Skip to content

Commit 5b1b9fb

Browse files
authored
Merge pull request #3152 from pleroy/Pointer
Cleanup and simplification of new-style discrete trajectory classes
2 parents 167fa6d + 9903b39 commit 5b1b9fb

9 files changed

+238
-291
lines changed

physics/discrete_trajectory_iterator_test.cpp

+52-100
Original file line numberDiff line numberDiff line change
@@ -12,135 +12,87 @@
1212
#include "physics/discrete_trajectory_segment.hpp"
1313
#include "physics/discrete_trajectory_segment_iterator.hpp"
1414
#include "physics/discrete_trajectory_types.hpp"
15-
#include "physics/mock_discrete_trajectory_segment.hpp"
1615
#include "quantities/quantities.hpp"
1716
#include "quantities/si.hpp"
1817

1918
namespace principia {
2019
namespace physics {
2120

2221
using base::check_not_null;
22+
using base::make_not_null_unique;
23+
using base::not_null;
2324
using geometry::Frame;
2425
using geometry::Instant;
2526
using physics::DegreesOfFreedom;
2627
using quantities::Time;
2728
using quantities::si::Second;
2829
using ::testing::Return;
2930

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-
4531
class DiscreteTrajectoryIteratorTest : public ::testing::Test {
4632
protected:
4733
using World = Frame<enum class WorldTag>;
48-
4934
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-
}
9635

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+
}
10562
}
10663

10764
DiscreteTrajectoryIterator<World> MakeBegin(
10865
Segments::const_iterator const it) {
10966
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());
11369
}
11470

11571
DiscreteTrajectoryIterator<World> MakeEnd(Segments::const_iterator it) {
11672
return DiscreteTrajectoryIterator<World>(
117-
DiscreteTrajectorySegmentIterator<World>(check_not_null(&segments_),
118-
++it),
73+
DiscreteTrajectorySegmentIterator<World>(segments_.get(), ++it),
11974
std::nullopt);
12075
}
12176

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;
13686
}
13787

138-
Segments segments_;
88+
not_null<std::unique_ptr<Segments>> segments_;
13989
Instant const t0_;
90+
DegreesOfFreedom<World> const unmoving_origin_{World::origin,
91+
World::unmoving};
14092
};
14193

14294
TEST_F(DiscreteTrajectoryIteratorTest, ForwardOneSegment) {
143-
auto segment = segments_.begin();
95+
auto segment = segments_->begin();
14496
auto iterator = MakeBegin(segment);
14597
EXPECT_EQ(t0_ + 2 * Second, iterator->first);
14698
auto const current = ++iterator;
@@ -152,7 +104,7 @@ TEST_F(DiscreteTrajectoryIteratorTest, ForwardOneSegment) {
152104
}
153105

154106
TEST_F(DiscreteTrajectoryIteratorTest, BackwardOneSegment) {
155-
auto segment = --segments_.end();
107+
auto segment = --segments_->end();
156108
auto iterator = MakeEnd(segment);
157109
--iterator;
158110
EXPECT_EQ(t0_ + 23 * Second, (*iterator).first);
@@ -165,7 +117,7 @@ TEST_F(DiscreteTrajectoryIteratorTest, BackwardOneSegment) {
165117
}
166118

167119
TEST_F(DiscreteTrajectoryIteratorTest, ForwardAcrossSegments) {
168-
auto segment = segments_.begin();
120+
auto segment = segments_->begin();
169121
auto iterator = MakeBegin(segment);
170122
for (int i = 0; i < 4; ++i) {
171123
++iterator;
@@ -178,7 +130,7 @@ TEST_F(DiscreteTrajectoryIteratorTest, ForwardAcrossSegments) {
178130
}
179131

180132
TEST_F(DiscreteTrajectoryIteratorTest, BackwardAcrossSegments) {
181-
auto segment = --segments_.end();
133+
auto segment = --segments_->end();
182134
auto iterator = MakeEnd(segment);
183135
for (int i = 0; i < 3; ++i) {
184136
--iterator;
@@ -193,15 +145,15 @@ TEST_F(DiscreteTrajectoryIteratorTest, BackwardAcrossSegments) {
193145
TEST_F(DiscreteTrajectoryIteratorTest, Equality) {
194146
// Construct two iterators that denote the time 13 * Second but in different
195147
// segments.
196-
auto it1 = MakeEnd(--segments_.end());
148+
auto it1 = MakeEnd(--segments_->end());
197149
for (int i = 0; i < 3; ++i) {
198150
--it1;
199151
}
200152
EXPECT_EQ(t0_ + 17 * Second, (*it1).first);
201153
--it1;
202154
EXPECT_EQ(t0_ + 13 * Second, (*it1).first);
203155

204-
auto it2 = MakeBegin(segments_.begin());
156+
auto it2 = MakeBegin(segments_->begin());
205157
for (int i = 0; i < 4; ++i) {
206158
++it2;
207159
}
@@ -210,9 +162,9 @@ TEST_F(DiscreteTrajectoryIteratorTest, Equality) {
210162
EXPECT_EQ(t0_ + 13 * Second, it2->first);
211163

212164
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()));
216168
}
217169

218170
} // namespace physics

physics/discrete_trajectory_segment.hpp

+2
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,7 @@ FORWARD_DECLARE_FROM(discrete_trajectory_factories,
2525
namespace physics {
2626

2727
class DiscreteTrajectoryIteratorTest;
28+
class DiscreteTrajectorySegmentIteratorTest;
2829
class DiscreteTrajectorySegmentTest;
2930

3031
namespace internal_discrete_trajectory_segment {
@@ -137,6 +138,7 @@ class DiscreteTrajectorySegment : public Trajectory<Frame> {
137138

138139
// For testing.
139140
friend class physics::DiscreteTrajectoryIteratorTest;
141+
friend class physics::DiscreteTrajectorySegmentIteratorTest;
140142
friend class physics::DiscreteTrajectorySegmentTest;
141143
template<typename F>
142144
friend class testing_utilities::DiscreteTrajectoryFactoriesFriend;

physics/discrete_trajectory_segment_iterator_body.hpp

+2-2
Original file line numberDiff line numberDiff line change
@@ -33,13 +33,13 @@ DiscreteTrajectorySegmentIterator<Frame>::operator--(int) { // NOLINT
3333
template<typename Frame>
3434
internal_discrete_trajectory_segment::DiscreteTrajectorySegment<Frame> const&
3535
DiscreteTrajectorySegmentIterator<Frame>::operator*() const {
36-
return **iterator_;
36+
return *iterator_;
3737
}
3838

3939
template<typename Frame>
4040
internal_discrete_trajectory_segment::DiscreteTrajectorySegment<Frame> const*
4141
DiscreteTrajectorySegmentIterator<Frame>::operator->() const {
42-
return iterator_->get();
42+
return &*iterator_;
4343
}
4444

4545
template<typename Frame>

physics/discrete_trajectory_segment_iterator_test.cpp

+51-21
Original file line numberDiff line numberDiff line change
@@ -5,53 +5,83 @@
55

66
#include "base/not_null.hpp"
77
#include "geometry/frame.hpp"
8+
#include "geometry/named_quantities.hpp"
89
#include "gmock/gmock.h"
910
#include "gtest/gtest.h"
11+
#include "physics/discrete_trajectory_segment.hpp"
1012
#include "physics/discrete_trajectory_types.hpp"
11-
#include "physics/mock_discrete_trajectory_segment.hpp"
13+
#include "quantities/si.hpp"
1214

1315
namespace principia {
1416
namespace physics {
1517

16-
using base::check_not_null;
18+
using base::make_not_null_unique;
1719
using base::not_null;
1820
using geometry::Frame;
21+
using geometry::Instant;
22+
using quantities::si::Second;
1923
using ::testing::Return;
2024

2125
// We use a mock segment in this test to avoid having to go through a
2226
// complicated setup just to test the iterator.
2327
class DiscreteTrajectorySegmentIteratorTest : public ::testing::Test {
2428
protected:
2529
using World = Frame<enum class WorldTag>;
26-
2730
using Segments = internal_discrete_trajectory_types::Segments<World>;
2831

32+
DiscreteTrajectorySegmentIteratorTest()
33+
: segments_(MakeSegments(3)) {
34+
auto it = segments_->begin();
35+
{
36+
auto& segment1 = *it;
37+
segment1.Append(t0_ + 2 * Second, unmoving_origin_);
38+
segment1.Append(t0_ + 3 * Second, unmoving_origin_);
39+
segment1.Append(t0_ + 5 * Second, unmoving_origin_);
40+
segment1.Append(t0_ + 7 * Second, unmoving_origin_);
41+
segment1.Append(t0_ + 11 * Second, unmoving_origin_);
42+
}
43+
44+
++it;
45+
{
46+
auto& segment2 = *it;
47+
segment2.Append(t0_ + 13 * Second, unmoving_origin_);
48+
}
49+
50+
++it;
51+
{
52+
auto& segment3 = *it;
53+
segment3.Append(t0_ + 13 * Second, unmoving_origin_);
54+
segment3.Append(t0_ + 17 * Second, unmoving_origin_);
55+
segment3.Append(t0_ + 19 * Second, unmoving_origin_);
56+
}
57+
}
58+
2959
DiscreteTrajectorySegmentIterator<World> MakeIterator(
3060
not_null<Segments const*> const segments,
3161
Segments::const_iterator const iterator) {
3262
return DiscreteTrajectorySegmentIterator<World>(segments, iterator);
3363
}
34-
};
3564

36-
TEST_F(DiscreteTrajectorySegmentIteratorTest, Basic) {
37-
auto owned_mock1 = std::make_unique<MockDiscreteTrajectorySegment<World>>();
38-
auto owned_mock2 = std::make_unique<MockDiscreteTrajectorySegment<World>>();
39-
auto owned_mock3 = std::make_unique<MockDiscreteTrajectorySegment<World>>();
40-
auto const& mock1 = *owned_mock1;
41-
auto const& mock2 = *owned_mock2;
42-
auto const& mock3 = *owned_mock3;
43-
44-
Segments segments;
45-
segments.push_back(std::move(owned_mock1));
46-
segments.push_back(std::move(owned_mock2));
47-
segments.push_back(std::move(owned_mock3));
65+
// Constructs a list of |n| segments which are properly initialized.
66+
// TODO(phl): Move to a central place.
67+
static not_null<std::unique_ptr<Segments>> MakeSegments(const int n) {
68+
auto segments = make_not_null_unique<Segments>(n);
69+
for (auto it = segments->begin(); it != segments->end(); ++it) {
70+
*it = DiscreteTrajectorySegment<World>(
71+
DiscreteTrajectorySegmentIterator<World>(segments.get(), it));
72+
}
73+
return segments;
74+
}
4875

49-
EXPECT_CALL(mock1, size()).WillRepeatedly(Return(5));
50-
EXPECT_CALL(mock2, size()).WillRepeatedly(Return(1));
51-
EXPECT_CALL(mock3, size()).WillRepeatedly(Return(3));
76+
not_null<std::unique_ptr<Segments>> segments_;
77+
Instant const t0_;
78+
DegreesOfFreedom<World> const unmoving_origin_{World::origin,
79+
World::unmoving};
80+
};
5281

82+
TEST_F(DiscreteTrajectorySegmentIteratorTest, Basic) {
5383
{
54-
auto iterator = MakeIterator(check_not_null(&segments), segments.begin());
84+
auto iterator = MakeIterator(segments_.get(), segments_->begin());
5585
EXPECT_EQ(5, iterator->size());
5686
auto const current = ++iterator;
5787
EXPECT_EQ(1, iterator->size());
@@ -61,7 +91,7 @@ TEST_F(DiscreteTrajectorySegmentIteratorTest, Basic) {
6191
EXPECT_EQ(1, previous->size());
6292
}
6393
{
64-
auto iterator = MakeIterator(check_not_null(&segments), segments.end());
94+
auto iterator = MakeIterator(segments_.get(), segments_->end());
6595
--iterator;
6696
EXPECT_EQ(3, (*iterator).size());
6797
auto const current = --iterator;

0 commit comments

Comments
 (0)