1// +build int 2 3package main 4 5// Set keys. 6 7import ( 8 "testing" 9) 10 11func TestSet(t *testing.T) { 12 testCommands(t, 13 succ("SADD", "s", "aap", "noot", "mies"), 14 succ("SADD", "s", "vuur", "noot"), 15 succ("TYPE", "s"), 16 succ("EXISTS", "s"), 17 succ("SCARD", "s"), 18 succSorted("SMEMBERS", "s"), 19 succSorted("SMEMBERS", "nosuch"), 20 succ("SISMEMBER", "s", "aap"), 21 succ("SISMEMBER", "s", "nosuch"), 22 23 succ("SCARD", "nosuch"), 24 succ("SISMEMBER", "nosuch", "nosuch"), 25 26 // failure cases 27 fail("SADD"), 28 fail("SADD", "s"), 29 fail("SMEMBERS"), 30 fail("SMEMBERS", "too", "many"), 31 fail("SCARD"), 32 fail("SCARD", "too", "many"), 33 fail("SISMEMBER"), 34 fail("SISMEMBER", "few"), 35 fail("SISMEMBER", "too", "many", "arguments"), 36 // Wrong type 37 succ("SET", "str", "I am a string"), 38 fail("SADD", "str", "noot", "mies"), 39 fail("SMEMBERS", "str"), 40 fail("SISMEMBER", "str", "noot"), 41 fail("SCARD", "str"), 42 ) 43} 44 45func TestSetMove(t *testing.T) { 46 // Move a set around 47 testCommands(t, 48 succ("SADD", "s", "aap", "noot", "mies"), 49 succ("RENAME", "s", "others"), 50 succSorted("SMEMBERS", "s"), 51 succSorted("SMEMBERS", "others"), 52 succ("MOVE", "others", 2), 53 succSorted("SMEMBERS", "others"), 54 succ("SELECT", 2), 55 succSorted("SMEMBERS", "others"), 56 ) 57} 58 59func TestSetDel(t *testing.T) { 60 testCommands(t, 61 succ("SADD", "s", "aap", "noot", "mies"), 62 succ("SREM", "s", "noot", "nosuch"), 63 succ("SCARD", "s"), 64 succSorted("SMEMBERS", "s"), 65 66 // failure cases 67 fail("SREM"), 68 fail("SREM", "s"), 69 // Wrong type 70 succ("SET", "str", "I am a string"), 71 fail("SREM", "str", "noot"), 72 ) 73} 74 75func TestSetSMove(t *testing.T) { 76 testCommands(t, 77 succ("SADD", "s", "aap", "noot", "mies"), 78 succ("SMOVE", "s", "s2", "aap"), 79 succ("SCARD", "s"), 80 succ("SCARD", "s2"), 81 succ("SMOVE", "s", "s2", "nosuch"), 82 succ("SCARD", "s"), 83 succ("SCARD", "s2"), 84 succ("SMOVE", "s", "nosuch", "noot"), 85 succ("SCARD", "s"), 86 succ("SCARD", "s2"), 87 88 succ("SMOVE", "s", "s2", "mies"), 89 succ("SCARD", "s"), 90 succ("EXISTS", "s"), 91 succ("SCARD", "s2"), 92 succ("EXISTS", "s2"), 93 94 succ("SMOVE", "s2", "s2", "mies"), 95 96 succ("SADD", "s5", "aap"), 97 succ("SADD", "s6", "aap"), 98 succ("SMOVE", "s5", "s6", "aap"), 99 100 // failure cases 101 fail("SMOVE"), 102 fail("SMOVE", "s"), 103 fail("SMOVE", "s", "s2"), 104 fail("SMOVE", "s", "s2", "too", "many"), 105 // Wrong type 106 succ("SET", "str", "I am a string"), 107 fail("SMOVE", "str", "s2", "noot"), 108 fail("SMOVE", "s2", "str", "noot"), 109 ) 110} 111 112func TestSetSpop(t *testing.T) { 113 testCommands(t, 114 // Without count argument 115 succ("SADD", "s", "aap"), 116 succ("SPOP", "s"), 117 succ("EXISTS", "s"), 118 119 succ("SPOP", "nosuch"), 120 121 succ("SADD", "s", "aap"), 122 succ("SADD", "s", "noot"), 123 succ("SADD", "s", "mies"), 124 succ("SADD", "s", "noot"), 125 succ("SCARD", "s"), 126 succLoosely("SMEMBERS", "s"), 127 128 // failure cases 129 fail("SPOP"), 130 succ("SADD", "s", "aap"), 131 fail("SPOP", "s", "s2"), 132 fail("SPOP", "nosuch", "s2"), 133 // Wrong type 134 succ("SET", "str", "I am a string"), 135 fail("SPOP", "str"), 136 ) 137 138 testCommands(t, 139 // With count argument 140 succ("SADD", "s", "aap"), 141 succ("SADD", "s", "noot"), 142 succ("SADD", "s", "mies"), 143 succ("SADD", "s", "vuur"), 144 succLoosely("SPOP", "s", 2), 145 succ("EXISTS", "s"), 146 succ("SCARD", "s"), 147 148 succLoosely("SPOP", "s", 200), 149 succ("SPOP", "s", 1), 150 succ("SCARD", "s"), 151 152 // failure cases 153 fail("SPOP", "foo", "one"), 154 ) 155} 156 157func TestSetSrandmember(t *testing.T) { 158 testCommands(t, 159 // Set with a single member... 160 succ("SADD", "s", "aap"), 161 succ("SRANDMEMBER", "s"), 162 succ("SRANDMEMBER", "s", 1), 163 succ("SRANDMEMBER", "s", 5), 164 succ("SRANDMEMBER", "s", -1), 165 succ("SRANDMEMBER", "s", -5), 166 167 succ("SRANDMEMBER", "s", 0), 168 succ("SPOP", "nosuch"), 169 170 // failure cases 171 fail("SRANDMEMBER"), 172 fail("SRANDMEMBER", "s", "noint"), 173 fail("SRANDMEMBER", "s", 1, "toomany"), 174 // Wrong type 175 succ("SET", "str", "I am a string"), 176 fail("SRANDMEMBER", "str"), 177 ) 178} 179 180func TestSetSdiff(t *testing.T) { 181 testCommands(t, 182 succ("SDIFF", "s1", "aap", "noot", "mies"), 183 succ("SDIFF", "s2", "noot", "mies", "vuur"), 184 succ("SDIFF", "s3", "mies", "wim"), 185 succ("SDIFF", "s1"), 186 succ("SDIFF", "s1", "s2"), 187 succ("SDIFF", "s1", "s2", "s3"), 188 succ("SDIFF", "nosuch"), 189 succ("SDIFF", "s1", "nosuch", "s2", "nosuch", "s3"), 190 succ("SDIFF", "s1", "s1"), 191 192 succ("SDIFFSTORE", "res", "s3", "nosuch", "s1"), 193 succ("SMEMBERS", "res"), 194 195 // failure cases 196 fail("SDIFF"), 197 fail("SDIFFSTORE"), 198 fail("SDIFFSTORE", "key"), 199 // Wrong type 200 succ("SET", "str", "I am a string"), 201 fail("SDIFF", "s1", "str"), 202 fail("SDIFF", "nosuch", "str"), 203 fail("SDIFF", "str", "s1"), 204 fail("SDIFFSTORE", "res", "str", "s1"), 205 fail("SDIFFSTORE", "res", "s1", "str"), 206 ) 207} 208 209func TestSetSinter(t *testing.T) { 210 testCommands(t, 211 succ("SADD", "s1", "aap", "noot", "mies"), 212 succ("SADD", "s2", "noot", "mies", "vuur"), 213 succ("SADD", "s3", "mies", "wim"), 214 succSorted("SINTER", "s1"), 215 succSorted("SINTER", "s1", "s2"), 216 succSorted("SINTER", "s1", "s2", "s3"), 217 succ("SINTER", "nosuch"), 218 succ("SINTER", "s1", "nosuch", "s2", "nosuch", "s3"), 219 succSorted("SINTER", "s1", "s1"), 220 221 succ("SINTERSTORE", "res", "s3", "nosuch", "s1"), 222 succ("SMEMBERS", "res"), 223 224 // failure cases 225 fail("SINTER"), 226 fail("SINTERSTORE"), 227 fail("SINTERSTORE", "key"), 228 // Wrong type 229 succ("SET", "str", "I am a string"), 230 fail("SINTER", "s1", "str"), 231 succ("SINTER", "nosuch", "str"), // SINTER succeeds if an input type is wrong as long as the preceding inputs result in an empty set 232 fail("SINTER", "str", "nosuch"), 233 fail("SINTER", "str", "s1"), 234 fail("SINTERSTORE", "res", "str", "s1"), 235 fail("SINTERSTORE", "res", "s1", "str"), 236 ) 237} 238 239func TestSetSunion(t *testing.T) { 240 testCommands(t, 241 succ("SUNION", "s1", "aap", "noot", "mies"), 242 succ("SUNION", "s2", "noot", "mies", "vuur"), 243 succ("SUNION", "s3", "mies", "wim"), 244 succ("SUNION", "s1"), 245 succ("SUNION", "s1", "s2"), 246 succ("SUNION", "s1", "s2", "s3"), 247 succ("SUNION", "nosuch"), 248 succ("SUNION", "s1", "nosuch", "s2", "nosuch", "s3"), 249 succ("SUNION", "s1", "s1"), 250 251 succ("SUNIONSTORE", "res", "s3", "nosuch", "s1"), 252 succ("SMEMBERS", "res"), 253 254 // failure cases 255 fail("SUNION"), 256 fail("SUNIONSTORE"), 257 fail("SUNIONSTORE", "key"), 258 // Wrong type 259 succ("SET", "str", "I am a string"), 260 fail("SUNION", "s1", "str"), 261 fail("SUNION", "nosuch", "str"), 262 fail("SUNION", "str", "s1"), 263 fail("SUNIONSTORE", "res", "str", "s1"), 264 fail("SUNIONSTORE", "res", "s1", "str"), 265 ) 266} 267 268func TestSscan(t *testing.T) { 269 testCommands(t, 270 // No set yet 271 succ("SSCAN", "set", 0), 272 273 succ("SADD", "set", "key1"), 274 succ("SSCAN", "set", 0), 275 succ("SSCAN", "set", 0, "COUNT", 12), 276 succ("SSCAN", "set", 0, "cOuNt", 12), 277 278 succ("SADD", "set", "anotherkey"), 279 succ("SSCAN", "set", 0, "MATCH", "anoth*"), 280 succ("SSCAN", "set", 0, "MATCH", "anoth*", "COUNT", 100), 281 succ("SSCAN", "set", 0, "COUNT", 100, "MATCH", "anoth*"), 282 283 // Can't really test multiple keys. 284 // succ("SET", "key2", "value2"), 285 // succ("SCAN", 0), 286 287 // Error cases 288 fail("SSCAN"), 289 fail("SSCAN", "noint"), 290 fail("SSCAN", "set", 0, "COUNT", "noint"), 291 fail("SSCAN", "set", 0, "COUNT"), 292 fail("SSCAN", "set", 0, "MATCH"), 293 fail("SSCAN", "set", 0, "garbage"), 294 fail("SSCAN", "set", 0, "COUNT", 12, "MATCH", "foo", "garbage"), 295 succ("SET", "str", "1"), 296 fail("SSCAN", "str", 0), 297 ) 298} 299 300func TestSetNoAuth(t *testing.T) { 301 testAuthCommands(t, 302 "supersecret", 303 failWith( 304 "NOAUTH Authentication required.", 305 "SET", "foo", "bar", 306 ), 307 succ("AUTH", "supersecret"), 308 succ( 309 "SET", "foo", "bar", 310 ), 311 ) 312} 313