@@ -4,15 +4,25 @@ import Prelude
4
4
import Control.Alternative (empty )
5
5
import Control.Monad.Aff.AVar (AVAR )
6
6
import Control.Monad.Eff (Eff )
7
+ import Control.Monad.Eff.Class (liftEff )
7
8
import Control.Monad.Eff.Console (CONSOLE )
9
+ import Control.Monad.Eff.Random (RANDOM )
10
+ import Data.Array as A
8
11
import Data.Either (isLeft , Either (..))
9
- import Data.List (List (Nil), singleton , (:))
12
+ import Data.Foldable (findMap )
13
+ import Data.List (List (..), singleton , (:))
10
14
import Data.Maybe (Maybe (Nothing, Just))
11
15
import Data.Path.Pathy (currentDir , parentDir' , file , dir , rootDir , (</>))
12
- import Data.Tuple (Tuple (Tuple) )
16
+ import Data.Tuple (Tuple (..), snd )
13
17
import 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
14
20
import 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 )
16
26
import Test.Unit.Assert (assert , equal )
17
27
import Test.Unit.Console (TESTOUTPUT )
18
28
import Test.Unit.Main (runTest )
@@ -42,8 +52,22 @@ testParseQueryParses uri query =
42
52
(" parses: \" " <> uri <> " \" " )
43
53
(equal (Right query) (runParser parseQuery uri))
44
54
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
46
56
main = 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
+
47
71
suite " runParseURIRef" do
48
72
testRunParseURIRefParses
49
73
" sql2:///?q=foo&var.bar=baz"
@@ -312,4 +336,25 @@ main = runTest $ suite "Data.URI" do
312
336
" key1=&key2="
313
337
(Query (Tuple " key1" (Just " " ) : Tuple " key2" (Just " " ) : Nil ))
314
338
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
315
344
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