{-# LANGUAGE DeriveAnyClass #-}
{-# LANGUAGE DeriveGeneric #-}
{-# LANGUAGE OverloadedStrings #-}
{-# LANGUAGE DataKinds #-}
{-# LANGUAGE TypeOperators #-}
{-# LANGUAGE FlexibleInstances #-}
{-# LANGUAGE ScopedTypeVariables #-}
module Sum where
-- base
import GHC.Generics
-- aeson
import Data.Aeson (FromJSON, ToJSON)
-- containers
import qualified Data.Map as Map
-- hspec
import Test.Hspec
-- QuickCheck
import Test.QuickCheck hiding (Result, Success)
-- quickcheck-arbitrary-adt
import Test.QuickCheck.Arbitrary.ADT
import Test.Aeson.Internal.ADT.GoldenSpecs
-- servant
import Servant.API
-- servant-server
import Servant
-- ocaml-export
import OCaml.Export hiding (mkGoldenFiles)
import Util
type SumPackage
= OCamlPackage "sum" NoDependency :>
(OCamlModule '["OnOrOff"] :> OnOrOff
:<|> OCamlModule '["NameOrIdNumber"] :> NameOrIdNumber
:<|> OCamlModule '["SumVariant"] :> SumVariant
:<|> OCamlModule '["WithTuple"] :> WithTuple
:<|> OCamlModule '["SumWithRecord"] :> SumWithRecord
:<|> OCamlModule '["Result"] :> Result TypeParameterRef0 TypeParameterRef1
:<|> OCamlModule '["NewType"] :> NewType)
compareInterfaceFiles = compareFiles "test/interface" "sum" True
compareNoInterfaceFiles = compareFiles "test/nointerface" "sum" False
mkGolden :: forall a. (ToADTArbitrary a, ToJSON a) => Proxy a -> IO ()
mkGolden Proxy = mkGoldenFileForType 10 (Proxy :: Proxy a) "test/interface/golden/golden/sum"
mkGoldenFiles :: IO ()
mkGoldenFiles = do
mkGolden (Proxy :: Proxy OnOrOff)
mkGolden (Proxy :: Proxy NameOrIdNumber)
mkGolden (Proxy :: Proxy SumVariant)
mkGolden (Proxy :: Proxy WithTuple)
mkGolden (Proxy :: Proxy SumWithRecord)
mkGolden (Proxy :: Proxy (Result TypeParameterRef0 TypeParameterRef1))
mkGolden (Proxy :: Proxy NewType)
spec :: Spec
spec = do
runIO mkGoldenFiles
let dir = "test/interface/temp"
runIO $ mkPackage (Proxy :: Proxy SumPackage) (PackageOptions dir "sum" Map.empty True $ Just $ SpecOptions "__tests__/sum" "golden/sum" "http://localhost:8082")
describe "OCaml Declaration with Interface: Sum Types" $ do
compareInterfaceFiles "OnOrOff"
compareInterfaceFiles "NameOrIdNumber"
compareInterfaceFiles "SumVariant"
compareInterfaceFiles "WithTuple"
compareInterfaceFiles "SumWithRecord"
compareInterfaceFiles "Result"
compareInterfaceFiles "NewType"
{-
let dir2 = "test/nointerface/temp"
runIO $ mkPackage (Proxy :: Proxy SumPackage) (PackageOptions dir2 "sum" Map.empty False Nothing)
describe "Sum Types" $ do
compareNoInterfaceFiles "OnOrOff"
compareNoInterfaceFiles "NameOrIdNumber"
compareNoInterfaceFiles "SumVariant"
compareNoInterfaceFiles "WithTuple"
compareNoInterfaceFiles "SumWithRecord"
compareNoInterfaceFiles "Result"
compareNoInterfaceFiles "NewType"
-}
data OnOrOff = On | Off
deriving (Show,Eq,Generic,OCamlType,ToJSON,FromJSON)
instance Arbitrary OnOrOff where
arbitrary = elements [On, Off]
instance ToADTArbitrary OnOrOff
data NameOrIdNumber = Name String | IdNumber Int
deriving (Show, Eq, Generic, OCamlType,ToJSON,FromJSON)
instance Arbitrary NameOrIdNumber where
arbitrary = oneof [Name <$> arbitrary, IdNumber <$> arbitrary]
instance ToADTArbitrary NameOrIdNumber
data Result a b
= Success a
| Error b
deriving (Show, Eq, Generic, OCamlType, ToJSON, FromJSON)
instance Arbitrary (Result TypeParameterRef0 TypeParameterRef1) where
arbitrary = oneof [Success <$> arbitrary, Error <$> arbitrary]
instance ToADTArbitrary (Result TypeParameterRef0 TypeParameterRef1)
data SumVariant
= HasNothing
| HasSingleInt Int
| HasSingleTuple (Int,Int)
| HasMultipleInts Int Int
| HasMultipleTuples (Int,Int) (Int,Int)
| HasMixed Int String Double
deriving (Show,Eq,Generic, OCamlType, ToJSON, FromJSON)
instance Arbitrary SumVariant where
arbitrary =
oneof
[ pure HasNothing
, HasSingleInt <$> arbitrary
, HasSingleTuple <$> arbitrary
, HasMultipleInts <$> arbitrary <*> arbitrary
, HasMultipleTuples <$> arbitrary <*> arbitrary
, HasMixed <$> arbitrary <*> arbitrary <*> arbitrary
]
instance ToADTArbitrary SumVariant
type Tuple
= (Int,Int)
data WithTuple = WithTuple Tuple
deriving (Show,Eq,Generic, OCamlType, ToJSON, FromJSON)
instance Arbitrary WithTuple where
arbitrary = WithTuple <$> arbitrary
instance ToADTArbitrary WithTuple
data SumWithRecord
= A1 {a1 :: Int}
| B2 {b2 :: String, b3 :: Int}
deriving (Show,Eq,Generic, OCamlType, ToJSON, FromJSON)
instance Arbitrary SumWithRecord where
arbitrary =
oneof
[ A1 <$> arbitrary
, B2 <$> arbitrary <*> arbitrary
]
instance ToADTArbitrary SumWithRecord
newtype NewType
= NewType Int
deriving (Show,Eq,Generic,OCamlType, ToJSON, FromJSON)
instance Arbitrary NewType where
arbitrary = NewType <$> arbitrary
instance ToADTArbitrary NewType