packages feed

warlock-0.1.0.0: test/Warlock/AutoSpec.hs

{-# LANGUAGE TemplateHaskell #-}
{-# LANGUAGE MultiParamTypeClasses #-}
module Warlock.AutoSpec (spec) where

import Test.Hspec
import qualified Witch as W
import Warlock

-- Test types for basic field mapping
data Foobert = Foobert
  { foobertName :: String
  , foobertAge :: Int
  } deriving (Show, Eq)

data Barfoo = Barfoo
  { barfooName :: String
  , barfooAge :: Int
  } deriving (Show, Eq)

deriveAutomap (ByName datatypePrefixConfig) ''Foobert ''Barfoo
deriveAutomap (ByName datatypePrefixConfig) ''Barfoo ''Foobert

-- Test types for constructor prefix rules
data Person = Person
  { personFirstName :: String
  , personLastName :: String
  , personAge :: Int
  } deriving (Show, Eq)

data Employee = Employee
  { empFirstName :: String
  , empLastName :: String
  , empAge :: Int
  } deriving (Show, Eq)

deriveAutomap
  ( ByName $ defaultConfig { ruleGens = [customPrefixRules "emp" "person"] } )
  ''Person
  ''Employee

-- Test types for positional constructors
data Point2D = Point2D Int Int deriving (Show, Eq)
data Vector2D = Vector2D Int Int deriving (Show, Eq)

deriveAutomap (ByName defaultConfig) ''Point2D ''Vector2D

spec :: Spec
spec = do
  describe "Basic AutoMap functionality" $ do
    it "maps between records with datatype prefix rules" $ do
      let foobert = Foobert "Alice" 30
      let barfoo = W.from foobert :: Barfoo
      barfoo `shouldBe` Barfoo "Alice" 30

    it "maps between records with constructor prefix rules" $ do
      let person = Person "Bob" "Smith" 25
      let employee = W.from person :: Employee
      employee `shouldBe` Employee "Bob" "Smith" 25

    it "maps between positional constructors" $ do
      let point = Point2D 3 4
      let vector = W.from point :: Vector2D
      vector `shouldBe` Vector2D 3 4

  describe "Bidirectional mapping" $ do
    it "can map back and forth" $ do
      let original = Foobert "Test" 42
      let converted = W.from original :: Barfoo
      let back = W.from converted :: Foobert
      back `shouldBe` original