@@ -26,26 +26,55 @@ using multibody::ModelInstanceIndex;
26
26
27
27
/* Exercise all of the constructors and evaluate the size-like APIs. */
28
28
GTEST_TEST (DofMaskTest, ConstructorsAndSize) {
29
- const DofMask dut1;
30
- EXPECT_EQ (dut1.count (), 0 );
31
- EXPECT_EQ (dut1.size (), 0 );
32
-
33
- const DofMask dut2 (13 , true );
34
- EXPECT_EQ (dut2.count (), 13 );
35
- EXPECT_EQ (dut2.size (), 13 );
36
-
37
- const DofMask dut3 (14 , false );
38
- EXPECT_EQ (dut3.count (), 0 );
39
- EXPECT_EQ (dut3.size (), 14 );
40
-
41
- const DofMask dut4 ({true , false , true , true , false });
42
- EXPECT_EQ (dut4.count (), 3 );
43
- EXPECT_EQ (dut4.size (), 5 );
44
-
45
- std::vector<bool > bits{true , true , false , true , true , false };
46
- const DofMask dut5 (bits);
47
- EXPECT_EQ (dut5.count (), 4 );
48
- EXPECT_EQ (dut5.size (), 6 );
29
+ {
30
+ const DofMask dut1;
31
+ EXPECT_EQ (dut1.count (), 0 );
32
+ EXPECT_EQ (dut1.size (), 0 );
33
+ }
34
+ {
35
+ const DofMask dut2 (13 , true );
36
+ EXPECT_EQ (dut2.count (), 13 );
37
+ EXPECT_EQ (dut2.size (), 13 );
38
+ for (int i = 0 ; i < dut2.size (); ++i) {
39
+ EXPECT_EQ (dut2.full_to_active_index (i), i);
40
+ EXPECT_EQ (dut2.active_to_full_index (i), i);
41
+ }
42
+ }
43
+ {
44
+ const DofMask dut3 (14 , false );
45
+ EXPECT_EQ (dut3.count (), 0 );
46
+ EXPECT_EQ (dut3.size (), 14 );
47
+ for (int i = 0 ; i < dut3.size (); ++i) {
48
+ EXPECT_FALSE (dut3.full_to_active_index (i).has_value ());
49
+ EXPECT_THROW (drake::unused (dut3.active_to_full_index (i)), std::exception);
50
+ }
51
+ }
52
+ {
53
+ const DofMask dut4 ({true , false , true , true , false });
54
+ EXPECT_EQ (dut4.count (), 3 );
55
+ EXPECT_EQ (dut4.size (), 5 );
56
+
57
+ EXPECT_EQ (dut4.full_to_active_index (0 ).value (), 0 );
58
+ EXPECT_FALSE (dut4.full_to_active_index (1 ).has_value ());
59
+ EXPECT_EQ (dut4.full_to_active_index (2 ), 1 );
60
+ EXPECT_EQ (dut4.full_to_active_index (3 ), 2 );
61
+ EXPECT_FALSE (dut4.full_to_active_index (4 ).has_value ());
62
+ EXPECT_EQ (dut4.active_to_full_index (0 ), 0 );
63
+ EXPECT_EQ (dut4.active_to_full_index (1 ), 2 );
64
+ EXPECT_EQ (dut4.active_to_full_index (2 ), 3 );
65
+ }
66
+ {
67
+ std::vector<bool > bits{true , true , false , true , true , false };
68
+ const DofMask dut5 (bits);
69
+ EXPECT_EQ (dut5.count (), 4 );
70
+ EXPECT_EQ (dut5.size (), 6 );
71
+ EXPECT_EQ (dut5.full_to_active_index (0 ), 0 );
72
+ EXPECT_EQ (dut5.full_to_active_index (1 ), 1 );
73
+ EXPECT_FALSE (dut5.full_to_active_index (2 ).has_value ());
74
+ EXPECT_EQ (dut5.full_to_active_index (3 ), 2 );
75
+ EXPECT_EQ (dut5.full_to_active_index (4 ), 3 );
76
+ EXPECT_FALSE (dut5.full_to_active_index (5 ).has_value ());
77
+ }
49
78
}
50
79
51
80
// In addition to testing move/copy semantics, this also provides testing for
@@ -183,35 +212,56 @@ GTEST_TEST(DofMaskTest, ToString) {
183
212
EXPECT_EQ (dut.to_string (), fmt::to_string (int_bits));
184
213
}
185
214
215
+ namespace {
216
+ void ExpectFullAndActiveIndicesEqual (const DofMask& mask1,
217
+ const DofMask& mask2) {
218
+ ASSERT_EQ (mask1.count (), mask2.count ());
219
+ ASSERT_EQ (mask1.size (), mask2.size ());
220
+ for (int i = 0 ; i < mask1.size (); ++i) {
221
+ EXPECT_EQ (mask1.full_to_active_index (i), mask2.full_to_active_index (i));
222
+ }
223
+ for (int i = 0 ; i < mask1.count (); ++i) {
224
+ EXPECT_EQ (mask1.active_to_full_index (i), mask2.active_to_full_index (i));
225
+ }
226
+ }
227
+ } // namespace
186
228
GTEST_TEST (DofMaskTest, Complement) {
187
229
const DofMask d1 ({true , false , false });
188
230
const DofMask expected ({false , true , true });
189
231
190
- EXPECT_EQ (d1.Complement (), expected);
232
+ const DofMask d1_complement = d1.Complement ();
233
+ EXPECT_EQ (d1_complement, expected);
234
+ ExpectFullAndActiveIndicesEqual (d1_complement, expected);
191
235
}
192
236
193
237
GTEST_TEST (DofMaskTest, Union) {
194
238
const DofMask d1 ({true , false , false });
195
239
const DofMask d2 ({false , false , true });
196
240
const DofMask expected ({true , false , true });
197
241
198
- EXPECT_EQ (d1.Union (d2), expected);
242
+ const DofMask d1_union_d2 = d1.Union (d2);
243
+ EXPECT_EQ (d1_union_d2, expected);
244
+ ExpectFullAndActiveIndicesEqual (d1_union_d2, expected);
199
245
}
200
246
201
247
GTEST_TEST (DofMaskTest, Intersect) {
202
248
const DofMask d1 ({true , true , false });
203
249
const DofMask d2 ({false , true , true });
204
250
const DofMask expected ({false , true , false });
205
251
206
- EXPECT_EQ (d1.Intersect (d2), expected);
252
+ const DofMask d1_intersect_d2 = d1.Intersect (d2);
253
+ EXPECT_EQ (d1_intersect_d2, expected);
254
+ ExpectFullAndActiveIndicesEqual (d1_intersect_d2, expected);
207
255
}
208
256
209
257
GTEST_TEST (DofMaskTest, Subtract) {
210
258
const DofMask d1 ({true , true , false });
211
259
const DofMask d2 ({false , true , true });
212
260
const DofMask expected ({true , false , false });
213
261
214
- EXPECT_EQ (d1.Subtract (d2), expected);
262
+ const DofMask d1_subtract_d2 = d1.Subtract (d2);
263
+ EXPECT_EQ (d1_subtract_d2, expected);
264
+ ExpectFullAndActiveIndicesEqual (d1_subtract_d2, expected);
215
265
}
216
266
217
267
GTEST_TEST (DofMaskTest, GetFromArrayWithReturn) {
0 commit comments