@@ -4,15 +4,25 @@ import Prelude
44import Control.Alternative (empty )
55import Control.Monad.Aff.AVar (AVAR )
66import Control.Monad.Eff (Eff )
7+ import Control.Monad.Eff.Class (liftEff )
78import Control.Monad.Eff.Console (CONSOLE )
9+ import Control.Monad.Eff.Random (RANDOM )
10+ import Data.Array as A
811import Data.Either (isLeft , Either (..))
9- import Data.List (List (Nil), singleton , (:))
12+ import Data.Foldable (findMap )
13+ import Data.List (List (..), singleton , (:))
1014import Data.Maybe (Maybe (Nothing, Just))
1115import Data.Path.Pathy (currentDir , parentDir' , file , dir , rootDir , (</>))
12- import Data.Tuple (Tuple (Tuple) )
16+ import Data.Tuple (Tuple (..), snd )
1317import Data.URI (Authority (Authority), HierarchicalPart (HierarchicalPart), Host (IPv4Address, NameAddress, IPv6Address), Query (Query), RelativePart (RelativePart), RelativeRef (RelativeRef), URI (URI), URIScheme (URIScheme), runParseURIRef )
18+ import Data.URI.Host as Host
19+ import Data.URI.Host.Gen as Host.Gen
1420import Data.URI.Query (parseQuery , printQuery )
15- import Test.Unit (suite , test , TestSuite )
21+ import Test.StrongCheck ((===))
22+ import Test.StrongCheck as SC
23+ import Test.StrongCheck.Gen as SCG
24+ import Test.StrongCheck.LCG as SCL
25+ import Test.Unit (Test , suite , test , TestSuite , success , failure )
1626import Test.Unit.Assert (assert , equal )
1727import Test.Unit.Console (TESTOUTPUT )
1828import Test.Unit.Main (runTest )
@@ -42,8 +52,22 @@ testParseQueryParses uri query =
4252 (" parses: \" " <> uri <> " \" " )
4353 (equal (Right query) (runParser parseQuery uri))
4454
45- main :: forall eff . Eff ( console :: CONSOLE , testOutput :: TESTOUTPUT , avar :: AVAR | eff ) Unit
55+ main :: forall eff . Eff ( console :: CONSOLE , testOutput :: TESTOUTPUT , avar :: AVAR , random :: RANDOM | eff ) Unit
4656main = runTest $ suite " Data.URI" do
57+
58+ suite " parseIPv4Address" do
59+
60+ test " parseIPv4Address / printHost roundtrip" do
61+ forAll do
62+ ipv4 <- Host.Gen .genIPv4
63+ let printed = Host .printHost ipv4
64+ let parsed = runParser Host .parseIPv4Address printed
65+ pure $ pure ipv4 === parsed
66+
67+ test " 0-lead octets should not parse" do
68+ assert (" parse should fail for 192.168.001.1" ) $
69+ isLeft $ runParser Host .parseIPv4Address " 192.168.001.1"
70+
4771 suite " runParseURIRef" do
4872 testRunParseURIRefParses
4973 " sql2:///?q=foo&var.bar=baz"
@@ -312,4 +336,25 @@ main = runTest $ suite "Data.URI" do
312336 " key1=&key2="
313337 (Query (Tuple " key1" (Just " " ) : Tuple " key2" (Just " " ) : Nil ))
314338
339+ forAll :: forall e prop . SC.Testable prop => SCG.Gen prop -> Test (random :: RANDOM | e )
340+ forAll = quickCheck
341+
342+ quickCheck :: forall e prop . SC.Testable prop => prop -> Test (random :: RANDOM | e )
343+ quickCheck = quickCheck' 100
315344
345+ quickCheck' :: forall e prop . SC.Testable prop => Int -> prop -> Test (random :: RANDOM | e )
346+ quickCheck' tries prop = do
347+ seed <- liftEff $ SCL .randomSeed
348+ let
349+ results = SC .quickCheckPure tries seed prop
350+ successes = A .length $ A .filter ((_ == SC.Success ) <<< snd) $ results
351+ findErr = findMap case _ of
352+ Tuple seed' (SC.Failed msg) -> Just (Tuple seed' msg)
353+ _ -> Nothing
354+ case findErr results of
355+ Nothing ->
356+ success
357+ Just (Tuple seed' msg) ->
358+ failure $
359+ show (tries - successes) <> " /" <> show tries <> " tests failed: "
360+ <> msg <> " (seed " <> show (SCL .runSeed seed') <> " )"
0 commit comments