@@ -4,14 +4,14 @@ import Prelude
44
55import Control.Monad.Eff.Console (log , logShow )
66
7- import Data.Argonaut.Core (JObject , Json , toObject , fromObject , fromArray , fromString , fromNumber , fromBoolean , jsonNull )
7+ import Data.Argonaut.Core (JObject , Json , isObject , toObject , fromObject , fromArray , fromString , fromNumber , fromBoolean , jsonNull )
88import Data.Argonaut.Decode (decodeJson )
9- import Data.Argonaut.Encode (encodeJson , gEncodeJson , (:=), (~>))
9+ import Data.Argonaut.Encode (encodeJson , (:=), (~>))
10+ import Data.Argonaut.Gen (genJson )
1011import Data.Array (zipWith , nubBy , length )
1112import Data.Either (Either (..))
1213import Data.Foldable (foldl )
1314import Data.Function (on )
14- import Data.Generic (class Generic )
1515import Data.List (fromFoldable )
1616import Data.Maybe (Maybe (..), maybe , isJust )
1717import Data.StrMap as SM
@@ -20,67 +20,26 @@ import Data.Tuple (Tuple(..), fst)
2020import Test.StrongCheck (SC , quickCheck , quickCheck' , (<?>))
2121import Test.StrongCheck.Arbitrary (class Arbitrary , arbitrary )
2222import Test.StrongCheck.Data.AlphaNumString (AlphaNumString (..))
23- import Test.StrongCheck.Gen (Gen , Size , showSample , sized , frequency , oneOf , vectorOf )
23+ import Test.StrongCheck.Gen (Gen , Size , showSample , sized , frequency , oneOf , vectorOf , suchThat , resize )
2424
2525main :: SC () Unit
2626main = do
2727 eitherCheck
2828 encodeDecodeCheck
2929 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- ]
6830
6931newtype TestJson = TestJson Json
7032
7133instance arbitraryTestJson :: Arbitrary TestJson where
72- arbitrary = TestJson <$> sized genJson
34+ arbitrary = TestJson <$> (resize 5 genJson)
7335
7436encodeDecodeCheck :: SC () Unit
7537encodeDecodeCheck = do
76- log " Showing small sample of JSON"
77- showSample (genJson 10 )
78-
7938 log " Testing that any JSON can be encoded and then decoded"
8039 quickCheck' 20 prop_encode_then_decode
8140
8241 log " Testing that any JSON can be decoded and then encoded"
83- quickCheck' 20 prop_decode_then_encode
42+ quickCheck' 20 ( prop_decode_then_encode)
8443
8544 where
8645
@@ -98,7 +57,7 @@ unObj :: Obj -> Json
9857unObj (Obj j) = j
9958
10059instance arbitraryObj :: Arbitrary Obj where
101- arbitrary = Obj <$> genJObject 5
60+ arbitrary = Obj <$> suchThat (resize 5 genJson) isObject
10261
10362combinatorsCheck :: SC () Unit
10463combinatorsCheck = do
@@ -133,58 +92,6 @@ combinatorsCheck = do
13392 let keys = SM .keys obj
13493 in foldl (\ok key -> ok && isJust (SM .lookup key obj)) true keys
13594
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- }
187-
18895eitherCheck :: SC () Unit
18996eitherCheck = do
19097 log " Test EncodeJson/DecodeJson Either instance"
0 commit comments