hs-json-parser/test/Spec.hs

49 lines
1.4 KiB
Haskell
Raw Normal View History

2018-02-23 12:51:03 +05:30
module Main where
import Control.Monad (unless)
import Data.Char (isControl)
2018-02-23 12:51:03 +05:30
import System.Exit
import Test.QuickCheck
import Test.QuickCheck.Test (isSuccess)
import JSONParser
main :: IO ()
2018-02-23 12:51:03 +05:30
main = do
result <- quickCheckResult $ \j -> parseJSON (show j) == Just j
2018-02-23 12:51:03 +05:30
unless (isSuccess result) exitFailure
instance Arbitrary JValue where
shrink = genericShrink
2018-02-23 12:51:03 +05:30
arbitrary = sized go
where
go 0 = oneof scalarGens
go n = frequency [(2, oneof scalarGens), (3, oneof (compositeGens n))]
2018-02-23 12:51:03 +05:30
scalarGens = [ pure JNull
, JBool <$> arbitrary
, JString <$> arbitraryJSONString
, JNumber <$> arbitrary <*> oneof [choose (-5, 0), arbitrary]
]
compositeGens n = [ fmap JArray . scaledListOf . go $ n `div` 2
, fmap JObject . scaledListOf . objKV $ n `div` 2
]
2018-02-23 12:51:03 +05:30
objKV n = (,) <$> arbitraryJSONString <*> go n
2018-02-23 12:51:03 +05:30
scaledListOf = scale (\n -> n * 2 `div` 3) . listOf
2018-02-23 12:51:03 +05:30
arbitraryJSONString :: Gen String
arbitraryJSONString = listOf arbitraryJSONChar
where
arbitraryJSONChar' =
frequency [(9, arbitraryASCIIChar), (0, choose ('\128', '\65535'))]
`suchThat` (\c -> not (c == '\"' || c == '\\' || isControl c))
2018-02-23 12:51:03 +05:30
arbitraryJSONChar = frequency [
(99, arbitraryJSONChar')
, (1, elements ['"' , '\\' , '\b' , '\f' , '\n' , '\r' , '\t'])
]