redis2-namespaced 3.0.7

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (99) hide show
  1. checksums.yaml +7 -0
  2. data/.gitignore +11 -0
  3. data/.order +170 -0
  4. data/.travis/Gemfile +11 -0
  5. data/.travis.yml +55 -0
  6. data/.yardopts +3 -0
  7. data/CHANGELOG.md +285 -0
  8. data/LICENSE +20 -0
  9. data/README.md +251 -0
  10. data/Rakefile +403 -0
  11. data/benchmarking/logging.rb +71 -0
  12. data/benchmarking/pipeline.rb +51 -0
  13. data/benchmarking/speed.rb +21 -0
  14. data/benchmarking/suite.rb +24 -0
  15. data/benchmarking/worker.rb +71 -0
  16. data/examples/basic.rb +15 -0
  17. data/examples/dist_redis.rb +43 -0
  18. data/examples/incr-decr.rb +17 -0
  19. data/examples/list.rb +26 -0
  20. data/examples/pubsub.rb +37 -0
  21. data/examples/sets.rb +36 -0
  22. data/examples/unicorn/config.ru +3 -0
  23. data/examples/unicorn/unicorn.rb +20 -0
  24. data/lib/redis2/client.rb +419 -0
  25. data/lib/redis2/connection/command_helper.rb +44 -0
  26. data/lib/redis2/connection/hiredis.rb +63 -0
  27. data/lib/redis2/connection/registry.rb +12 -0
  28. data/lib/redis2/connection/ruby.rb +322 -0
  29. data/lib/redis2/connection/synchrony.rb +124 -0
  30. data/lib/redis2/connection.rb +9 -0
  31. data/lib/redis2/distributed.rb +853 -0
  32. data/lib/redis2/errors.rb +40 -0
  33. data/lib/redis2/hash_ring.rb +131 -0
  34. data/lib/redis2/pipeline.rb +141 -0
  35. data/lib/redis2/subscribe.rb +83 -0
  36. data/lib/redis2/version.rb +3 -0
  37. data/lib/redis2.rb +2533 -0
  38. data/redis.gemspec +43 -0
  39. data/test/bitpos_test.rb +69 -0
  40. data/test/blocking_commands_test.rb +42 -0
  41. data/test/command_map_test.rb +30 -0
  42. data/test/commands_on_hashes_test.rb +21 -0
  43. data/test/commands_on_lists_test.rb +20 -0
  44. data/test/commands_on_sets_test.rb +77 -0
  45. data/test/commands_on_sorted_sets_test.rb +109 -0
  46. data/test/commands_on_strings_test.rb +101 -0
  47. data/test/commands_on_value_types_test.rb +131 -0
  48. data/test/connection_handling_test.rb +189 -0
  49. data/test/db/.gitkeep +0 -0
  50. data/test/distributed_blocking_commands_test.rb +46 -0
  51. data/test/distributed_commands_on_hashes_test.rb +10 -0
  52. data/test/distributed_commands_on_lists_test.rb +22 -0
  53. data/test/distributed_commands_on_sets_test.rb +83 -0
  54. data/test/distributed_commands_on_sorted_sets_test.rb +18 -0
  55. data/test/distributed_commands_on_strings_test.rb +59 -0
  56. data/test/distributed_commands_on_value_types_test.rb +95 -0
  57. data/test/distributed_commands_requiring_clustering_test.rb +164 -0
  58. data/test/distributed_connection_handling_test.rb +23 -0
  59. data/test/distributed_internals_test.rb +70 -0
  60. data/test/distributed_key_tags_test.rb +52 -0
  61. data/test/distributed_persistence_control_commands_test.rb +26 -0
  62. data/test/distributed_publish_subscribe_test.rb +92 -0
  63. data/test/distributed_remote_server_control_commands_test.rb +66 -0
  64. data/test/distributed_scripting_test.rb +102 -0
  65. data/test/distributed_sorting_test.rb +20 -0
  66. data/test/distributed_test.rb +58 -0
  67. data/test/distributed_transactions_test.rb +32 -0
  68. data/test/encoding_test.rb +18 -0
  69. data/test/error_replies_test.rb +59 -0
  70. data/test/helper.rb +218 -0
  71. data/test/helper_test.rb +24 -0
  72. data/test/internals_test.rb +410 -0
  73. data/test/lint/blocking_commands.rb +150 -0
  74. data/test/lint/hashes.rb +162 -0
  75. data/test/lint/lists.rb +143 -0
  76. data/test/lint/sets.rb +125 -0
  77. data/test/lint/sorted_sets.rb +238 -0
  78. data/test/lint/strings.rb +260 -0
  79. data/test/lint/value_types.rb +122 -0
  80. data/test/persistence_control_commands_test.rb +26 -0
  81. data/test/pipelining_commands_test.rb +242 -0
  82. data/test/publish_subscribe_test.rb +210 -0
  83. data/test/remote_server_control_commands_test.rb +117 -0
  84. data/test/scanning_test.rb +413 -0
  85. data/test/scripting_test.rb +78 -0
  86. data/test/sorting_test.rb +59 -0
  87. data/test/support/connection/hiredis.rb +1 -0
  88. data/test/support/connection/ruby.rb +1 -0
  89. data/test/support/connection/synchrony.rb +17 -0
  90. data/test/support/redis_mock.rb +115 -0
  91. data/test/support/wire/synchrony.rb +24 -0
  92. data/test/support/wire/thread.rb +5 -0
  93. data/test/synchrony_driver.rb +88 -0
  94. data/test/test.conf +9 -0
  95. data/test/thread_safety_test.rb +32 -0
  96. data/test/transactions_test.rb +264 -0
  97. data/test/unknown_commands_test.rb +14 -0
  98. data/test/url_param_test.rb +132 -0
  99. metadata +226 -0
@@ -0,0 +1,150 @@
1
+ module Lint
2
+
3
+ module BlockingCommands
4
+
5
+ def setup
6
+ super
7
+
8
+ r.rpush("{zap}foo", "s1")
9
+ r.rpush("{zap}foo", "s2")
10
+ r.rpush("{zap}bar", "s1")
11
+ r.rpush("{zap}bar", "s2")
12
+ end
13
+
14
+ def to_protocol(obj)
15
+ case obj
16
+ when String
17
+ "$#{obj.length}\r\n#{obj}\r\n"
18
+ when Array
19
+ "*#{obj.length}\r\n" + obj.map { |e| to_protocol(e) }.join
20
+ else
21
+ fail
22
+ end
23
+ end
24
+
25
+ def mock(options = {}, &blk)
26
+ commands = {
27
+ :blpop => lambda do |*args|
28
+ sleep options[:delay] if options.has_key?(:delay)
29
+ to_protocol([args.first, args.last])
30
+ end,
31
+ :brpop => lambda do |*args|
32
+ sleep options[:delay] if options.has_key?(:delay)
33
+ to_protocol([args.first, args.last])
34
+ end,
35
+ :brpoplpush => lambda do |*args|
36
+ sleep options[:delay] if options.has_key?(:delay)
37
+ to_protocol(args.last)
38
+ end,
39
+ }
40
+
41
+ redis_mock(commands, &blk)
42
+ end
43
+
44
+ def test_blpop
45
+ assert_equal ["{zap}foo", "s1"], r.blpop("{zap}foo")
46
+ assert_equal ["{zap}foo", "s2"], r.blpop(["{zap}foo"])
47
+ assert_equal ["{zap}bar", "s1"], r.blpop(["{zap}bar", "{zap}foo"])
48
+ assert_equal ["{zap}bar", "s2"], r.blpop(["{zap}foo", "{zap}bar"])
49
+ end
50
+
51
+ def test_blpop_timeout
52
+ mock do |r|
53
+ assert_equal ["{zap}foo", "0"], r.blpop("{zap}foo")
54
+ assert_equal ["{zap}foo", "1"], r.blpop("{zap}foo", :timeout => 1)
55
+ end
56
+ end
57
+
58
+ def test_blpop_with_old_prototype
59
+ assert_equal ["{zap}foo", "s1"], r.blpop("{zap}foo", 0)
60
+ assert_equal ["{zap}foo", "s2"], r.blpop("{zap}foo", 0)
61
+ assert_equal ["{zap}bar", "s1"], r.blpop("{zap}bar", "{zap}foo", 0)
62
+ assert_equal ["{zap}bar", "s2"], r.blpop("{zap}foo", "{zap}bar", 0)
63
+ end
64
+
65
+ def test_blpop_timeout_with_old_prototype
66
+ mock do |r|
67
+ assert_equal ["{zap}foo", "0"], r.blpop("{zap}foo", 0)
68
+ assert_equal ["{zap}foo", "1"], r.blpop("{zap}foo", 1)
69
+ end
70
+ end
71
+
72
+ def test_brpop
73
+ assert_equal ["{zap}foo", "s2"], r.brpop("{zap}foo")
74
+ assert_equal ["{zap}foo", "s1"], r.brpop(["{zap}foo"])
75
+ assert_equal ["{zap}bar", "s2"], r.brpop(["{zap}bar", "{zap}foo"])
76
+ assert_equal ["{zap}bar", "s1"], r.brpop(["{zap}foo", "{zap}bar"])
77
+ end
78
+
79
+ def test_brpop_timeout
80
+ mock do |r|
81
+ assert_equal ["{zap}foo", "0"], r.brpop("{zap}foo")
82
+ assert_equal ["{zap}foo", "1"], r.brpop("{zap}foo", :timeout => 1)
83
+ end
84
+ end
85
+
86
+ def test_brpop_with_old_prototype
87
+ assert_equal ["{zap}foo", "s2"], r.brpop("{zap}foo", 0)
88
+ assert_equal ["{zap}foo", "s1"], r.brpop("{zap}foo", 0)
89
+ assert_equal ["{zap}bar", "s2"], r.brpop("{zap}bar", "{zap}foo", 0)
90
+ assert_equal ["{zap}bar", "s1"], r.brpop("{zap}foo", "{zap}bar", 0)
91
+ end
92
+
93
+ def test_brpop_timeout_with_old_prototype
94
+ mock do |r|
95
+ assert_equal ["{zap}foo", "0"], r.brpop("{zap}foo", 0)
96
+ assert_equal ["{zap}foo", "1"], r.brpop("{zap}foo", 1)
97
+ end
98
+ end
99
+
100
+ def test_brpoplpush
101
+ assert_equal "s2", r.brpoplpush("{zap}foo", "{zap}qux")
102
+ assert_equal ["s2"], r.lrange("{zap}qux", 0, -1)
103
+ end
104
+
105
+ def test_brpoplpush_timeout
106
+ mock do |r|
107
+ assert_equal "0", r.brpoplpush("{zap}foo", "{zap}bar")
108
+ assert_equal "1", r.brpoplpush("{zap}foo", "{zap}bar", :timeout => 1)
109
+ end
110
+ end
111
+
112
+ def test_brpoplpush_with_old_prototype
113
+ assert_equal "s2", r.brpoplpush("{zap}foo", "{zap}qux", 0)
114
+ assert_equal ["s2"], r.lrange("{zap}qux", 0, -1)
115
+ end
116
+
117
+ def test_brpoplpush_timeout_with_old_prototype
118
+ mock do |r|
119
+ assert_equal "0", r.brpoplpush("{zap}foo", "{zap}bar", 0)
120
+ assert_equal "1", r.brpoplpush("{zap}foo", "{zap}bar", 1)
121
+ end
122
+ end
123
+
124
+ driver(:ruby, :hiredis) do
125
+ def test_blpop_socket_timeout
126
+ mock(:delay => 1 + OPTIONS[:timeout] * 2) do |r|
127
+ assert_raises(Redis2::TimeoutError) do
128
+ r.blpop("{zap}foo", :timeout => 1)
129
+ end
130
+ end
131
+ end
132
+
133
+ def test_brpop_socket_timeout
134
+ mock(:delay => 1 + OPTIONS[:timeout] * 2) do |r|
135
+ assert_raises(Redis2::TimeoutError) do
136
+ r.brpop("{zap}foo", :timeout => 1)
137
+ end
138
+ end
139
+ end
140
+
141
+ def test_brpoplpush_socket_timeout
142
+ mock(:delay => 1 + OPTIONS[:timeout] * 2) do |r|
143
+ assert_raises(Redis2::TimeoutError) do
144
+ r.brpoplpush("{zap}foo", "{zap}bar", :timeout => 1)
145
+ end
146
+ end
147
+ end
148
+ end
149
+ end
150
+ end
@@ -0,0 +1,162 @@
1
+ module Lint
2
+
3
+ module Hashes
4
+
5
+ def test_hset_and_hget
6
+ r.hset("foo", "f1", "s1")
7
+
8
+ assert_equal "s1", r.hget("foo", "f1")
9
+ end
10
+
11
+ def test_hsetnx
12
+ r.hset("foo", "f1", "s1")
13
+ r.hsetnx("foo", "f1", "s2")
14
+
15
+ assert_equal "s1", r.hget("foo", "f1")
16
+
17
+ r.del("foo")
18
+ r.hsetnx("foo", "f1", "s2")
19
+
20
+ assert_equal "s2", r.hget("foo", "f1")
21
+ end
22
+
23
+ def test_hdel
24
+ r.hset("foo", "f1", "s1")
25
+
26
+ assert_equal "s1", r.hget("foo", "f1")
27
+
28
+ assert_equal 1, r.hdel("foo", "f1")
29
+
30
+ assert_equal nil, r.hget("foo", "f1")
31
+ end
32
+
33
+ def test_variadic_hdel
34
+ target_version "2.3.9" do
35
+ r.hset("foo", "f1", "s1")
36
+ r.hset("foo", "f2", "s2")
37
+
38
+ assert_equal "s1", r.hget("foo", "f1")
39
+ assert_equal "s2", r.hget("foo", "f2")
40
+
41
+ assert_equal 2, r.hdel("foo", ["f1", "f2"])
42
+
43
+ assert_equal nil, r.hget("foo", "f1")
44
+ assert_equal nil, r.hget("foo", "f2")
45
+ end
46
+ end
47
+
48
+ def test_hexists
49
+ assert_equal false, r.hexists("foo", "f1")
50
+
51
+ r.hset("foo", "f1", "s1")
52
+
53
+ assert r.hexists("foo", "f1")
54
+ end
55
+
56
+ def test_hlen
57
+ assert_equal 0, r.hlen("foo")
58
+
59
+ r.hset("foo", "f1", "s1")
60
+
61
+ assert_equal 1, r.hlen("foo")
62
+
63
+ r.hset("foo", "f2", "s2")
64
+
65
+ assert_equal 2, r.hlen("foo")
66
+ end
67
+
68
+ def test_hkeys
69
+ assert_equal [], r.hkeys("foo")
70
+
71
+ r.hset("foo", "f1", "s1")
72
+ r.hset("foo", "f2", "s2")
73
+
74
+ assert_equal ["f1", "f2"], r.hkeys("foo")
75
+ end
76
+
77
+ def test_hvals
78
+ assert_equal [], r.hvals("foo")
79
+
80
+ r.hset("foo", "f1", "s1")
81
+ r.hset("foo", "f2", "s2")
82
+
83
+ assert_equal ["s1", "s2"], r.hvals("foo")
84
+ end
85
+
86
+ def test_hgetall
87
+ assert({} == r.hgetall("foo"))
88
+
89
+ r.hset("foo", "f1", "s1")
90
+ r.hset("foo", "f2", "s2")
91
+
92
+ assert({"f1" => "s1", "f2" => "s2"} == r.hgetall("foo"))
93
+ end
94
+
95
+ def test_hmset
96
+ r.hmset("hash", "foo1", "bar1", "foo2", "bar2")
97
+
98
+ assert_equal "bar1", r.hget("hash", "foo1")
99
+ assert_equal "bar2", r.hget("hash", "foo2")
100
+ end
101
+
102
+ def test_hmset_with_invalid_arguments
103
+ assert_raise(Redis2::CommandError) do
104
+ r.hmset("hash", "foo1", "bar1", "foo2", "bar2", "foo3")
105
+ end
106
+ end
107
+
108
+ def test_mapped_hmset
109
+ r.mapped_hmset("foo", :f1 => "s1", :f2 => "s2")
110
+
111
+ assert_equal "s1", r.hget("foo", "f1")
112
+ assert_equal "s2", r.hget("foo", "f2")
113
+ end
114
+
115
+ def test_hmget
116
+ r.hset("foo", "f1", "s1")
117
+ r.hset("foo", "f2", "s2")
118
+ r.hset("foo", "f3", "s3")
119
+
120
+ assert_equal ["s2", "s3"], r.hmget("foo", "f2", "f3")
121
+ end
122
+
123
+ def test_hmget_mapped
124
+ r.hset("foo", "f1", "s1")
125
+ r.hset("foo", "f2", "s2")
126
+ r.hset("foo", "f3", "s3")
127
+
128
+ assert({"f1" => "s1"} == r.mapped_hmget("foo", "f1"))
129
+ assert({"f1" => "s1", "f2" => "s2"} == r.mapped_hmget("foo", "f1", "f2"))
130
+ end
131
+
132
+ def test_hincrby
133
+ r.hincrby("foo", "f1", 1)
134
+
135
+ assert_equal "1", r.hget("foo", "f1")
136
+
137
+ r.hincrby("foo", "f1", 2)
138
+
139
+ assert_equal "3", r.hget("foo", "f1")
140
+
141
+ r.hincrby("foo", "f1", -1)
142
+
143
+ assert_equal "2", r.hget("foo", "f1")
144
+ end
145
+
146
+ def test_hincrbyfloat
147
+ target_version "2.5.4" do
148
+ r.hincrbyfloat("foo", "f1", 1.23)
149
+
150
+ assert_equal "1.23", r.hget("foo", "f1")
151
+
152
+ r.hincrbyfloat("foo", "f1", 0.77)
153
+
154
+ assert_equal "2", r.hget("foo", "f1")
155
+
156
+ r.hincrbyfloat("foo", "f1", -0.1)
157
+
158
+ assert_equal "1.9", r.hget("foo", "f1")
159
+ end
160
+ end
161
+ end
162
+ end
@@ -0,0 +1,143 @@
1
+ module Lint
2
+
3
+ module Lists
4
+
5
+ def test_lpush
6
+ r.lpush "foo", "s1"
7
+ r.lpush "foo", "s2"
8
+
9
+ assert_equal 2, r.llen("foo")
10
+ assert_equal "s2", r.lpop("foo")
11
+ end
12
+
13
+ def test_variadic_lpush
14
+ target_version "2.3.9" do # 2.4-rc6
15
+ assert_equal 3, r.lpush("foo", ["s1", "s2", "s3"])
16
+ assert_equal 3, r.llen("foo")
17
+ assert_equal "s3", r.lpop("foo")
18
+ end
19
+ end
20
+
21
+ def test_lpushx
22
+ r.lpushx "foo", "s1"
23
+ r.lpush "foo", "s2"
24
+ r.lpushx "foo", "s3"
25
+
26
+ assert_equal 2, r.llen("foo")
27
+ assert_equal ["s3", "s2"], r.lrange("foo", 0, -1)
28
+ end
29
+
30
+ def test_rpush
31
+ r.rpush "foo", "s1"
32
+ r.rpush "foo", "s2"
33
+
34
+ assert_equal 2, r.llen("foo")
35
+ assert_equal "s2", r.rpop("foo")
36
+ end
37
+
38
+ def test_variadic_rpush
39
+ target_version "2.3.9" do # 2.4-rc6
40
+ assert_equal 3, r.rpush("foo", ["s1", "s2", "s3"])
41
+ assert_equal 3, r.llen("foo")
42
+ assert_equal "s3", r.rpop("foo")
43
+ end
44
+ end
45
+
46
+ def test_rpushx
47
+ r.rpushx "foo", "s1"
48
+ r.rpush "foo", "s2"
49
+ r.rpushx "foo", "s3"
50
+
51
+ assert_equal 2, r.llen("foo")
52
+ assert_equal ["s2", "s3"], r.lrange("foo", 0, -1)
53
+ end
54
+
55
+ def test_llen
56
+ r.rpush "foo", "s1"
57
+ r.rpush "foo", "s2"
58
+
59
+ assert_equal 2, r.llen("foo")
60
+ end
61
+
62
+ def test_lrange
63
+ r.rpush "foo", "s1"
64
+ r.rpush "foo", "s2"
65
+ r.rpush "foo", "s3"
66
+
67
+ assert_equal ["s2", "s3"], r.lrange("foo", 1, -1)
68
+ assert_equal ["s1", "s2"], r.lrange("foo", 0, 1)
69
+
70
+ assert_equal [], r.lrange("bar", 0, -1)
71
+ end
72
+
73
+ def test_ltrim
74
+ r.rpush "foo", "s1"
75
+ r.rpush "foo", "s2"
76
+ r.rpush "foo", "s3"
77
+
78
+ r.ltrim "foo", 0, 1
79
+
80
+ assert_equal 2, r.llen("foo")
81
+ assert_equal ["s1", "s2"], r.lrange("foo", 0, -1)
82
+ end
83
+
84
+ def test_lindex
85
+ r.rpush "foo", "s1"
86
+ r.rpush "foo", "s2"
87
+
88
+ assert_equal "s1", r.lindex("foo", 0)
89
+ assert_equal "s2", r.lindex("foo", 1)
90
+ end
91
+
92
+ def test_lset
93
+ r.rpush "foo", "s1"
94
+ r.rpush "foo", "s2"
95
+
96
+ assert_equal "s2", r.lindex("foo", 1)
97
+ assert r.lset("foo", 1, "s3")
98
+ assert_equal "s3", r.lindex("foo", 1)
99
+
100
+ assert_raise Redis2::CommandError do
101
+ r.lset("foo", 4, "s3")
102
+ end
103
+ end
104
+
105
+ def test_lrem
106
+ r.rpush "foo", "s1"
107
+ r.rpush "foo", "s2"
108
+
109
+ assert_equal 1, r.lrem("foo", 1, "s1")
110
+ assert_equal ["s2"], r.lrange("foo", 0, -1)
111
+ end
112
+
113
+ def test_lpop
114
+ r.rpush "foo", "s1"
115
+ r.rpush "foo", "s2"
116
+
117
+ assert_equal 2, r.llen("foo")
118
+ assert_equal "s1", r.lpop("foo")
119
+ assert_equal 1, r.llen("foo")
120
+ end
121
+
122
+ def test_rpop
123
+ r.rpush "foo", "s1"
124
+ r.rpush "foo", "s2"
125
+
126
+ assert_equal 2, r.llen("foo")
127
+ assert_equal "s2", r.rpop("foo")
128
+ assert_equal 1, r.llen("foo")
129
+ end
130
+
131
+ def test_linsert
132
+ r.rpush "foo", "s1"
133
+ r.rpush "foo", "s3"
134
+ r.linsert "foo", :before, "s3", "s2"
135
+
136
+ assert_equal ["s1", "s2", "s3"], r.lrange("foo", 0, -1)
137
+
138
+ assert_raise(Redis2::CommandError) do
139
+ r.linsert "foo", :anywhere, "s3", "s2"
140
+ end
141
+ end
142
+ end
143
+ end
data/test/lint/sets.rb ADDED
@@ -0,0 +1,125 @@
1
+ module Lint
2
+
3
+ module Sets
4
+
5
+ def test_sadd
6
+ assert_equal true, r.sadd("foo", "s1")
7
+ assert_equal true, r.sadd("foo", "s2")
8
+ assert_equal false, r.sadd("foo", "s1")
9
+
10
+ assert_equal ["s1", "s2"], r.smembers("foo").sort
11
+ end
12
+
13
+ def test_variadic_sadd
14
+ target_version "2.3.9" do # 2.4-rc6
15
+ assert_equal 2, r.sadd("foo", ["s1", "s2"])
16
+ assert_equal 1, r.sadd("foo", ["s1", "s2", "s3"])
17
+
18
+ assert_equal ["s1", "s2", "s3"], r.smembers("foo").sort
19
+ end
20
+ end
21
+
22
+ def test_srem
23
+ r.sadd("foo", "s1")
24
+ r.sadd("foo", "s2")
25
+
26
+ assert_equal true, r.srem("foo", "s1")
27
+ assert_equal false, r.srem("foo", "s3")
28
+
29
+ assert_equal ["s2"], r.smembers("foo")
30
+ end
31
+
32
+ def test_variadic_srem
33
+ target_version "2.3.9" do # 2.4-rc6
34
+ r.sadd("foo", "s1")
35
+ r.sadd("foo", "s2")
36
+ r.sadd("foo", "s3")
37
+
38
+ assert_equal 1, r.srem("foo", ["s1", "aaa"])
39
+ assert_equal 0, r.srem("foo", ["bbb", "ccc" "ddd"])
40
+ assert_equal 1, r.srem("foo", ["eee", "s3"])
41
+
42
+ assert_equal ["s2"], r.smembers("foo")
43
+ end
44
+ end
45
+
46
+ def test_spop
47
+ r.sadd "foo", "s1"
48
+ r.sadd "foo", "s2"
49
+
50
+ assert ["s1", "s2"].include?(r.spop("foo"))
51
+ assert ["s1", "s2"].include?(r.spop("foo"))
52
+ assert_equal nil, r.spop("foo")
53
+ end
54
+
55
+ def test_scard
56
+ assert_equal 0, r.scard("foo")
57
+
58
+ r.sadd "foo", "s1"
59
+
60
+ assert_equal 1, r.scard("foo")
61
+
62
+ r.sadd "foo", "s2"
63
+
64
+ assert_equal 2, r.scard("foo")
65
+ end
66
+
67
+ def test_sismember
68
+ assert_equal false, r.sismember("foo", "s1")
69
+
70
+ r.sadd "foo", "s1"
71
+
72
+ assert_equal true, r.sismember("foo", "s1")
73
+ assert_equal false, r.sismember("foo", "s2")
74
+ end
75
+
76
+ def test_smembers
77
+ assert_equal [], r.smembers("foo")
78
+
79
+ r.sadd "foo", "s1"
80
+ r.sadd "foo", "s2"
81
+
82
+ assert_equal ["s1", "s2"], r.smembers("foo").sort
83
+ end
84
+
85
+ def test_srandmember
86
+ r.sadd "foo", "s1"
87
+ r.sadd "foo", "s2"
88
+
89
+ 4.times do
90
+ assert ["s1", "s2"].include?(r.srandmember("foo"))
91
+ end
92
+
93
+ assert_equal 2, r.scard("foo")
94
+ end
95
+
96
+ def test_srandmember_with_positive_count
97
+ r.sadd "foo", "s1"
98
+ r.sadd "foo", "s2"
99
+ r.sadd "foo", "s3"
100
+ r.sadd "foo", "s4"
101
+
102
+ 4.times do
103
+ assert !(["s1", "s2", "s3", "s4"] & r.srandmember("foo", 3)).empty?
104
+
105
+ assert_equal 3, r.srandmember("foo", 3).size
106
+ end
107
+
108
+ assert_equal 4, r.scard("foo")
109
+ end
110
+
111
+ def test_srandmember_with_negative_count
112
+ r.sadd "foo", "s1"
113
+ r.sadd "foo", "s2"
114
+ r.sadd "foo", "s3"
115
+ r.sadd "foo", "s4"
116
+
117
+ 4.times do
118
+ assert !(["s1", "s2", "s3", "s4"] & r.srandmember("foo", -6)).empty?
119
+ assert_equal 6, r.srandmember("foo", -6).size
120
+ end
121
+
122
+ assert_equal 4, r.scard("foo")
123
+ end
124
+ end
125
+ end