packages feed

highjson-th-0.4.0.0: test/Data/HighJson/THSpec.hs

{-# LANGUAGE DataKinds #-}
{-# LANGUAGE OverloadedStrings #-}
{-# LANGUAGE ScopedTypeVariables #-}
{-# LANGUAGE TemplateHaskell #-}
module Data.HighJson.THSpec
    ( spec )
where

import Data.HighJson
import Data.HighJson.TH

import Control.Lens.TH
import Data.Swagger
import Test.Hspec
import Test.QuickCheck hiding (Success)

data SomeSum
    = SomeSumInt Int
    | SomeSumDummy Bool
    deriving (Show, Eq)

makePrisms ''SomeSum

someSumSpec :: SumTypeSpec SomeSum '[Int, Bool]
someSumSpec =
    sumSpec "some sum" Nothing $
    "int" .-> _SomeSumInt
    :& "dummy" .-> _SomeSumDummy

$(deriveJsonSwagger ''SomeSum 'someSumSpec)

instance Arbitrary SomeSum where
    arbitrary =
        oneof
        [ SomeSumInt <$> arbitrary
        , SomeSumDummy <$> arbitrary
        ]

spec :: Spec
spec =
    it "should work for sum types" $
    property $ \(t :: SomeSum) -> validateToJSON t `shouldBe` []