1 #include "pid/controller.hpp"
2 #include "pid/ec/stepwise.hpp"
3 #include "pid/stepwisecontroller.hpp"
4 #include "test/zone_mock.hpp"
5 
6 #include <string>
7 #include <vector>
8 
9 #include <gmock/gmock.h>
10 #include <gtest/gtest.h>
11 
12 using ::testing::Return;
13 using ::testing::StrEq;
14 
15 TEST(StepwiseControllerTest, HysteresisTestPositive)
16 {
17     // Verifies positive hysteresis works as expected
18 
19     ZoneMock z;
20 
21     std::vector<std::string> inputs = {"test"};
22     ec::StepwiseInfo initial;
23     initial.negativeHysteresis = 3.0;
24     initial.positiveHysteresis = 2.0;
25     initial.reading[0] = 20.0;
26     initial.reading[1] = 30.0;
27     initial.reading[2] = std::numeric_limits<float>::quiet_NaN();
28     initial.output[0] = 40.0;
29     initial.output[1] = 60.0;
30 
31     std::unique_ptr<Controller> p =
32         StepwiseController::CreateStepwiseController(&z, "foo", inputs,
33                                                      initial);
34 
35     EXPECT_CALL(z, getCachedValue(StrEq("test")))
36         .Times(3)
37         .WillOnce(Return(29.0))  // return 40
38         .WillOnce(Return(31.0))  // return 40
39         .WillOnce(Return(32.0)); // return 60
40 
41     EXPECT_CALL(z, addRPMSetPoint(40.0)).Times(2);
42     EXPECT_CALL(z, addRPMSetPoint(60.0)).Times(1);
43 
44     for (int ii = 0; ii < 3; ii++)
45     {
46         p->process();
47     }
48 }
49 
50 TEST(StepwiseControllerTest, HysteresisTestNegative)
51 {
52     // Verifies negative hysteresis works as expected
53 
54     ZoneMock z;
55 
56     std::vector<std::string> inputs = {"test"};
57     ec::StepwiseInfo initial;
58     initial.negativeHysteresis = 3.0;
59     initial.positiveHysteresis = 2.0;
60     initial.reading[0] = 20.0;
61     initial.reading[1] = 30.0;
62     initial.reading[2] = std::numeric_limits<float>::quiet_NaN();
63     initial.output[0] = 40.0;
64     initial.output[1] = 60.0;
65 
66     std::unique_ptr<Controller> p =
67         StepwiseController::CreateStepwiseController(&z, "foo", inputs,
68                                                      initial);
69 
70     EXPECT_CALL(z, getCachedValue(StrEq("test")))
71         .Times(3)
72         .WillOnce(Return(30.0))  // return 60
73         .WillOnce(Return(27.0))  // return 60
74         .WillOnce(Return(26.0)); // return 40
75 
76     EXPECT_CALL(z, addRPMSetPoint(40.0)).Times(1);
77     EXPECT_CALL(z, addRPMSetPoint(60.0)).Times(2);
78 
79     for (int ii = 0; ii < 3; ii++)
80     {
81         p->process();
82     }
83 }
84