redis 2.2.2 → 3.0.0.rc1
Sign up to get free protection for your applications and to get access to all the features.
- 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
|
-
|