packages feed

incremental-computing-0.0.0.0: src/test-suites/TestSuite/Sequence.hs

module TestSuite.Sequence (

    tests

) where

-- Data

import           Data.Foldable (asum)
import           Data.Incremental
import           Data.Sequence (Seq)
import qualified Data.Sequence             as Seq
import qualified Data.Incremental.Sequence as IncSeq

-- Test

import Test.QuickCheck
import Test.QuickCheck.Poly

-- Distribution

import Distribution.TestSuite

-- TestSuite
import TestSuite

-- * Tests

tests :: IO [Test]
tests = return [transTest "singleton" IncSeq.singleton
                                      (Seq.singleton :: A -> Seq A),
                transTest "fromPair"  IncSeq.fromPair
                                      (seqFromPair :: (A, A) -> Seq A),
                transTest "cat"       IncSeq.cat
                                      (seqCat :: (Seq A, Seq A) -> Seq A),
                transTest "null"      IncSeq.null
                                      (Seq.null :: Seq A -> Bool),
                transTest "length"    IncSeq.length
                                      (Seq.length :: Seq A -> Int),
                transTest "map"       (IncSeq.map testTrans)
                                      (fmap (toFunction testTrans)),
                transTest "map'"      (IncSeq.map' testFun)
                                      (fmap testFun),
                transTest "concat"    IncSeq.concat
                                      (seqConcat :: Seq (Seq A) -> Seq A),
                transTest "gate"      (IncSeq.gate testPrdTrans)
                                      (seqGate (toFunction testPrdTrans)),
                transTest "gate'"     (IncSeq.gate' testPrdFun)
                                      (seqGate testPrdFun),
                transTest "filter"    (IncSeq.filter testPrdTrans)
                                      (Seq.filter (toFunction testPrdTrans)),
                transTest "filter'"   (IncSeq.filter' testPrdFun)
                                      (Seq.filter testPrdFun),
                transTest "reverse"   IncSeq.reverse
                                      (Seq.reverse :: Seq A -> Seq A),
                transTest "sort"      IncSeq.sort
                                      (Seq.sort :: Seq A -> Seq A),
                transTest "sortBy"    (IncSeq.sortBy testCompare)
                                      (Seq.sortBy testCompare)]
-- FIXME: Explain why we have no test for concatMap.

seqFromPair :: (a, a) -> Seq a
seqFromPair (val1, val2) = Seq.fromList [val1, val2]

seqCat :: (Seq a, Seq a) -> Seq a
seqCat = uncurry (Seq.><)

seqConcat :: Seq (Seq a) -> Seq a
seqConcat = asum

seqGate :: (a -> Bool) -> a -> Seq a
seqGate prd val | prd val   = Seq.singleton val
                | otherwise = Seq.empty