blob: ea9656bb01296bf30c24b42d15cce6df0d46841d [file] [log] [blame]
Austin Schuh812d0d12021-11-04 20:16:48 -07001// Copyright (c) FIRST and other WPILib contributors.
2// Open Source Software; you can modify and/or share it under the terms of
3// the WPILib BSD license file in the root directory of this project.
Austin Schuh1e69f942020-11-14 15:06:14 -08004
5#include "frc/TimedRobot.h" // NOLINT(build/include_order)
6
7#include <stdint.h>
8
9#include <atomic>
10#include <thread>
11
12#include "frc/simulation/DriverStationSim.h"
13#include "frc/simulation/SimHooks.h"
14#include "gtest/gtest.h"
15
16using namespace frc;
17
18namespace {
19class TimedRobotTest : public ::testing::Test {
20 protected:
21 void SetUp() override { frc::sim::PauseTiming(); }
22
23 void TearDown() override { frc::sim::ResumeTiming(); }
24};
25
26class MockRobot : public TimedRobot {
27 public:
28 std::atomic<uint32_t> m_robotInitCount{0};
29 std::atomic<uint32_t> m_simulationInitCount{0};
30 std::atomic<uint32_t> m_disabledInitCount{0};
31 std::atomic<uint32_t> m_autonomousInitCount{0};
32 std::atomic<uint32_t> m_teleopInitCount{0};
33 std::atomic<uint32_t> m_testInitCount{0};
34
Austin Schuh812d0d12021-11-04 20:16:48 -070035 std::atomic<uint32_t> m_disabledExitCount{0};
36 std::atomic<uint32_t> m_autonomousExitCount{0};
37 std::atomic<uint32_t> m_teleopExitCount{0};
38 std::atomic<uint32_t> m_testExitCount{0};
39
Austin Schuh1e69f942020-11-14 15:06:14 -080040 std::atomic<uint32_t> m_robotPeriodicCount{0};
41 std::atomic<uint32_t> m_simulationPeriodicCount{0};
42 std::atomic<uint32_t> m_disabledPeriodicCount{0};
43 std::atomic<uint32_t> m_autonomousPeriodicCount{0};
44 std::atomic<uint32_t> m_teleopPeriodicCount{0};
45 std::atomic<uint32_t> m_testPeriodicCount{0};
46
47 void RobotInit() override { m_robotInitCount++; }
48
49 void SimulationInit() override { m_simulationInitCount++; }
50
51 void DisabledInit() override { m_disabledInitCount++; }
52
53 void AutonomousInit() override { m_autonomousInitCount++; }
54
55 void TeleopInit() override { m_teleopInitCount++; }
56
57 void TestInit() override { m_testInitCount++; }
58
59 void RobotPeriodic() override { m_robotPeriodicCount++; }
60
61 void SimulationPeriodic() override { m_simulationPeriodicCount++; }
62
63 void DisabledPeriodic() override { m_disabledPeriodicCount++; }
64
65 void AutonomousPeriodic() override { m_autonomousPeriodicCount++; }
66
67 void TeleopPeriodic() override { m_teleopPeriodicCount++; }
68
69 void TestPeriodic() override { m_testPeriodicCount++; }
Austin Schuh812d0d12021-11-04 20:16:48 -070070
71 void DisabledExit() override { m_disabledExitCount++; }
72
73 void AutonomousExit() override { m_autonomousExitCount++; }
74
75 void TeleopExit() override { m_teleopExitCount++; }
76
77 void TestExit() override { m_testExitCount++; }
Austin Schuh1e69f942020-11-14 15:06:14 -080078};
79} // namespace
80
Austin Schuh812d0d12021-11-04 20:16:48 -070081TEST_F(TimedRobotTest, DisabledMode) {
Austin Schuh1e69f942020-11-14 15:06:14 -080082 MockRobot robot;
83
84 std::thread robotThread{[&] { robot.StartCompetition(); }};
85
86 frc::sim::DriverStationSim::SetEnabled(false);
87 frc::sim::DriverStationSim::NotifyNewData();
88 frc::sim::StepTiming(0_ms); // Wait for Notifiers
89
90 EXPECT_EQ(1u, robot.m_robotInitCount);
91 EXPECT_EQ(1u, robot.m_simulationInitCount);
92 EXPECT_EQ(0u, robot.m_disabledInitCount);
93 EXPECT_EQ(0u, robot.m_autonomousInitCount);
94 EXPECT_EQ(0u, robot.m_teleopInitCount);
95 EXPECT_EQ(0u, robot.m_testInitCount);
96
97 EXPECT_EQ(0u, robot.m_robotPeriodicCount);
98 EXPECT_EQ(0u, robot.m_simulationPeriodicCount);
99 EXPECT_EQ(0u, robot.m_disabledPeriodicCount);
100 EXPECT_EQ(0u, robot.m_autonomousPeriodicCount);
101 EXPECT_EQ(0u, robot.m_teleopPeriodicCount);
102 EXPECT_EQ(0u, robot.m_testPeriodicCount);
103
Austin Schuh812d0d12021-11-04 20:16:48 -0700104 EXPECT_EQ(0u, robot.m_disabledExitCount);
105 EXPECT_EQ(0u, robot.m_autonomousExitCount);
106 EXPECT_EQ(0u, robot.m_teleopExitCount);
107 EXPECT_EQ(0u, robot.m_testExitCount);
108
Austin Schuh1e69f942020-11-14 15:06:14 -0800109 frc::sim::StepTiming(20_ms);
110
111 EXPECT_EQ(1u, robot.m_robotInitCount);
112 EXPECT_EQ(1u, robot.m_simulationInitCount);
113 EXPECT_EQ(1u, robot.m_disabledInitCount);
114 EXPECT_EQ(0u, robot.m_autonomousInitCount);
115 EXPECT_EQ(0u, robot.m_teleopInitCount);
116 EXPECT_EQ(0u, robot.m_testInitCount);
117
118 EXPECT_EQ(1u, robot.m_robotPeriodicCount);
119 EXPECT_EQ(1u, robot.m_simulationPeriodicCount);
120 EXPECT_EQ(1u, robot.m_disabledPeriodicCount);
121 EXPECT_EQ(0u, robot.m_autonomousPeriodicCount);
122 EXPECT_EQ(0u, robot.m_teleopPeriodicCount);
123 EXPECT_EQ(0u, robot.m_testPeriodicCount);
124
Austin Schuh812d0d12021-11-04 20:16:48 -0700125 EXPECT_EQ(0u, robot.m_disabledExitCount);
126 EXPECT_EQ(0u, robot.m_autonomousExitCount);
127 EXPECT_EQ(0u, robot.m_teleopExitCount);
128 EXPECT_EQ(0u, robot.m_testExitCount);
129
Austin Schuh1e69f942020-11-14 15:06:14 -0800130 frc::sim::StepTiming(20_ms);
131
132 EXPECT_EQ(1u, robot.m_robotInitCount);
133 EXPECT_EQ(1u, robot.m_simulationInitCount);
134 EXPECT_EQ(1u, robot.m_disabledInitCount);
135 EXPECT_EQ(0u, robot.m_autonomousInitCount);
136 EXPECT_EQ(0u, robot.m_teleopInitCount);
137 EXPECT_EQ(0u, robot.m_testInitCount);
138
139 EXPECT_EQ(2u, robot.m_robotPeriodicCount);
140 EXPECT_EQ(2u, robot.m_simulationPeriodicCount);
141 EXPECT_EQ(2u, robot.m_disabledPeriodicCount);
142 EXPECT_EQ(0u, robot.m_autonomousPeriodicCount);
143 EXPECT_EQ(0u, robot.m_teleopPeriodicCount);
144 EXPECT_EQ(0u, robot.m_testPeriodicCount);
145
Austin Schuh812d0d12021-11-04 20:16:48 -0700146 EXPECT_EQ(0u, robot.m_disabledExitCount);
147 EXPECT_EQ(0u, robot.m_autonomousExitCount);
148 EXPECT_EQ(0u, robot.m_teleopExitCount);
149 EXPECT_EQ(0u, robot.m_testExitCount);
150
Austin Schuh1e69f942020-11-14 15:06:14 -0800151 robot.EndCompetition();
152 robotThread.join();
153}
154
Austin Schuh812d0d12021-11-04 20:16:48 -0700155TEST_F(TimedRobotTest, AutonomousMode) {
Austin Schuh1e69f942020-11-14 15:06:14 -0800156 MockRobot robot;
157
158 std::thread robotThread{[&] { robot.StartCompetition(); }};
159
160 frc::sim::DriverStationSim::SetEnabled(true);
161 frc::sim::DriverStationSim::SetAutonomous(true);
162 frc::sim::DriverStationSim::SetTest(false);
163 frc::sim::DriverStationSim::NotifyNewData();
164 frc::sim::StepTiming(0_ms); // Wait for Notifiers
165
166 EXPECT_EQ(1u, robot.m_robotInitCount);
167 EXPECT_EQ(1u, robot.m_simulationInitCount);
168 EXPECT_EQ(0u, robot.m_disabledInitCount);
169 EXPECT_EQ(0u, robot.m_autonomousInitCount);
170 EXPECT_EQ(0u, robot.m_teleopInitCount);
171 EXPECT_EQ(0u, robot.m_testInitCount);
172
173 EXPECT_EQ(0u, robot.m_robotPeriodicCount);
174 EXPECT_EQ(0u, robot.m_simulationPeriodicCount);
175 EXPECT_EQ(0u, robot.m_disabledPeriodicCount);
176 EXPECT_EQ(0u, robot.m_autonomousPeriodicCount);
177 EXPECT_EQ(0u, robot.m_teleopPeriodicCount);
178 EXPECT_EQ(0u, robot.m_testPeriodicCount);
179
Austin Schuh812d0d12021-11-04 20:16:48 -0700180 EXPECT_EQ(0u, robot.m_disabledExitCount);
181 EXPECT_EQ(0u, robot.m_autonomousExitCount);
182 EXPECT_EQ(0u, robot.m_teleopExitCount);
183 EXPECT_EQ(0u, robot.m_testExitCount);
184
Austin Schuh1e69f942020-11-14 15:06:14 -0800185 frc::sim::StepTiming(20_ms);
186
187 EXPECT_EQ(1u, robot.m_robotInitCount);
188 EXPECT_EQ(1u, robot.m_simulationInitCount);
189 EXPECT_EQ(0u, robot.m_disabledInitCount);
190 EXPECT_EQ(1u, robot.m_autonomousInitCount);
191 EXPECT_EQ(0u, robot.m_teleopInitCount);
192 EXPECT_EQ(0u, robot.m_testInitCount);
193
194 EXPECT_EQ(1u, robot.m_robotPeriodicCount);
195 EXPECT_EQ(1u, robot.m_simulationPeriodicCount);
196 EXPECT_EQ(0u, robot.m_disabledPeriodicCount);
197 EXPECT_EQ(1u, robot.m_autonomousPeriodicCount);
198 EXPECT_EQ(0u, robot.m_teleopPeriodicCount);
199 EXPECT_EQ(0u, robot.m_testPeriodicCount);
200
Austin Schuh812d0d12021-11-04 20:16:48 -0700201 EXPECT_EQ(0u, robot.m_disabledExitCount);
202 EXPECT_EQ(0u, robot.m_autonomousExitCount);
203 EXPECT_EQ(0u, robot.m_teleopExitCount);
204 EXPECT_EQ(0u, robot.m_testExitCount);
205
Austin Schuh1e69f942020-11-14 15:06:14 -0800206 frc::sim::StepTiming(20_ms);
207
208 EXPECT_EQ(1u, robot.m_robotInitCount);
209 EXPECT_EQ(1u, robot.m_simulationInitCount);
210 EXPECT_EQ(0u, robot.m_disabledInitCount);
211 EXPECT_EQ(1u, robot.m_autonomousInitCount);
212 EXPECT_EQ(0u, robot.m_teleopInitCount);
213 EXPECT_EQ(0u, robot.m_testInitCount);
214
215 EXPECT_EQ(2u, robot.m_robotPeriodicCount);
216 EXPECT_EQ(2u, robot.m_simulationPeriodicCount);
217 EXPECT_EQ(0u, robot.m_disabledPeriodicCount);
218 EXPECT_EQ(2u, robot.m_autonomousPeriodicCount);
219 EXPECT_EQ(0u, robot.m_teleopPeriodicCount);
220 EXPECT_EQ(0u, robot.m_testPeriodicCount);
221
Austin Schuh812d0d12021-11-04 20:16:48 -0700222 EXPECT_EQ(0u, robot.m_disabledExitCount);
223 EXPECT_EQ(0u, robot.m_autonomousExitCount);
224 EXPECT_EQ(0u, robot.m_teleopExitCount);
225 EXPECT_EQ(0u, robot.m_testExitCount);
226
Austin Schuh1e69f942020-11-14 15:06:14 -0800227 robot.EndCompetition();
228 robotThread.join();
229}
230
Austin Schuh812d0d12021-11-04 20:16:48 -0700231TEST_F(TimedRobotTest, TeleopMode) {
Austin Schuh1e69f942020-11-14 15:06:14 -0800232 MockRobot robot;
233
234 std::thread robotThread{[&] { robot.StartCompetition(); }};
235
236 frc::sim::DriverStationSim::SetEnabled(true);
237 frc::sim::DriverStationSim::SetAutonomous(false);
238 frc::sim::DriverStationSim::SetTest(false);
239 frc::sim::DriverStationSim::NotifyNewData();
240 frc::sim::StepTiming(0_ms); // Wait for Notifiers
241
242 EXPECT_EQ(1u, robot.m_robotInitCount);
243 EXPECT_EQ(1u, robot.m_simulationInitCount);
244 EXPECT_EQ(0u, robot.m_disabledInitCount);
245 EXPECT_EQ(0u, robot.m_autonomousInitCount);
246 EXPECT_EQ(0u, robot.m_teleopInitCount);
247 EXPECT_EQ(0u, robot.m_testInitCount);
248
249 EXPECT_EQ(0u, robot.m_robotPeriodicCount);
250 EXPECT_EQ(0u, robot.m_simulationPeriodicCount);
251 EXPECT_EQ(0u, robot.m_disabledPeriodicCount);
252 EXPECT_EQ(0u, robot.m_autonomousPeriodicCount);
253 EXPECT_EQ(0u, robot.m_teleopPeriodicCount);
254 EXPECT_EQ(0u, robot.m_testPeriodicCount);
255
Austin Schuh812d0d12021-11-04 20:16:48 -0700256 EXPECT_EQ(0u, robot.m_disabledExitCount);
257 EXPECT_EQ(0u, robot.m_autonomousExitCount);
258 EXPECT_EQ(0u, robot.m_teleopExitCount);
259 EXPECT_EQ(0u, robot.m_testExitCount);
260
Austin Schuh1e69f942020-11-14 15:06:14 -0800261 frc::sim::StepTiming(20_ms);
262
263 EXPECT_EQ(1u, robot.m_robotInitCount);
264 EXPECT_EQ(1u, robot.m_simulationInitCount);
265 EXPECT_EQ(0u, robot.m_disabledInitCount);
266 EXPECT_EQ(0u, robot.m_autonomousInitCount);
267 EXPECT_EQ(1u, robot.m_teleopInitCount);
268 EXPECT_EQ(0u, robot.m_testInitCount);
269
270 EXPECT_EQ(1u, robot.m_robotPeriodicCount);
271 EXPECT_EQ(1u, robot.m_simulationPeriodicCount);
272 EXPECT_EQ(0u, robot.m_disabledPeriodicCount);
273 EXPECT_EQ(0u, robot.m_autonomousPeriodicCount);
274 EXPECT_EQ(1u, robot.m_teleopPeriodicCount);
275 EXPECT_EQ(0u, robot.m_testPeriodicCount);
276
Austin Schuh812d0d12021-11-04 20:16:48 -0700277 EXPECT_EQ(0u, robot.m_disabledExitCount);
278 EXPECT_EQ(0u, robot.m_autonomousExitCount);
279 EXPECT_EQ(0u, robot.m_teleopExitCount);
280 EXPECT_EQ(0u, robot.m_testExitCount);
281
Austin Schuh1e69f942020-11-14 15:06:14 -0800282 frc::sim::StepTiming(20_ms);
283
284 EXPECT_EQ(1u, robot.m_robotInitCount);
285 EXPECT_EQ(1u, robot.m_simulationInitCount);
286 EXPECT_EQ(0u, robot.m_disabledInitCount);
287 EXPECT_EQ(0u, robot.m_autonomousInitCount);
288 EXPECT_EQ(1u, robot.m_teleopInitCount);
289 EXPECT_EQ(0u, robot.m_testInitCount);
290
291 EXPECT_EQ(2u, robot.m_robotPeriodicCount);
292 EXPECT_EQ(2u, robot.m_simulationPeriodicCount);
293 EXPECT_EQ(0u, robot.m_disabledPeriodicCount);
294 EXPECT_EQ(0u, robot.m_autonomousPeriodicCount);
295 EXPECT_EQ(2u, robot.m_teleopPeriodicCount);
296 EXPECT_EQ(0u, robot.m_testPeriodicCount);
297
Austin Schuh812d0d12021-11-04 20:16:48 -0700298 EXPECT_EQ(0u, robot.m_disabledExitCount);
299 EXPECT_EQ(0u, robot.m_autonomousExitCount);
300 EXPECT_EQ(0u, robot.m_teleopExitCount);
301 EXPECT_EQ(0u, robot.m_testExitCount);
302
Austin Schuh1e69f942020-11-14 15:06:14 -0800303 robot.EndCompetition();
304 robotThread.join();
305}
306
Austin Schuh812d0d12021-11-04 20:16:48 -0700307TEST_F(TimedRobotTest, TestMode) {
Austin Schuh1e69f942020-11-14 15:06:14 -0800308 MockRobot robot;
309
310 std::thread robotThread{[&] { robot.StartCompetition(); }};
311
312 frc::sim::DriverStationSim::SetEnabled(true);
313 frc::sim::DriverStationSim::SetAutonomous(false);
314 frc::sim::DriverStationSim::SetTest(true);
315 frc::sim::DriverStationSim::NotifyNewData();
316 frc::sim::StepTiming(0_ms); // Wait for Notifiers
317
318 EXPECT_EQ(1u, robot.m_robotInitCount);
319 EXPECT_EQ(1u, robot.m_simulationInitCount);
320 EXPECT_EQ(0u, robot.m_disabledInitCount);
321 EXPECT_EQ(0u, robot.m_autonomousInitCount);
322 EXPECT_EQ(0u, robot.m_teleopInitCount);
323 EXPECT_EQ(0u, robot.m_testInitCount);
324
325 EXPECT_EQ(0u, robot.m_robotPeriodicCount);
326 EXPECT_EQ(0u, robot.m_simulationPeriodicCount);
327 EXPECT_EQ(0u, robot.m_disabledPeriodicCount);
328 EXPECT_EQ(0u, robot.m_autonomousPeriodicCount);
329 EXPECT_EQ(0u, robot.m_teleopPeriodicCount);
330 EXPECT_EQ(0u, robot.m_testPeriodicCount);
331
Austin Schuh812d0d12021-11-04 20:16:48 -0700332 EXPECT_EQ(0u, robot.m_disabledExitCount);
333 EXPECT_EQ(0u, robot.m_autonomousExitCount);
334 EXPECT_EQ(0u, robot.m_teleopExitCount);
335 EXPECT_EQ(0u, robot.m_testExitCount);
336
Austin Schuh1e69f942020-11-14 15:06:14 -0800337 frc::sim::StepTiming(20_ms);
338
339 EXPECT_EQ(1u, robot.m_robotInitCount);
340 EXPECT_EQ(1u, robot.m_simulationInitCount);
341 EXPECT_EQ(0u, robot.m_disabledInitCount);
342 EXPECT_EQ(0u, robot.m_autonomousInitCount);
343 EXPECT_EQ(0u, robot.m_teleopInitCount);
344 EXPECT_EQ(1u, robot.m_testInitCount);
345
346 EXPECT_EQ(1u, robot.m_robotPeriodicCount);
347 EXPECT_EQ(1u, robot.m_simulationPeriodicCount);
348 EXPECT_EQ(0u, robot.m_disabledPeriodicCount);
349 EXPECT_EQ(0u, robot.m_autonomousPeriodicCount);
350 EXPECT_EQ(0u, robot.m_teleopPeriodicCount);
351 EXPECT_EQ(1u, robot.m_testPeriodicCount);
352
Austin Schuh812d0d12021-11-04 20:16:48 -0700353 EXPECT_EQ(0u, robot.m_disabledExitCount);
354 EXPECT_EQ(0u, robot.m_autonomousExitCount);
355 EXPECT_EQ(0u, robot.m_teleopExitCount);
356 EXPECT_EQ(0u, robot.m_testExitCount);
357
Austin Schuh1e69f942020-11-14 15:06:14 -0800358 frc::sim::StepTiming(20_ms);
359
360 EXPECT_EQ(1u, robot.m_robotInitCount);
361 EXPECT_EQ(1u, robot.m_simulationInitCount);
362 EXPECT_EQ(0u, robot.m_disabledInitCount);
363 EXPECT_EQ(0u, robot.m_autonomousInitCount);
364 EXPECT_EQ(0u, robot.m_teleopInitCount);
365 EXPECT_EQ(1u, robot.m_testInitCount);
366
367 EXPECT_EQ(2u, robot.m_robotPeriodicCount);
368 EXPECT_EQ(2u, robot.m_simulationPeriodicCount);
369 EXPECT_EQ(0u, robot.m_disabledPeriodicCount);
370 EXPECT_EQ(0u, robot.m_autonomousPeriodicCount);
371 EXPECT_EQ(0u, robot.m_teleopPeriodicCount);
372 EXPECT_EQ(2u, robot.m_testPeriodicCount);
373
Austin Schuh812d0d12021-11-04 20:16:48 -0700374 EXPECT_EQ(0u, robot.m_disabledExitCount);
375 EXPECT_EQ(0u, robot.m_autonomousExitCount);
376 EXPECT_EQ(0u, robot.m_teleopExitCount);
377 EXPECT_EQ(0u, robot.m_testExitCount);
378
379 robot.EndCompetition();
380 robotThread.join();
381}
382
383TEST_F(TimedRobotTest, ModeChange) {
384 MockRobot robot;
385
386 std::thread robotThread{[&] { robot.StartCompetition(); }};
387
388 // Start in disabled
389 frc::sim::DriverStationSim::SetEnabled(false);
390 frc::sim::DriverStationSim::SetAutonomous(false);
391 frc::sim::DriverStationSim::SetTest(false);
392 frc::sim::DriverStationSim::NotifyNewData();
393 frc::sim::StepTiming(0_ms); // Wait for Notifiers
394
395 EXPECT_EQ(0u, robot.m_disabledInitCount);
396 EXPECT_EQ(0u, robot.m_autonomousInitCount);
397 EXPECT_EQ(0u, robot.m_teleopInitCount);
398 EXPECT_EQ(0u, robot.m_testInitCount);
399
400 EXPECT_EQ(0u, robot.m_disabledExitCount);
401 EXPECT_EQ(0u, robot.m_autonomousExitCount);
402 EXPECT_EQ(0u, robot.m_teleopExitCount);
403 EXPECT_EQ(0u, robot.m_testExitCount);
404
405 frc::sim::StepTiming(20_ms);
406
407 EXPECT_EQ(1u, robot.m_disabledInitCount);
408 EXPECT_EQ(0u, robot.m_autonomousInitCount);
409 EXPECT_EQ(0u, robot.m_teleopInitCount);
410 EXPECT_EQ(0u, robot.m_testInitCount);
411
412 EXPECT_EQ(0u, robot.m_disabledExitCount);
413 EXPECT_EQ(0u, robot.m_autonomousExitCount);
414 EXPECT_EQ(0u, robot.m_teleopExitCount);
415 EXPECT_EQ(0u, robot.m_testExitCount);
416
417 // Transition to autonomous
418 frc::sim::DriverStationSim::SetEnabled(true);
419 frc::sim::DriverStationSim::SetAutonomous(true);
420 frc::sim::DriverStationSim::SetTest(false);
421
422 frc::sim::StepTiming(20_ms);
423
424 EXPECT_EQ(1u, robot.m_disabledInitCount);
425 EXPECT_EQ(1u, robot.m_autonomousInitCount);
426 EXPECT_EQ(0u, robot.m_teleopInitCount);
427 EXPECT_EQ(0u, robot.m_testInitCount);
428
429 EXPECT_EQ(1u, robot.m_disabledExitCount);
430 EXPECT_EQ(0u, robot.m_autonomousExitCount);
431 EXPECT_EQ(0u, robot.m_teleopExitCount);
432 EXPECT_EQ(0u, robot.m_testExitCount);
433
434 // Transition to teleop
435 frc::sim::DriverStationSim::SetEnabled(true);
436 frc::sim::DriverStationSim::SetAutonomous(false);
437 frc::sim::DriverStationSim::SetTest(false);
438
439 frc::sim::StepTiming(20_ms);
440
441 EXPECT_EQ(1u, robot.m_disabledInitCount);
442 EXPECT_EQ(1u, robot.m_autonomousInitCount);
443 EXPECT_EQ(1u, robot.m_teleopInitCount);
444 EXPECT_EQ(0u, robot.m_testInitCount);
445
446 EXPECT_EQ(1u, robot.m_disabledExitCount);
447 EXPECT_EQ(1u, robot.m_autonomousExitCount);
448 EXPECT_EQ(0u, robot.m_teleopExitCount);
449 EXPECT_EQ(0u, robot.m_testExitCount);
450
451 // Transition to test
452 frc::sim::DriverStationSim::SetEnabled(true);
453 frc::sim::DriverStationSim::SetAutonomous(false);
454 frc::sim::DriverStationSim::SetTest(true);
455
456 frc::sim::StepTiming(20_ms);
457
458 EXPECT_EQ(1u, robot.m_disabledInitCount);
459 EXPECT_EQ(1u, robot.m_autonomousInitCount);
460 EXPECT_EQ(1u, robot.m_teleopInitCount);
461 EXPECT_EQ(1u, robot.m_testInitCount);
462
463 EXPECT_EQ(1u, robot.m_disabledExitCount);
464 EXPECT_EQ(1u, robot.m_autonomousExitCount);
465 EXPECT_EQ(1u, robot.m_teleopExitCount);
466 EXPECT_EQ(0u, robot.m_testExitCount);
467
468 // Transition to disabled
469 frc::sim::DriverStationSim::SetEnabled(false);
470 frc::sim::DriverStationSim::SetAutonomous(false);
471 frc::sim::DriverStationSim::SetTest(false);
472
473 frc::sim::StepTiming(20_ms);
474
475 EXPECT_EQ(2u, robot.m_disabledInitCount);
476 EXPECT_EQ(1u, robot.m_autonomousInitCount);
477 EXPECT_EQ(1u, robot.m_teleopInitCount);
478 EXPECT_EQ(1u, robot.m_testInitCount);
479
480 EXPECT_EQ(1u, robot.m_disabledExitCount);
481 EXPECT_EQ(1u, robot.m_autonomousExitCount);
482 EXPECT_EQ(1u, robot.m_teleopExitCount);
483 EXPECT_EQ(1u, robot.m_testExitCount);
484
Austin Schuh1e69f942020-11-14 15:06:14 -0800485 robot.EndCompetition();
486 robotThread.join();
487}
488
489TEST_F(TimedRobotTest, AddPeriodic) {
490 MockRobot robot;
491
492 std::atomic<uint32_t> callbackCount{0};
493 robot.AddPeriodic([&] { callbackCount++; }, 10_ms);
494
495 std::thread robotThread{[&] { robot.StartCompetition(); }};
496
497 frc::sim::DriverStationSim::SetEnabled(false);
498 frc::sim::DriverStationSim::NotifyNewData();
499 frc::sim::StepTiming(0_ms); // Wait for Notifiers
500
501 EXPECT_EQ(0u, robot.m_disabledInitCount);
502 EXPECT_EQ(0u, robot.m_disabledPeriodicCount);
503 EXPECT_EQ(0u, callbackCount);
504
505 frc::sim::StepTiming(10_ms);
506
507 EXPECT_EQ(0u, robot.m_disabledInitCount);
508 EXPECT_EQ(0u, robot.m_disabledPeriodicCount);
509 EXPECT_EQ(1u, callbackCount);
510
511 frc::sim::StepTiming(10_ms);
512
513 EXPECT_EQ(1u, robot.m_disabledInitCount);
514 EXPECT_EQ(1u, robot.m_disabledPeriodicCount);
515 EXPECT_EQ(2u, callbackCount);
516
517 robot.EndCompetition();
518 robotThread.join();
519}
520
521TEST_F(TimedRobotTest, AddPeriodicWithOffset) {
522 MockRobot robot;
523
524 std::atomic<uint32_t> callbackCount{0};
525 robot.AddPeriodic([&] { callbackCount++; }, 10_ms, 5_ms);
526
527 // Expirations in this test (ms)
528 //
529 // Robot | Callback
530 // ================
531 // 20 | 15
532 // 40 | 25
533
534 std::thread robotThread{[&] { robot.StartCompetition(); }};
535
536 frc::sim::DriverStationSim::SetEnabled(false);
537 frc::sim::DriverStationSim::NotifyNewData();
538 frc::sim::StepTiming(0_ms); // Wait for Notifiers
539
540 EXPECT_EQ(0u, robot.m_disabledInitCount);
541 EXPECT_EQ(0u, robot.m_disabledPeriodicCount);
542 EXPECT_EQ(0u, callbackCount);
543
544 frc::sim::StepTiming(7.5_ms);
545
546 EXPECT_EQ(0u, robot.m_disabledInitCount);
547 EXPECT_EQ(0u, robot.m_disabledPeriodicCount);
548 EXPECT_EQ(0u, callbackCount);
549
550 frc::sim::StepTiming(7.5_ms);
551
552 EXPECT_EQ(0u, robot.m_disabledInitCount);
553 EXPECT_EQ(0u, robot.m_disabledPeriodicCount);
554 EXPECT_EQ(1u, callbackCount);
555
556 frc::sim::StepTiming(5_ms);
557
558 EXPECT_EQ(1u, robot.m_disabledInitCount);
559 EXPECT_EQ(1u, robot.m_disabledPeriodicCount);
560 EXPECT_EQ(1u, callbackCount);
561
562 frc::sim::StepTiming(5_ms);
563
564 EXPECT_EQ(1u, robot.m_disabledInitCount);
565 EXPECT_EQ(1u, robot.m_disabledPeriodicCount);
566 EXPECT_EQ(2u, callbackCount);
567
568 robot.EndCompetition();
569 robotThread.join();
570}