-
Notifications
You must be signed in to change notification settings - Fork 0
/
google_mock.cc
74 lines (62 loc) · 2.19 KB
/
google_mock.cc
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
// Adding Google Mock to a third-party unit-testing framework
#include "braking.h"
#include "gtest/gtest.h"
#include "gmock/gmock.h"
using ::testing::_;
using ::testing::A;
using ::testing::Field;
using ::testing::DoubleEq;
using ::testing::NiceMock;
using ::testing::StrictMock;
using ::testing::Invoke;
struct MockServiceBus : IServiceBus {
MOCK_METHOD1(publish, void(const BrakeCommand& cmd));
MOCK_METHOD1(subscribe, void(SpeedUpdateCallback callback));
MOCK_METHOD1(subscribe, void(CarDetectedCallback callback));
};
struct NiceAutoBrakeTest : ::testing::Test {
NiceMock<MockServiceBus> bus;
AutoBrake auto_brake{ bus };
};
struct StrictAutoBrakeTest : ::testing::Test {
StrictAutoBrakeTest() {
EXPECT_CALL(bus, subscribe(A<CarDetectedCallback>()))
.Times(1)
.WillOnce(Invoke([this](const auto& x) {
car_detected_callback = x;
}));
EXPECT_CALL(bus, subscribe(A<SpeedUpdateCallback>()))
.Times(1)
.WillOnce(Invoke([this](const auto& x) {
speed_update_callback = x;
}));
}
CarDetectedCallback car_detected_callback;
SpeedUpdateCallback speed_update_callback;
StrictMock<MockServiceBus> bus;
};
TEST_F(NiceAutoBrakeTest, InitialCarSpeedIsZero) {
ASSERT_DOUBLE_EQ(0, auto_brake.get_speed_mps());
}
TEST_F(NiceAutoBrakeTest, InitialSensitivityIsFive) {
ASSERT_DOUBLE_EQ(5, auto_brake.get_collision_threshold_s());
}
TEST_F(NiceAutoBrakeTest, SensitivityGreaterThanOne) {
ASSERT_ANY_THROW(auto_brake.set_collision_threshold_s(0.5L));
}
TEST_F(StrictAutoBrakeTest, NoAlertWhenNotImminent) {
AutoBrake auto_brake{ bus };
auto_brake.set_collision_threshold_s(2L);
speed_update_callback(SpeedUpdate{ 100L });
car_detected_callback(CarDetected{ 1000L, 50L });
}
TEST_F(StrictAutoBrakeTest, AlertWhenImminent) {
EXPECT_CALL(bus, publish(
Field(&BrakeCommand::time_to_collision_s, DoubleEq({ 1L
})))
).Times(1);
AutoBrake auto_brake{ bus };
auto_brake.set_collision_threshold_s(10L);
speed_update_callback(SpeedUpdate{ 100L });
car_detected_callback(CarDetected{ 100L, 0L });
}