packages feed

nbparts-0.1.0.0: tests/Tests/Util/Json.hs

module Tests.Util.Json where

import Data.Aeson qualified as Aeson
import Data.Aeson.KeyMap qualified as KeyMap
import Data.Scientific (Scientific, scientific)
import Data.Vector qualified as Vector
import Hedgehog (Gen)
import Hedgehog.Gen qualified as Gen
import Hedgehog.Range qualified as Range

genValue :: Gen Aeson.Value
genValue =
  Gen.recursive Gen.choice nonRecursive recursive
  where
    nonRecursive :: [Gen Aeson.Value]
    nonRecursive =
      [ pure Aeson.Null,
        Aeson.Bool <$> Gen.bool,
        Aeson.String <$> Gen.text (Range.linear 1 10) Gen.unicode,
        Aeson.Number <$> genScientific
      ]

    recursive :: [Gen Aeson.Value]
    recursive =
      [ genArrayValue,
        genObjectValue
      ]

    genArrayValue :: Gen Aeson.Value
    genArrayValue = do
      values <- Gen.list (Range.linear 0 5) genValue
      pure $ Aeson.Array (Vector.fromList values)

    genObjectValue :: Gen Aeson.Value
    genObjectValue = do
      obj <- Gen.map (Range.linear 0 5) $ (,) <$> Gen.text (Range.linear 10 20) Gen.unicode <*> genValue
      pure $ Aeson.Object (KeyMap.fromMapText obj)

genScientific :: Gen Scientific
genScientific = do
  c <- Gen.integral (Range.linear (-1000000) 1000000)
  e <- Gen.int (Range.linear (-6) 6)
  pure $ scientific c e