Coverage for test_interlocking_examples.py: 99%
508 statements
« prev ^ index » next coverage.py v7.2.7, created at 2024-02-10 12:38 +0000
« prev ^ index » next coverage.py v7.2.7, created at 2024-02-10 12:38 +0000
1#-----------------------------------------------------------------------------------
2# Basic interlocking and route setting system tests
3#
4# When run as 'main' it uses the following example schematic files:
5# "../configuration_examples/interlocking_colour_light_example.sig"
6# "../configuration_examples/interlocking_semaphore_example.sig"
7#
8# common functions are also reused for the automation and approach control tests
9#-----------------------------------------------------------------------------------
11from system_test_harness import *
12import test_object_edit_windows
14#-----------------------------------------------------------------------------------
16def run_initial_state_tests(semaphore=False):
17 print("Colour Light Initial state tests")
18 # Signal 14 has no valid route available
19 assert_signals_route_MAIN(1,3,4,5,6,7,8,9,10,11,12,13,15,16,17,18,19)
20 assert_signals_route_LH1(2)
21 assert_signals_DANGER(1,2,3,4,5,6,7,8,10,11,12,13,14,15,17,19)
22 assert_signals_CAUTION(9,18)
23 # Differences are due to semaphore associated signals
24 if semaphore:
25 assert_signals_DANGER(16)
26 assert_signals_locked(116)
27 assert_signals_unlocked(16)
28 else:
29 assert_signals_CAUTION(16)
30 assert_signals_locked(16)
31 assert_points_unlocked(2,3,5)
32 assert_signals_unlocked(1,3,4,5,6,7,8,10,11,12,13,15,17,19)
33 assert_subsidaries_unlocked(1,2,3)
34 assert_signals_locked(2,14)
35 # distant signals 9,16 and 18 are locked on the home signals ahead
36 assert_signals_locked(9,18)
37 return()
39#-----------------------------------------------------------------------------------
41def run_signal_route_tests():
42 print("Common Signal Route tests")
43 # Test the default route states
44 # There is no route for signal 14 in the 'default' state
45 assert_signals_route_MAIN(1,5,6,7,13)
46 assert_signals_route_LH1(2)
47 # Signals 1 and 6
48 set_fpls_off(2)
49 set_points_switched(2)
50 set_fpls_on(2)
51 assert_signals_route_LH1(1,6)
52 set_fpls_off(2)
53 set_points_normal(2)
54 set_fpls_on(2)
55 assert_signals_route_MAIN(1,6)
56 # Signal 2, Signal 13 and Signal 14
57 # Note that for Signal 2, MAIN is for the main line and LH1 is the siding
58 # Note that for Signal 14, MAIN is for the crossover (no route back along main line)
59 assert_signals_route_LH1(2)
60 assert_signals_route_MAIN(13)
61 # There is "no route" for signal 14
62 set_fpls_off(3)
63 set_points_switched(3)
64 set_fpls_on(3)
65 assert_signals_route_MAIN(2)
66 assert_signals_route_RH1(13)
67 # There is "no route" for signal 14
68 set_points_switched(5)
69 assert_signals_route_LH1(13)
70 assert_signals_route_MAIN(14)
71 set_points_normal(5)
72 assert_signals_route_MAIN(2)
73 assert_signals_route_RH1(13)
74 # There is "no route" for signal 14
75 set_fpls_off(3)
76 set_points_normal(3)
77 set_fpls_on(3)
78 # Test everything has returned to the default state
79 # There is "no route" for signal 14
80 assert_signals_route_MAIN(1,5,6,7,13)
81 assert_signals_route_LH1(2)
82 return()
84#-----------------------------------------------------------------------------------
86def run_signal_aspect_tests(semaphore=False):
87 print("Signal Aspect tests")
88 # The main route tests are different because of associated distants
89 # Set the home signals 'off' first, followed by the distant signals
90 if semaphore:
91 # Test the default state
92 assert_signals_DANGER(17,16,8,1,2,3,4)
93 # Main Route 1
94 set_signals_off(17,16)
95 assert_signals_PROCEED(17)
96 assert_signals_CAUTION(16)
97 set_signals_off(8,1,3,4,116)
98 assert_signals_PROCEED(8,1,3,4,16)
99 set_signals_on(16,17,8,1,3,4,116)
100 # Main Route 2 - loop
101 set_fpls_off(2,3)
102 set_points_switched(2,3)
103 set_fpls_on(2,3)
104 set_signals_off(17,16)
105 assert_signals_PROCEED(17)
106 assert_signals_CAUTION(16)
107 set_signals_off(8,1,2,4,116)
108 assert_signals_PROCEED(8,1,2,4,16)
109 set_signals_on(16,17,8,1,2,4,116)
110 set_fpls_off(2,3)
111 set_points_normal(2,3)
112 set_fpls_on(2,3)
113 # Test everything has returned to the default state
114 assert_signals_DANGER(17,16,8,1,2,3,4)
115 else:
116 # Test the default state
117 assert_signals_DANGER(17,8,1,2,3,4)
118 assert_signals_CAUTION(16)
119 # Main Route 1 - block 1
120 set_signals_off(8,1,3,4,16,17)
121 assert_signals_PROCEED(8,1,3,4,16,17)
122 set_signals_on(8,1,3,4,16,17)
123 # Main Route 2 - loop
124 set_fpls_off(2,3)
125 set_points_switched(2,3)
126 set_fpls_on(2,3)
127 set_signals_off(8,1,2,4,16,17)
128 assert_signals_PROCEED(8,1,2,4,16,17)
129 set_signals_on(8,1,2,4,16,17)
130 set_fpls_off(2,3)
131 set_points_normal(2,3)
132 set_fpls_on(2,3)
133 # Test everything has returned to the default state
134 assert_signals_DANGER(17,8,1,2,3,4)
135 assert_signals_CAUTION(16)
136 # Main Route 2
137 # Test the default state
138 assert_signals_DANGER(12,10,19,11)
139 assert_signals_CAUTION(9,18)
140 # Set the home signals 'off' first, followed by the distant signals
141 set_signals_off(11,19,18,10,12,9)
142 assert_signals_PROCEED(11,19,18,10,12,9)
143 set_signals_on(11,19,18,10,12,9)
144 # Test everything has returned to the default state
145 assert_signals_DANGER(12,10,19,11)
146 assert_signals_CAUTION(9,18)
147 return()
149#-----------------------------------------------------------------------------------
151def run_point_interlocking_tests():
152 print("Common Point Interlocking Tests")
153 # Test the default state
154 assert_points_unlocked(2,3,5)
155 assert_signals_unlocked(1,3,5,6,7,12,13,15)
156 assert_signals_locked(2,14)
157 assert_subsidaries_unlocked(1,2,3)
158 # Point 2 - Test interlocking when normal
159 set_fpls_off(2)
160 assert_signals_locked(1,5,6,15)
161 assert_subsidaries_locked(1)
162 set_fpls_on(2)
163 assert_signals_unlocked(1,5,6,15)
164 assert_subsidaries_unlocked(1)
165 # Point 2 - Test interlocking when switched
166 set_fpls_off(2)
167 set_points_switched(2)
168 set_fpls_on(2)
169 assert_signals_unlocked(1,6)
170 assert_signals_locked(5,15)
171 assert_subsidaries_unlocked(1)
172 # Point 2 - Test interlocking when returned to normal
173 set_fpls_off(2)
174 assert_signals_locked(1,5,6,15)
175 assert_subsidaries_locked(1)
176 set_points_normal(2)
177 set_fpls_on(2)
178 assert_signals_unlocked(1,5,6,15)
179 assert_subsidaries_unlocked(1)
180 # Point 3 - Test interlocking when normal
181 assert_signals_unlocked(3,7,13)
182 assert_subsidaries_unlocked(2,3)
183 assert_signals_locked(2)
184 set_fpls_off(3)
185 assert_signals_locked(2,3,7,13)
186 assert_subsidaries_locked(2,3)
187 set_fpls_on(3)
188 assert_signals_unlocked(3,7,13)
189 assert_subsidaries_unlocked(2,3)
190 assert_signals_locked(2)
191 # Test effect of Point 5 (different signals interlocked)
192 assert_signals_locked(14)
193 assert_signals_unlocked(12,3,13)
194 assert_subsidaries_unlocked(3)
195 set_points_switched(5)
196 assert_signals_locked(3,12)
197 assert_signals_unlocked(13,14)
198 assert_subsidaries_locked(3)
199 set_points_normal(5)
200 assert_signals_locked(14)
201 assert_signals_unlocked(12,3,13)
202 assert_subsidaries_unlocked(3)
203 # Point 3 - Test interlocking when switched
204 set_fpls_off(3)
205 set_points_switched(3)
206 set_fpls_on(3)
207 assert_signals_unlocked(2,13)
208 assert_signals_locked(3,7)
209 assert_subsidaries_unlocked(2)
210 assert_subsidaries_locked(3)
211 # Test effect of Point 5 (different signals interlocked)
212 assert_signals_locked(14)
213 assert_signals_unlocked(12,2,13)
214 assert_subsidaries_unlocked(2)
215 set_points_switched(5)
216 assert_signals_locked(2,12)
217 assert_signals_unlocked(13,14)
218 assert_subsidaries_locked(2)
219 set_points_normal(5)
220 assert_signals_locked(14)
221 assert_signals_unlocked(12,2,13)
222 assert_subsidaries_unlocked(2)
223 # Point 2 - Test interlocking when returned to normal
224 set_fpls_off(3)
225 assert_signals_locked(2,3,7,13)
226 assert_subsidaries_locked(2,3)
227 set_points_normal(3)
228 set_fpls_on(3)
229 assert_signals_unlocked(3,7,13)
230 assert_signals_locked(2)
231 assert_subsidaries_unlocked(2,3)
232 # Point 3 - Test interlocking when normal
233 assert_signals_unlocked(3,13,12)
234 assert_signals_locked(14)
235 assert_subsidaries_unlocked(3)
236 # Point 3 - Test interlocking when switched
237 set_points_switched(5)
238 assert_signals_unlocked(13,14)
239 assert_signals_locked(3,12)
240 assert_subsidaries_locked(3)
241 # Point 2 - Test interlocking when returned to normal
242 set_points_normal(5)
243 # Test everything has been returned to the default state
244 assert_points_unlocked(2,3,5)
245 assert_signals_unlocked(1,3,5,6,7,12,13,15)
246 assert_signals_locked(2,14)
247 assert_subsidaries_unlocked(1,2,3)
248 return()
250#-----------------------------------------------------------------------------------
252def run_signal_interlocking_tests():
253 print("Common Signal Interlocking Tests")
254 # Test the default state
255 assert_points_unlocked(2,3,5)
256 assert_signals_unlocked(1,3,5,6,7,12,13,15)
257 assert_signals_locked(2,14)
258 assert_subsidaries_unlocked(1,2,3)
259 # Test signal 8 interlocking
260 set_signals_off(8)
261 assert_signals_locked(15)
262 set_signals_on(8)
263 assert_signals_unlocked(15)
264 # Test effect of point 2 (different signals interlocked)
265 set_fpls_off(2)
266 set_points_switched(2)
267 set_fpls_on(2)
268 set_signals_off(8)
269 assert_signals_locked(6)
270 set_signals_on(8)
271 assert_signals_unlocked(6)
272 # Return point 2 to normal
273 set_fpls_off(2)
274 set_points_normal(2)
275 set_fpls_on(2)
276 # Test signal 1 interlocking - main line
277 set_signals_off(1)
278 assert_signals_locked(13,15)
279 assert_subsidaries_locked(1)
280 assert_points_locked(2)
281 set_signals_on(1)
282 assert_signals_unlocked(13,15)
283 assert_subsidaries_unlocked(1)
284 assert_points_unlocked(1)
285 set_subsidaries_off(1)
286 assert_signals_locked(1,13,15)
287 assert_points_locked(2)
288 set_subsidaries_on(1)
289 assert_signals_unlocked(1,13,15)
290 assert_points_unlocked(1)
291 # Test signals 1 interlocking on loop line
292 set_fpls_off(2)
293 set_points_switched(2)
294 set_fpls_on(2)
295 set_signals_off(1)
296 assert_signals_locked(6,7)
297 assert_points_locked(2)
298 set_signals_on(1)
299 set_subsidaries_off(1)
300 assert_signals_locked(6,7)
301 assert_points_locked(2)
302 set_subsidaries_on(1)
303 assert_signals_unlocked(6,7)
304 assert_points_unlocked(1)
305 # Test effect of point 3 (different interlocked signals)
306 set_fpls_off(3)
307 set_points_switched(3)
308 set_fpls_on(3)
309 set_signals_off(1)
310 assert_signals_locked(6,13)
311 set_signals_on(1)
312 assert_signals_unlocked(6,13)
313 set_subsidaries_off(1)
314 assert_signals_locked(6,13)
315 set_subsidaries_on(1)
316 assert_signals_unlocked(6,13)
317 assert_points_unlocked(1)
318 # Set Points 2 and 3 back to their default states
319 set_fpls_off(3)
320 set_points_normal(3)
321 set_fpls_on(3)
322 set_fpls_off(2)
323 set_points_normal(2)
324 set_fpls_on(2)
325 # Test signal 15 interlocking
326 set_signals_off(15)
327 assert_signals_locked(1,8)
328 assert_subsidaries_locked(1)
329 assert_points_locked(2)
330 set_signals_on(15)
331 assert_signals_unlocked(1,8)
332 assert_subsidaries_unlocked(1)
333 assert_points_unlocked(2)
334 # Test Signal 3 interlocking
335 set_signals_off(3)
336 assert_signals_locked(13)
337 assert_subsidaries_locked(3)
338 assert_points_locked(3,5)
339 set_signals_on(3)
340 assert_signals_unlocked(13)
341 assert_subsidaries_unlocked(3)
342 assert_points_unlocked(2)
343 set_subsidaries_off(3)
344 assert_signals_locked(13,3)
345 assert_points_locked(3,5)
346 set_subsidaries_on(3)
347 assert_signals_unlocked(13,3)
348 assert_points_unlocked(3,5)
349 # Test Signal 13 interlocking for MAIN route
350 set_signals_off(13)
351 assert_signals_locked(1,3)
352 assert_subsidaries_locked(1,3)
353 assert_points_locked(3,5)
354 set_signals_on(13)
355 assert_signals_unlocked(1,3)
356 assert_subsidaries_unlocked(1,3)
357 assert_points_unlocked(3,5)
358 # Test Signal 13 interlocking for LH1 route
359 set_points_switched(5)
360 set_signals_off(13)
361 assert_signals_locked(14)
362 assert_points_locked(5)
363 set_signals_on(13)
364 assert_signals_unlocked(14)
365 assert_points_unlocked(5)
366 set_points_normal(5)
367 # Test Signal 13 interlocking for RH1 route
368 set_fpls_off(3)
369 set_points_switched(3)
370 set_fpls_on(3)
371 set_signals_off(13)
372 assert_signals_locked(2,5)
373 assert_subsidaries_locked(2)
374 assert_points_locked(3,5)
375 set_signals_on(13)
376 assert_signals_unlocked(2,5)
377 assert_subsidaries_unlocked(2)
378 assert_points_unlocked(3,5)
379 # Test effect of point 2 (different interlocked signals)
380 set_fpls_off(2)
381 set_points_switched(2)
382 set_fpls_on(2)
383 set_signals_off(13)
384 assert_signals_locked(2,1)
385 assert_subsidaries_locked(2,1)
386 assert_points_locked(3,5)
387 set_signals_on(13)
388 assert_signals_unlocked(2,1)
389 assert_subsidaries_unlocked(2,1)
390 assert_points_unlocked(3,5)
391 # Set Points 2 and 3 back to their default states
392 set_fpls_off(3)
393 set_points_normal(3)
394 set_fpls_on(3)
395 set_fpls_off(2)
396 set_points_normal(2)
397 set_fpls_on(2)
398 # Test Signal 5 interlocking
399 set_signals_off(5)
400 assert_signals_locked(6,7)
401 assert_points_locked(2)
402 set_signals_on(5)
403 assert_signals_unlocked(6,7)
404 assert_points_unlocked(2)
405 # Test effect of point 3 (different interlocked signals)
406 set_fpls_off(3)
407 set_points_switched(3)
408 set_fpls_on(3)
409 set_signals_off(5)
410 assert_signals_locked(6,13)
411 assert_points_locked(2)
412 set_signals_on(5)
413 assert_signals_unlocked(6,13)
414 assert_points_unlocked(2)
415 # Set Point 3 back to its default state
416 set_fpls_off(3)
417 set_points_normal(3)
418 set_fpls_on(3)
419 # Test Signal 6 interlocking
420 set_signals_off(6)
421 assert_signals_locked(5)
422 assert_points_locked(2)
423 set_signals_on(6)
424 assert_signals_unlocked(5)
425 assert_points_unlocked(2)
426 # Test effect of point 2 (different interlocked signals)
427 set_fpls_off(2)
428 set_points_switched(2)
429 set_fpls_on(2)
430 set_signals_off(6)
431 assert_signals_locked(1,8)
432 assert_subsidaries_locked(1)
433 assert_points_locked(2)
434 set_signals_on(6)
435 assert_signals_unlocked(1,8)
436 assert_subsidaries_unlocked(1)
437 assert_points_unlocked(2)
438 # Set Point 2 back to its default state
439 set_fpls_off(2)
440 set_points_normal(2)
441 set_fpls_on(2)
442 # Test signal 7 interlocking
443 # Note that signal 2 is always locked when point 3 is normal
444 set_signals_off(7)
445 assert_signals_locked(2,5)
446 assert_subsidaries_locked(2)
447 assert_points_locked(3)
448 set_signals_on(7)
449 assert_signals_locked(2)
450 assert_signals_unlocked(5)
451 assert_subsidaries_unlocked(1)
452 assert_points_unlocked(3)
453 # Test effect of point 2 (different interlocked signals)
454 # Note that signal 2 should always be locked unless route is set for MAIN
455 set_fpls_off(2)
456 set_points_switched(2)
457 set_fpls_on(2)
458 set_signals_off(7)
459 assert_signals_locked(2,1)
460 assert_subsidaries_locked(2,1)
461 assert_points_locked(3)
462 set_signals_on(7)
463 assert_signals_locked(2)
464 assert_signals_unlocked(1)
465 assert_subsidaries_unlocked(2,1)
466 assert_points_unlocked(3)
467 # Set Point 2 back to its default state
468 set_fpls_off(2)
469 set_points_normal(2)
470 set_fpls_on(2)
471 # Test Signal 2 interlocking
472 # Note that main signal is only for the MAIN route (not the siding)
473 assert_signals_locked(2)
474 set_subsidaries_off(2)
475 assert_signals_locked(7)
476 assert_points_locked(3)
477 set_subsidaries_on(2)
478 assert_signals_unlocked(7)
479 assert_points_unlocked(3)
480 # Test Signal 2 interlocking for LH1 route
481 set_fpls_off(3)
482 set_points_switched(3)
483 set_fpls_on(3)
484 set_signals_off(2)
485 assert_signals_locked(13)
486 assert_points_locked(3)
487 set_signals_on(2)
488 assert_signals_unlocked(13)
489 assert_points_unlocked(3)
490 set_subsidaries_off(2)
491 assert_signals_locked(13)
492 assert_points_locked(3)
493 set_subsidaries_on(2)
494 assert_signals_unlocked(13)
495 assert_points_unlocked(3)
496 # Set Point 3 back to its default state
497 set_fpls_off(3)
498 set_points_normal(3)
499 set_fpls_on(3)
500 # Test Signal 12 interlocking
501 # Note that signal 14 should always be locked for this test
502 set_signals_off(12)
503 assert_signals_locked(14)
504 assert_points_locked(5)
505 set_signals_on(12)
506 assert_signals_locked(14)
507 assert_points_unlocked(5)
508 # Test Signal 14 interlocking
509 # Note this can only be cleared for the crossover
510 assert_signals_locked(14)
511 set_points_switched(5)
512 set_signals_off(14)
513 assert_signals_locked(13)
514 assert_points_locked(5)
515 set_signals_on(14)
516 assert_signals_unlocked(13)
517 assert_points_unlocked(5)
518 set_points_normal(5)
519 # Test everything has been returned to the default state
520 assert_points_unlocked(2,3,5)
521 assert_signals_unlocked(1,3,5,6,7,12,13,15)
522 assert_signals_locked(2,14)
523 assert_subsidaries_unlocked(1,2,3)
524 return()
526#-----------------------------------------------------------------------------------
528def run_signal_interlock_ahead_tests(semaphore=False):
529 print("Signal Interlock on signals ahead Tests")
530 if semaphore: sig_id = 116
531 else: sig_id = 16
532 # Test the default state
533 assert_signals_locked(9,18,sig_id)
534 # Main line 1
535 assert_signals_locked(sig_id)
536 set_signals_off(8)
537 assert_signals_locked(sig_id)
538 set_signals_off(1)
539 assert_signals_locked(sig_id)
540 set_signals_off(3)
541 assert_signals_locked(sig_id)
542 set_signals_off(4)
543 assert_signals_unlocked(sig_id)
544 set_signals_off(sig_id)
545 set_signals_on(8,1,3,4)
546 assert_signals_unlocked(sig_id)
547 set_signals_on(sig_id)
548 assert_signals_locked(sig_id)
549 # Main Line Loop
550 set_fpls_off(2,3)
551 set_points_switched(2,3)
552 set_fpls_on(2,3)
553 assert_signals_locked(sig_id)
554 set_signals_off(8)
555 assert_signals_locked(sig_id)
556 set_signals_off(1)
557 assert_signals_locked(sig_id)
558 set_signals_off(2)
559 assert_signals_locked(sig_id)
560 set_signals_off(4)
561 assert_signals_unlocked(sig_id)
562 set_signals_off(sig_id)
563 set_signals_on(8,1,2,4)
564 assert_signals_unlocked(sig_id)
565 set_signals_on(sig_id)
566 assert_signals_locked()
567 set_fpls_off(2,3)
568 set_points_normal(2,3)
569 set_fpls_on(2,3)
570 # Main Line 2 - first section
571 assert_signals_locked(9)
572 set_signals_off(10)
573 assert_signals_locked(9)
574 set_signals_off(12)
575 assert_signals_unlocked(9)
576 set_signals_off(9)
577 set_signals_on(12,10)
578 assert_signals_unlocked(9)
579 set_signals_on(9)
580 assert_signals_locked(9)
581 # Main Line 2 - second section
582 assert_signals_locked(18)
583 set_signals_off(19)
584 assert_signals_locked(18)
585 set_signals_off(11)
586 assert_signals_unlocked(18)
587 set_signals_off(18)
588 set_signals_on(19,11)
589 assert_signals_unlocked(18)
590 set_signals_on(18)
591 assert_signals_locked(18)
592 # Test the default state
593 assert_signals_locked(9,18,sig_id)
594 return()
596######################################################################################################
598def run_all_interlocking_example_tests(delay:float=0.0, shutdown:bool=False):
599 initialise_test_harness(filename="../configuration_examples/interlocking_colour_light_example.sig")
600 # Edit/save all schematic objects to give confidence that editing doesn't break the layout configuration
601 set_edit_mode()
602 test_object_edit_windows.test_all_object_edit_windows(delay)
603 set_run_mode()
604 reset_layout()
605 run_initial_state_tests()
606 run_signal_route_tests()
607 run_signal_aspect_tests()
608 run_point_interlocking_tests()
609 run_signal_interlocking_tests()
610 run_signal_interlock_ahead_tests()
611 initialise_test_harness(filename="../configuration_examples/interlocking_semaphore_example.sig")
612 # Edit/save all schematic objects to give confidence that editing doesn't break the layout configuration
613 set_edit_mode()
614 test_object_edit_windows.test_all_object_edit_windows(delay)
615 set_run_mode()
616 reset_layout()
617 run_initial_state_tests(semaphore=True)
618 run_signal_route_tests()
619 run_signal_aspect_tests(semaphore=True)
620 run_point_interlocking_tests()
621 run_signal_interlocking_tests()
622 run_signal_interlock_ahead_tests(semaphore=True)
623 if shutdown: report_results()
625if __name__ == "__main__": 625 ↛ 626line 625 didn't jump to line 626, because the condition on line 625 was never true
626 start_application(lambda:run_all_interlocking_example_tests(delay=0.0, shutdown=True))
628######################################################################################################