@@ -496,10 +496,29 @@ object ParserGen {
496496 )
497497 }
498498
499+ def genParser [A ](genA : Gen [A ]): Gen [Parser [A ]] =
500+ for {
501+ genT <- gen
502+ fn <- Gen .function1(genA)(genT.cogen)
503+ } yield genT.fa.map(fn)
504+
505+ def genParser1 [A ](genA : Gen [A ]): Gen [Parser1 [A ]] =
506+ for {
507+ genT <- gen1
508+ fn <- Gen .function1(genA)(genT.cogen)
509+ } yield genT.fa.map(fn)
510+
511+ implicit def arbParser [A : Arbitrary ]: Arbitrary [Parser [A ]] =
512+ Arbitrary (genParser(Arbitrary .arbitrary[A ]))
513+
514+ implicit def arbParser1 [A : Arbitrary ]: Arbitrary [Parser1 [A ]] =
515+ Arbitrary (genParser1(Arbitrary .arbitrary[A ]))
499516}
500517
501518class ParserTest extends munit.ScalaCheckSuite {
502519
520+ import ParserGen .{arbParser , arbParser1 }
521+
503522 val tests : Int = if (BitSetUtil .isScalaJs) 50 else 2000
504523
505524 override def scalaCheckTestParameters =
@@ -1517,6 +1536,20 @@ class ParserTest extends munit.ScalaCheckSuite {
15171536 }
15181537 }
15191538
1539+ property(" a.backtrack.peek.orElse(b.peek) == (a.backtrack.orElse(b)).peek" ) {
1540+ forAll(ParserGen .gen, ParserGen .gen, Arbitrary .arbitrary[String ]) { (a, b, str) =>
1541+ val pa = a.fa.backtrack
1542+ val pb = b.fa
1543+
1544+ val left = pa.peek.orElse(pb.peek)
1545+ val right = pa.orElse(pb).peek
1546+
1547+ val leftRes = left.parse(str).toOption
1548+ val rightRes = right.parse(str).toOption
1549+ assertEquals(leftRes, rightRes)
1550+ }
1551+ }
1552+
15201553 property(" a.peek == a.peek *> a.peek" ) {
15211554 forAll(ParserGen .gen, Arbitrary .arbitrary[String ]) { (a, str) =>
15221555 val pa = a.fa.peek
@@ -1580,6 +1613,28 @@ class ParserTest extends munit.ScalaCheckSuite {
15801613 }
15811614 }
15821615
1616+ property(" !fail == unit" ) {
1617+ forAll { (str : String ) =>
1618+ val left = ! Parser .fail
1619+ val right = Parser .unit
1620+
1621+ val leftRes = left.parse(str)
1622+ val rightRes = right.parse(str)
1623+ assertEquals(leftRes, rightRes)
1624+ }
1625+ }
1626+
1627+ property(" !pure(_) == fail" ) {
1628+ forAll { (str : String , i : Int ) =>
1629+ val left = ! Parser .pure(i)
1630+ val right = Parser .fail
1631+
1632+ val leftRes = left.parse(str).toOption
1633+ val rightRes = right.parse(str).toOption
1634+ assertEquals(leftRes, rightRes)
1635+ }
1636+ }
1637+
15831638 property(" anyChar.repAs[String] parses the whole string" ) {
15841639 forAll { (str : String ) =>
15851640 assertEquals(Parser .anyChar.repAs[String ].parse(str), Right ((" " , str)))
@@ -1615,24 +1670,36 @@ class ParserTest extends munit.ScalaCheckSuite {
16151670 }
16161671 }
16171672
1618- /*
16191673 property(" select(pa.map(Left(_)))(pf) == (pa, pf).mapN((a, fn) => fn(a))" ) {
1620- forAll(ParserGen.gen, ParserGen.gen, Arbitrary.arbitrary[String]) { (genP, genRes, str) =>
1621- val pa = genP.fa
1622- val pf = null: Parser[genP.A => genRes.A]
1623- assertEquals(Parser.select(pa.map(Left(_)))(pf).parse(str), pf.ap(pa).parse(str))
1674+ forAll { (pa : Parser [Int ], pf : Parser [Int => String ], str : String ) =>
1675+ assertEquals(
1676+ Parser .select(pa.map(Left (_)))(pf).parse(str),
1677+ (pa, pf).mapN((a, f) => f(a)).parse(str)
1678+ )
1679+ }
1680+ }
1681+
1682+ property(" select1(pa.map(Left(_)))(pf) == (pa, pf).mapN((a, fn) => fn(a))" ) {
1683+ forAll { (pa : Parser1 [Int ], pf : Parser [Int => String ], str : String ) =>
1684+ assertEquals(
1685+ Parser .select(pa.map(Left (_)))(pf).parse(str),
1686+ (pa, pf).mapN((a, f) => f(a)).parse(str)
1687+ )
16241688 }
16251689 }
1626- */
16271690
16281691 property(" select(pa.map(Right(_)))(pf) == pa" ) {
1629- forAll(ParserGen .gen, ParserGen .gen, Arbitrary .arbitrary[String ]) { (genP, genRes, str) =>
1630- val pa = genRes.fa
1631- val pf : Parser [genP.A => genRes.A ] = Parser .fail
1692+ forAll { (pa : Parser [String ], pf : Parser [Int => String ], str : String ) =>
16321693 assertEquals(Parser .select(pa.map(Right (_)))(pf).parse(str), pa.parse(str))
16331694 }
16341695 }
16351696
1697+ property(" select1(pa.map(Right(_)))(pf) == pa" ) {
1698+ forAll { (pa : Parser1 [String ], pf : Parser [Int => String ], str : String ) =>
1699+ assertEquals(Parser .select1(pa.map(Right (_)))(pf).parse(str), pa.parse(str))
1700+ }
1701+ }
1702+
16361703 property(" p.filter(_ => true) == p" ) {
16371704 forAll(ParserGen .gen, Arbitrary .arbitrary[String ]) { (genP, str) =>
16381705 val res0 = genP.fa.filter(_ => true ).parse(str)
@@ -1671,4 +1738,44 @@ class ParserTest extends munit.ScalaCheckSuite {
16711738 )
16721739 }
16731740 }
1741+
1742+ property(" mapFilter is the same as filter + map" ) {
1743+ forAll { (pa : Parser [Int ], fn : Int => Option [String ], str : String ) =>
1744+ val left = pa.mapFilter(fn)
1745+ val right = pa.map(fn).filter(_.isDefined).map(_.get)
1746+
1747+ assertEquals(left.parse(str), right.parse(str))
1748+ }
1749+ }
1750+
1751+ property(" mapFilter is the same as filter + map Parser1" ) {
1752+ forAll { (pa : Parser1 [Int ], fn : Int => Option [String ], str : String ) =>
1753+ val left = pa.mapFilter(fn)
1754+ val right = pa.map(fn).filter(_.isDefined).map(_.get)
1755+
1756+ assertEquals(left.parse(str), right.parse(str))
1757+ }
1758+ }
1759+
1760+ property(" collect is the same as filter + map" ) {
1761+ forAll { (pa : Parser [Int ], fn : Int => Option [String ], str : String ) =>
1762+ val left = pa.collect {
1763+ case i if fn(i).isDefined => fn(i).get
1764+ }
1765+ val right = pa.map(fn).filter(_.isDefined).map(_.get)
1766+
1767+ assertEquals(left.parse(str), right.parse(str))
1768+ }
1769+ }
1770+
1771+ property(" collect is the same as filter + map Parser1" ) {
1772+ forAll { (pa : Parser1 [Int ], fn : Int => Option [String ], str : String ) =>
1773+ val left = pa.collect {
1774+ case i if fn(i).isDefined => fn(i).get
1775+ }
1776+ val right = pa.map(fn).filter(_.isDefined).map(_.get)
1777+
1778+ assertEquals(left.parse(str), right.parse(str))
1779+ }
1780+ }
16741781}
0 commit comments