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.
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
-