@@ -61,17 +61,20 @@ class DiscreteTrajectoryIteratorTest : public ::testing::Test {
61
61
}
62
62
}
63
63
64
+ void Append (Segments::iterator const it,
65
+ Instant const & t,
66
+ DegreesOfFreedom<World> const & degrees_of_freedom) {
67
+ it->Append (t, degrees_of_freedom);
68
+ }
69
+
64
70
DiscreteTrajectoryIterator<World> MakeBegin (
65
71
Segments::const_iterator const it) {
66
- return DiscreteTrajectoryIterator<World>(
67
- DiscreteTrajectorySegmentIterator<World>(segments_.get (), it),
68
- it->timeline_begin ());
72
+ return it->begin ();
69
73
}
70
74
71
- DiscreteTrajectoryIterator<World> MakeEnd (Segments::const_iterator it) {
72
- return DiscreteTrajectoryIterator<World>(
73
- DiscreteTrajectorySegmentIterator<World>(segments_.get (), ++it),
74
- std::nullopt);
75
+ DiscreteTrajectoryIterator<World> MakeEnd (
76
+ Segments::const_iterator const it) {
77
+ return it->end ();
75
78
}
76
79
77
80
// Constructs a list of |n| segments which are properly initialized.
@@ -167,5 +170,47 @@ TEST_F(DiscreteTrajectoryIteratorTest, Equality) {
167
170
EXPECT_NE (MakeBegin (segments_->begin ()), MakeEnd (--segments_->end ()));
168
171
}
169
172
173
+ // Empty segments may exist in a transient manner, we must be able to iterate
174
+ // over them.
175
+ TEST_F (DiscreteTrajectoryIteratorTest, EmptySegment) {
176
+ auto segments = MakeSegments (1 );
177
+ {
178
+ int count = 0 ;
179
+ for (auto const & point : segments->front ()) {
180
+ ++count;
181
+ }
182
+ EXPECT_EQ (0 , count);
183
+ }
184
+ {
185
+ int count = 0 ;
186
+ for (auto it = segments->front ().rbegin ();
187
+ it != segments->front ().rend ();
188
+ ++it) {
189
+ ++count;
190
+ }
191
+ EXPECT_EQ (0 , count);
192
+ }
193
+ }
194
+
195
+ // Check that repeated points don't cause confusion regarding the end of a
196
+ // segment.
197
+ TEST_F (DiscreteTrajectoryIteratorTest, SegmentEnd) {
198
+ auto segment0 = segments_->begin ();
199
+ auto segment1 = std::next (segment0);
200
+ auto iterator = segment0->begin ();
201
+ for (int i = 0 ; i < 5 ; ++i) {
202
+ ++iterator;
203
+ }
204
+ EXPECT_TRUE (iterator != segment1->end ());
205
+ }
206
+
207
+ // Checkt that rbegin() works if the next segment is empty.
208
+ TEST_F (DiscreteTrajectoryIteratorTest, EmptyLastSegment) {
209
+ auto segments = MakeSegments (2 );
210
+ auto segment = segments->begin ();
211
+ Append (segment, t0_, unmoving_origin_);
212
+ EXPECT_EQ (t0_, segment->rbegin ()->first );
213
+ }
214
+
170
215
} // namespace physics
171
216
} // namespace principia
0 commit comments