@@ -123,6 +123,86 @@ TEST(RangeSetTest, Overlaps) {
123123 ASSERT_FALSE (RangeSet::Parse (" 2,5,7" ).Overlaps (RangeSet::Parse (" 2,3,5" )));
124124}
125125
126+ TEST (RangeSetTest, Split) {
127+ RangeSet rs1 = RangeSet::Parse (" 2,1,2" );
128+ ASSERT_TRUE (rs1);
129+ ASSERT_EQ ((std::vector<RangeSet>{ RangeSet::Parse (" 2,1,2" ) }), rs1.Split (1 ));
130+
131+ RangeSet rs2 = RangeSet::Parse (" 2,5,10" );
132+ ASSERT_TRUE (rs2);
133+ ASSERT_EQ ((std::vector<RangeSet>{ RangeSet::Parse (" 2,5,8" ), RangeSet::Parse (" 2,8,10" ) }),
134+ rs2.Split (2 ));
135+
136+ RangeSet rs3 = RangeSet::Parse (" 4,0,1,5,10" );
137+ ASSERT_TRUE (rs3);
138+ ASSERT_EQ ((std::vector<RangeSet>{ RangeSet::Parse (" 4,0,1,5,7" ), RangeSet::Parse (" 2,7,10" ) }),
139+ rs3.Split (2 ));
140+
141+ RangeSet rs4 = RangeSet::Parse (" 6,1,3,3,4,4,5" );
142+ ASSERT_TRUE (rs4);
143+ ASSERT_EQ ((std::vector<RangeSet>{ RangeSet::Parse (" 2,1,3" ), RangeSet::Parse (" 2,3,4" ),
144+ RangeSet::Parse (" 2,4,5" ) }),
145+ rs4.Split (3 ));
146+
147+ RangeSet rs5 = RangeSet::Parse (" 2,0,10" );
148+ ASSERT_TRUE (rs5);
149+ ASSERT_EQ ((std::vector<RangeSet>{ RangeSet::Parse (" 2,0,3" ), RangeSet::Parse (" 2,3,6" ),
150+ RangeSet::Parse (" 2,6,8" ), RangeSet::Parse (" 2,8,10" ) }),
151+ rs5.Split (4 ));
152+
153+ RangeSet rs6 = RangeSet::Parse (
154+ " 20,0,268,269,271,286,447,8350,32770,33022,98306,98558,163842,164094,196609,204800,229378,"
155+ " 229630,294914,295166,457564" );
156+ ASSERT_TRUE (rs6);
157+ size_t rs6_blocks = rs6.blocks ();
158+ auto splits = rs6.Split (4 );
159+ ASSERT_EQ (
160+ (std::vector<RangeSet>{
161+ RangeSet::Parse (" 12,0,268,269,271,286,447,8350,32770,33022,98306,98558,118472" ),
162+ RangeSet::Parse (" 8,118472,163842,164094,196609,204800,229378,229630,237216" ),
163+ RangeSet::Parse (" 4,237216,294914,295166,347516" ), RangeSet::Parse (" 2,347516,457564" ) }),
164+ splits);
165+ size_t sum = 0 ;
166+ for (const auto & element : splits) {
167+ sum += element.blocks ();
168+ }
169+ ASSERT_EQ (rs6_blocks, sum);
170+ }
171+
172+ TEST (RangeSetTest, Split_EdgeCases) {
173+ // Empty RangeSet.
174+ RangeSet rs1;
175+ ASSERT_FALSE (rs1);
176+ ASSERT_EQ ((std::vector<RangeSet>{}), rs1.Split (2 ));
177+ ASSERT_FALSE (rs1);
178+
179+ // Zero group.
180+ RangeSet rs2 = RangeSet::Parse (" 2,1,5" );
181+ ASSERT_TRUE (rs2);
182+ ASSERT_EQ ((std::vector<RangeSet>{}), rs2.Split (0 ));
183+
184+ // The number of blocks equals to the number of groups.
185+ RangeSet rs3 = RangeSet::Parse (" 2,1,5" );
186+ ASSERT_TRUE (rs3);
187+ ASSERT_EQ ((std::vector<RangeSet>{ RangeSet::Parse (" 2,1,2" ), RangeSet::Parse (" 2,2,3" ),
188+ RangeSet::Parse (" 2,3,4" ), RangeSet::Parse (" 2,4,5" ) }),
189+ rs3.Split (4 ));
190+
191+ // Less blocks than the number of groups.
192+ RangeSet rs4 = RangeSet::Parse (" 2,1,5" );
193+ ASSERT_TRUE (rs4);
194+ ASSERT_EQ ((std::vector<RangeSet>{ RangeSet::Parse (" 2,1,2" ), RangeSet::Parse (" 2,2,3" ),
195+ RangeSet::Parse (" 2,3,4" ), RangeSet::Parse (" 2,4,5" ) }),
196+ rs4.Split (8 ));
197+
198+ // Less blocks than the number of groups.
199+ RangeSet rs5 = RangeSet::Parse (" 2,0,3" );
200+ ASSERT_TRUE (rs5);
201+ ASSERT_EQ ((std::vector<RangeSet>{ RangeSet::Parse (" 2,0,1" ), RangeSet::Parse (" 2,1,2" ),
202+ RangeSet::Parse (" 2,2,3" ) }),
203+ rs5.Split (4 ));
204+ }
205+
126206TEST (RangeSetTest, GetBlockNumber) {
127207 RangeSet rs = RangeSet::Parse (" 2,1,10" );
128208 ASSERT_EQ (static_cast <size_t >(1 ), rs.GetBlockNumber (0 ));
0 commit comments