module Generic (tests) where
import Data.Aeson as A
import Data.Aeson.TypeScript.Recursive
import Data.Aeson.TypeScript.TH
import Data.Aeson.TypeScript.Types
import Data.Map
import Data.Proxy
import Data.String.Interpolate
import Data.Text
import Prelude hiding (Double)
import Test.Hspec
data Complex a = Product Int a | Unary Int
$(deriveTypeScript defaultOptions ''Complex)
data Complex2 a = Product2 Int a
$(deriveTypeScript (defaultOptions { sumEncoding = UntaggedValue }) ''Complex2)
data Complex3 k = Product3 { record3 :: [k] }
$(deriveTypeScript defaultOptions ''Complex3)
data Complex4 k = Product4 { record4 :: Map Text k }
$(deriveTypeScript defaultOptions ''Complex4)
tests :: SpecWith ()
tests = describe "Generic instances" $ do
it [i|Complex makes the declaration and types correctly|] $ do
(getTypeScriptDeclarationsRecursively (Proxy :: Proxy (Complex String))) `shouldBe` [
TSInterfaceDeclaration "IProduct" ["T"] [TSField False "tag" "\"Product\"" Nothing, TSField False "contents" "[number, T]" Nothing] Nothing
,TSInterfaceDeclaration "IUnary" ["T"] [TSField False "tag" "\"Unary\"" Nothing, TSField False "contents" "number" Nothing] Nothing
,TSTypeAlternatives "Complex" ["T"] ["IProduct<T>","IUnary<T>"] Nothing
]
it [i|Complex2 makes the declaration and types correctly|] $ do
(getTypeScriptDeclarationsRecursively (Proxy :: Proxy (Complex2 String))) `shouldBe` [
TSTypeAlternatives "Complex2" ["T"] ["IProduct2<T>"] Nothing
,TSTypeAlternatives "IProduct2" ["T"] ["[number, T]"] Nothing
]
it [i|Complex3 makes the declaration and types correctly|] $ do
(getTypeScriptDeclarationsRecursively (Proxy :: Proxy (Complex3 String))) `shouldBe` [
TSInterfaceDeclaration "IProduct3" ["T"] [TSField False "record3" "T[]" Nothing] Nothing
,TSTypeAlternatives "Complex3" ["T"] ["IProduct3<T>"] Nothing
]
(getTypeScriptDeclarationsRecursively (Proxy :: Proxy (Complex3 Int))) `shouldBe` [
TSInterfaceDeclaration "IProduct3" ["T"] [TSField False "record3" "T[]" Nothing] Nothing
,TSTypeAlternatives "Complex3" ["T"] ["IProduct3<T>"] Nothing
]
it [i|Complex4 makes the declaration and types correctly|] $ do
(getTypeScriptDeclarationsRecursively (Proxy :: Proxy (Complex4 String))) `shouldBe` [
TSInterfaceDeclaration "IProduct4" ["T"] [TSField False "record4" "{[k in string]?: T}" Nothing] Nothing
,TSTypeAlternatives "Complex4" ["T"] ["IProduct4<T>"] Nothing
]
main :: IO ()
main = hspec tests