@@ -20,6 +20,88 @@ class ZSetFamilyTest : public BaseFamilyTest {
20
20
protected:
21
21
};
22
22
23
+ using ScoredElement = std::pair<std::string, std::string>;
24
+
25
+ auto ParseToScoredArray (auto vec) {
26
+ std::vector<ScoredElement> scored_elements;
27
+ for (std::size_t i = 1 ; i < vec.size (); i += 2 ) {
28
+ scored_elements.emplace_back (vec[i - 1 ].GetString (), vec[i].GetString ());
29
+ }
30
+ return scored_elements;
31
+ }
32
+
33
+ MATCHER_P (ConsistsOfMatcher, elements, " " ) {
34
+ auto vec = arg.GetVec ();
35
+ for (const auto & x : vec) {
36
+ if (elements.find (x.GetString ()) == elements.end ()) {
37
+ return false ;
38
+ }
39
+ }
40
+ return true ;
41
+ }
42
+
43
+ MATCHER_P (ConsistsOfScoredElementsMatcher, elements, " " ) {
44
+ auto vec = arg.GetVec ();
45
+ if (vec.size () % 2 ) {
46
+ return false ;
47
+ }
48
+
49
+ auto scored_vec = ParseToScoredArray (vec);
50
+ for (const auto & scored_element : scored_vec) {
51
+ if (elements.find (scored_element) == elements.end ()) {
52
+ return false ;
53
+ }
54
+ }
55
+ return true ;
56
+ }
57
+
58
+ MATCHER_P (IsScoredSubsetOfMatcher, elements_list, " " ) {
59
+ auto vec = arg.GetVec ();
60
+ if (vec.size () % 2 ) {
61
+ return false ;
62
+ }
63
+
64
+ auto scored_vec = ParseToScoredArray (vec);
65
+
66
+ std::vector<ScoredElement> diff;
67
+ std::set_difference (scored_vec.begin (), scored_vec.end (), elements_list.begin (),
68
+ elements_list.end (), std::back_inserter (diff));
69
+
70
+ return diff.empty ();
71
+ }
72
+
73
+ MATCHER_P (UnorderedScoredElementsAreMatcher, elements_list, " " ) {
74
+ auto vec = arg.GetVec ();
75
+ if (vec.size () % 2 ) {
76
+ return false ;
77
+ }
78
+
79
+ auto scored_vec = ParseToScoredArray (vec);
80
+
81
+ std::vector<ScoredElement> diff;
82
+ std::set_difference (scored_vec.begin (), scored_vec.end (), elements_list.begin (),
83
+ elements_list.end (), std::back_inserter (diff));
84
+
85
+ return diff.empty () && scored_vec.size () == elements_list.size ();
86
+ }
87
+
88
+ auto ConsistsOf (std::initializer_list<std::string> elements) {
89
+ return ConsistsOfMatcher (std::unordered_set<std::string>{elements});
90
+ }
91
+
92
+ auto ConsistsOfScoredElements (std::initializer_list<std::pair<std::string, std::string>> elements) {
93
+ return ConsistsOfScoredElementsMatcher (std::set<std::pair<std::string, std::string>>{elements});
94
+ }
95
+
96
+ auto IsScoredSubsetOf (std::initializer_list<std::pair<std::string, std::string>> elements) {
97
+ return IsScoredSubsetOfMatcher (elements);
98
+ }
99
+
100
+ auto UnorderedScoredElementsAre (
101
+ std::initializer_list<std::pair<std::string, std::string>> elements) {
102
+ return UnorderedScoredElementsAreMatcher (elements);
103
+ }
104
+
23
105
TEST_F (ZSetFamilyTest, Add) {
24
106
auto resp = Run ({" zadd" , " x" , " 1.1" , " a" });
25
107
EXPECT_THAT (resp, IntArg (1 ));
@@ -77,53 +159,95 @@ TEST_F(ZSetFamilyTest, ZRem) {
77
159
}
78
160
79
161
TEST_F (ZSetFamilyTest, ZRandMember) {
80
- auto resp = Run ({
81
- " zadd" ,
82
- " x" ,
83
- " 1" ,
84
- " a" ,
85
- " 2" ,
86
- " b" ,
87
- " 3" ,
88
- " c" ,
89
- });
162
+ auto resp = Run ({" ZAdd" , " x" , " 1" , " a" , " 2" , " b" , " 3" , " c" });
163
+ EXPECT_THAT (resp, IntArg (3 ));
164
+
165
+ // Test if count > 0
90
166
resp = Run ({" ZRandMember" , " x" });
91
167
ASSERT_THAT (resp, ArgType (RespExpr::STRING));
92
- EXPECT_THAT (resp, " a" );
168
+ EXPECT_THAT (resp, AnyOf (" a" , " b" , " c" ));
169
+
170
+ resp = Run ({" ZRandMember" , " x" , " 1" });
171
+ ASSERT_THAT (resp, ArgType (RespExpr::STRING));
172
+ EXPECT_THAT (resp, AnyOf (" a" , " b" , " c" ));
93
173
94
174
resp = Run ({" ZRandMember" , " x" , " 2" });
95
- ASSERT_THAT (resp, ArgType (RespExpr::ARRAY ));
96
- EXPECT_THAT (resp.GetVec (), UnorderedElementsAre ( " a" , " b" ));
175
+ ASSERT_THAT (resp, ArrLen ( 2 ));
176
+ EXPECT_THAT (resp.GetVec (), IsSubsetOf ({ " a" , " b" , " c " } ));
97
177
98
- resp = Run ({" ZRandMember" , " x" , " 0 " });
99
- ASSERT_THAT (resp, ArgType (RespExpr::ARRAY ));
100
- EXPECT_EQ (resp.GetVec (). size (), 0 );
178
+ resp = Run ({" ZRandMember" , " x" , " 3 " });
179
+ ASSERT_THAT (resp, ArrLen ( 3 ));
180
+ EXPECT_THAT (resp.GetVec (), UnorderedElementsAre ( " a " , " b " , " c " ) );
101
181
102
- resp = Run ({" ZRandMember" , " k" });
103
- ASSERT_THAT (resp, ArgType (RespExpr::NIL));
182
+ // Test if count < 0
183
+ resp = Run ({" ZRandMember" , " x" , " -1" });
184
+ ASSERT_THAT (resp, ArgType (RespExpr::STRING));
185
+ EXPECT_THAT (resp, AnyOf (" a" , " b" , " c" ));
104
186
105
- resp = Run ({" ZRandMember" , " k" , " 2" });
106
- ASSERT_THAT (resp, ArgType (RespExpr::ARRAY));
107
- EXPECT_EQ (resp.GetVec ().size (), 0 );
187
+ resp = Run ({" ZRandMember" , " x" , " -2" });
188
+ ASSERT_THAT (resp, ArrLen (2 ));
189
+ EXPECT_THAT (resp, ConsistsOf ({" a" , " b" , " c" }));
190
+
191
+ resp = Run ({" ZRandMember" , " x" , " -3" });
192
+ ASSERT_THAT (resp, ArrLen (3 ));
193
+ EXPECT_THAT (resp, ConsistsOf ({" a" , " b" , " c" }));
194
+
195
+ // Test if count < 0, but the absolute value is larger than the size of the sorted set
196
+ resp = Run ({" ZRandMember" , " x" , " -15" });
197
+ ASSERT_THAT (resp, ArrLen (15 ));
198
+ EXPECT_THAT (resp, ConsistsOf ({" a" , " b" , " c" }));
108
199
109
- resp = Run ({" ZRandMember" , " x" , " -5" });
110
- ASSERT_THAT (resp, ArrLen (5 ));
111
- EXPECT_THAT (resp.GetVec (), ElementsAre (" a" , " b" , " c" , " a" , " a" ));
200
+ // Test if count is 0
201
+ ASSERT_THAT (Run ({" ZRandMember" , " x" , " 0" }), ArrLen (0 ));
112
202
113
- resp = Run ({" ZRandMember" , " x" , " 5" });
203
+ // Test if count is larger than the size of the sorted set
204
+ resp = Run ({" ZRandMember" , " x" , " 15" });
114
205
ASSERT_THAT (resp, ArrLen (3 ));
115
206
EXPECT_THAT (resp.GetVec (), UnorderedElementsAre (" a" , " b" , " c" ));
116
207
117
- resp = Run ({" ZRandMember" , " x" , " -5" , " WITHSCORES" });
118
- ASSERT_THAT (resp, ArrLen (10 ));
119
- EXPECT_THAT (resp.GetVec (), ElementsAre (" a" , " 1" , " b" , " 2" , " c" , " 3" , " a" , " 1" , " a" , " 1" ));
208
+ // Test if sorted set is empty
209
+ EXPECT_THAT (Run ({" ZAdd" , " empty::zset" , " 1" , " one" }), IntArg (1 ));
210
+ EXPECT_THAT (Run ({" ZRem" , " empty::zset" , " one" }), IntArg (1 ));
211
+ ASSERT_THAT (Run ({" ZRandMember" , " empty::zset" , " 0" }), ArrLen (0 ));
212
+ ASSERT_THAT (Run ({" ZRandMember" , " empty::zset" , " 3" }), ArrLen (0 ));
213
+ ASSERT_THAT (Run ({" ZRandMember" , " empty::zset" , " -4" }), ArrLen (0 ));
214
+
215
+ // Test if key does not exist
216
+ ASSERT_THAT (Run ({" ZRandMember" , " y" }), ArgType (RespExpr::NIL));
217
+ ASSERT_THAT (Run ({" ZRandMember" , " y" , " 0" }), ArrLen (0 ));
218
+
219
+ // Test WITHSCORES
220
+ resp = Run ({" ZRandMember" , " x" , " 1" , " WITHSCORES" });
221
+ ASSERT_THAT (resp, ArrLen (2 ));
222
+ EXPECT_THAT (resp, IsScoredSubsetOf ({{" a" , " 1" }, {" b" , " 2" }, {" c" , " 3" }}));
223
+
224
+ resp = Run ({" ZRandMember" , " x" , " 2" , " WITHSCORES" });
225
+ ASSERT_THAT (resp, ArrLen (4 ));
226
+ EXPECT_THAT (resp, IsScoredSubsetOf ({{" a" , " 1" }, {" b" , " 2" }, {" c" , " 3" }}));
120
227
121
228
resp = Run ({" ZRandMember" , " x" , " 3" , " WITHSCORES" });
122
229
ASSERT_THAT (resp, ArrLen (6 ));
123
- EXPECT_THAT (resp. GetVec (), UnorderedElementsAre ( " a" , " 1" , " b" , " 2" , " c" , " 3" ));
230
+ EXPECT_THAT (resp, UnorderedScoredElementsAre ({{ " a" , " 1" }, { " b" , " 2" }, { " c" , " 3" }} ));
124
231
125
- resp = Run ({" ZRandMember" , " x" , " 3" , " WITHSCORES" , " test" });
126
- EXPECT_THAT (resp, ErrArg (" wrong number of arguments" ));
232
+ resp = Run ({" ZRandMember" , " x" , " 15" , " WITHSCORES" });
233
+ ASSERT_THAT (resp, ArrLen (6 ));
234
+ EXPECT_THAT (resp, UnorderedScoredElementsAre ({{" a" , " 1" }, {" b" , " 2" }, {" c" , " 3" }}));
235
+
236
+ resp = Run ({" ZRandMember" , " x" , " -1" , " WITHSCORES" });
237
+ ASSERT_THAT (resp, ArrLen (2 ));
238
+ EXPECT_THAT (resp, ConsistsOfScoredElements ({{" a" , " 1" }, {" b" , " 2" }, {" c" , " 3" }}));
239
+
240
+ resp = Run ({" ZRandMember" , " x" , " -2" , " WITHSCORES" });
241
+ ASSERT_THAT (resp, ArrLen (4 ));
242
+ EXPECT_THAT (resp, ConsistsOfScoredElements ({{" a" , " 1" }, {" b" , " 2" }, {" c" , " 3" }}));
243
+
244
+ resp = Run ({" ZRandMember" , " x" , " -3" , " WITHSCORES" });
245
+ ASSERT_THAT (resp, ArrLen (6 ));
246
+ EXPECT_THAT (resp, ConsistsOfScoredElements ({{" a" , " 1" }, {" b" , " 2" }, {" c" , " 3" }}));
247
+
248
+ resp = Run ({" ZRandMember" , " x" , " -15" , " WITHSCORES" });
249
+ ASSERT_THAT (resp, ArrLen (30 ));
250
+ EXPECT_THAT (resp, ConsistsOfScoredElements ({{" a" , " 1" }, {" b" , " 2" }, {" c" , " 3" }}));
127
251
}
128
252
129
253
TEST_F (ZSetFamilyTest, ZMScore) {
0 commit comments