redis 2.2.2 → 3.0.0.rc1
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.
- data/.gitignore +2 -0
- data/.yardopts +3 -0
- data/CHANGELOG.md +65 -1
- data/README.md +6 -0
- data/Rakefile +19 -27
- data/lib/redis.rb +737 -170
- data/lib/redis/client.rb +82 -67
- data/lib/redis/connection/command_helper.rb +15 -16
- data/lib/redis/connection/hiredis.rb +6 -3
- data/lib/redis/connection/ruby.rb +2 -1
- data/lib/redis/connection/synchrony.rb +3 -1
- data/lib/redis/distributed.rb +20 -18
- data/lib/redis/errors.rb +38 -0
- data/lib/redis/hash_ring.rb +2 -2
- data/lib/redis/pipeline.rb +91 -19
- data/lib/redis/subscribe.rb +1 -16
- data/lib/redis/version.rb +1 -1
- data/redis.gemspec +30 -11
- data/test/command_map_test.rb +29 -0
- data/test/commands_on_hashes_test.rb +3 -3
- data/test/commands_on_lists_test.rb +1 -1
- data/test/commands_on_sets_test.rb +0 -2
- data/test/commands_on_sorted_sets_test.rb +8 -9
- data/test/commands_on_strings_test.rb +3 -3
- data/test/commands_on_value_types_test.rb +0 -1
- data/test/connection_handling_test.rb +120 -4
- data/test/distributed_commands_on_hashes_test.rb +0 -1
- data/test/distributed_commands_on_lists_test.rb +0 -1
- data/test/distributed_commands_on_sets_test.rb +0 -1
- data/test/distributed_commands_on_sorted_sets_test.rb +19 -0
- data/test/distributed_commands_on_strings_test.rb +0 -1
- data/test/distributed_commands_on_value_types_test.rb +0 -1
- data/test/distributed_connection_handling_test.rb +0 -1
- data/test/distributed_key_tags_test.rb +0 -1
- data/test/distributed_persistence_control_commands_test.rb +0 -1
- data/test/distributed_publish_subscribe_test.rb +1 -2
- data/test/distributed_remote_server_control_commands_test.rb +2 -3
- data/test/distributed_transactions_test.rb +0 -1
- data/test/encoding_test.rb +0 -1
- data/test/helper.rb +14 -4
- data/test/helper_test.rb +8 -0
- data/test/internals_test.rb +25 -33
- data/test/lint/hashes.rb +17 -3
- data/test/lint/internals.rb +2 -3
- data/test/lint/lists.rb +17 -3
- data/test/lint/sets.rb +30 -6
- data/test/lint/sorted_sets.rb +56 -27
- data/test/lint/strings.rb +9 -13
- data/test/lint/value_types.rb +12 -15
- data/test/persistence_control_commands_test.rb +0 -1
- data/test/pipelining_commands_test.rb +69 -6
- data/test/publish_subscribe_test.rb +1 -1
- data/test/redis_mock.rb +14 -5
- data/test/remote_server_control_commands_test.rb +8 -2
- data/test/sorting_test.rb +0 -1
- data/test/test.conf +1 -0
- data/test/transactions_test.rb +88 -15
- data/test/unknown_commands_test.rb +1 -2
- data/test/url_param_test.rb +0 -1
- metadata +68 -16
- data/lib/redis/compat.rb +0 -21
@@ -0,0 +1,19 @@
|
|
1
|
+
# encoding: UTF-8
|
2
|
+
|
3
|
+
require File.expand_path("./helper", File.dirname(__FILE__))
|
4
|
+
require "redis/distributed"
|
5
|
+
|
6
|
+
setup do
|
7
|
+
log = StringIO.new
|
8
|
+
init Redis::Distributed.new(NODES, :logger => ::Logger.new(log))
|
9
|
+
end
|
10
|
+
|
11
|
+
load './test/lint/sorted_sets.rb'
|
12
|
+
|
13
|
+
test "ZCOUNT" do |r|
|
14
|
+
r.zadd "foo", 1, "s1"
|
15
|
+
r.zadd "foo", 2, "s2"
|
16
|
+
r.zadd "foo", 3, "s3"
|
17
|
+
|
18
|
+
assert 2 == r.zcount("foo", 2, 3)
|
19
|
+
end
|
@@ -84,7 +84,7 @@ test "SUBSCRIBE within SUBSCRIBE" do |r|
|
|
84
84
|
end
|
85
85
|
|
86
86
|
test "other commands within a SUBSCRIBE" do |r|
|
87
|
-
assert_raise
|
87
|
+
assert_raise Redis::CommandError do
|
88
88
|
r.subscribe("foo") do |on|
|
89
89
|
on.subscribe do |channel, total|
|
90
90
|
r.set("bar", "s2")
|
@@ -98,4 +98,3 @@ test "SUBSCRIBE without a block" do |r|
|
|
98
98
|
r.subscribe("foo")
|
99
99
|
end
|
100
100
|
end
|
101
|
-
|
@@ -17,8 +17,8 @@ test "INFO" do |r|
|
|
17
17
|
end
|
18
18
|
|
19
19
|
test "INFO COMMANDSTATS" do |r|
|
20
|
-
# Only available on Redis >= 2.
|
21
|
-
next if r
|
20
|
+
# Only available on Redis >= 2.9.0
|
21
|
+
next if version(r) < 209000
|
22
22
|
|
23
23
|
r.nodes.each { |n| n.config(:resetstat) }
|
24
24
|
r.ping # Executed on every node
|
@@ -40,4 +40,3 @@ end
|
|
40
40
|
test "ECHO" do |r|
|
41
41
|
assert ["foo bar baz\n"] == r.echo("foo bar baz\n")
|
42
42
|
end
|
43
|
-
|
data/test/encoding_test.rb
CHANGED
data/test/helper.rb
CHANGED
@@ -1,6 +1,6 @@
|
|
1
1
|
$:.unshift File.expand_path('../lib', File.dirname(__FILE__))
|
2
2
|
|
3
|
-
require "cutest"
|
3
|
+
#require "cutest"
|
4
4
|
require "logger"
|
5
5
|
require "stringio"
|
6
6
|
|
@@ -20,7 +20,7 @@ def init(redis)
|
|
20
20
|
redis.flushdb
|
21
21
|
redis.select 15
|
22
22
|
redis
|
23
|
-
rescue
|
23
|
+
rescue Redis::CannotConnectError
|
24
24
|
puts <<-EOS
|
25
25
|
|
26
26
|
Cannot connect to Redis.
|
@@ -29,7 +29,7 @@ def init(redis)
|
|
29
29
|
This testing suite connects to the database 15.
|
30
30
|
|
31
31
|
To install redis:
|
32
|
-
visit <http://
|
32
|
+
visit <http://redis.io/download/>.
|
33
33
|
|
34
34
|
To start the server:
|
35
35
|
rake start
|
@@ -44,6 +44,7 @@ end
|
|
44
44
|
|
45
45
|
$VERBOSE = true
|
46
46
|
|
47
|
+
require "redis/connection/%s" % (ENV["REDIS_CONNECTION_DRIVER"] || "ruby")
|
47
48
|
require "redis"
|
48
49
|
|
49
50
|
def driver
|
@@ -124,6 +125,16 @@ def silent
|
|
124
125
|
end
|
125
126
|
end
|
126
127
|
|
128
|
+
def version(r)
|
129
|
+
info = r.info
|
130
|
+
info = info.first unless info.is_a?(Hash)
|
131
|
+
version_str_to_i info["redis_version"]
|
132
|
+
end
|
133
|
+
|
134
|
+
def version_str_to_i(version_str)
|
135
|
+
version_str.split(".").map{ |v| v.ljust(2, '0') }.join.to_i
|
136
|
+
end
|
137
|
+
|
127
138
|
def with_external_encoding(encoding)
|
128
139
|
original_encoding = Encoding.default_external
|
129
140
|
|
@@ -142,4 +153,3 @@ def assert_nothing_raised(*exceptions)
|
|
142
153
|
flunk(caller[1])
|
143
154
|
end
|
144
155
|
end
|
145
|
-
|
data/test/helper_test.rb
ADDED
@@ -0,0 +1,8 @@
|
|
1
|
+
require File.expand_path("./helper", File.dirname(__FILE__))
|
2
|
+
|
3
|
+
test "version_str_to_i" do
|
4
|
+
assert_equal 200000, version_str_to_i('2.0.0')
|
5
|
+
assert_equal 202020, version_str_to_i('2.2.2')
|
6
|
+
assert_equal 202022, version_str_to_i('2.2.22')
|
7
|
+
assert_equal 222222, version_str_to_i('22.22.22')
|
8
|
+
end
|
data/test/internals_test.rb
CHANGED
@@ -35,20 +35,11 @@ test "Timeout" do
|
|
35
35
|
end
|
36
36
|
end
|
37
37
|
|
38
|
-
# Don't use assert_raise because Timeour::Error in 1.8 inherits
|
39
|
-
# Exception instead of StandardError (on 1.9).
|
40
38
|
test "Connection timeout" do
|
41
|
-
# EM immediately raises CONNREFUSED
|
42
39
|
next if driver == :synchrony
|
43
40
|
|
44
|
-
|
45
|
-
|
46
|
-
begin
|
41
|
+
assert_raise Redis::CannotConnectError do
|
47
42
|
Redis.new(OPTIONS.merge(:host => "10.255.255.254", :timeout => 0.1)).ping
|
48
|
-
rescue Timeout::Error
|
49
|
-
result = true
|
50
|
-
ensure
|
51
|
-
assert result
|
52
43
|
end
|
53
44
|
end
|
54
45
|
|
@@ -80,7 +71,7 @@ test "Don't retry when wrapped inside #without_reconnect" do
|
|
80
71
|
|
81
72
|
redis_mock(:ping => command) do
|
82
73
|
redis = Redis.connect(:port => 6380, :timeout => 0.1)
|
83
|
-
assert_raise
|
74
|
+
assert_raise Redis::ConnectionError do
|
84
75
|
redis.without_reconnect do
|
85
76
|
redis.ping
|
86
77
|
end
|
@@ -103,7 +94,7 @@ test "Retry only once when read raises ECONNRESET" do
|
|
103
94
|
|
104
95
|
redis_mock(:ping => command) do
|
105
96
|
redis = Redis.connect(:port => 6380, :timeout => 0.1)
|
106
|
-
assert_raise
|
97
|
+
assert_raise Redis::ConnectionError do
|
107
98
|
redis.ping
|
108
99
|
end
|
109
100
|
|
@@ -123,7 +114,7 @@ test "Don't retry when second read in pipeline raises ECONNRESET" do
|
|
123
114
|
|
124
115
|
redis_mock(:ping => command) do
|
125
116
|
redis = Redis.connect(:port => 6380, :timeout => 0.1)
|
126
|
-
assert_raise
|
117
|
+
assert_raise Redis::ConnectionError do
|
127
118
|
redis.pipelined do
|
128
119
|
redis.ping
|
129
120
|
redis.ping # Second #read times out
|
@@ -138,23 +129,24 @@ test "Connecting to UNIX domain socket" do
|
|
138
129
|
end
|
139
130
|
end
|
140
131
|
|
141
|
-
#
|
142
|
-
#
|
143
|
-
|
144
|
-
|
145
|
-
|
146
|
-
|
147
|
-
|
148
|
-
|
149
|
-
|
150
|
-
|
151
|
-
|
152
|
-
|
153
|
-
|
154
|
-
|
155
|
-
|
156
|
-
|
157
|
-
|
158
|
-
|
159
|
-
end
|
160
|
-
|
132
|
+
# if driver == :ruby || driver == :hiredis
|
133
|
+
# # Using a mock server in a thread doesn't work here (possibly because blocking
|
134
|
+
# # socket ops, raw socket timeouts and Ruby's thread scheduling don't mix).
|
135
|
+
# test "Bubble EAGAIN without retrying" do
|
136
|
+
# cmd = %{(sleep 0.3; echo "+PONG\r\n") | nc -l 6380}
|
137
|
+
# IO.popen(cmd) do |_|
|
138
|
+
# sleep 0.1 # Give nc a little time to start listening
|
139
|
+
# redis = Redis.connect(:port => 6380, :timeout => 0.1)
|
140
|
+
#
|
141
|
+
# begin
|
142
|
+
# assert_raise(Errno::EAGAIN) { redis.ping }
|
143
|
+
# ensure
|
144
|
+
# # Explicitly close connection so nc can quit
|
145
|
+
# redis.client.disconnect
|
146
|
+
#
|
147
|
+
# # Make the reactor loop do a tick to really close
|
148
|
+
# EM::Synchrony.sleep(0) if driver == :synchrony
|
149
|
+
# end
|
150
|
+
# end
|
151
|
+
# end
|
152
|
+
# end
|
data/test/lint/hashes.rb
CHANGED
@@ -21,11 +21,26 @@ test "HDEL" do |r|
|
|
21
21
|
|
22
22
|
assert "s1" == r.hget("foo", "f1")
|
23
23
|
|
24
|
-
r.hdel("foo", "f1")
|
24
|
+
assert 1 == r.hdel("foo", "f1")
|
25
25
|
|
26
26
|
assert nil == r.hget("foo", "f1")
|
27
27
|
end
|
28
28
|
|
29
|
+
test "Variadic HDEL" do |r|
|
30
|
+
next if version(r) < 203090
|
31
|
+
|
32
|
+
r.hset("foo", "f1", "s1")
|
33
|
+
r.hset("foo", "f2", "s2")
|
34
|
+
|
35
|
+
assert "s1" == r.hget("foo", "f1")
|
36
|
+
assert "s2" == r.hget("foo", "f2")
|
37
|
+
|
38
|
+
assert 2 == r.hdel("foo", ["f1", "f2"])
|
39
|
+
|
40
|
+
assert nil == r.hget("foo", "f1")
|
41
|
+
assert nil == r.hget("foo", "f2")
|
42
|
+
end
|
43
|
+
|
29
44
|
test "HEXISTS" do |r|
|
30
45
|
assert false == r.hexists("foo", "f1")
|
31
46
|
|
@@ -81,7 +96,7 @@ test "HMSET" do |r|
|
|
81
96
|
end
|
82
97
|
|
83
98
|
test "HMSET with invalid arguments" do |r|
|
84
|
-
assert_raise(
|
99
|
+
assert_raise(Redis::CommandError) do
|
85
100
|
r.hmset("hash", "foo1", "bar1", "foo2", "bar2", "foo3")
|
86
101
|
end
|
87
102
|
end
|
@@ -123,4 +138,3 @@ test "HINCRBY" do |r|
|
|
123
138
|
|
124
139
|
assert "2" == r.hget("foo", "f1")
|
125
140
|
end
|
126
|
-
|
data/test/lint/internals.rb
CHANGED
@@ -18,8 +18,8 @@ end if $TEST_PIPELINING
|
|
18
18
|
test "Recovers from failed commands" do |r, _|
|
19
19
|
# See http://github.com/ezmobius/redis-rb/issues#issue/28
|
20
20
|
|
21
|
-
assert_raise
|
22
|
-
r.
|
21
|
+
assert_raise do
|
22
|
+
r.command_that_doesnt_exist
|
23
23
|
end
|
24
24
|
|
25
25
|
assert_nothing_raised do
|
@@ -34,4 +34,3 @@ test "raises on protocol errors" do
|
|
34
34
|
end
|
35
35
|
end
|
36
36
|
end
|
37
|
-
|
data/test/lint/lists.rb
CHANGED
@@ -6,6 +6,14 @@ test "RPUSH" do |r|
|
|
6
6
|
assert "s2" == r.rpop("foo")
|
7
7
|
end
|
8
8
|
|
9
|
+
test "Variadic RPUSH" do |r|
|
10
|
+
next if version(r) < 203090 # 2.4-rc6
|
11
|
+
|
12
|
+
assert 3 == r.rpush("foo", ["s1", "s2", "s3"])
|
13
|
+
assert 3 == r.llen("foo")
|
14
|
+
assert "s3" == r.rpop("foo")
|
15
|
+
end
|
16
|
+
|
9
17
|
test "LPUSH" do |r|
|
10
18
|
r.lpush "foo", "s1"
|
11
19
|
r.lpush "foo", "s2"
|
@@ -14,6 +22,14 @@ test "LPUSH" do |r|
|
|
14
22
|
assert "s2" == r.lpop("foo")
|
15
23
|
end
|
16
24
|
|
25
|
+
test "Variadic LPUSH" do |r|
|
26
|
+
next if version(r) < 203090 # 2.4-rc6
|
27
|
+
|
28
|
+
assert 3 == r.lpush("foo", ["s1", "s2", "s3"])
|
29
|
+
assert 3 == r.llen("foo")
|
30
|
+
assert "s3" == r.lpop("foo")
|
31
|
+
end
|
32
|
+
|
17
33
|
test "LLEN" do |r|
|
18
34
|
r.rpush "foo", "s1"
|
19
35
|
r.rpush "foo", "s2"
|
@@ -59,7 +75,7 @@ test "LSET" do |r|
|
|
59
75
|
assert r.lset("foo", 1, "s3")
|
60
76
|
assert "s3" == r.lindex("foo", 1)
|
61
77
|
|
62
|
-
assert_raise
|
78
|
+
assert_raise Redis::CommandError do
|
63
79
|
r.lset("foo", 4, "s3")
|
64
80
|
end
|
65
81
|
end
|
@@ -89,5 +105,3 @@ test "RPOP" do |r|
|
|
89
105
|
assert "s2" == r.rpop("foo")
|
90
106
|
assert 1 == r.llen("foo")
|
91
107
|
end
|
92
|
-
|
93
|
-
|
data/test/lint/sets.rb
CHANGED
@@ -1,15 +1,40 @@
|
|
1
1
|
test "SADD" do |r|
|
2
|
-
r.sadd
|
3
|
-
r.sadd
|
2
|
+
assert true == r.sadd("foo", "s1")
|
3
|
+
assert true == r.sadd("foo", "s2")
|
4
|
+
assert false == r.sadd("foo", "s1")
|
4
5
|
|
5
6
|
assert ["s1", "s2"] == r.smembers("foo").sort
|
6
7
|
end
|
7
8
|
|
9
|
+
test "Variadic SADD" do |r|
|
10
|
+
next if version(r) < 203090 # 2.4-rc6
|
11
|
+
|
12
|
+
assert 2 == r.sadd("foo", ["s1", "s2"])
|
13
|
+
assert 1 == r.sadd("foo", ["s1", "s2", "s3"])
|
14
|
+
|
15
|
+
assert ["s1", "s2", "s3"] == r.smembers("foo").sort
|
16
|
+
end
|
17
|
+
|
8
18
|
test "SREM" do |r|
|
9
|
-
r.sadd
|
10
|
-
r.sadd
|
19
|
+
r.sadd("foo", "s1")
|
20
|
+
r.sadd("foo", "s2")
|
11
21
|
|
12
|
-
r.srem("foo", "s1")
|
22
|
+
assert true == r.srem("foo", "s1")
|
23
|
+
assert false == r.srem("foo", "s3")
|
24
|
+
|
25
|
+
assert ["s2"] == r.smembers("foo")
|
26
|
+
end
|
27
|
+
|
28
|
+
test "Variadic SREM" do |r|
|
29
|
+
next if version(r) < 203090 # 2.4-rc6
|
30
|
+
|
31
|
+
r.sadd("foo", "s1")
|
32
|
+
r.sadd("foo", "s2")
|
33
|
+
r.sadd("foo", "s3")
|
34
|
+
|
35
|
+
assert 1 == r.srem("foo", ["s1", "aaa"])
|
36
|
+
assert 0 == r.srem("foo", ["bbb", "ccc" "ddd"])
|
37
|
+
assert 1 == r.srem("foo", ["eee", "s3"])
|
13
38
|
|
14
39
|
assert ["s2"] == r.smembers("foo")
|
15
40
|
end
|
@@ -63,4 +88,3 @@ test "SRANDMEMBER" do |r|
|
|
63
88
|
|
64
89
|
assert 2 == r.scard("foo")
|
65
90
|
end
|
66
|
-
|
data/test/lint/sorted_sets.rb
CHANGED
@@ -1,33 +1,63 @@
|
|
1
1
|
test "ZADD" do |r|
|
2
2
|
assert 0 == r.zcard("foo")
|
3
|
+
assert true == r.zadd("foo", 1, "s1")
|
4
|
+
assert false == r.zadd("foo", 1, "s1")
|
5
|
+
assert 1 == r.zcard("foo")
|
6
|
+
end
|
3
7
|
|
4
|
-
|
8
|
+
test "Variadic ZADD" do |r|
|
9
|
+
next if version(r) < 203090 # 2.4-rc6
|
5
10
|
|
6
|
-
|
11
|
+
# Non-nested array with pairs
|
12
|
+
assert 0 == r.zcard("foo")
|
13
|
+
assert 2 == r.zadd("foo", [1, "s1", 2, "s2"])
|
14
|
+
assert 1 == r.zadd("foo", [4, "s1", 5, "s2", 6, "s3"])
|
15
|
+
assert 3 == r.zcard("foo")
|
16
|
+
r.del "foo"
|
17
|
+
|
18
|
+
# Nested array with pairs
|
19
|
+
assert 0 == r.zcard("foo")
|
20
|
+
assert 2 == r.zadd("foo", [[1, "s1"], [2, "s2"]])
|
21
|
+
assert 1 == r.zadd("foo", [[4, "s1"], [5, "s2"], [6, "s3"]])
|
22
|
+
assert 3 == r.zcard("foo")
|
23
|
+
r.del "foo"
|
24
|
+
|
25
|
+
# Wrong number of arguments
|
26
|
+
assert_raise { r.zadd("foo") }
|
27
|
+
assert_raise { r.zadd("foo", ["bar"]) }
|
28
|
+
assert_raise { r.zadd("foo", ["bar", "qux", "zap"]) }
|
7
29
|
end
|
8
30
|
|
9
31
|
test "ZREM" do |r|
|
10
|
-
r.zadd
|
32
|
+
r.zadd("foo", 1, "s1")
|
33
|
+
r.zadd("foo", 2, "s2")
|
11
34
|
|
35
|
+
assert 2 == r.zcard("foo")
|
36
|
+
assert true == r.zrem("foo", "s1")
|
37
|
+
assert false == r.zrem("foo", "s1")
|
12
38
|
assert 1 == r.zcard("foo")
|
39
|
+
end
|
13
40
|
|
14
|
-
|
15
|
-
|
16
|
-
assert 2 == r.zcard("foo")
|
41
|
+
test "Variadic ZREM" do |r|
|
42
|
+
next if version(r) < 203090 # 2.4-rc6
|
17
43
|
|
18
|
-
r.
|
44
|
+
r.zadd("foo", 1, "s1")
|
45
|
+
r.zadd("foo", 2, "s2")
|
46
|
+
r.zadd("foo", 3, "s3")
|
19
47
|
|
48
|
+
assert 3 == r.zcard("foo")
|
49
|
+
assert 1 == r.zrem("foo", ["s1", "aaa"])
|
50
|
+
assert 0 == r.zrem("foo", ["bbb", "ccc" "ddd"])
|
51
|
+
assert 1 == r.zrem("foo", ["eee", "s3"])
|
20
52
|
assert 1 == r.zcard("foo")
|
21
53
|
end
|
22
54
|
|
23
55
|
test "ZINCRBY" do |r|
|
24
|
-
r.zincrby "foo", 1, "s1"
|
25
|
-
|
26
|
-
assert "1" == r.zscore("foo", "s1")
|
56
|
+
rv = r.zincrby "foo", 1, "s1"
|
57
|
+
assert 1.0 == rv
|
27
58
|
|
28
|
-
r.zincrby "foo", 10, "s1"
|
29
|
-
|
30
|
-
assert "11" == r.zscore("foo", "s1")
|
59
|
+
rv = r.zincrby "foo", 10, "s1"
|
60
|
+
assert 11.0 == rv
|
31
61
|
end
|
32
62
|
|
33
63
|
test "ZRANK" do |r|
|
@@ -52,8 +82,8 @@ test "ZRANGE" do |r|
|
|
52
82
|
r.zadd "foo", 3, "s3"
|
53
83
|
|
54
84
|
assert ["s1", "s2"] == r.zrange("foo", 0, 1)
|
55
|
-
assert ["s1",
|
56
|
-
assert ["s1",
|
85
|
+
assert [["s1", 1.0], ["s2", 2.0]] == r.zrange("foo", 0, 1, :with_scores => true)
|
86
|
+
assert [["s1", 1.0], ["s2", 2.0]] == r.zrange("foo", 0, 1, :withscores => true)
|
57
87
|
end
|
58
88
|
|
59
89
|
test "ZREVRANGE" do |r|
|
@@ -62,8 +92,8 @@ test "ZREVRANGE" do |r|
|
|
62
92
|
r.zadd "foo", 3, "s3"
|
63
93
|
|
64
94
|
assert ["s3", "s2"] == r.zrevrange("foo", 0, 1)
|
65
|
-
assert ["s3",
|
66
|
-
assert ["s3",
|
95
|
+
assert [["s3", 3.0], ["s2", 2.0]] == r.zrevrange("foo", 0, 1, :with_scores => true)
|
96
|
+
assert [["s3", 3.0], ["s2", 2.0]] == r.zrevrange("foo", 0, 1, :withscores => true)
|
67
97
|
end
|
68
98
|
|
69
99
|
test "ZRANGEBYSCORE" do |r|
|
@@ -110,10 +140,10 @@ test "ZRANGEBYSCORE with WITHSCORES" do |r|
|
|
110
140
|
r.zadd "foo", 3, "s3"
|
111
141
|
r.zadd "foo", 4, "s4"
|
112
142
|
|
113
|
-
assert ["s2",
|
114
|
-
assert ["s3",
|
115
|
-
assert ["s2",
|
116
|
-
assert ["s3",
|
143
|
+
assert [["s2", 2.0]] == r.zrangebyscore("foo", 2, 4, :limit => [0, 1], :with_scores => true)
|
144
|
+
assert [["s3", 3.0]] == r.zrangebyscore("foo", 2, 4, :limit => [1, 1], :with_scores => true)
|
145
|
+
assert [["s2", 2.0]] == r.zrangebyscore("foo", 2, 4, :limit => [0, 1], :withscores => true)
|
146
|
+
assert [["s3", 3.0]] == r.zrangebyscore("foo", 2, 4, :limit => [1, 1], :withscores => true)
|
117
147
|
end
|
118
148
|
|
119
149
|
test "ZREVRANGEBYSCORE with WITHSCORES" do |r|
|
@@ -122,10 +152,10 @@ test "ZREVRANGEBYSCORE with WITHSCORES" do |r|
|
|
122
152
|
r.zadd "foo", 3, "s3"
|
123
153
|
r.zadd "foo", 4, "s4"
|
124
154
|
|
125
|
-
assert ["s4",
|
126
|
-
assert ["s3",
|
127
|
-
assert ["s4",
|
128
|
-
assert ["s3",
|
155
|
+
assert [["s4", 4.0]] == r.zrevrangebyscore("foo", 4, 2, :limit => [0, 1], :with_scores => true)
|
156
|
+
assert [["s3", 3.0]] == r.zrevrangebyscore("foo", 4, 2, :limit => [1, 1], :with_scores => true)
|
157
|
+
assert [["s4", 4.0]] == r.zrevrangebyscore("foo", 4, 2, :limit => [0, 1], :withscores => true)
|
158
|
+
assert [["s3", 3.0]] == r.zrevrangebyscore("foo", 4, 2, :limit => [1, 1], :withscores => true)
|
129
159
|
end
|
130
160
|
|
131
161
|
test "ZCARD" do |r|
|
@@ -139,7 +169,7 @@ end
|
|
139
169
|
test "ZSCORE" do |r|
|
140
170
|
r.zadd "foo", 1, "s1"
|
141
171
|
|
142
|
-
assert
|
172
|
+
assert 1.0 == r.zscore("foo", "s1")
|
143
173
|
|
144
174
|
assert nil == r.zscore("foo", "s2")
|
145
175
|
assert nil == r.zscore("bar", "s1")
|
@@ -164,4 +194,3 @@ test "ZREMRANGEBYSCORE" do |r|
|
|
164
194
|
assert 3 == r.zremrangebyscore("foo", 2, 4)
|
165
195
|
assert ["s1"] == r.zrange("foo", 0, -1)
|
166
196
|
end
|
167
|
-
|