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.
Files changed (61) hide show
  1. data/.gitignore +2 -0
  2. data/.yardopts +3 -0
  3. data/CHANGELOG.md +65 -1
  4. data/README.md +6 -0
  5. data/Rakefile +19 -27
  6. data/lib/redis.rb +737 -170
  7. data/lib/redis/client.rb +82 -67
  8. data/lib/redis/connection/command_helper.rb +15 -16
  9. data/lib/redis/connection/hiredis.rb +6 -3
  10. data/lib/redis/connection/ruby.rb +2 -1
  11. data/lib/redis/connection/synchrony.rb +3 -1
  12. data/lib/redis/distributed.rb +20 -18
  13. data/lib/redis/errors.rb +38 -0
  14. data/lib/redis/hash_ring.rb +2 -2
  15. data/lib/redis/pipeline.rb +91 -19
  16. data/lib/redis/subscribe.rb +1 -16
  17. data/lib/redis/version.rb +1 -1
  18. data/redis.gemspec +30 -11
  19. data/test/command_map_test.rb +29 -0
  20. data/test/commands_on_hashes_test.rb +3 -3
  21. data/test/commands_on_lists_test.rb +1 -1
  22. data/test/commands_on_sets_test.rb +0 -2
  23. data/test/commands_on_sorted_sets_test.rb +8 -9
  24. data/test/commands_on_strings_test.rb +3 -3
  25. data/test/commands_on_value_types_test.rb +0 -1
  26. data/test/connection_handling_test.rb +120 -4
  27. data/test/distributed_commands_on_hashes_test.rb +0 -1
  28. data/test/distributed_commands_on_lists_test.rb +0 -1
  29. data/test/distributed_commands_on_sets_test.rb +0 -1
  30. data/test/distributed_commands_on_sorted_sets_test.rb +19 -0
  31. data/test/distributed_commands_on_strings_test.rb +0 -1
  32. data/test/distributed_commands_on_value_types_test.rb +0 -1
  33. data/test/distributed_connection_handling_test.rb +0 -1
  34. data/test/distributed_key_tags_test.rb +0 -1
  35. data/test/distributed_persistence_control_commands_test.rb +0 -1
  36. data/test/distributed_publish_subscribe_test.rb +1 -2
  37. data/test/distributed_remote_server_control_commands_test.rb +2 -3
  38. data/test/distributed_transactions_test.rb +0 -1
  39. data/test/encoding_test.rb +0 -1
  40. data/test/helper.rb +14 -4
  41. data/test/helper_test.rb +8 -0
  42. data/test/internals_test.rb +25 -33
  43. data/test/lint/hashes.rb +17 -3
  44. data/test/lint/internals.rb +2 -3
  45. data/test/lint/lists.rb +17 -3
  46. data/test/lint/sets.rb +30 -6
  47. data/test/lint/sorted_sets.rb +56 -27
  48. data/test/lint/strings.rb +9 -13
  49. data/test/lint/value_types.rb +12 -15
  50. data/test/persistence_control_commands_test.rb +0 -1
  51. data/test/pipelining_commands_test.rb +69 -6
  52. data/test/publish_subscribe_test.rb +1 -1
  53. data/test/redis_mock.rb +14 -5
  54. data/test/remote_server_control_commands_test.rb +8 -2
  55. data/test/sorting_test.rb +0 -1
  56. data/test/test.conf +1 -0
  57. data/test/transactions_test.rb +88 -15
  58. data/test/unknown_commands_test.rb +1 -2
  59. data/test/url_param_test.rb +0 -1
  60. metadata +68 -16
  61. data/lib/redis/compat.rb +0 -21
@@ -9,4 +9,3 @@ setup do
9
9
  end
10
10
 
11
11
  load './test/lint/hashes.rb'
12
-
@@ -21,4 +21,3 @@ test "BRPOPLPUSH" do |r|
21
21
  r.brpoplpush("foo", "bar", 1)
22
22
  end
23
23
  end
24
-
@@ -82,4 +82,3 @@ test "SDIFFSTORE" do |r|
82
82
  r.sdiffstore("baz", "foo", "bar")
83
83
  end
84
84
  end
85
-
@@ -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
@@ -47,4 +47,3 @@ test "MSETNX mapped" do |r|
47
47
  r.mapped_msetnx(:foo => "s2", :bar => "s3")
48
48
  end
49
49
  end
50
-
@@ -70,4 +70,3 @@ test "FLUSHDB" do |r|
70
70
 
71
71
  assert [0] == r.dbsize
72
72
  end
73
-
@@ -22,4 +22,3 @@ test "SELECT" do |r|
22
22
 
23
23
  assert "bar" == r.get("foo")
24
24
  end
25
-
@@ -50,4 +50,3 @@ test "allows passing a custom tag extractor" do |r|
50
50
 
51
51
  assert [0, 100] == r.nodes.map { |node| node.keys.size }
52
52
  end
53
-
@@ -21,4 +21,3 @@ end
21
21
  test "LASTSAVE" do |r|
22
22
  assert r.lastsave.all? { |t| Time.at(t) <= Time.now }
23
23
  end
24
-
@@ -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 RuntimeError do
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.3.0
21
- next if r.info.first["redis_version"] < "2.3.0"
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
-
@@ -31,4 +31,3 @@ test "WATCH/UNWATCH" do |r|
31
31
  r.unwatch
32
32
  end
33
33
  end
34
-
@@ -13,4 +13,3 @@ test "returns properly encoded strings" do |r|
13
13
  assert "Shalom שלום" == "Shalom " + r.get("foo")
14
14
  end
15
15
  end if defined?(Encoding)
16
-
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 Errno::ECONNREFUSED
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://code.google.com/p/redis/>.
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
-
@@ -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
@@ -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
- result = false
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 Errno::ECONNRESET do
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 Errno::ECONNRESET do
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 Errno::ECONNRESET do
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
- # Using a mock server in a thread doesn't work here (possibly because blocking
142
- # socket ops, raw socket timeouts and Ruby's thread scheduling don't mix).
143
- test "Bubble EAGAIN without retrying" do
144
- cmd = %{(sleep 0.3; echo "+PONG\r\n") | nc -l 6380}
145
- IO.popen(cmd) do |_|
146
- sleep 0.1 # Give nc a little time to start listening
147
- redis = Redis.connect(:port => 6380, :timeout => 0.1)
148
-
149
- begin
150
- assert_raise(Errno::EAGAIN) { redis.ping }
151
- ensure
152
- # Explicitly close connection so nc can quit
153
- redis.client.disconnect
154
-
155
- # Make the reactor loop do a tick to really close
156
- EM::Synchrony.sleep(0) if driver == :synchrony
157
- end
158
- end
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(RuntimeError) do
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
-
@@ -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(ArgumentError) do
22
- r.srem "foo"
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 RuntimeError do
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 "foo", "s1"
3
- r.sadd "foo", "s2"
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 "foo", "s1"
10
- r.sadd "foo", "s2"
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
-
@@ -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
- r.zadd "foo", 1, "s1"
8
+ test "Variadic ZADD" do |r|
9
+ next if version(r) < 203090 # 2.4-rc6
5
10
 
6
- assert 1 == r.zcard("foo")
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 "foo", 1, "s1"
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
- r.zadd "foo", 2, "s2"
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.zrem "foo", "s1"
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", "1", "s2", "2"] == r.zrange("foo", 0, 1, :with_scores => true)
56
- assert ["s1", "1", "s2", "2"] == r.zrange("foo", 0, 1, :withscores => true)
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", "3", "s2", "2"] == r.zrevrange("foo", 0, 1, :with_scores => true)
66
- assert ["s3", "3", "s2", "2"] == r.zrevrange("foo", 0, 1, :withscores => true)
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", "2"] == r.zrangebyscore("foo", 2, 4, :limit => [0, 1], :with_scores => true)
114
- assert ["s3", "3"] == r.zrangebyscore("foo", 2, 4, :limit => [1, 1], :with_scores => true)
115
- assert ["s2", "2"] == r.zrangebyscore("foo", 2, 4, :limit => [0, 1], :withscores => true)
116
- assert ["s3", "3"] == r.zrangebyscore("foo", 2, 4, :limit => [1, 1], :withscores => true)
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", "4"] == r.zrevrangebyscore("foo", 4, 2, :limit => [0, 1], :with_scores => true)
126
- assert ["s3", "3"] == r.zrevrangebyscore("foo", 4, 2, :limit => [1, 1], :with_scores => true)
127
- assert ["s4", "4"] == r.zrevrangebyscore("foo", 4, 2, :limit => [0, 1], :withscores => true)
128
- assert ["s3", "3"] == r.zrevrangebyscore("foo", 4, 2, :limit => [1, 1], :withscores => true)
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 "1" == r.zscore("foo", "s1")
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
-