@@ -20,6 +20,88 @@ class ZSetFamilyTest : public BaseFamilyTest {
2020 protected:
2121};
2222
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+
23105TEST_F (ZSetFamilyTest, Add) {
24106 auto resp = Run ({" zadd" , " x" , " 1.1" , " a" });
25107 EXPECT_THAT (resp, IntArg (1 ));
@@ -77,53 +159,95 @@ TEST_F(ZSetFamilyTest, ZRem) {
77159}
78160
79161TEST_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
90166 resp = Run ({" ZRandMember" , " x" });
91167 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" ));
93173
94174 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 " } ));
97177
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 " ) );
101181
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" ));
104186
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" }));
108199
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 ));
112202
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" });
114205 ASSERT_THAT (resp, ArrLen (3 ));
115206 EXPECT_THAT (resp.GetVec (), UnorderedElementsAre (" a" , " b" , " c" ));
116207
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" }}));
120227
121228 resp = Run ({" ZRandMember" , " x" , " 3" , " WITHSCORES" });
122229 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" }} ));
124231
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" }}));
127251}
128252
129253TEST_F (ZSetFamilyTest, ZMScore) {
0 commit comments