@@ -2,22 +2,23 @@ module Test.Main where
22
33import Prelude
44
5- import Data.Argonaut.Core
6- import Data.Argonaut.Decode (decodeJson , DecodeJson )
7- import Data.Argonaut.Encode (encodeJson , EncodeJson )
5+ import Data.Argonaut.Core
6+ import Data.Argonaut.Decode (decodeJson , DecodeJson , gDecodeJson , gDecodeJson' )
7+ import Data.Argonaut.Encode (encodeJson , EncodeJson , gEncodeJson , gEncodeJson' )
88import Data.Argonaut.Combinators ((:=), (~>), (?>>=), (.?))
99import Data.Either
1010import Data.Tuple
1111import Data.Maybe
1212import Data.Array
13+ import Data.Generic
1314import Data.Foldable (foldl )
1415import Data.List (toList , List (..))
1516import Control.Monad.Eff.Console
1617import qualified Data.StrMap as M
1718
1819import Test.StrongCheck
1920import Test.StrongCheck.Gen
20-
21+ import Test.StrongCheck.Generic
2122
2223genJNull :: Gen Json
2324genJNull = pure jsonNull
@@ -67,7 +68,7 @@ prop_decode_then_encode (TestJson json) =
6768 Right json == (decoded >>= (encodeJson >>> pure))
6869
6970
70- encodeDecodeCheck = do
71+ encodeDecodeCheck = do
7172 log " Showing small sample of JSON"
7273 showSample (genJson 10 )
7374
@@ -81,7 +82,7 @@ prop_assoc_builder_str :: Tuple String String -> Boolean
8182prop_assoc_builder_str (Tuple key str) =
8283 case (key := str) of
8384 Tuple k json ->
84- (key == k) && (decodeJson json == Right str)
85+ (key == k) && (decodeJson json == Right str)
8586
8687newtype Obj = Obj Json
8788unObj :: Obj -> Json
@@ -110,7 +111,7 @@ prop_get_jobject_field (Obj obj) =
110111 in foldl (\ok key -> ok && (isJust $ M .lookup key obj)) true keys
111112
112113assert_maybe_msg :: Boolean
113- assert_maybe_msg =
114+ assert_maybe_msg =
114115 (isLeft (Nothing ?>>= " Nothing is Left" ))
115116 &&
116117 ((Just 2 ?>>= " Nothing is left" ) == Right 2 )
@@ -127,9 +128,62 @@ combinatorsCheck = do
127128 quickCheck' 20 prop_get_jobject_field
128129 log " Assert maybe to either convertion"
129130 assert assert_maybe_msg
130-
131+
132+ newtype MyRecord = MyRecord { foo :: String , bar :: Int }
133+ derive instance genericMyRecord :: Generic MyRecord
134+
135+ data User = Anonymous
136+ | Guest String
137+ | Registered { name :: String
138+ , age :: Int
139+ , balance :: Number
140+ , banned :: Boolean
141+ , tweets :: Array String
142+ , followers :: Array User
143+ }
144+ derive instance genericUser :: Generic User
145+
146+ prop_iso_generic :: GenericValue -> Boolean
147+ prop_iso_generic genericValue =
148+ Right val.spine == gDecodeJson' val.signature (gEncodeJson' val.spine)
149+ where val = runGenericValue genericValue
150+
151+ prop_decoded_spine_valid :: GenericValue -> Boolean
152+ prop_decoded_spine_valid genericValue =
153+ Right true == (isValidSpine val.signature <$> gDecodeJson' val.signature (gEncodeJson' val.spine))
154+ where val = runGenericValue genericValue
155+
156+ genericsCheck = do
157+ log " Check that decodeJson' and encodeJson' form an isomorphism"
158+ quickCheck prop_iso_generic
159+ log " Check that decodeJson' returns a valid spine"
160+ quickCheck prop_decoded_spine_valid
161+ log " Print samples of values encoded with gEncodeJson"
162+ print $ gEncodeJson 5
163+ print $ gEncodeJson [1 , 2 , 3 , 5 ]
164+ print $ gEncodeJson (Just " foo" )
165+ print $ gEncodeJson (Right " foo" :: Either String String )
166+ print $ gEncodeJson $ MyRecord { foo: " foo" , bar: 2 }
167+ print $ gEncodeJson " foo"
168+ print $ gEncodeJson Anonymous
169+ print $ gEncodeJson $ Guest " guest's handle"
170+ print $ gEncodeJson $ Registered { name: " user1"
171+ , age: 5
172+ , balance: 26.6
173+ , banned: false
174+ , tweets: [" Hello" , " What's up" ]
175+ , followers: [ Anonymous
176+ , Guest " someGuest"
177+ , Registered { name: " user2"
178+ , age: 6
179+ , balance: 32.1
180+ , banned: false
181+ , tweets: [" Hi" ]
182+ , followers: []
183+ }] }
131184
132185
133186main = do
134187 encodeDecodeCheck
135188 combinatorsCheck
189+ genericsCheck
0 commit comments