module Main where import Test.HUnit import Control.Monad import Data.Int import Data.Word import qualified Data.ByteString.Char8 as S import qualified Data.ByteString.Lazy.Char8 as L import Database.TokyoCabinet.List len_test = do xs <- new (==0) `fmap` len xs @? "empty" push xs "foo" (==1) `fmap` len xs @? "1 element" push xs "baz" (==2) `fmap` len xs @? "2 elements" pop xs :: IO (Maybe String) (==1) `fmap` len xs @? "1 element again" pop xs :: IO (Maybe String) (==0) `fmap` len xs @? "empty again" delete xs push_pop_test = do xs <- new push xs "foo" push xs "bar" push xs "baz" (@?= (Just "baz")) =<< pop xs (@?= (Just "bar")) =<< pop xs (@?= (Just "foo")) =<< pop xs (@?= (Nothing :: Maybe String)) =<< pop xs delete xs unshift_shift_test = do xs <- new unshift xs "foo" unshift xs "bar" unshift xs "baz" (@?= (Just "baz")) =<< shift xs (@?= (Just "bar")) =<< shift xs (@?= (Just "foo")) =<< shift xs (@?= (Nothing :: Maybe String)) =<< shift xs delete xs clear_test = do xs <- new push xs "" push xs "" push xs "" (@?= 3) =<< len xs clear xs (@?= 0) =<< len xs delete xs insert_remove_test = do xs <- new (@?= (Nothing :: Maybe String)) =<< remove xs 0 insert xs 0 "foo" insert xs 0 "bar" insert xs 1 "baz" (@?= 3) =<< len xs (@?= (Just "bar")) =<< get xs 0 (@?= (Just "baz")) =<< get xs 1 (@?= (Just "foo")) =<< get xs 2 (@?= (Nothing :: Maybe String)) =<< get xs 3 remove xs 0 :: IO (Maybe String) (@?= 2) =<< len xs (@?= (Just "foo")) =<< get xs 1 remove xs 1 :: IO (Maybe String) (@?= 1) =<< len xs (@?= (Just "baz")) =<< get xs 0 (@?= (Nothing :: Maybe String)) =<< get xs 1 (@?= (Nothing :: Maybe String)) =<< remove xs 1 delete xs sort_test = do xs <- new let x = 12 :: Int y = 49 :: Int z = 5 :: Int push xs x push xs y push xs z sort xs (@?= 3) =<< len xs (@?= (Just z)) =<< get xs 0 (@?= (Just x)) =<< get xs 1 (@?= (Just y)) =<< get xs 2 delete xs lsearch_test = do xs <- new let x = 12 :: Int y = 49 :: Int z = 5 :: Int push xs x push xs y push xs z (@?= 2) =<< lsearch xs z (@?= 0) =<< lsearch xs x (@?= 1) =<< lsearch xs y delete xs bsearch_test = do xs <- new let x = 12 :: Int y = 49 :: Int z = 5 :: Int push xs z push xs x push xs y (@?= 0) =<< bsearch xs z (@?= 1) =<< bsearch xs x (@?= 2) =<< bsearch xs y delete xs int_test = do xs <- new :: IO (List Int) xs8 <- new :: IO (List Int8) xs16 <- new :: IO (List Int16) xs32 <- new :: IO (List Int32) xs64 <- new :: IO (List Int64) let num_int = [ 1..10] num_int8 = [11..20] num_int16 = [21..30] num_int32 = [31..40] num_int64 = [41..50] pushlist xs num_int pushlist xs8 num_int8 pushlist xs16 num_int16 pushlist xs32 num_int32 pushlist xs64 num_int64 get xs 0 >>= (@?= (Just (num_int !! 0))) get xs 9 >>= (@?= (Just (num_int !! 9))) get xs8 0 >>= (@?= (Just (num_int8 !! 0))) get xs8 9 >>= (@?= (Just (num_int8 !! 9))) get xs16 0 >>= (@?= (Just (num_int16 !! 0))) get xs16 9 >>= (@?= (Just (num_int16 !! 9))) get xs32 0 >>= (@?= (Just (num_int32 !! 0))) get xs32 9 >>= (@?= (Just (num_int32 !! 9))) get xs64 0 >>= (@?= (Just (num_int64 !! 0))) get xs64 9 >>= (@?= (Just (num_int64 !! 9))) where pushlist xs ys = mapM_ (push xs) ys word_test = do xs8 <- new :: IO (List Word8) xs16 <- new :: IO (List Word16) xs32 <- new :: IO (List Word32) xs64 <- new :: IO (List Word64) let num_word8 = [ 1..10] num_word16 = [11..20] num_word32 = [21..30] num_word64 = [31..40] pushlist xs8 num_word8 pushlist xs16 num_word16 pushlist xs32 num_word32 pushlist xs64 num_word64 get xs8 0 >>= (@?= (Just (num_word8 !! 0))) get xs8 9 >>= (@?= (Just (num_word8 !! 9))) get xs16 0 >>= (@?= (Just (num_word16 !! 0))) get xs16 9 >>= (@?= (Just (num_word16 !! 9))) get xs32 0 >>= (@?= (Just (num_word32 !! 0))) get xs32 9 >>= (@?= (Just (num_word32 !! 9))) get xs64 0 >>= (@?= (Just (num_word64 !! 0))) get xs64 9 >>= (@?= (Just (num_word64 !! 9))) where pushlist xs ys = mapM_ (push xs) ys strict_bytestring_test = do xs <- new let vals = map S.pack ["foo", "bar", "baz"] mapM_ (push xs) vals get xs 0 >>= (@?= (Just (vals !! 0))) get xs 1 >>= (@?= (Just (vals !! 1))) get xs 2 >>= (@?= (Just (vals !! 2))) lazy_bytestring_test = do xs <- new let vals = map L.pack ["foo", "bar", "baz"] mapM_ (push xs) vals get xs 0 >>= (@?= (Just (vals !! 0))) get xs 1 >>= (@?= (Just (vals !! 1))) get xs 2 >>= (@?= (Just (vals !! 2))) dump_load_test = do xs <- new mapM_ (push xs) ["foo", "bar", "baz"] bytes <- dump xs ys <- load bytes xsiz <- len xs ysiz <- len ys xsiz @?= ysiz tclist_equal xs ys 0 xsiz where tclist_equal xs ys ix num = do if ix == num then return () else do liftM2 (@?=) (get xs ix :: IO (Maybe String)) (get ys ix :: IO (Maybe String)) tclist_equal xs ys (1 + ix) num tests = test [ "len test" ~: len_test , "push pop test" ~: push_pop_test , "unshift shift test" ~: unshift_shift_test , "clear test" ~: clear_test , "insert remove test" ~: insert_remove_test , "sort test" ~: sort_test , "lsearch test" ~: lsearch_test , "bsearch test" ~: bsearch_test , "int_test" ~: int_test , "word_test" ~: word_test , "strict_bytestring_test" ~: strict_bytestring_test , "lazy_bytestring_test" ~: lazy_bytestring_test , "dump_load_test" ~: dump_load_test ] main = runTestTT tests