5 * th9x - http://code.google.com/p/th9x
6 * er9x - http://code.google.com/p/er9x
7 * gruvin9x - http://code.google.com/p/gruvin9x
9 * License GPLv2: http://www.gnu.org/licenses/gpl-2.0.html
11 * This program is free software; you can redistribute it and/or modify
12 * it under the terms of the GNU General Public License version 2 as
13 * published by the Free Software Foundation.
15 * This program is distributed in the hope that it will be useful,
16 * but WITHOUT ANY WARRANTY; without even the implied warranty of
17 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
18 * GNU General Public License for more details.
23 #define THR_100 128 // approximately 10% full throttle
24 #define THR_50 64 // approximately 10% full throttle
25 #define THR_10 13 // approximately 10% full throttle
27 #define TEST_AB_EQUAL(a, b) if (a != b) { return ::testing::AssertionFailure() << \
28 #a "= " << (uint32_t)a << ", " << #b "= " << (uint32_t)b; };
30 void initModelTimer(uint32_t idx
, uint8_t mode
, int16_t start
= 0)
32 memset(&g_model
.timers
[idx
], 0, sizeof(TimerData
));
33 g_model
.timers
[idx
].mode
= mode
;
34 g_model
.timers
[idx
].start
= start
;
35 g_model
.timers
[idx
].countdownBeep
= COUNTDOWN_SILENT
;
39 Run timers for n seconds and test the end state
41 ::testing::AssertionResult
evalTimersForNSecondsAndTest(unsigned int n
, uint8_t throttle
, uint32_t idx
, uint8_t state
, int value
)
43 unsigned int noLoops
= n
* 100;
45 evalTimers(throttle
, 1);
47 TEST_AB_EQUAL(timersStates
[idx
].state
, state
);
48 TEST_AB_EQUAL(timersStates
[idx
].val
, value
);
49 return ::testing::AssertionSuccess();
52 TEST(Timers
, timerReset
)
54 initModelTimer(0, TMRMODE_THR_REL
, 200);
56 EXPECT_TRUE(evalTimersForNSecondsAndTest(0, THR_100
, 0, TMR_OFF
, 200));
58 initModelTimer(1, TMRMODE_THR_REL
, 0);
60 EXPECT_TRUE(evalTimersForNSecondsAndTest(0, THR_100
, 1, TMR_OFF
, 0));
63 TEST(Timers
, timerSet
)
66 EXPECT_TRUE(evalTimersForNSecondsAndTest(0, THR_100
, 0, TMR_OFF
, 500));
69 EXPECT_TRUE(evalTimersForNSecondsAndTest(0, THR_100
, 1, TMR_OFF
, 300));
72 TEST(Timers
, timerGreaterThan9hours
)
74 initModelTimer(0, TMRMODE_ABS
, 0);
77 EXPECT_TRUE(evalTimersForNSecondsAndTest(24*3600, THR_100
, 0, TMR_RUNNING
, 24*3600));
80 TEST(Timers
, saveRestoreTimers
)
82 g_model
.timers
[0].persistent
= 1;
83 g_model
.timers
[1].persistent
= 1;
87 EXPECT_EQ(g_model
.timers
[0].value
, 500);
88 EXPECT_EQ(g_model
.timers
[1].value
, 1500);
89 EXPECT_TRUE(evalTimersForNSecondsAndTest(0, THR_100
, 0, TMR_OFF
, 500));
90 EXPECT_TRUE(evalTimersForNSecondsAndTest(0, THR_100
, 1, TMR_OFF
, 1500));
95 EXPECT_TRUE(evalTimersForNSecondsAndTest(0, THR_100
, 0, TMR_OFF
, 500));
96 EXPECT_TRUE(evalTimersForNSecondsAndTest(0, THR_100
, 1, TMR_OFF
, 1500));
99 TEST(Timers
, timerOff
)
101 initModelTimer(0, TMRMODE_NONE
, 0);
104 EXPECT_TRUE(evalTimersForNSecondsAndTest(0, THR_100
, 0, TMR_OFF
, 0));
105 EXPECT_TRUE(evalTimersForNSecondsAndTest(10, THR_100
, 0, TMR_OFF
, 0));
108 TEST(Timers
, timerAbsolute
)
110 initModelTimer(0, TMRMODE_ABS
, 0);
113 EXPECT_TRUE(evalTimersForNSecondsAndTest(1, THR_100
, 0, TMR_RUNNING
, 1));
114 EXPECT_TRUE(evalTimersForNSecondsAndTest(100, THR_100
, 0, TMR_RUNNING
, 101));
115 EXPECT_TRUE(evalTimersForNSecondsAndTest(100, 0, 0, TMR_RUNNING
, 201));
117 // max timer value test
118 timerSet(0, TIMER_MAX
-10);
119 EXPECT_TRUE(evalTimersForNSecondsAndTest(1, THR_100
, 0, TMR_RUNNING
, TIMER_MAX
-9));
120 EXPECT_TRUE(evalTimersForNSecondsAndTest(100, THR_100
, 0, TMR_RUNNING
, TIMER_MAX
));
123 g_model
.timers
[0].start
= 200;
125 EXPECT_TRUE(evalTimersForNSecondsAndTest(1, THR_100
, 0, TMR_RUNNING
, 199));
126 EXPECT_TRUE(evalTimersForNSecondsAndTest(100, THR_100
, 0, TMR_RUNNING
, 99));
127 EXPECT_TRUE(evalTimersForNSecondsAndTest(100, THR_100
, 0, TMR_NEGATIVE
, -1));
128 EXPECT_TRUE(evalTimersForNSecondsAndTest(100, THR_100
, 0, TMR_STOPPED
, -101));
132 TEST(Timers
, timerThrottle
)
134 initModelTimer(0, TMRMODE_THR
, 0);
137 EXPECT_TRUE(evalTimersForNSecondsAndTest(1, 0, 0, TMR_RUNNING
, 0));
138 EXPECT_TRUE(evalTimersForNSecondsAndTest(100, THR_100
, 0, TMR_RUNNING
, 100));
139 EXPECT_TRUE(evalTimersForNSecondsAndTest(100, THR_10
, 0, TMR_RUNNING
, 200));
140 EXPECT_TRUE(evalTimersForNSecondsAndTest(100, 0, 0, TMR_RUNNING
, 200));
143 g_model
.timers
[0].start
= 200;
145 EXPECT_TRUE(evalTimersForNSecondsAndTest(1, THR_100
, 0, TMR_RUNNING
, 199));
146 EXPECT_TRUE(evalTimersForNSecondsAndTest(1, 0, 0, TMR_RUNNING
, 199));
147 EXPECT_TRUE(evalTimersForNSecondsAndTest(100, THR_100
, 0, TMR_RUNNING
, 99));
148 EXPECT_TRUE(evalTimersForNSecondsAndTest(100, THR_50
, 0, TMR_NEGATIVE
, -1));
149 EXPECT_TRUE(evalTimersForNSecondsAndTest(100, THR_100
, 0, TMR_STOPPED
,-101));
152 TEST(Timers
, timerThrottleRelative
)
154 initModelTimer(0, TMRMODE_THR_REL
, 0);
157 EXPECT_TRUE(evalTimersForNSecondsAndTest(1, 0, 0, TMR_RUNNING
, 0));
158 EXPECT_TRUE(evalTimersForNSecondsAndTest(100, THR_100
, 0, TMR_RUNNING
, 100));
159 EXPECT_TRUE(evalTimersForNSecondsAndTest(100, THR_50
, 0, TMR_RUNNING
, 150)); // 50% throttle == 50s
160 EXPECT_TRUE(evalTimersForNSecondsAndTest(100, THR_10
, 0, TMR_RUNNING
, 160)); // 10% throttle == 10s
161 EXPECT_TRUE(evalTimersForNSecondsAndTest(100, 0, 0, TMR_RUNNING
, 160));
164 initModelTimer(0, TMRMODE_THR_REL
, 200);
166 EXPECT_TRUE(evalTimersForNSecondsAndTest(1, THR_100
, 0, TMR_RUNNING
, 199));
167 EXPECT_TRUE(evalTimersForNSecondsAndTest(1, 0, 0, TMR_RUNNING
, 199));
168 EXPECT_TRUE(evalTimersForNSecondsAndTest(100, THR_100
, 0, TMR_RUNNING
, 99));
169 EXPECT_TRUE(evalTimersForNSecondsAndTest(200, THR_50
, 0, TMR_NEGATIVE
, -1)); // 50% throttle == 100s
170 EXPECT_TRUE(evalTimersForNSecondsAndTest(100, THR_10
, 0, TMR_NEGATIVE
,-11)); // 10% throttle == 10s
171 EXPECT_TRUE(evalTimersForNSecondsAndTest(100, THR_100
, 0, TMR_STOPPED
,-111));
174 TEST(Timers
, timerThrottleTriggered
)
176 initModelTimer(0, TMRMODE_THR_TRG
, 0);
179 EXPECT_TRUE(evalTimersForNSecondsAndTest(1, 0, 0, TMR_OFF
, 0));
180 EXPECT_TRUE(evalTimersForNSecondsAndTest(100, THR_10
-1, 0, TMR_OFF
, 0)); // below threshold
181 EXPECT_TRUE(evalTimersForNSecondsAndTest(100, THR_50
, 0, TMR_RUNNING
, 100));
182 EXPECT_TRUE(evalTimersForNSecondsAndTest(100, THR_100
, 0, TMR_RUNNING
, 200));
183 EXPECT_TRUE(evalTimersForNSecondsAndTest(100, 0, 0, TMR_RUNNING
, 300));
186 initModelTimer(0, TMRMODE_THR_TRG
, 200);
188 EXPECT_TRUE(evalTimersForNSecondsAndTest(1, 0, 0, TMR_OFF
, 200));
189 EXPECT_TRUE(evalTimersForNSecondsAndTest(100, THR_10
-1, 0, TMR_OFF
, 200)); // below threshold
190 EXPECT_TRUE(evalTimersForNSecondsAndTest(100, THR_100
, 0, TMR_RUNNING
, 100));
191 EXPECT_TRUE(evalTimersForNSecondsAndTest(101, THR_50
, 0, TMR_NEGATIVE
, -1));
192 EXPECT_TRUE(evalTimersForNSecondsAndTest(10, 0, 0, TMR_NEGATIVE
,-11));
193 EXPECT_TRUE(evalTimersForNSecondsAndTest(100, 0, 0, TMR_STOPPED
,-111));