@@ -5,15 +5,18 @@ import Prelude
5
5
import Control.Monad.Gen as Gen
6
6
import Control.Monad.Gen.Common as GenC
7
7
import Data.Argonaut.Core (stringify )
8
- import Data.Codec.Argonaut.Common as JA
9
- import Data.Codec.Argonaut.Record as JAR
10
- import Data.Maybe (Maybe (..))
8
+ import Data.Argonaut.Core as Json
9
+ import Data.Codec.Argonaut.Common as CA
10
+ import Data.Codec.Argonaut.Record as CAR
11
+ import Data.Maybe (Maybe (..), fromJust )
11
12
import Data.Newtype (class Newtype , unwrap , wrap )
12
13
import Data.Profunctor (dimap )
13
14
import Data.String.Gen (genAsciiString )
14
15
import Effect (Effect )
15
16
import Effect.Console (log )
16
- import Test.QuickCheck (quickCheck )
17
+ import Foreign.Object as Object
18
+ import Partial.Unsafe (unsafePartial )
19
+ import Test.QuickCheck (assertEquals , quickCheck , quickCheckGen )
17
20
import Test.QuickCheck.Gen (Gen )
18
21
import Test.Util (genInt , propCodec )
19
22
@@ -26,14 +29,15 @@ type OuterR =
26
29
type InnerR =
27
30
{ n ∷ Int
28
31
, m ∷ Boolean
32
+ , o ∷ Maybe Boolean
29
33
}
30
34
31
35
newtype Outer = Outer OuterR
32
36
33
37
derive instance newtypeOuter ∷ Newtype Outer _
34
38
35
39
instance showOuter ∷ Show Outer where
36
- show (Outer r) = " Outer " <> stringify (JA .encode outerCodec r)
40
+ show (Outer r) = " Outer " <> stringify (CA .encode outerCodec r)
37
41
38
42
instance eqOuter ∷ Eq Outer where
39
43
eq (Outer o1) (Outer o2) =
@@ -44,19 +48,20 @@ instance eqOuter ∷ Eq Outer where
44
48
Just i1, Just i2 → i1.n == i2.n && i1.m == i2.m
45
49
_, _ → false
46
50
47
- outerCodec ∷ JA .JsonCodec OuterR
51
+ outerCodec ∷ CA .JsonCodec OuterR
48
52
outerCodec =
49
- JA .object " Outer" $ JAR .record
50
- { a: JA .int
51
- , b: JA .string
52
- , c: JA .maybe innerCodec
53
+ CA .object " Outer" $ CAR .record
54
+ { a: CA .int
55
+ , b: CA .string
56
+ , c: CA .maybe innerCodec
53
57
}
54
58
55
- innerCodec ∷ JA .JsonCodec InnerR
59
+ innerCodec ∷ CA .JsonCodec InnerR
56
60
innerCodec =
57
- JA .object " Inner" $ JAR .record
58
- { n: JA .int
59
- , m: JA .boolean
61
+ CA .object " Inner" $ CAR .record
62
+ { n: CA .int
63
+ , m: CA .boolean
64
+ , o: CAR.Optional CA .boolean
60
65
}
61
66
62
67
genOuter ∷ Gen OuterR
@@ -70,9 +75,25 @@ genInner ∷ Gen InnerR
70
75
genInner = do
71
76
n ← genInt
72
77
m ← Gen .chooseBool
73
- pure { n, m }
78
+ o ← GenC .genMaybe Gen .chooseBool
79
+ pure { n, m, o }
74
80
75
81
main ∷ Effect Unit
76
82
main = do
77
83
log " Checking record codec"
78
84
quickCheck $ propCodec (Outer <$> genOuter) (dimap unwrap wrap outerCodec)
85
+
86
+ log " Check optional Nothing is missing from json"
87
+ quickCheckGen do
88
+ v ← genInner
89
+ let obj = unsafePartial $ fromJust $ Json .toObject $ CA .encode innerCodec (v { o = Nothing })
90
+ pure $ assertEquals [ " m" , " n" ] (Object .keys obj)
91
+
92
+ log " Check optional Just is present in the json"
93
+ quickCheckGen do
94
+ b ← Gen .chooseBool
95
+ v ← genInner
96
+ let obj = unsafePartial $ fromJust $ Json .toObject $ CA .encode innerCodec (v { o = Just b })
97
+ pure $ assertEquals [ " m" , " n" , " o" ] (Object .keys obj)
98
+
99
+ pure unit
0 commit comments