packages feed

redis-0.10: Test/SetCommands.hs

module Test.SetCommands where

import Test.HUnit
import Control.Monad.Reader
import Data.Maybe
import Data.Set
import Database.Redis.Redis
import Test.Setup
import Test.Utils

tests = TestList [TestLabel "smembers" test_smembers,
                  TestLabel "sismember" test_sismember,
                  TestLabel "sadd" test_sadd,
                  TestLabel "srem" test_srem,
                  TestLabel "spop" test_spop,
                  TestLabel "smove" test_smove,
                  TestLabel "scard" test_scard,
                  TestLabel "srandmember" test_srandmember,
                  TestLabel "sinter and sinterStore" test_sinter_sinterstore,
                  TestLabel "sunion and sunionStore" test_sunion_sunionstore,
                  TestLabel "sdiff and sdiffStore" test_sdiff_sdiffstore]

asSet :: Reply String -> IO (Set (Maybe String))
asSet r = fromRMultiBulk r >>= return . fromList . fromJust
        
test_smembers = TestCase $ testRedis $
    do r <- ask
       addSet
       liftIO $ do s <- smembers r "set" >>= asSet
                   assertEqual "" (fromList [Just "1", Just "2", Just "3"]) s

test_sismember = TestCase $ testRedis $
    do r <- ask
       addSet
       liftIO $ do sismember r "set" "1" >>= fromRInt >>= assertEqual "" 1
                   sismember r "set" "0" >>= fromRInt >>= assertEqual "" 0
                   sismember r "no-such-key" "1" >>= fromRInt >>= assertEqual "" 0

test_sadd = TestCase $ testRedis $
    do r <- ask
       addSet
       liftIO $ do s <- smembers r "set" >>= asSet
                   sadd r "set" "3" >>= fromRInt >>= assertEqual "element allready exists" 0
                   sadd r "set" "4" >>= fromRInt >>= assertEqual "" 1
                   s' <- smembers r "set" >>= asSet
                   assertEqual "" (insert (Just "4") s) s'

test_srem = TestCase $ testRedis $
    do r <- ask
       addSet
       liftIO $ do s <- smembers r "set" >>= asSet
                   srem r "set" "4" >>= fromRInt >>= assertEqual "element is not a member" 0
                   srem r "set" "3" >>= fromRInt >>= assertEqual "" 1
                   s' <- smembers r "set" >>= asSet
                   assertEqual "" (delete (Just "3") s) s'

test_spop = TestCase $ testRedis $
    do r <- ask
       addSet
       liftIO $ do s <- smembers r "set" >>= asSet
                   el <- spop r "set" >>= fromRBulk :: IO (Maybe String)
                   assertBool "" $ member el s
                   s' <- smembers r "set" >>= asSet
                   assertEqual "" (delete el s) s'

test_smove = TestCase $ testRedis $
    do r <- ask
       addSet
       liftIO $ do s <- smembers r "set" >>= asSet
                   smove r "set" "set2" "3" >>= fromRInt >>= assertEqual "" 1
                   s' <- smembers r "set" >>= asSet
                   assertEqual "" (delete (Just "3") s) s'
                   s' <- smembers r "set2" >>= asSet
                   assertEqual "" (fromList [Just "3"]) s'

test_scard = TestCase $ testRedis $
    do r <- ask
       addSet
       liftIO $ do s <- smembers r "set" >>= asSet
                   scard r "set" >>= fromRInt >>= assertEqual "" (size s)

test_srandmember = TestCase $ testRedis $
    do r <- ask
       addSet
       liftIO $ do s <- smembers r "set" >>= asSet
                   el <- srandmember r "set" >>= fromRBulk
                   assertBool "" $ member el s

test_sinter_sinterstore = TestCase $ testRedis $
    do r <- ask
       addSet
       liftIO $ do mapM_ (sadd r "set2") ["2", "3", "4"]
                   s <- smembers r "set" >>= asSet
                   s2 <- smembers r "set2" >>= asSet
                   s3 <- sinter r ["set", "set2"] >>= asSet
                   assertEqual "" (intersection s s2) s3
                   sinterStore r "set3" ["set", "set2"] >>= fromRInt >>= assertEqual "" (size s3)
                   smembers r "set3" >>= asSet >>= assertEqual "" s3
                   sinterStore r "set3" ["set", "set4"] >>= fromRInt >>= assertEqual "" 0

test_sunion_sunionstore = TestCase $ testRedis $
    do r <- ask
       addSet
       liftIO $ do mapM_ (sadd r "set2") ["3", "4", "5"]
                   s <- smembers r "set" >>= asSet
                   s2 <- smembers r "set2" >>= asSet
                   s3 <- sunion r ["set", "set2"] >>= asSet
                   assertEqual "" (union s s2) s3
                   sunionStore r "set3" ["set", "set2"] >>= fromRInt >>= assertEqual "" (size s3)
                   smembers r "set3" >>= asSet >>= assertEqual "" s3
                   sunionStore r "set3" ["set", "set4"] >>= fromRInt >>= assertEqual "" (size s)

test_sdiff_sdiffstore = TestCase $ testRedis $
    do r <- ask
       addSet
       liftIO $ do mapM_ (sadd r "set2") ["3", "4", "5"]
                   s <- smembers r "set" >>= asSet
                   s2 <- smembers r "set2" >>= asSet
                   s3 <- sdiff r ["set", "set2"] >>= asSet
                   assertEqual "" (difference s s2) s3
                   sdiffStore r "set3" ["set", "set2"] >>= fromRInt >>= assertEqual "" (size s3)
                   smembers r "set3" >>= asSet >>= assertEqual "" s3
                   sdiffStore r "set3" ["set", "set4"] >>= fromRInt >>= assertEqual "" (size s)