packages feed

red-black-record-2.1.6.0: tests/tests-generically.hs

{-# LANGUAGE DataKinds,
             TypeOperators,
             TypeFamilies,
             TypeApplications,
             DeriveGeneric,
             StandaloneDeriving,
             DerivingStrategies,
             UndecidableInstances,
             KindSignatures,
             PartialTypeSignatures,
             FlexibleContexts,
             ScopedTypeVariables
#-}
{-# OPTIONS_GHC -Wno-partial-type-signatures #-}
module Main where

import Data.RBR
import TypeLevelRecordDot

import GHC.Generics (Generic, Generically(..))

import Test.Tasty
import Test.Tasty.HUnit (testCase,Assertion,assertEqual,assertBool)

main :: IO ()
main = defaultMain tests


data Person = Person { 
    personName :: String, 
    address :: Address,
    func :: Bool -> Int -> Address 
    }
    deriving stock (Generic)

data Address = Address { 
    street :: String, 
    number :: Int, 
    other :: Int
    }
    deriving stock (Generic)

-- | Checking that 'Dot' has the proper associativity...
foo :: Person `Dot` "address" `Dot` "number" 
foo = 5

foof :: Person `Dot` "func" `Dot` "number" 
foof = \_ _ -> 3

tests :: TestTree
tests = testGroup "Tests" [ testCase "generically" testGenerically
    ]

testGenerically :: Assertion
testGenerically = do
    let r = Person "Foo" (Address "Somestreet" 1 2 ) (\_ _ -> Address "Somestreet" 1 2)
        a = Data.RBR.getFieldI @"address" (Data.RBR.toRecord (Generically r))
        n = Data.RBR.getFieldI @"number" (Data.RBR.toRecord (Generically a))
    assertEqual "number" n 1