Skip to content

Commit 2e69d86

Browse files
committed
Add generator for JSON values
1 parent 4c46fad commit 2e69d86

File tree

2 files changed

+69
-2
lines changed

2 files changed

+69
-2
lines changed

bower.json

Lines changed: 12 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,13 @@
11
{
22
"name": "purescript-argonaut-core",
33
"homepage": "https://github.com/purescript-contrib/purescript-argonaut-core",
4+
"description": "Core of the purescript-argonaut library, providing basic types, folds, and combinators for `Json`",
5+
"license": "MIT",
46
"authors": [
57
"Maxim Zimaliev <[email protected]>",
68
"Hardy Jones <>",
79
"John A. De Goes <[email protected]>"
810
],
9-
"description": "Core of the purescript-argonaut library, providing basic types, folds, and combinators for `Json`",
1011
"keywords": [
1112
"purescript",
1213
"argonaut",
@@ -16,10 +17,19 @@
1617
"type": "git",
1718
"url": "git://github.com/purescript-contrib/purescript-argonaut-core.git"
1819
},
19-
"license": "MIT",
20+
"ignore": [
21+
"**/.*",
22+
"bower_components",
23+
"node_modules",
24+
"output",
25+
"test",
26+
"bower.json",
27+
"package.json"
28+
],
2029
"dependencies": {
2130
"purescript-enums": "^3.0.0",
2231
"purescript-functions": "^3.0.0",
32+
"purescript-gen": "^1.0.0",
2333
"purescript-maps": "^3.0.0"
2434
},
2535
"devDependencies": {

src/Data/Argonaut/Gen.purs

Lines changed: 57 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,57 @@
1+
module Test.StrongCheck.Data.Argonaut where
2+
3+
import Prelude
4+
5+
import Control.Lazy (class Lazy, defer)
6+
import Control.Monad.Gen (class MonadGen)
7+
import Control.Monad.Gen as Gen
8+
import Control.Monad.Rec.Class (class MonadRec)
9+
10+
import Data.Argonaut.Core as J
11+
import Data.Array as A
12+
import Data.Char as C
13+
import Data.NonEmpty ((:|))
14+
import Data.String as S
15+
import Data.StrMap as SM
16+
17+
genJson :: forall m. MonadGen m => MonadRec m => Lazy (m J.Json) => m J.Json
18+
genJson = Gen.sized genJson'
19+
where
20+
genJson' :: Int -> m J.Json
21+
genJson' size
22+
| size > 3 =
23+
genJson' 3
24+
| size > 0 =
25+
Gen.resize (_ - 1) (Gen.choose genJArray genJObject)
26+
| otherwise =
27+
Gen.oneOf $ pure J.jsonNull :| [ genJBoolean, genJNumber, genJString]
28+
29+
genJArray :: m J.Json
30+
genJArray = J.fromArray <$> Gen.unfoldable (defer \_ -> genJson)
31+
32+
genJObject :: m J.Json
33+
genJObject = A.foldM extendJObj J.jsonEmptyObject =<< Gen.unfoldable genString
34+
35+
extendJObj :: J.Json -> String -> m J.Json
36+
extendJObj obj k = do
37+
v <- genJson
38+
pure $
39+
J.foldJsonObject
40+
(J.jsonSingletonObject k v)
41+
(J.fromObject <<< SM.insert k v)
42+
obj
43+
44+
genJBoolean :: m J.Json
45+
genJBoolean = J.fromBoolean <$> Gen.chooseBool
46+
47+
genJNumber :: m J.Json
48+
genJNumber = J.fromNumber <$> Gen.chooseFloat (-1000000.0) 1000000.0
49+
50+
genJString :: m J.Json
51+
genJString = J.fromString <$> genString
52+
53+
genString :: m String
54+
genString = S.fromCharArray <$> Gen.unfoldable genChar
55+
56+
genChar :: m Char
57+
genChar = C.fromCharCode <$> Gen.chooseInt 0 65535

0 commit comments

Comments
 (0)