packages feed

liblawless-0.16.0: Tests/TestAeson.hs

-- | Test encoding and decoding options.

{-# LANGUAGE TemplateHaskell, ExtendedDefaultRules #-}
{-# OPTIONS_GHC -Wno-orphans #-}

module TestAeson where

import Test.Framework
import Test.Framework.TH
import Test.Framework.Providers.QuickCheck2 (testProperty)
import Test.QuickCheck

import Data.String (String)

import Lawless
import Arbitrary
import Aeson
import Text
import Generics

import Data.Text (pack)

default (Text)

data TestData = TestData
    {
        _tdName ∷ Text,
        _tdCount ∷ Integer
    } deriving (Show, Eq, Ord, Generic)
makeLenses ''TestData
instance ToJSON TestData where
    toEncoding = lawlessToJSONEncoding
instance FromJSON TestData where
    parseJSON = lawlessParseJSON

instance Arbitrary TestData where
    arbitrary = TestData <$> arbitrary <*> arbitrary

prop_TestEncodingSimple :: TestData -> Property
prop_TestEncodingSimple (td :: TestData) =
    let
        enc = encode td

        dec ∷ Either String TestData
        dec = eitherDecode enc
    in
        collect "dec ∘ enc ≍ id" $ isn't _Left dec

data Cluster = Cluster
    {
        _clName ∷ Text,
        _clRegion ∷ Text
    } deriving (Show, Eq, Ord, Generic)
instance ToJSON Cluster where
    toEncoding = lawlessToJSONEncoding
instance FromJSON Cluster where
    parseJSON = lawlessParseJSON

data Schema1 = Schema1
    {
        _sc1Name ∷ Text,
        _sc1Cluster ∷ Cluster
    } deriving (Show, Eq, Ord, Generic)
instance ToJSON Schema1 where
    toEncoding = lawlessToJSONEncoding
instance FromJSON Schema1 where
    parseJSON = lawlessParseJSON

properties ∷ Test
properties = $(testGroupGenerator)