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