packages feed

AlgoRhythm-0.1.0.0: test/TVec.hs

{-# LANGUAGE PostfixOperators    #-}
{-# LANGUAGE ScopedTypeVariables #-}
{-# LANGUAGE GADTs #-}
{-# language DataKinds #-}
module TVec where

import Utils.Vec
import Test.Framework                       (Test, testGroup)
import Test.Framework.Providers.HUnit       (testCase)
import Test.HUnit                           ((@?=))

len :: Vec n a -> Integer
len v = foldr (\_ -> (1+)) 0 v

addElem :: a -> Vec n a -> Vec (S n) a
addElem a v = a :. v

sameElems :: Eq a => Vec n a -> [a] -> Bool
sameElems  Nil    []     = True
sameElems (y:.ys) (x:xs) = x == y && sameElems ys xs
sameElems  _       _     = False

-- Since it's pretty much impossible to generate arbitrary Vecs that have
-- their length encoded in their type, only some hardcoded Vecs are tested.
vecTests :: Test
vecTests = testGroup "Vec"
  [ testCase "0-elem vec length" $
      len v0 @?= 0
  , testCase "0-elem vec list length" $
      length (list v0) @?= 0
  , testCase "0-elem vec list same elems" $
      sameElems v0 [] @?= True
  , testCase "0-elem vec addElem" $
      (addElem 1 v0) @?= v1

  , testCase "1-elem vec length" $
      len v1 @?= 1
  , testCase "1-elem vec list length" $
      length (list v1) @?= 1
  , testCase "1-elem vec list same elems" $
      sameElems v1 [1] @?= True
  , testCase "1-elem vec addElem" $
      addElem 2 v1 @?= v2

  , testCase "2-elem vec length" $
      len v2 @?= 2
  , testCase "2-elem vec list length" $
      length (list v2) @?= 2
  , testCase "2-elem vec list same elems" $
      sameElems v2 [2,1] @?= True
  , testCase "2-elem vec addElem" $
      addElem 3 v2 @?= v3
  ]
  where v0 = Nil :: Vec D0 Int
        v1 = 1 :. Nil
        v2 = 2 :. 1 :. Nil
        v3 = 3 :. 2 :. 1 :. Nil