packages feed

argo-0.2022.1.15: source/test-suite/Argo/Orphanage.hs

{-# OPTIONS_GHC -Wno-orphans #-}

module Argo.Orphanage where

import Data.List.NonEmpty (NonEmpty((:|)))

import qualified Argo
import qualified Data.Text as Text
import qualified Data.Text.Lazy as LazyText
import qualified Test.Tasty.QuickCheck as Tasty

instance Tasty.Arbitrary Argo.Name where
    arbitrary = Argo.Name <$> Tasty.arbitrary
    shrink (Argo.Name x) = Argo.Name <$> Tasty.shrink x

instance Tasty.Arbitrary value => Tasty.Arbitrary (Argo.Member value) where
    arbitrary = Argo.Member <$> Tasty.arbitrary <*> Tasty.arbitrary
    shrink (Argo.Member k v) = uncurry Argo.Member <$> Tasty.shrink (k, v)

instance Tasty.Arbitrary Argo.Value where
    arbitrary = Tasty.sized genValueSized
    shrink x = case x of
        Argo.Null -> []
        Argo.Boolean y -> Argo.Boolean <$> Tasty.shrink y
        Argo.Number y -> Argo.Number <$> Tasty.shrink y
        Argo.String y -> Argo.String <$> Tasty.shrink y
        Argo.Array y -> Argo.Array <$> Tasty.shrink y
        Argo.Object y -> Argo.Object <$> Tasty.shrink y

genValueSized :: Int -> Tasty.Gen Argo.Value
genValueSized size =
    let newSize = div size 3
    in
        Tasty.oneof
            [ pure Argo.Null
            , Argo.Boolean <$> Tasty.arbitrary
            , Argo.Number <$> Tasty.arbitrary
            , Argo.String <$> Tasty.arbitrary
            , Argo.Array <$> Tasty.vectorOf size (genValueSized newSize)
            , Argo.Object <$> Tasty.vectorOf
                size
                (Argo.Member <$> Tasty.arbitrary <*> genValueSized newSize)
            ]

instance Tasty.Arbitrary Argo.Decimal where
    arbitrary = Argo.Decimal <$> Tasty.arbitrary <*> Tasty.arbitrary
    shrink (Argo.Decimal s e) = uncurry Argo.Decimal <$> Tasty.shrink (s, e)

instance Tasty.Arbitrary Text.Text where
    arbitrary = Text.pack <$> Tasty.arbitrary
    shrink = Tasty.shrinkMap Text.pack Text.unpack

instance Tasty.Arbitrary LazyText.Text where
    arbitrary = LazyText.pack <$> Tasty.arbitrary
    shrink = Tasty.shrinkMap LazyText.pack LazyText.unpack

instance Tasty.Arbitrary a => Tasty.Arbitrary (NonEmpty a) where
    arbitrary = (:|) <$> Tasty.arbitrary <*> Tasty.arbitrary
    shrink (x :| xs) = uncurry (:|) <$> Tasty.shrink (x, xs)

instance Tasty.Arbitrary Argo.Pointer where
    arbitrary = Argo.Pointer <$> Tasty.arbitrary
    shrink (Argo.Pointer x) = Argo.Pointer <$> Tasty.shrink x

instance Tasty.Arbitrary Argo.Token where
    arbitrary = Argo.Token <$> Tasty.arbitrary
    shrink (Argo.Token x) = Argo.Token <$> Tasty.shrink x