packages feed

redis-0.11: Test/ListCommands.hs

module Test.ListCommands where

import Prelude hiding ((!!))
import Data.List
import Test.Setup

tests = TList [TLabel "lrange" test_lrange,
               TLabel "llen" test_llen,
               TLabel "lpush and rpush" test_lpush_rpush,
               TLabel "lpushx and rpushx" test_lpushx_rpushx,
               TLabel "linsert" test_linsert,
               TLabel "ltrim" test_ltrim,
               TLabel "lindex and lset" test_lindex_lset,
               TLabel "lrem" test_lrem,
               TLabel "lpop and rpop" test_lpor_rpop,
               TLabel "rpoplpush" test_rpoplpush,
               TLabel "blpop" test_blpop,
               TLabel "brpop" test_brpop,
               TLabel "brpoplpush" test_brpoplpush]

test_lrange = TCase $ testRedis $
    do r <- ask
       addList
       liftIO $ do list <- lrange r "list" takeAll >>= fromRMultiBulk
                   assertEqual "" (Just [Just "1", Just "2", Just "3"]) list
                   list <- lrange r "list" (1, 1) >>= fromRMultiBulk
                   assertEqual "" (Just [Just "2"]) list

test_llen = TCase $ testRedis $
    do r <- ask
       addList
       liftIO $ do len <- llen r "list" >>= fromRInt
                   Just list <- lrange r "list" takeAll >>= fromRMultiBulk :: IO (Maybe [Maybe String])
                   assertEqual "equals to real list length" (length list) len
                   len <- llen r "no-such-key" >>= fromRInt
                   assertEqual "not existing key is the same as an empty list" 0 len

test_lpush_rpush = TCase $ testRedis $
    do r <- ask
       addList
       liftIO $ do Just list <- lrange r "list" takeAll >>= fromRMultiBulk
                   len <- rpush r "list" "4" >>= fromRInt
                   assertEqual "list length was increased by 1" (length list + 1) len
                   Just list' <- lrange r "list" takeAll >>= fromRMultiBulk
                   assertEqual "" (list ++ [(Just "4")]) list'

                   len <- lpush r "list" "0" >>= fromRInt
                   assertEqual "list length was increased by 1 again" (length list' + 1) len
                   Just list'' <- lrange r "list" takeAll >>= fromRMultiBulk
                   assertEqual "" ((Just "0") : list') list''

test_lpushx_rpushx = TCase $ testRedis $
    do r <- ask
       addList
       liftIO $ do Just list <- lrange r "list" takeAll >>= fromRMultiBulk
                   len <- rpushx r "list" "4" >>= fromRInt
                   assertEqual "list length was increased by 1" (length list + 1) len
                   Just list' <- lrange r "list" takeAll >>= fromRMultiBulk
                   assertEqual "" (list ++ [(Just "4")]) list'

                   len <- lpushx r "list" "0" >>= fromRInt
                   assertEqual "list length was increased by 1 again" (length list' + 1) len
                   Just list'' <- lrange r "list" takeAll >>= fromRMultiBulk
                   assertEqual "" ((Just "0") : list') list''

                   lpushx r "no-such-key" "1" >>= fromRInt >>= assertEqual "List was not created" 0
                   exists r "no-such-key" >>= fromRInt >>= assertEqual "List was not created" 0
                   rpushx r "no-such-key" "1" >>= fromRInt >>= assertEqual "List was not created" 0
                   exists r "no-such-key" >>= fromRInt >>= assertEqual "List was not created" 0

test_linsert = TCase $ testRedis $
    do r <- ask
       addList
       liftIO $ do Just list <- lrange r "list" takeAll >>= fromRMultiBulk
                   len <- linsert r "list" BEFORE "2" "foo" >>= fromRInt
                   assertEqual "list length was increased by 1" (length list + 1) len
                   Just list' <- lrange r "list" takeAll >>= fromRMultiBulk
                   let excepted = let (a,b) = span (/= Just "2") list
                                  in a ++ ((Just "foo") : b)
                   assertEqual "" excepted list'

                   len <- linsert r "list" AFTER "foo" "bar" >>= fromRInt
                   assertEqual "list length was increased by 1" (length list' + 1) len
                   Just list'' <- lrange r "list" takeAll >>= fromRMultiBulk
                   let excepted = let (a,b) = span (/= Just "foo") list'
                                  in a ++ (head b : Just "bar" : tail b)
                   assertEqual "" excepted list''

test_ltrim = TCase $ testRedis $
    do r <- ask
       addList
       liftIO $ do Just list <- lrange r "list" takeAll >>= fromRMultiBulk :: (IO (Maybe [Maybe String]))
                   ltrim r "list" (1, 1) >>= fromROk
                   Just list' <- lrange r "list" takeAll >>= fromRMultiBulk
                   assertEqual "" (take 1 $ drop 1 $ list) list'

test_lindex_lset = TCase $ testRedis $
    do r <- ask
       addList
       liftIO $ do Just list <- lrange r "list" takeAll >>= fromRMultiBulk :: (IO (Maybe [Maybe String]))
                   el <- lindex r "list" 1 >>= fromRBulk
                   assertEqual "" (list !! 1) el
                   lset r "list" 1 "4" >>= fromROk
                   lindex r "list" 1 >>= fromRBulk >>= assertEqual "" (Just "4")

test_lrem = TCase $ testRedis $
    do r <- ask
       addList
       liftIO $ do Just list <- lrange r "list" takeAll >>= fromRMultiBulk
                   lrem r "list" 1 (fromJust $ list !! 1) >>= fromRInt >>= assertEqual ("delete only first value equals to " ++ (fromJust $ list !! 1)) 1
                   Just list' <- lrange r "list" takeAll >>= fromRMultiBulk
                   assertEqual "" ((list !! 1) `delete` list) list'

test_lpor_rpop = TCase $ testRedis $
    do r <- ask
       addList
       liftIO $ do Just list <- lrange r "list" takeAll >>= fromRMultiBulk :: IO (Maybe [Maybe String])
                   lpop r "list" >>= fromRBulk >>= assertEqual "" (head list)
                   rpop r "list" >>= fromRBulk >>= assertEqual "" (last list)
                   Just list' <- lrange r "list" takeAll >>= fromRMultiBulk
                   assertEqual "" (init $ tail list) list'

test_rpoplpush = TCase $ testRedis $
    do r <- ask
       addList
       liftIO $ do Just list <- lrange r "list" takeAll >>= fromRMultiBulk :: IO (Maybe [Maybe String])
                   rpoplpush r "list" "list2" >>= fromRBulk >>= assertEqual "" (last list)
                   rpoplpush r "list" "list2" >>= fromRBulk >>= assertEqual "" (last $ init list)
                   Just list' <- lrange r "list" takeAll >>= fromRMultiBulk
                   assertEqual "Two elemens was rpopped" (init $ init list) list'
                   Just list'' <- lrange r "list2" takeAll >>= fromRMultiBulk
                   assertEqual "Two elemens was lpushed" (reverse $ take 2 $ reverse list) list''

test_blpop = TCase $ testRedis2 $
    do r1 <- ask
       r2 <- ask2
       addList
       liftIO $ do Just list <- lrange r1 "list" takeAll >>= fromRMultiBulk :: IO (Maybe [Maybe String])
                   res <- blpop r1 ["bar", "list"] 1
                   assertEqual "" (Just ("list", fromJust $ head list)) res
                   Just list' <- lrange r1 "list" takeAll >>= fromRMultiBulk :: IO (Maybe [Maybe String])
                   assertEqual "" (tail list) list'

                   later 500 $ lpush r2 "zap" "1" >>= noError
                   res <- blpop r1 ["zap"] 2
                   assertEqual "" (Just ("zap", "1")) res
                   exists r1 "zap" >>= fromRInt >>= assertEqual "" 0

                   (blpop r1 ["zap"] 1 :: IO (Maybe (String, String))) >>= assertEqual "" Nothing

test_brpop = TCase $ testRedis2 $
    do r1 <- ask
       r2 <- ask2
       addList
       liftIO $ do Just list <- lrange r1 "list" takeAll >>= fromRMultiBulk :: IO (Maybe [Maybe String])
                   res <- brpop r1 ["bar", "list"] 1
                   assertEqual "" (Just ("list", fromJust $ last list)) res
                   Just list' <- lrange r1 "list" takeAll >>= fromRMultiBulk :: IO (Maybe [Maybe String])
                   assertEqual "" (init list) list'

                   later 500 $ lpush r2 "zap" "1" >>= noError
                   res <- brpop r1 ["zap"] 2
                   assertEqual "" (Just ("zap", "1")) res
                   exists r1 "zap" >>= fromRInt >>= assertEqual "" 0

                   (brpop r1 ["zap"] 1 :: IO (Maybe (String, String))) >>= assertEqual "" Nothing

test_brpoplpush = TCase $ testRedis2 $
    do r1 <- ask
       r2 <- ask2
       addList
       liftIO $ do Just list <- lrange r1 "list" takeAll >>= fromRMultiBulk :: IO (Maybe [Maybe String])
                   res <- brpoplpush r1 "list" "bar" 0
                   assertEqual "" (Just $ Just $ fromJust $ last list) res
                   Just list' <- lrange r1 "list" takeAll >>= fromRMultiBulk :: IO (Maybe [Maybe String])
                   assertEqual "" (init list) list'
                   Just list' <- lrange r1 "bar" takeAll >>= fromRMultiBulk :: IO (Maybe [Maybe String])
                   assertEqual "" ([last list]) list'

                   later 500 $ lpush r2 "zap" "1" >>= noError
                   res <- brpoplpush r1 "zap" "list" 2
                   assertEqual "" (Just $ Just "1") res
                   exists r1 "zap" >>= fromRInt >>= assertEqual "" 0

                   (brpoplpush r1 "zap" "list" 1 :: IO (Maybe (Maybe String))) >>= assertEqual "" Nothing