12
12
#include " physics/discrete_trajectory_segment.hpp"
13
13
#include " physics/discrete_trajectory_segment_iterator.hpp"
14
14
#include " physics/discrete_trajectory_types.hpp"
15
- #include " physics/mock_discrete_trajectory_segment.hpp"
16
15
#include " quantities/quantities.hpp"
17
16
#include " quantities/si.hpp"
18
17
19
18
namespace principia {
20
19
namespace physics {
21
20
22
21
using base::check_not_null;
22
+ using base::make_not_null_unique;
23
+ using base::not_null;
23
24
using geometry::Frame;
24
25
using geometry::Instant;
25
26
using physics::DegreesOfFreedom;
26
27
using quantities::Time;
27
28
using quantities::si::Second;
28
29
using ::testing::Return;
29
30
30
- namespace {
31
-
32
- // A trajectory that holds a real timeline, where we mock multiple methods to
33
- // return data from that timeline.
34
- template <typename Frame>
35
- class FakeDiscreteTrajectorySegment
36
- : public MockDiscreteTrajectorySegment<Frame> {
37
- public:
38
- FakeDiscreteTrajectorySegment () = default ;
39
-
40
- internal_discrete_trajectory_types::Timeline<Frame> timeline;
41
- };
42
-
43
- } // namespace
44
-
45
31
class DiscreteTrajectoryIteratorTest : public ::testing::Test {
46
32
protected:
47
33
using World = Frame<enum class WorldTag >;
48
-
49
34
using Segments = internal_discrete_trajectory_types::Segments<World>;
50
- using Timeline = internal_discrete_trajectory_types::Timeline<World>;
51
-
52
- DiscreteTrajectoryIteratorTest () {
53
- // Set up a fake trajectory with 3 segments. After construction, the mocks
54
- // are owned by |segments_|.
55
- auto owned_mock1 = std::make_unique<FakeDiscreteTrajectorySegment<World>>();
56
- auto owned_mock2 = std::make_unique<FakeDiscreteTrajectorySegment<World>>();
57
- auto owned_mock3 = std::make_unique<FakeDiscreteTrajectorySegment<World>>();
58
- auto const & mock1 = *owned_mock1;
59
- auto const & mock2 = *owned_mock2;
60
- auto const & mock3 = *owned_mock3;
61
-
62
- segments_.push_back (std::move (owned_mock1));
63
- auto const it1 = --segments_.end ();
64
- segments_.push_back (std::move (owned_mock2));
65
- auto const it2 = --segments_.end ();
66
- segments_.push_back (std::move (owned_mock3));
67
- auto const it3 = --segments_.end ();
68
-
69
- FillSegment (it1,
70
- Timeline{MakeTimelineValueType (2 * Second),
71
- MakeTimelineValueType (3 * Second),
72
- MakeTimelineValueType (5 * Second),
73
- MakeTimelineValueType (7 * Second),
74
- MakeTimelineValueType (11 * Second)});
75
- FillSegment (it2, Timeline{MakeTimelineValueType (13 * Second)});
76
- FillSegment (it3,
77
- Timeline{MakeTimelineValueType (13 * Second), // Duplicated.
78
- MakeTimelineValueType (17 * Second),
79
- MakeTimelineValueType (19 * Second),
80
- MakeTimelineValueType (23 * Second)});
81
-
82
- // This must happen *after* the segments have been set up.
83
- EXPECT_CALL (mock1, timeline_begin ())
84
- .WillRepeatedly (Return (timeline_begin (it1)));
85
- EXPECT_CALL (mock1, timeline_end ())
86
- .WillRepeatedly (Return (timeline_end (it1)));
87
- EXPECT_CALL (mock2, timeline_begin ())
88
- .WillRepeatedly (Return (timeline_begin (it2)));
89
- EXPECT_CALL (mock2, timeline_end ())
90
- .WillRepeatedly (Return (timeline_end (it2)));
91
- EXPECT_CALL (mock3, timeline_begin ())
92
- .WillRepeatedly (Return (timeline_begin (it3)));
93
- EXPECT_CALL (mock3, timeline_end ())
94
- .WillRepeatedly (Return (timeline_end (it3)));
95
- }
96
35
97
- FakeDiscreteTrajectorySegment<World>* DownCast (
98
- std::unique_ptr<DiscreteTrajectorySegment<World>> const & segment) {
99
- return dynamic_cast <FakeDiscreteTrajectorySegment<World>*>(segment.get ());
100
- }
101
-
102
- void FillSegment (Segments::iterator const it, Timeline const & timeline) {
103
- auto * const segment = DownCast (*it);
104
- segment->timeline = timeline;
36
+ DiscreteTrajectoryIteratorTest ()
37
+ : segments_(MakeSegments(3 )) {
38
+ auto it = segments_->begin ();
39
+ {
40
+ auto & segment1 = *it;
41
+ segment1.Append (t0_ + 2 * Second, unmoving_origin_);
42
+ segment1.Append (t0_ + 3 * Second, unmoving_origin_);
43
+ segment1.Append (t0_ + 5 * Second, unmoving_origin_);
44
+ segment1.Append (t0_ + 7 * Second, unmoving_origin_);
45
+ segment1.Append (t0_ + 11 * Second, unmoving_origin_);
46
+ }
47
+
48
+ ++it;
49
+ {
50
+ auto & segment2 = *it;
51
+ segment2.Append (t0_ + 13 * Second, unmoving_origin_);
52
+ }
53
+
54
+ ++it;
55
+ {
56
+ auto & segment3 = *it;
57
+ segment3.Append (t0_ + 13 * Second, unmoving_origin_);
58
+ segment3.Append (t0_ + 17 * Second, unmoving_origin_);
59
+ segment3.Append (t0_ + 19 * Second, unmoving_origin_);
60
+ segment3.Append (t0_ + 23 * Second, unmoving_origin_);
61
+ }
105
62
}
106
63
107
64
DiscreteTrajectoryIterator<World> MakeBegin (
108
65
Segments::const_iterator const it) {
109
66
return DiscreteTrajectoryIterator<World>(
110
- DiscreteTrajectorySegmentIterator<World>(
111
- check_not_null (&segments_), it),
112
- timeline_begin (it));
67
+ DiscreteTrajectorySegmentIterator<World>(segments_.get (), it),
68
+ it->timeline_begin ());
113
69
}
114
70
115
71
DiscreteTrajectoryIterator<World> MakeEnd (Segments::const_iterator it) {
116
72
return DiscreteTrajectoryIterator<World>(
117
- DiscreteTrajectorySegmentIterator<World>(check_not_null (&segments_),
118
- ++it),
73
+ DiscreteTrajectorySegmentIterator<World>(segments_.get (), ++it),
119
74
std::nullopt);
120
75
}
121
76
122
- Timeline::value_type MakeTimelineValueType (Time const & t) {
123
- static const DegreesOfFreedom<World> unmoving_origin (World::origin,
124
- World::unmoving);
125
- return {t0_ + t, unmoving_origin};
126
- }
127
-
128
- internal_discrete_trajectory_types::Timeline<World>::const_iterator
129
- timeline_begin (Segments::const_iterator const it) {
130
- return DownCast (*it)->timeline .begin ();
131
- }
132
-
133
- internal_discrete_trajectory_types::Timeline<World>::const_iterator
134
- timeline_end (Segments::const_iterator const it) {
135
- return DownCast (*it)->timeline .end ();
77
+ // Constructs a list of |n| segments which are properly initialized.
78
+ // TODO(phl): Move to a central place.
79
+ static not_null<std::unique_ptr<Segments>> MakeSegments (const int n) {
80
+ auto segments = make_not_null_unique<Segments>(n);
81
+ for (auto it = segments->begin (); it != segments->end (); ++it) {
82
+ *it = DiscreteTrajectorySegment<World>(
83
+ DiscreteTrajectorySegmentIterator<World>(segments.get (), it));
84
+ }
85
+ return segments;
136
86
}
137
87
138
- Segments segments_;
88
+ not_null<std::unique_ptr< Segments>> segments_;
139
89
Instant const t0_;
90
+ DegreesOfFreedom<World> const unmoving_origin_{World::origin,
91
+ World::unmoving};
140
92
};
141
93
142
94
TEST_F (DiscreteTrajectoryIteratorTest, ForwardOneSegment) {
143
- auto segment = segments_. begin ();
95
+ auto segment = segments_-> begin ();
144
96
auto iterator = MakeBegin (segment);
145
97
EXPECT_EQ (t0_ + 2 * Second, iterator->first );
146
98
auto const current = ++iterator;
@@ -152,7 +104,7 @@ TEST_F(DiscreteTrajectoryIteratorTest, ForwardOneSegment) {
152
104
}
153
105
154
106
TEST_F (DiscreteTrajectoryIteratorTest, BackwardOneSegment) {
155
- auto segment = --segments_. end ();
107
+ auto segment = --segments_-> end ();
156
108
auto iterator = MakeEnd (segment);
157
109
--iterator;
158
110
EXPECT_EQ (t0_ + 23 * Second, (*iterator).first );
@@ -165,7 +117,7 @@ TEST_F(DiscreteTrajectoryIteratorTest, BackwardOneSegment) {
165
117
}
166
118
167
119
TEST_F (DiscreteTrajectoryIteratorTest, ForwardAcrossSegments) {
168
- auto segment = segments_. begin ();
120
+ auto segment = segments_-> begin ();
169
121
auto iterator = MakeBegin (segment);
170
122
for (int i = 0 ; i < 4 ; ++i) {
171
123
++iterator;
@@ -178,7 +130,7 @@ TEST_F(DiscreteTrajectoryIteratorTest, ForwardAcrossSegments) {
178
130
}
179
131
180
132
TEST_F (DiscreteTrajectoryIteratorTest, BackwardAcrossSegments) {
181
- auto segment = --segments_. end ();
133
+ auto segment = --segments_-> end ();
182
134
auto iterator = MakeEnd (segment);
183
135
for (int i = 0 ; i < 3 ; ++i) {
184
136
--iterator;
@@ -193,15 +145,15 @@ TEST_F(DiscreteTrajectoryIteratorTest, BackwardAcrossSegments) {
193
145
TEST_F (DiscreteTrajectoryIteratorTest, Equality) {
194
146
// Construct two iterators that denote the time 13 * Second but in different
195
147
// segments.
196
- auto it1 = MakeEnd (--segments_. end ());
148
+ auto it1 = MakeEnd (--segments_-> end ());
197
149
for (int i = 0 ; i < 3 ; ++i) {
198
150
--it1;
199
151
}
200
152
EXPECT_EQ (t0_ + 17 * Second, (*it1).first );
201
153
--it1;
202
154
EXPECT_EQ (t0_ + 13 * Second, (*it1).first );
203
155
204
- auto it2 = MakeBegin (segments_. begin ());
156
+ auto it2 = MakeBegin (segments_-> begin ());
205
157
for (int i = 0 ; i < 4 ; ++i) {
206
158
++it2;
207
159
}
@@ -210,9 +162,9 @@ TEST_F(DiscreteTrajectoryIteratorTest, Equality) {
210
162
EXPECT_EQ (t0_ + 13 * Second, it2->first );
211
163
212
164
EXPECT_EQ (it1, it2);
213
- EXPECT_NE (it1, MakeBegin (segments_. begin ()));
214
- EXPECT_NE (it2, MakeEnd (--segments_. end ()));
215
- EXPECT_NE (MakeBegin (segments_. begin ()), MakeEnd (--segments_. end ()));
165
+ EXPECT_NE (it1, MakeBegin (segments_-> begin ()));
166
+ EXPECT_NE (it2, MakeEnd (--segments_-> end ()));
167
+ EXPECT_NE (MakeBegin (segments_-> begin ()), MakeEnd (--segments_-> end ()));
216
168
}
217
169
218
170
} // namespace physics
0 commit comments