generated from tpl/purs
108 lines
3.6 KiB
Haskell
108 lines
3.6 KiB
Haskell
module Test.Data.Postgres.Custom where
|
|
|
|
import Prelude
|
|
|
|
import Control.Monad.Error.Class (liftEither)
|
|
import Control.Monad.Except (runExceptT)
|
|
import Data.Bifunctor (lmap)
|
|
import Data.DateTime (DateTime(..))
|
|
import Data.Generic.Rep (class Generic)
|
|
import Data.Maybe (Maybe(..))
|
|
import Data.Newtype (unwrap)
|
|
import Data.Postgres (deserialize, serialize, smash)
|
|
import Data.Postgres.Custom (class CustomDeserialize, class CustomSerialize, customDeserialize)
|
|
import Data.Postgres.Custom.Enum (class CustomEnum, create, enumDeserialize, enumPrintExpr, enumSerialize, genericEnumVariants, genericParseEnum, genericPrintEnum, parseEnum, printEnum)
|
|
import Data.Show.Generic (genericShow)
|
|
import Effect.Class (liftEffect)
|
|
import Test.Spec (Spec, describe, it)
|
|
import Test.Spec.Assertions (shouldEqual)
|
|
import Unsafe.Coerce (unsafeCoerce)
|
|
|
|
data Enum1 = E1A
|
|
|
|
derive instance Generic Enum1 _
|
|
derive instance Eq Enum1
|
|
instance Show Enum1 where
|
|
show = genericShow
|
|
|
|
instance CustomSerialize Enum1 "enum_1" where
|
|
customPrintExpr a = enumPrintExpr a
|
|
customSerialize a = enumSerialize a
|
|
|
|
instance CustomDeserialize Enum1 "enum_1" where
|
|
customDeserialize a = enumDeserialize a
|
|
|
|
instance CustomEnum Enum1 "enum_1" where
|
|
printEnum = genericPrintEnum
|
|
parseEnum = genericParseEnum
|
|
enumVariants = genericEnumVariants
|
|
|
|
data Enum2 = E2A | E2B
|
|
|
|
derive instance Generic Enum2 _
|
|
derive instance Eq Enum2
|
|
instance Show Enum2 where
|
|
show = genericShow
|
|
|
|
instance CustomSerialize Enum2 "enum_2" where
|
|
customPrintExpr a = enumPrintExpr a
|
|
customSerialize a = enumSerialize a
|
|
|
|
instance CustomDeserialize Enum2 "enum_2" where
|
|
customDeserialize a = enumDeserialize a
|
|
|
|
instance CustomEnum Enum2 "enum_2" where
|
|
printEnum a = genericPrintEnum a
|
|
parseEnum a = genericParseEnum a
|
|
enumVariants = genericEnumVariants
|
|
|
|
data Enum5 = E5A | E5B | E5C | E5D | E5E
|
|
|
|
derive instance Generic Enum5 _
|
|
derive instance Eq Enum5
|
|
instance Show Enum5 where
|
|
show = genericShow
|
|
|
|
instance CustomSerialize Enum5 "enum_5" where
|
|
customPrintExpr a = enumPrintExpr a
|
|
customSerialize a = enumSerialize a
|
|
|
|
instance CustomDeserialize Enum5 "enum_5" where
|
|
customDeserialize a = enumDeserialize a
|
|
|
|
instance CustomEnum Enum5 "enum_5" where
|
|
printEnum a = genericPrintEnum a
|
|
parseEnum a = genericParseEnum a
|
|
enumVariants = genericEnumVariants
|
|
|
|
spec :: Spec Unit
|
|
spec =
|
|
describe "Test.Data.Postgres.Custom" do
|
|
describe "Enum" do
|
|
it "serialize" do
|
|
act <- liftEffect $ smash $ serialize E5A
|
|
exp <- liftEffect $ smash $ serialize "E5A"
|
|
act `shouldEqual` exp
|
|
it "deserialize" do
|
|
act <- liftEffect $ smash $ deserialize $ unsafeCoerce "E5A"
|
|
act `shouldEqual` E5A
|
|
it "create" do
|
|
(_.text $ unwrap $ create @Enum1) `shouldEqual` "create type enum_1 as enum ('E1A');"
|
|
(_.text $ unwrap $ create @Enum2) `shouldEqual` "create type enum_2 as enum ('E2A', 'E2B');"
|
|
(_.text $ unwrap $ create @Enum5) `shouldEqual` "create type enum_5 as enum ('E5A', 'E5B', 'E5C', 'E5D', 'E5E');"
|
|
it "parseEnum" do
|
|
parseEnum "E1A" `shouldEqual` Just E1A
|
|
parseEnum "E2A" `shouldEqual` Just E2A
|
|
parseEnum "E2B" `shouldEqual` Just E2B
|
|
parseEnum "E5B" `shouldEqual` Just E5B
|
|
it "printEnum" do
|
|
printEnum E1A `shouldEqual` "E1A"
|
|
printEnum E2A `shouldEqual` "E2A"
|
|
printEnum E2B `shouldEqual` "E2B"
|
|
printEnum E5D `shouldEqual` "E5D"
|
|
it "enumPrintExpr" do
|
|
enumPrintExpr E1A `shouldEqual` Just "'E1A' :: enum_1"
|
|
enumPrintExpr E2A `shouldEqual` Just "'E2A' :: enum_2"
|
|
enumPrintExpr E2B `shouldEqual` Just "'E2B' :: enum_2"
|
|
enumPrintExpr E5D `shouldEqual` Just "'E5D' :: enum_5"
|