packages feed

large-anon-0.1.0.0: test/Test/Sanity/CheckIsSubRow.hs

{-# LANGUAGE DataKinds        #-}
{-# LANGUAGE TypeApplications #-}
{-# LANGUAGE TypeOperators    #-}

{-# OPTIONS_GHC -fplugin=Data.Record.Anon.Plugin #-}

module Test.Sanity.CheckIsSubRow (tests) where

import Data.Typeable

import Data.Record.Anon
import Data.Record.Anon.Advanced (Record)

import Test.Tasty
import Test.Tasty.HUnit

import Test.Infra.Discovery

tests :: TestTree
tests = testGroup "Test.Sanity.CheckIsSubRow" [
      testCase "maybeProject" test_maybeProject
    ]

test_maybeProject :: Assertion
test_maybeProject = do
    case maybeProject example1 (Proxy @Row2) of
      Left  _  -> assertFailure "Should be able to project to Row2"
      Right r1 -> assertEqual "Should be equal" r1 example2

    case maybeProject example1 (Proxy @Row3) of
      Left missing -> assertEqual "missing" ["c"] missing
      Right _      -> assertFailure "Should not be able to project to Row3"

{-------------------------------------------------------------------------------
  Example values
-------------------------------------------------------------------------------}

type Row1 = [ "a" := Int, "b" := Bool, "c" := Char ]
type Row2 = [ "c" := Char, "a" := Int ]
type Row3 = [ "c" := Bool, "a" := Int ]

example1 :: Record I Row1
example1 = ANON_F {
      a = I 1
    , b = I True
    , c = I 'a'
    }

example2 :: Record I Row2
example2 = ANON_F {
      c = I 'a'
    , a = I 1
    }