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 namespace pid_control 13 { 14 namespace 15 { 16 17 using ::testing::Return; 18 using ::testing::StrEq; 19 20 TEST(StepwiseControllerTest, HysteresisTestPositive) 21 { 22 // Verifies positive hysteresis works as expected 23 24 ZoneMock z; 25 26 std::vector<std::string> inputs = {"test"}; 27 ec::StepwiseInfo initial; 28 initial.negativeHysteresis = 3.0; 29 initial.positiveHysteresis = 2.0; 30 initial.reading[0] = 20.0; 31 initial.reading[1] = 30.0; 32 initial.reading[2] = std::numeric_limits<double>::quiet_NaN(); 33 initial.output[0] = 40.0; 34 initial.output[1] = 60.0; 35 initial.isCeiling = false; 36 37 std::unique_ptr<Controller> p = 38 StepwiseController::createStepwiseController(&z, "foo", inputs, 39 initial); 40 41 EXPECT_CALL(z, getCachedValue(StrEq("test"))) 42 .Times(3) 43 .WillOnce(Return(29.0)) // return 40 44 .WillOnce(Return(31.0)) // return 40 45 .WillOnce(Return(32.0)); // return 60 46 47 EXPECT_CALL(z, addSetPoint(40.0, "foo")).Times(2); 48 EXPECT_CALL(z, addSetPoint(60.0, "foo")).Times(1); 49 50 for (int ii = 0; ii < 3; ii++) 51 { 52 p->process(); 53 } 54 } 55 56 TEST(StepwiseControllerTest, HysteresisTestNegative) 57 { 58 // Verifies negative hysteresis works as expected 59 60 ZoneMock z; 61 62 std::vector<std::string> inputs = {"test"}; 63 ec::StepwiseInfo initial; 64 initial.negativeHysteresis = 3.0; 65 initial.positiveHysteresis = 2.0; 66 initial.reading[0] = 20.0; 67 initial.reading[1] = 30.0; 68 initial.reading[2] = std::numeric_limits<double>::quiet_NaN(); 69 initial.output[0] = 40.0; 70 initial.output[1] = 60.0; 71 initial.isCeiling = false; 72 73 std::unique_ptr<Controller> p = 74 StepwiseController::createStepwiseController(&z, "foo", inputs, 75 initial); 76 77 EXPECT_CALL(z, getCachedValue(StrEq("test"))) 78 .Times(3) 79 .WillOnce(Return(30.0)) // return 60 80 .WillOnce(Return(27.0)) // return 60 81 .WillOnce(Return(26.0)); // return 40 82 83 EXPECT_CALL(z, addSetPoint(40.0, "foo")).Times(1); 84 EXPECT_CALL(z, addSetPoint(60.0, "foo")).Times(2); 85 86 for (int ii = 0; ii < 3; ii++) 87 { 88 p->process(); 89 } 90 } 91 92 } // namespace 93 } // namespace pid_control 94