packages feed

hvect-0.2.0.0: test/Data/HVectTest.hs

{-# OPTIONS_GHC -F -pgmF htfpp #-}
{-# LANGUAGE GADTs #-}
{-# LANGUAGE DataKinds #-}
module Data.HVectTest (htf_thisModulesTests) where

import Test.Framework
import Data.HVect
import qualified Data.HVect as HV

test_eqInstance :: IO ()
test_eqInstance =
    do assertBool ("foo" :&: "bar" :&: empty == "foo" :&: "bar" :&: empty)
       assertBool ("foo" :&: True :&: empty == "foo" :&: True :&: empty)
       assertBool ("foo" :&: False :&: empty /= "foo" :&: True :&: empty)

test_ordInstance :: IO ()
test_ordInstance =
   do assertEqual ([1, 2, 3] `compare` [1, 2, 3]) ((1 :&: 2 :&: 3 :&: empty) `compare` (1 :&: 2 :&: 3 :&: empty))
      assertEqual ([3, 2, 3] `compare` [1, 2, 3]) ((3 :&: 2 :&: 3 :&: empty) `compare` (1 :&: 2 :&: 3 :&: empty))
      assertEqual ([1, 2, 3] `compare` [1, 1, 3]) ((3 :&: 2 :&: 3 :&: empty) `compare` (1 :&: 1 :&: 3 :&: empty))
      assertEqual ([1, 2, 3] <= [1, 2, 3]) ((1 :&: 2 :&: 3 :&: empty) <= (1 :&: 2 :&: 3 :&: empty))
      assertEqual ([3, 2, 3] <= [1, 2, 3]) ((3 :&: 2 :&: 3 :&: empty) <= (1 :&: 2 :&: 3 :&: empty))
      assertEqual ([1, 2, 3] <= [1, 1, 3]) ((3 :&: 2 :&: 3 :&: empty) <= (1 :&: 1 :&: 3 :&: empty))
      assertEqual EQ ((1 :&: 2 :&: True :&: empty) `compare` (1 :&: 2 :&: True :&: empty))
      assertEqual ("foo" `compare` "bar") ((1 :&: "foo" :&: True :&: empty) `compare` (1 :&: "bar" :&: True :&: empty))

test_reverse :: IO ()
test_reverse =
    do assertEqual empty (HV.reverse empty)
       assertEqual (2 :&: 1 :&: empty) (HV.reverse $ 1 :&: 2 :&: empty)
       assertEqual (True :&: "foo" :&: 1 :&: empty) (HV.reverse $ 1 :&: "foo" :&: True :&: empty)

test_head :: IO ()
test_head =
    do assertEqual 1 (HV.head $ 1 :&: empty)
       assertEqual 1 (HV.head $ 1 :&: 2 :&: empty)

test_tail :: IO ()
test_tail =
    do assertEqual empty (HV.tail $ 1 :&: empty)
       assertEqual (2 :&: empty) (HV.tail $ 1 :&: 2 :&: empty)

test_null :: IO ()
test_null =
    do assertBool (HV.null empty)
       assertBool (not $ HV.null $ 1 :&: empty)

test_concat :: IO ()
test_concat =
    do assertEqual (1 :&: 2 :&: "foo" :&: "bar" :&: empty) ((1 :&: 2 :&: empty) <++> ("foo" :&: "bar" :&: empty))
       assertEqual (1 :&: 2 :&: empty) ((1 :&: 2 :&: empty) <++> empty)


test_curryUncurry :: IO ()
test_curryUncurry =
    do assertEqual "12" (fun (1 :&: 2 :&: empty))
       assertEqual "12" (HV.curry fun 1 2)
       assertEqual "12" (HV.uncurry (HV.curry fun) (1 :&: 2 :&: empty))
    where
      fun :: HVect [Int, Int] -> String
      fun (a :&: b  :&: HNil) = show a ++ show b
      fun _ = "OOPS!"

test_length :: IO ()
test_length =
    do assertEqual 0 (sNatToInt $ HV.length empty)
       assertEqual 2 (sNatToInt $ HV.length ("foo" :&: "bar" :&: empty))
       assertEqual 5 (sNatToInt $ HV.length ("aaa" :&: False :&: True :&: "foo" :&: "bar" :&: empty))

test_idxAccess :: IO ()
test_idxAccess =
    do assertEqual "foo" (SZero HV.!! ("foo" :&: "bar" :&: empty))
       assertEqual "bar" (SSucc SZero HV.!! ("foo" :&: "bar" :&: empty))
       assertEqual "bar" (SSucc (SSucc SZero) HV.!! (True :&: "foo" :&: "bar" :&: empty))