API
 
Loading...
Searching...
No Matches
zaberStage_test.cpp
Go to the documentation of this file.
1/** \file zaberStage_test.cpp
2 * \brief Catch2 tests for the zaberStage in the zaberLowLevel app
3 * \author Jared R. Males (jaredmales@gmail.com)
4 *
5 * \ingroup zaberLowLevel_files
6 */
7
8#include "../../../tests/testXWC.hpp"
9
10#include "../zaberLowLevel.hpp"
11
12extern "C"
13{
14#include "../za_serial.c" //to allow test to compile
15}
16
17using namespace MagAOX::app;
18
19namespace libXWCTest
20{
21
22/** \addtogroup zaberLowLevel_unit_test
23 * \brief Additional unit tests for the zaberLowLevel application.
24 *
25 * \ingroup application_unit_test
26 */
27
28/// Namespace for `zaberLowLevel` unit tests.
29/** \ingroup zaberLowLevel_unit_test
30 */
31namespace zaberLowLevelTest
32{
33
34/// Verify `zaberStage` classifies replies and decodes warning tokens from ASCII responses.
35/**
36 * \ingroup zaberLowLevel_unit_test
37 */
38SCENARIO( "Classifying decoded device messages", "[zaberStage]" )
39{
40 // clang-format off
41 #ifdef ZABERLOWLEVEL_TEST_DOXYGEN_REF
44 #endif
45 // clang-format on
46
47 GIVEN( "A configured stage and decoded ASCII messages" )
48 {
49 zaberLowLevel zll;
50
51 zaberStage<zaberLowLevel> zstg( &zll );
52
53 REQUIRE( zstg.deviceAddress( 1 ) == 0 );
54
55 za_reply rep{};
56 rep.device_address = 1;
57
58 WHEN( "The message is a normal reply for the same device" )
59 {
60 rep.message_type = '@';
61
62 REQUIRE( zstg.isCommandReply( rep ) == true );
63 }
64
65 WHEN( "The message is an alert for the same device" )
66 {
67 rep.message_type = '!';
68
69 REQUIRE( zstg.isCommandReply( rep ) == false );
70 }
71
72 WHEN( "The message is an info message for the same device" )
73 {
74 rep.message_type = '#';
75
76 REQUIRE( zstg.isCommandReply( rep ) == false );
77 }
78
79 WHEN( "The message is a reply for a different device" )
80 {
81 rep.message_type = '@';
82 rep.device_address = 2;
83
84 REQUIRE( zstg.isCommandReply( rep ) == false );
85 }
86 }
87}
88
89SCENARIO( "Parsing the warnings response", "[zaberStage]" )
90{
91 GIVEN( "A valid response to the warnings query" )
92 {
93 int rv;
94
95 WHEN( "Valid response, no warnings" )
96 {
97 zaberLowLevel zll;
98
99 zaberStage<zaberLowLevel> zstg( &zll );
100
101 std::string tstr = "00";
102
103 rv = zstg.parseWarnings( tstr );
104
105 REQUIRE( rv == 0 );
106 REQUIRE( zstg.warningState() == false );
107 REQUIRE( zstg.warnFD() == false );
108 REQUIRE( zstg.warnFQ() == false );
109 REQUIRE( zstg.warnFS() == false );
110 REQUIRE( zstg.warnFT() == false );
111 REQUIRE( zstg.warnFB() == false );
112 REQUIRE( zstg.warnFP() == false );
113 REQUIRE( zstg.warnFE() == false );
114 REQUIRE( zstg.warnWH() == false );
115 REQUIRE( zstg.warnWL() == false );
116 REQUIRE( zstg.warnWP() == false );
117 REQUIRE( zstg.warnWV() == false );
118 REQUIRE( zstg.warnWT() == false );
119 REQUIRE( zstg.warnWM() == false );
120 REQUIRE( zstg.warnWR() == false );
121 REQUIRE( zstg.warnNC() == false );
122 REQUIRE( zstg.warnNI() == false );
123 REQUIRE( zstg.warnND() == false );
124 REQUIRE( zstg.warnNU() == false );
125 REQUIRE( zstg.warnNJ() == false );
126 REQUIRE( zstg.warnUNK() == false );
127 }
128
129 WHEN( "Valid response, one warning" )
130 {
131 zaberLowLevel zll;
132
133 zaberStage<zaberLowLevel> zstg( &zll );
134
135 std::string tstr = "01 WR";
136
137 rv = zstg.parseWarnings( tstr );
138
139 REQUIRE( rv == 0 );
140 REQUIRE( zstg.warningState() == true );
141 REQUIRE( zstg.warnFD() == false );
142 REQUIRE( zstg.warnFQ() == false );
143 REQUIRE( zstg.warnFS() == false );
144 REQUIRE( zstg.warnFT() == false );
145 REQUIRE( zstg.warnFB() == false );
146 REQUIRE( zstg.warnFP() == false );
147 REQUIRE( zstg.warnFE() == false );
148 REQUIRE( zstg.warnWH() == false );
149 REQUIRE( zstg.warnWL() == false );
150 REQUIRE( zstg.warnWP() == false );
151 REQUIRE( zstg.warnWV() == false );
152 REQUIRE( zstg.warnWT() == false );
153 REQUIRE( zstg.warnWM() == false );
154 REQUIRE( zstg.warnWR() == true );
155 REQUIRE( zstg.warnNC() == false );
156 REQUIRE( zstg.warnNI() == false );
157 REQUIRE( zstg.warnND() == false );
158 REQUIRE( zstg.warnNU() == false );
159 REQUIRE( zstg.warnNJ() == false );
160 REQUIRE( zstg.warnUNK() == false );
161 }
162
163 WHEN( "Valid response, five warnings" )
164 {
165 zaberLowLevel zll;
166
167 zaberStage<zaberLowLevel> zstg( &zll );
168
169 std::string tstr = "05 FD FQ FS FT FB";
170
171 rv = zstg.parseWarnings( tstr );
172
173 REQUIRE( rv == 0 );
174 REQUIRE( zstg.warningState() == true );
175 REQUIRE( zstg.warnFD() == true );
176 REQUIRE( zstg.warnFQ() == true );
177 REQUIRE( zstg.warnFS() == true );
178 REQUIRE( zstg.warnFT() == true );
179 REQUIRE( zstg.warnFB() == true );
180 REQUIRE( zstg.warnFP() == false );
181 REQUIRE( zstg.warnFE() == false );
182 REQUIRE( zstg.warnWH() == false );
183 REQUIRE( zstg.warnWL() == false );
184 REQUIRE( zstg.warnWP() == false );
185 REQUIRE( zstg.warnWV() == false );
186 REQUIRE( zstg.warnWT() == false );
187 REQUIRE( zstg.warnWM() == false );
188 REQUIRE( zstg.warnWR() == false );
189 REQUIRE( zstg.warnNC() == false );
190 REQUIRE( zstg.warnNI() == false );
191 REQUIRE( zstg.warnND() == false );
192 REQUIRE( zstg.warnNU() == false );
193 REQUIRE( zstg.warnNJ() == false );
194 REQUIRE( zstg.warnUNK() == false );
195 }
196
197 WHEN( "Valid response, ten warnings" )
198 {
199 zaberLowLevel zll;
200
201 zaberStage<zaberLowLevel> zstg( &zll );
202
203 std::string tstr = "10 FP FE WH WL WP WV WT WM WR NC";
204
205 rv = zstg.parseWarnings( tstr );
206
207 REQUIRE( rv == 0 );
208 REQUIRE( zstg.warningState() == true );
209 REQUIRE( zstg.warnFD() == false );
210 REQUIRE( zstg.warnFQ() == false );
211 REQUIRE( zstg.warnFS() == false );
212 REQUIRE( zstg.warnFT() == false );
213 REQUIRE( zstg.warnFB() == false );
214 REQUIRE( zstg.warnFP() == true );
215 REQUIRE( zstg.warnFE() == true );
216 REQUIRE( zstg.warnWH() == true );
217 REQUIRE( zstg.warnWL() == true );
218 REQUIRE( zstg.warnWP() == true );
219 REQUIRE( zstg.warnWV() == true );
220 REQUIRE( zstg.warnWT() == true );
221 REQUIRE( zstg.warnWM() == true );
222 REQUIRE( zstg.warnWR() == true );
223 REQUIRE( zstg.warnNC() == true );
224 REQUIRE( zstg.warnNI() == false );
225 REQUIRE( zstg.warnND() == false );
226 REQUIRE( zstg.warnNU() == false );
227 REQUIRE( zstg.warnNJ() == false );
228 REQUIRE( zstg.warnUNK() == false );
229 }
230 WHEN( "Valid response, 2 warnings" )
231 {
232 zaberLowLevel zll;
233
234 zaberStage<zaberLowLevel> zstg( &zll );
235
236 std::string tstr = "02 NI ND";
237
238 rv = zstg.parseWarnings( tstr );
239
240 REQUIRE( rv == 0 );
241 REQUIRE( zstg.warningState() == true );
242 REQUIRE( zstg.warnFD() == false );
243 REQUIRE( zstg.warnFQ() == false );
244 REQUIRE( zstg.warnFS() == false );
245 REQUIRE( zstg.warnFT() == false );
246 REQUIRE( zstg.warnFB() == false );
247 REQUIRE( zstg.warnFP() == false );
248 REQUIRE( zstg.warnFE() == false );
249 REQUIRE( zstg.warnWH() == false );
250 REQUIRE( zstg.warnWL() == false );
251 REQUIRE( zstg.warnWP() == false );
252 REQUIRE( zstg.warnWV() == false );
253 REQUIRE( zstg.warnWT() == false );
254 REQUIRE( zstg.warnWM() == false );
255 REQUIRE( zstg.warnWR() == false );
256 REQUIRE( zstg.warnNC() == false );
257 REQUIRE( zstg.warnNI() == true );
258 REQUIRE( zstg.warnND() == true );
259 REQUIRE( zstg.warnNU() == false );
260 REQUIRE( zstg.warnNJ() == false );
261 REQUIRE( zstg.warnUNK() == false );
262 }
263 WHEN( "Valid response, 3 warnings" )
264 {
265 zaberLowLevel zll;
266
267 zaberStage<zaberLowLevel> zstg( &zll );
268
269 std::string tstr = "03 NU NJ UN";
270
271 rv = zstg.parseWarnings( tstr );
272
273 REQUIRE( rv == 0 );
274 REQUIRE( zstg.warningState() == true );
275 REQUIRE( zstg.warnFD() == false );
276 REQUIRE( zstg.warnFQ() == false );
277 REQUIRE( zstg.warnFS() == false );
278 REQUIRE( zstg.warnFT() == false );
279 REQUIRE( zstg.warnFB() == false );
280 REQUIRE( zstg.warnFP() == false );
281 REQUIRE( zstg.warnFE() == false );
282 REQUIRE( zstg.warnWH() == false );
283 REQUIRE( zstg.warnWL() == false );
284 REQUIRE( zstg.warnWP() == false );
285 REQUIRE( zstg.warnWV() == false );
286 REQUIRE( zstg.warnWT() == false );
287 REQUIRE( zstg.warnWM() == false );
288 REQUIRE( zstg.warnWR() == false );
289 REQUIRE( zstg.warnNC() == false );
290 REQUIRE( zstg.warnNI() == false );
291 REQUIRE( zstg.warnND() == false );
292 REQUIRE( zstg.warnNU() == true );
293 REQUIRE( zstg.warnNJ() == true );
294 REQUIRE( zstg.warnUNK() == true );
295 }
296
297 WHEN( "Truncated response ends before the first warning token" )
298 {
299 zaberLowLevel zll;
300
301 zaberStage<zaberLowLevel> zstg( &zll );
302
303 std::string tstr = "01 ";
304
305 rv = zstg.parseWarnings( tstr );
306
307 REQUIRE( rv < 0 );
308 REQUIRE( zstg.warnUNK() == false );
309 }
310
311 WHEN( "Truncated response ends inside a later warning token" )
312 {
313 zaberLowLevel zll;
314
315 zaberStage<zaberLowLevel> zstg( &zll );
316
317 std::string tstr = "06 6";
318
319 rv = zstg.parseWarnings( tstr );
320
321 REQUIRE( rv < 0 );
322 REQUIRE( zstg.warnUNK() == false );
323 }
324 }
325}
326
327} // namespace zaberLowLevelTest
328
329} // namespace libXWCTest
The low-level ASCII-protocol Zaber controller.
A class to manage the details of one stage in a Zaber system.
bool isCommandReply(const za_reply &rep)
Determine whether a decoded message is the awaited command reply.
int parseWarnings(std::string &response)
Parse the warning response from the device.
int deviceAddress()
Get the device address.
bool warningState()
Get the warning state.
SCENARIO("INDI Callbacks", "[zaberLowLevel]")
Verify zaberLowLevel callback validation and power-off snapshots preserve stage state.
Namespace for all libXWC tests.
int device_address
Definition za_serial.h:37