packages feed

strict-data-0.2.0.2: test/StrictList.hs

{-# LANGUAGE TypeOperators #-}
{-# OPTIONS_GHC -F -pgmF htfpp -fno-warn-type-defaults #-}
module StrictList (htf_thisModulesTests) where

import Data.Option
import Data.StrictList
import Data.StrictTuple

import Prelude hiding
    ( (!!)
    , all
    , any
    , break
    , concat
    , concatMap
    , drop
    , dropWhile
    , elem
    , filter
    , length
    , lookup
    , map
    , mapM
    , mapM_
    , notElem
    , null
    , replicate
    , reverse
    , span
    , take
    , takeWhile
    , unzip
    , zip
    , zipWith
    )
import Test.Framework
import qualified Prelude as P

test_nub :: IO ()
test_nub =
    do assertEqual (sl [1, 5, 2] :: SL Int) $ nub (sl [1, 5, 1, 2, 5, 2])

test_unzip :: IO ()
test_unzip =
    do assertEqual ((1:!2:!Nil) :!: ('a':!'b':!Nil)) (unzip ((1 :!: 'a') :! (2 :!: 'b') :! Nil))
       assertEqual ((1:!2:!Nil) :!: ('a':!'b':!Nil)) (unzipL [(1:!:'a'),(2:!:'b')])
       assertEqual ((1:!2:!Nil) :!: ('a':!'b':!Nil)) (unzipLL [(1,'a'),(2,'b')])

test_dropWhileEnd :: IO ()
test_dropWhileEnd =
    do assertEqual Nil $ dropWhileEnd (<= 1) $ Nil
       assertEqual Nil $ dropWhileEnd (<= 1) $ 1 :! Nil
       assertEqual (1 :! 2 :! Nil) $ dropWhileEnd (<= 1) $ 1 :! 2 :! 1 :! Nil


prop_partition :: [Int] -> Bool
prop_partition l =
    let me :: ([Int], [Int])
        me = (\(xs, ys) -> (toLazyList xs, toLazyList ys)) $ partition even $ fromLazyList l
    in (P.filter even l, P.filter odd l) == me

test_insert :: IO ()
test_insert =
    do assertEqual (1 :! Nil) (insert 1 Nil)
       assertEqual (1 :! 2 :! Nil) (insert 1 (2 :! Nil))
       assertEqual (1 :! 2 :! Nil) (insert 2 (1 :! Nil))
       assertEqual (1 :! 2 :! 3 :! Nil) (insert 2 (1 :! 3 :! Nil))
       assertEqual (1 :! 2 :! 3 :! Nil) (insert 3 (1 :! 2 :! Nil))
       assertEqual (1 :! 2 :! 2 :! Nil) (insert 2 (1 :! 2 :! Nil))
       assertEqual (2 :! 3 :! 1 :! Nil) (insert 2 (3 :! 1 :! Nil))

test_lookup :: IO ()
test_lookup =
    do assertEqual None (lookup True (mk []))
       assertEqual (Some 'a') (lookup True (mk [(True, 'a')]))
       assertEqual (Some 'a') (lookup True (mk [(False, 'b'),(True, 'a')]))
       assertEqual (Some 'a') (lookup True (mk [(False, 'b'),(True, 'a'),(False, 'c')]))
       assertEqual (Some 'a') (lookup True (mk [(False, 'b'),(False, 'c'),(True, 'a')]))
       assertEqual None (lookup True (mk [(False, 'b')]))
       assertEqual None (lookup True (mk [(False, 'a'), (False, 'b')]))
    where
      mk :: [(Bool,Char)] -> StrictList (Bool :!: Char)
      mk = fromLazyList . fmap fromLazyTuple

prop_take :: Int -> [Int] -> Bool
prop_take l lst =
    let me :: [Int]
        me = toLazyList $ take l (fromLazyList lst)
    in P.take l lst == me

-- test_sort :: IO ()
-- test_sort =
--     do let list = fromLazyList [1..133]
--        list' <- Cpm.Util.Random.shuffle (toLazyList list)
--        assertEqual list (sort (fromLazyList list'))

test_headOpt :: IO ()
test_headOpt =
    do assertEqual (Some "B") $ headOpt $ fromLazyList ["B","C"]
       assertEqual None $ headOpt (Nil :: StrictList ())

test_lastOpt :: IO ()
test_lastOpt =
    do assertEqual (Some 5) $ lastOpt $ fromLazyList [2,4,5]
       assertEqual (Some 5) $ lastOpt $ fromLazyList [5]
       assertEqual None $ lastOpt $ (Nil :: StrictList ())

test_findIndex :: IO ()
test_findIndex =
    do assertEqual None $ findIndex (== "A") $ fromLazyList ["B","C"]
       assertEqual None $ findIndex (== "A") Nil
       assertEqual (Some 1) $ findIndex (== "C") $ fromLazyList ["B","C","D"]
       assertEqual (Some 0) $ findIndex (/= "C") $ fromLazyList ["B","C","D"]

test_reverse :: IO ()
test_reverse =
    do assertEqual (fromLazyList ["D","C","B"]) (reverse $ fromLazyList ["B","C","D"])
       assertEqual (Nil :: StrictList ()) $ reverse Nil

test_replicate :: IO ()
test_replicate =
  do assertEqual (replicate 3 'a') (fromLazyList (P.replicate 3 'a'))
     assertEqual (replicate 3 'b') ('b' :! 'b' :! 'b' :! Nil)
     assertEqual (replicate 0 'c') Nil
     assertEqual (replicate 0 'd') (fromLazyList (P.replicate 0 'e'))

test_dropWhile :: IO ()
test_dropWhile =
    do assertEqual (fromLazyList [5]) $ dropWhile even $ fromLazyList [2,4,5]
       assertEqual (fromLazyList [2,4,5]) $ dropWhile odd $ fromLazyList [2,4,5]
       assertEqual Nil $ dropWhile (>=1) $ fromLazyList [2,4,5]

test_stripPrefix :: IO ()
test_stripPrefix =
    do assertEqual (Just Nil) $ stripPrefix Nil (Nil :: SL Int)
       assertEqual (Just $ 1 :! Nil) $ stripPrefix Nil (1 :! Nil)
       assertEqual (Just Nil) $ stripPrefix (1 :! Nil) (1 :! Nil)
       assertEqual (Just $ 3 :! Nil) $ stripPrefix (1 :! 2 :! Nil) (1 :! 2 :! 3 :! Nil)
       assertEqual Nothing $ stripPrefix (1 :! Nil) Nil

test_stripSuffix :: IO ()
test_stripSuffix =
    do assertEqual (Just Nil) $ stripSuffix Nil (Nil :: SL Int)
       assertEqual (Just $ 1 :! Nil) $ stripSuffix Nil (1 :! Nil)
       assertEqual (Just Nil) $ stripSuffix (1 :! Nil) (1 :! Nil)
       assertEqual (Just $ 1 :! Nil) $ stripSuffix (2 :! 3 :! Nil) (1 :! 2 :! 3 :! Nil)
       assertEqual Nothing $ stripSuffix (1 :! Nil) Nil

test_deleteIdx :: IO ()
test_deleteIdx =
    do assertEqual (1 :! Nil) $ deleteIdx (-5) (1 :! Nil)
       assertEqual (1 :! 3 :! Nil) $ deleteIdx 1 (1 :! 2 :! 3 :! Nil)
       assertEqual Nil $ deleteIdx 0 ("B" :! Nil)
       assertEqual (fromLazyList ["a","B","C","D","E"]) $
                   deleteIdx 5 (fromLazyList ["a","B","C","D","E","Q"])
       assertEqual (fromLazyList [1,3,2,4]) $
                    deleteIdx 4 (fromLazyList [1,3,2,4])

test_atIdx :: IO ()
test_atIdx =
    do assertEqual (Some 1) $ atIdx 0 (1 :! Nil)
       assertEqual None $ atIdx 6 (1 :! 2 :! 3 :! Nil)
       assertEqual None $ atIdx (-3) ("B" :! Nil)
       assertEqual (Some "a") $ atIdx 5 (fromLazyList ["g","q","s","u","xc","a"])

test_snoc :: IO ()
test_snoc =
    do assertEqual (True :! Nil) (snoc Nil True)
       assertEqual (False :! True :! Nil) (snoc (False :! Nil) True)

test_transpose :: IO ()
test_transpose =
    do assertEqual (f [[1,4],[2,5],[3,6]]) (transpose (f [[1,2,3],[4,5,6]]))
       assertEqual (f [[1,2,3],[4,5],[6]]) (transpose (f [[1,4],[2],[],[3,5,6]]))
    where
      f = fmap sl . sl

prop_difference :: SL Int -> SL Int -> Bool
prop_difference xs ys = (xs +!+ ys) \!\ xs == ys

test_delete :: IO ()
test_delete =
    do assertEqual (sl "bnana") (delete 'a' (sl "banana"))
       assertEqual Nil (delete 'a' Nil)

test_merge :: IO ()
test_merge =
    assertEqual (sl "abcdef" :: SL Char) (merge (sl "acde") (sl "abdf"))