@@ -2,85 +2,40 @@ module Test.Main where
22
33import Prelude
44
5- import Control.Monad.Eff.Console (log , logShow )
5+ import Control.Monad.Eff.Console (log )
66
7- import Data.Argonaut.Core (JObject , Json , toObject , fromObject , fromArray , fromString , fromNumber , fromBoolean , jsonNull )
7+ import Data.Argonaut.Core (JObject , Json , isObject , toObject )
88import Data.Argonaut.Decode (decodeJson )
9- import Data.Argonaut.Encode (encodeJson , gEncodeJson , (:=), (~>))
10- import Data.Array ( zipWith , nubBy , length )
9+ import Data.Argonaut.Encode (encodeJson , (:=), (~>))
10+ import Data.Argonaut.Gen ( genJson )
1111import Data.Either (Either (..))
1212import Data.Foldable (foldl )
13- import Data.Function (on )
14- import Data.Generic (class Generic )
15- import Data.List (fromFoldable )
1613import Data.Maybe (Maybe (..), maybe , isJust )
1714import Data.StrMap as SM
18- import Data.Tuple (Tuple (..), fst )
15+ import Data.Tuple (Tuple (..))
1916
2017import Test.StrongCheck (SC , quickCheck , quickCheck' , (<?>))
21- import Test.StrongCheck.Arbitrary (class Arbitrary , arbitrary )
22- import Test.StrongCheck.Data.AlphaNumString (AlphaNumString (..))
23- import Test.StrongCheck.Gen (Gen , Size , showSample , sized , frequency , oneOf , vectorOf )
18+ import Test.StrongCheck.Arbitrary (class Arbitrary )
19+ import Test.StrongCheck.Gen (suchThat , resize )
2420
2521main :: SC () Unit
2622main = do
2723 eitherCheck
2824 encodeDecodeCheck
2925 combinatorsCheck
30- genericsCheck
31-
32- genJNull :: Gen Json
33- genJNull = pure jsonNull
34-
35- genJBool :: Gen Json
36- genJBool = fromBoolean <$> arbitrary
37-
38- genJNumber :: Gen Json
39- genJNumber = fromNumber <$> arbitrary
40-
41- genJString :: Gen Json
42- genJString = fromString <$> arbitrary
43-
44- genJArray :: Size -> Gen Json
45- genJArray sz = fromArray <$> vectorOf sz (genJson $ sz - 1 )
46-
47- genJObject :: Size -> Gen Json
48- genJObject sz = do
49- v <- vectorOf sz (genJson $ sz - 1 )
50- k <- vectorOf (length v) (arbitrary :: Gen AlphaNumString )
51- pure
52- let
53- f (AlphaNumString s) = s <> " x"
54- k' = f <$> k
55- in
56- fromObject <<< SM .fromFoldable <<< nubBy (eq `on` fst) $ zipWith Tuple k' v
57-
58- genJson :: Size -> Gen Json
59- genJson 0 = oneOf genJNull [genJBool, genJNumber, genJString]
60- genJson n = frequency (Tuple 1.0 genJNull) rest where
61- rest = fromFoldable
62- [ Tuple 2.0 genJBool
63- , Tuple 2.0 genJNumber
64- , Tuple 3.0 genJString
65- , Tuple 1.0 (genJArray n)
66- , Tuple 1.0 (genJObject n)
67- ]
6826
6927newtype TestJson = TestJson Json
7028
7129instance arbitraryTestJson :: Arbitrary TestJson where
72- arbitrary = TestJson <$> sized genJson
30+ arbitrary = TestJson <$> (resize 5 genJson)
7331
7432encodeDecodeCheck :: SC () Unit
7533encodeDecodeCheck = do
76- log " Showing small sample of JSON"
77- showSample (genJson 10 )
78-
7934 log " Testing that any JSON can be encoded and then decoded"
8035 quickCheck' 20 prop_encode_then_decode
8136
8237 log " Testing that any JSON can be decoded and then encoded"
83- quickCheck' 20 prop_decode_then_encode
38+ quickCheck' 20 ( prop_decode_then_encode)
8439
8540 where
8641
@@ -98,7 +53,7 @@ unObj :: Obj -> Json
9853unObj (Obj j) = j
9954
10055instance arbitraryObj :: Arbitrary Obj where
101- arbitrary = Obj <$> genJObject 5
56+ arbitrary = Obj <$> suchThat (resize 5 genJson) isObject
10257
10358combinatorsCheck :: SC () Unit
10459combinatorsCheck = do
@@ -121,69 +76,17 @@ combinatorsCheck = do
12176 prop_assoc_append (Tuple (Tuple key (TestJson val)) (Obj obj)) =
12277 let appended = (key := val) ~> obj
12378 in case toObject appended >>= SM .lookup key of
124- Just val -> true
79+ Just value -> true
12580 _ -> false
12681
12782 prop_get_jobject_field :: Obj -> Boolean
12883 prop_get_jobject_field (Obj obj) =
12984 maybe false go $ toObject obj
13085 where
13186 go :: JObject -> Boolean
132- go obj =
133- let keys = SM .keys obj
134- in foldl (\ok key -> ok && isJust (SM .lookup key obj)) true keys
135-
136- newtype MyRecord = MyRecord { foo :: String , bar :: Int }
137-
138- derive instance genericMyRecord :: Generic MyRecord
139-
140- data User
141- = Anonymous
142- | Guest String
143- | Registered
144- { name :: String
145- , bio :: Maybe String
146- , age :: Int
147- , balance :: Number
148- , banned :: Boolean
149- , tweets :: Array String
150- , followers :: Array User
151- }
152-
153- derive instance genericUser :: Generic User
154-
155- genericsCheck :: SC () Unit
156- genericsCheck = do
157- log " Print samples of values encoded with gEncodeJson"
158- logShow $ gEncodeJson 5
159- logShow $ gEncodeJson [1 , 2 , 3 , 5 ]
160- logShow $ gEncodeJson (Just " foo" )
161- logShow $ gEncodeJson (Right " foo" :: Either String String )
162- logShow $ gEncodeJson $ MyRecord { foo: " foo" , bar: 2 }
163- logShow $ gEncodeJson " foo"
164- logShow $ gEncodeJson Anonymous
165- logShow $ gEncodeJson $ Guest " guest's handle"
166- logShow $ gEncodeJson $ Registered
167- { name: " user1"
168- , bio: Just " Ordinary User"
169- , age: 5
170- , balance: 26.6
171- , banned: false
172- , tweets: [" Hello" , " What's up" ]
173- , followers:
174- [ Anonymous
175- , Guest " someGuest"
176- , Registered
177- { name: " user2"
178- , bio: Nothing
179- , age: 6
180- , balance: 32.1
181- , banned: false
182- , tweets: [" Hi" ]
183- , followers: []
184- }
185- ]
186- }
87+ go object =
88+ let keys = SM .keys object
89+ in foldl (\ok key -> ok && isJust (SM .lookup key object)) true keys
18790
18891eitherCheck :: SC () Unit
18992eitherCheck = do
0 commit comments