{-# LANGUAGE GeneralizedNewtypeDeriving #-}
{-# OPTIONS_GHC -fno-warn-orphans #-}
module Main where
import Data.List
import qualified Data.Map.Strict as Map
import qualified Data.Set as Set
import qualified Data.Text.Short as ST
import Test.QuickCheck.Instances ()
import Test.Tasty
import Test.Tasty.QuickCheck as QC
import qualified Data.TextArray.Unboxed as TA
import qualified Data.TextMap.Unboxed.Lazy as TM
import qualified Data.TextSet.Unboxed as TS
main :: IO ()
main = defaultMain tests
-- compat for containers<0.5.9
setLookupMin :: Set.Set a -> Maybe a
setLookupMin s = if Set.null s then Nothing else Just (Set.findMin s)
setLookupMax :: Set.Set a -> Maybe a
setLookupMax s = if Set.null s then Nothing else Just (Set.findMax s)
instance Arbitrary ST.ShortText where
arbitrary = ST.fromText <$> arbitrary
instance Arbitrary TA.TextArray where
arbitrary = TA.fromList <$> arbitrary
tests :: TestTree
tests = testGroup "Tests" [testsMapLazy, testsSet, testsArray]
where
testsArray = testGroup "TextArray"
[ QC.testProperty "toList.fromList" $
\xs -> (TA.toList . TA.fromList) xs == xs
, QC.testProperty "singleton" $
\x -> (TA.toList . TA.singleton) x == [x]
, QC.testProperty "length" $
\xs -> length xs == TA.length (TA.fromList xs)
, QC.testProperty "null" $
\xs -> null xs == TA.null (TA.fromList xs)
, QC.testProperty "elem" $
\xs -> all (`TA.elem` (TA.fromList xs)) xs
, QC.testProperty "elemIndices" $
\t0 t1 t2 t3 t4 t5 -> let xs = [t1,t0,t2,t0,t3,t0,t4,t5]
ta = TA.fromList xs
in all (\z -> elemIndices z xs == TA.elemIndices z ta) xs
, QC.testProperty "elemIndices#2" $
\xs -> let ta = TA.fromList xs
in all (\z -> elemIndices z xs == TA.elemIndices z ta) (ST.fromString "Shakespeare":xs)
, QC.testProperty "(!?)" $
\xs -> let ta = TA.fromList xs
in mapM (ta TA.!?) [0.. (TA.length ta)-1] == Just xs
, QC.testProperty "append" $
\xs ys -> TA.fromList (xs++ys) == TA.fromList xs `mappend` TA.fromList ys
-- , QC.testProperty "findAllOrd EQ" $
-- \xs -> let ta = TA.fromList xs
-- in all (\z -> filter (==z) xs == TA.findAllOrd (==EQ) z ta) (ST.fromString "Shakespeare":xs)
-- , QC.testProperty "findIndicesOrd EQ" $
-- \xs -> let ta = TA.fromList xs
-- in all (\z -> findIndices (==z) xs == TA.findIndicesOrd (==EQ) z ta) (ST.fromString "Shakespeare":xs)
]
testsSet = testGroup "TextSet"
[ QC.testProperty "toList.fromList" $
\xs -> (TS.toList . TS.fromList) xs == (Set.toList . Set.fromList) xs
, QC.testProperty "singleton" $
\x -> (TS.toList . TS.singleton) x == [x]
, QC.testProperty "toList.fromSet" $
\xs -> (TS.toList . TS.fromSet) xs == Set.toList xs
, QC.testProperty "toList.toSet" $
\xs -> (TS.toSet . TS.fromList) xs == Set.fromList xs
, QC.testProperty "size" $
\xs -> Set.size (Set.fromList xs) == TS.size (TS.fromList xs)
, QC.testProperty "null" $
\xs -> null xs == TS.null (TS.fromList xs)
, QC.testProperty "member" $
\xs -> all (`TS.member` (TS.fromList xs)) xs
, QC.testProperty "(!?)" $
\xs -> let s1 = TS.fromList xs
s2 = Set.fromList xs
in all (\j -> s1 TS.!? j == Just (Set.elemAt j s2)) [0 .. Set.size s2 - 1]
, QC.testProperty "lookupMin" $
\xs -> (TS.lookupMin . TS.fromList) xs == (setLookupMin . Set.fromList) xs
, QC.testProperty "lookupMax" $
\xs -> (TS.lookupMax . TS.fromList) xs == (setLookupMax . Set.fromList) xs
, QC.testProperty "lookupIndex" $
\xs -> let s1 = TS.fromList xs
s2 = Set.fromList xs
in all (\k -> TS.lookupIndex k s1 == Set.lookupIndex k s2) (someStrs ++ xs)
, QC.testProperty "lookupLE" $
\xs -> let s1 = TS.fromList xs
s2 = Set.fromList xs
in all (\k -> fmap snd (TS.lookupLE k s1) == Set.lookupLE k s2) (someStrs ++ xs)
, QC.testProperty "lookupGE" $
\xs -> let s1 = TS.fromList xs
s2 = Set.fromList xs
in all (\k -> fmap snd (TS.lookupGE k s1) == Set.lookupGE k s2) (someStrs ++ xs)
]
testsMapLazy = testGroup "TextMap(Lazy)"
[ QC.testProperty "toList.fromList" $
\(Ps xs) -> (TM.toList . TM.fromList) xs == (Map.toList . Map.fromList) xs
, QC.testProperty "singleton" $
\x y -> TM.toList (TM.singleton x y) == [(x,y::Int)]
, QC.testProperty "toList.fromMap" $
\xs -> (TM.toList . TM.fromMap) xs == Map.toList (xs :: Map.Map ST.ShortText Int)
, QC.testProperty "toList.toMap" $
\(Ps xs) -> (TM.toMap . TM.fromList) xs == Map.fromList xs
, QC.testProperty "size" $
\(Ps xs) -> TM.size (TM.fromList xs) == Map.size (Map.fromList xs)
, QC.testProperty "null" $
\(Ps xs) -> TM.null (TM.fromList xs) == null xs
, QC.testProperty "member" $
\(Ps xs) -> all (`TM.member` (TM.fromList xs)) (map fst xs)
, QC.testProperty "(!?)" $
\(Ps xs) -> let s1 = TM.fromList xs
s2 = Map.fromList xs
in all (\k -> (s1 TM.!? k) == (Map.lookup k s2)) (someStrs ++ map fst xs)
]
someStrs :: [ST.ShortText]
someStrs = map ST.fromString ["","\x00","a","Z","\x10ffff"]
newtype Ps = Ps [(ST.ShortText,Int)]
deriving (Arbitrary,Show)