Sequoia
Loading...
Searching...
No Matches
DynamicUndirectedEmbeddedGraphTestingUtilities.hpp
Go to the documentation of this file.
1
2// Copyright Oliver J. Rosten 2023. //
3// Distributed under the GNU GENERAL PUBLIC LICENSE, Version 3.0. //
4// (See accompanying file LICENSE.md or copy at //
5// https://www.gnu.org/licenses/gpl-3.0.en.html) //
7
8#pragma once
9
13
16
17namespace sequoia::testing
18{
19 namespace undirected_embedded_graph
20 {
22 enum graph_description : std::size_t {
23 empty = 0,
24
25 // x
26 node,
27
28 // /-\
29 // \ /
30 // x
31 node_0,
32
33 // /-\ /-\
34 // \ / \ /
35 // x
36 node_0_0,
37
38 // /-\/-\
39 // / /\ \
40 // \ / \ /
41 // x
42 node_0_0_interleaved,
43
44 // /-\/-\
45 // / /\ \
46 // \ / \ /
47 // x
48 // / \
49 // \-/
50 //
51 node_0_0_0_interleaved,
52
53 // x x
54 node_node,
55
56 // x ---- x
57 node_1_node_0,
58
59 // /-\
60 // \ /
61 // x ---- x
62 node_0_1_node_0,
63
64 // /-\
65 // \ /
66 // x x
67 node_0_node,
68
69 // /-\
70 // \ /
71 // x x
72 node_node_1,
73
74 // /-\/-\
75 // / /\ \
76 // \ / \ /
77 // x x
78 node_node_1_1_interleaved,
79
80 // /-\/-\
81 // / /\ \
82 // \ / \ /
83 // x x
84 // / \
85 // \-/
86 //
87 node_node_1_1_1_interleaved,
88
89 // /-\/-\
90 // / /\ \
91 // \ / \ /
92 // x ---- x
93 // / \
94 // \-/
95 //
96 node_1_node_1_1_1_0_interleaved,
97
98 // /-\/-\
99 // / /\ \
100 // \ / \ /
101 // -- x ---- x-----
102 // / \
103 // \-/
104 //
105 node_1_1_node_1_0_1_0_1_interleaved,
106
107 // x ==== x
108 node_1_1_node_0_0,
109
110 // x ---- x
111 // ----
112 node_1pos1_1pos0_node_0pos1_0pos0,
113
114 // x x x
115 node_node_node,
116
117 // x ---- x x
118 node_1_node_0_node,
119
120 // x x ---- x
121 node_node_2_node_1,
122
123 // x ---- x ---- x
124 node_1_node_0_2_node_1,
125
126 // -- x ---- x ---- x --
127 node_1_node_0_2_node_1_0,
128
129 // /-\
130 // \ /
131 // x x x
132 node_node_1_node,
133
134 // /-\
135 // \ /
136 // x ---- x x
137 node_1_node_0_1_node,
138
139
140 // /-\
141 // \ /
142 // x ---- x x
143 // ----
144 node_1_node_1_0_node,
145
146 // /-\
147 // \ /
148 // x ---- x ---- x
149 // ----
150 node_1_node_1_0_2_node_1,
151
152 // /-\
153 // \ /
154 // x ---- x ---- x
155 node_1_node_0_1_2_node_1,
156
157 // /-\
158 // \ /
159 // -- x x x --
160 node_2_node_node_0_2,
161
162 // [2]
163 // x
164 // // \
165 // // \
166 // // \
167 // x ==== x
168 // [0] [1]
169 node_1_1_2_2_node_0_2_0_node_0_1_0,
170
171 // [2]
172 // x
173 // // \\
174 // // \\
175 // // \\
176 // x ==== x
177 // [0] [1]
178 node_1_1_2_2_node_0_2_2_0_node_0_1_1_0,
179
180 // [2]
181 // x
182 // // \\
183 // // \\
184 // // \\
185 // x ==== x
186 // [0] [1]
187 node_2_2_1_1_node_2pos3_node_1,
188
189 // x [3]
190 // |
191 // |
192 // |
193 // x ---- x ---- x
194 // [0] [1] [2]
195 node_3_1_node_0_2_node_1_node_0,
196
197 // x ---- x x ---- x
198 node_1_node_0_node_3_node_2,
199
200 // x -- x -- -- x -- x
201 node_2_node_3_node_0_node_1,
202
203 end
204 };
205 }
206
207 template
208 <
209 class EdgeWeight,
210 class NodeWeight,
211 class EdgeStorageConfig,
212 class NodeWeightStorage
213 >
215 {
216 public:
218 using edge_t = typename graph_t::edge_init_type;
219 using edges_equivalent_t = std::initializer_list<std::initializer_list<edge_t>>;
220 using transition_graph = typename transition_checker<graph_t>::transition_graph;
221
222 static void execute_operations(regular_test& t)
223 {
224 auto trg{make_transition_graph(t)};
225
226 auto checker{
227 [&t](std::string_view description, const graph_t& obtained, const graph_t& prediction, const graph_t& parent, std::size_t host, std::size_t target) {
228 t.check(equality, {description, no_source_location}, obtained, prediction);
229 if(host != target) t.check_semantics({description, no_source_location}, prediction, parent);
230 }
231 };
232
234 }
235
236 [[nodiscard]]
237 static graph_t make_and_check(regular_test& t, std::string_view description, edges_equivalent_t init)
238 {
240 }
241
242 static void check_initialization_exceptions(regular_test& t)
243 {
244 using namespace maths;
245
246 // One node
247 t.check_exception_thrown<std::out_of_range>("Target index of edge out of range", [](){ return graph_t{{{1, 0}}}; });
248 t.check_exception_thrown<std::out_of_range>("Complimentary index of edge out of range", [](){ return graph_t{{{0, 1}}}; });
249 t.check_exception_thrown<std::logic_error>("Self-referential complimentary index", [](){ return graph_t{{{0, 0}}}; });
250 t.check_exception_thrown<std::logic_error>("Mismatched complimentary indices", [](){ return graph_t{{{0, 1}, {0, 1}}}; });
251 t.check_exception_thrown<std::logic_error>("Mismatched complimentary indices", [](){ return graph_t{{{0, 1}, {0, 2}, {0, 0}}}; });
252
253 // Two nodes
254 t.check_exception_thrown<std::logic_error>("Mismatched complimentary indices", [](){ return graph_t{{{1, 0}, {0, 2}, {0, 1}}, {{0, 1}}}; });
255 }
256
257 [[nodiscard]]
258 static transition_graph make_transition_graph(regular_test& t)
259 {
260 using namespace undirected_embedded_graph;
261
262 check_initialization_exceptions(t);
263
264 return transition_graph{
265 {
266 { // begin, 'empty'
267 {
268 graph_description::empty,
269 t.report(""),
270 [&t](const graph_t& g) -> const graph_t& {
271 t.check_exception_thrown<std::out_of_range>("cbegin_edges throws for empty graph", [&g]() { return g.cbegin_edges(0); });
272 return g;
273 }
274 },
275 {
276 graph_description::empty,
277 t.report(""),
278 [&t](const graph_t& g) -> const graph_t& {
279 t.check_exception_thrown<std::out_of_range>("cend_edges throws for empty graph", [&g]() { return g.cend_edges(0); });
280 return g;
281 }
282 },
283 {
284 graph_description::empty,
285 t.report(""),
286 [&t](const graph_t& g) -> const graph_t& {
287 t.check_exception_thrown<std::out_of_range>("crbegin_edges throws for empty graph", [&g]() { return g.crbegin_edges(0); });
288 return g;
289 }
290 },
291 {
292 graph_description::empty,
293 t.report(""),
294 [&t](const graph_t& g) -> const graph_t& {
295 t.check_exception_thrown<std::out_of_range>("crend_edges throws for empty graph", [&g]() { return g.crend_edges(0); });
296 return g;
297 }
298 },
299 {
300 graph_description::empty,
301 t.report(""),
302 [&t](const graph_t& g) -> const graph_t& {
303 t.check_exception_thrown<std::out_of_range>("cedges throws for empty graph", [&g]() { return g.cedges(0); });
304 return g;
305 }
306 },
307 {
308 graph_description::empty,
309 t.report(""),
310 [&t](const graph_t& g) -> const graph_t& {
311 t.check_exception_thrown<std::out_of_range>("swapping nodes throws for empty graph", [g{g}]() mutable { g.swap_nodes(0, 0); });
312 return g;
313 }
314 },
315 {
316 graph_description::empty,
317 t.report(""),
318 [&t](const graph_t& g) -> const graph_t& {
319 t.check_exception_thrown<std::out_of_range>("joining nodes throws for empty graph", [g{g}]() mutable { g.join(0, 0); });
320 return g;
321 }
322 },
323 {
324 graph_description::empty,
325 t.report("Clear empty graph"),
326 [](graph_t g) -> graph_t {
327 g.clear();
328 return g;
329 }
330 },
331 {
332 graph_description::node,
333 t.report("Add node to empty graph"),
334 [&t](graph_t g) -> graph_t {
335 t.check(equality, "Index of added node is 0", g.add_node(), 0uz);
336 return g;
337 }
338 },
339 {
340 graph_description::node,
341 t.report("insert node into empty graph"),
342 [&t](graph_t g) -> graph_t {
343 t.check(equality, "Index of added node is 0", g.insert_node(0), 0uz);
344 return g;
345 }
346 }
347 }, // end 'empty'
348 { // begin 'node'
349 {
350 graph_description::node,
351 t.report(""),
352 [&t](const graph_t& g) -> const graph_t& {
353 t.check_exception_thrown<std::out_of_range>("cbegin_edges throws when index is out of range", [&g]() { return g.cbegin_edges(1); });
354 return g;
355 }
356 },
357 {
358 graph_description::node,
359 t.report(""),
360 [&t](const graph_t& g) -> const graph_t& {
361 t.check_exception_thrown<std::out_of_range>("cend_edges throws when index is out of range", [&g]() { return g.cend_edges(1); });
362 return g;
363 }
364 },
365 {
366 graph_description::node,
367 t.report(""),
368 [&t](const graph_t& g) -> const graph_t& {
369 t.check_exception_thrown<std::out_of_range>("crbegin_edges throws when index is out of range", [&g]() { return g.crbegin_edges(1); });
370 return g;
371 }
372 },
373 {
374 graph_description::node,
375 t.report(""),
376 [&t](const graph_t& g) -> const graph_t& {
377 t.check_exception_thrown<std::out_of_range>("crend_edges throws when index is out of range", [&g]() { return g.crend_edges(1); });
378 return g;
379 }
380 },
381 {
382 graph_description::node,
383 t.report(""),
384 [&t](const graph_t& g) -> const graph_t& {
385 t.check_exception_thrown<std::out_of_range>("cedges throws when index is out of range", [&g]() { return g.cedges(1); });
386 return g;
387 }
388 },
389 {
390 graph_description::node,
391 t.report(""),
392 [&t](const graph_t& g) -> const graph_t& {
393 t.check_exception_thrown<std::out_of_range>("swapping nodes throws if first index out of range", [g{g}]() mutable { g.swap_nodes(1, 0); });
394 return g;
395 }
396 },
397 {
398 graph_description::node,
399 t.report(""),
400 [&t](const graph_t& g) -> const graph_t& {
401 t.check_exception_thrown<std::out_of_range>("swapping nodes throws if second index out of range", [g{g}]() mutable { g.swap_nodes(0, 1); });
402 return g;
403 }
404 },
405 {
406 graph_description::node,
407 t.report(""),
408 [&t](const graph_t& g) -> const graph_t& {
409 t.check_exception_thrown<std::out_of_range>("joining nodes throws if first index out of range", [g{g}]() mutable { g.join(1, 0); });
410 return g;
411 }
412 },
413 {
414 graph_description::node,
415 t.report(""),
416 [&t](const graph_t& g) -> const graph_t& {
417 t.check_exception_thrown<std::out_of_range>("joining nodes throws if second index out of range", [g{g}]() mutable { g.join(0, 1); });
418 return g;
419 }
420 },
421 {
422 graph_description::node,
423 t.report(""),
424 [&t](const graph_t& g) -> const graph_t& {
425 t.check_exception_thrown<std::out_of_range>("inserting join throws if second index out of range", [g{g}]() mutable { g.insert_join(g.cbegin_edges(0), 2); });
426 return g;
427 }
428 },
429 {
430 graph_description::empty,
431 t.report("Clear graph"),
432 [](graph_t g) -> graph_t {
433 g.clear();
434 return g;
435 }
436 },
437 {
438 graph_description::empty,
439 t.report("Erase node to give empty graph"),
440 [](graph_t g) -> graph_t {
441 g.erase_node(0);
442 return g;
443 }
444 },
445 {
446 graph_description::node,
447 t.report("Attempt to erase edge past the end"),
448 [](graph_t g) -> const graph_t {
449 g.erase_edge(g.cend_edges(0));
450 return g;
451 }
452 },
453 {
454 graph_description::node_0,
455 t.report("Add loop"),
456 [](graph_t g) -> graph_t {
457 g.join(0, 0);
458 return g;
459 }
460 },
461 {
462 graph_description::node_node,
463 t.report("Add second node"),
464 [&t](graph_t g) -> graph_t {
465 t.check(equality, "Index of added node is 1", g.add_node(), 1uz);
466 return g;
467 }
468 },
469 {
470 graph_description::node_node,
471 t.report("Insert second node"),
472 [&t](graph_t g) -> graph_t {
473 t.check(equality, "Index of added node is 0", g.insert_node(0), 0uz);
474 return g;
475 }
476 },
477 {
478 graph_description::node_node,
479 t.report("Insert second node at end"),
480 [&t](graph_t g) -> graph_t {
481 t.check(equality, "Index of added node is 1", g.insert_node(1), 1uz);
482 return g;
483 }
484 },
485 {
486 graph_description::node,
487 t.report("Swap node with self"),
488 [](graph_t g) -> graph_t {
489 g.swap_nodes(0,0);
490 return g;
491 }
492 }
493 }, // end 'node'
494 { // begin 'node_0'
495 {
496 graph_description::empty,
497 t.report("Clear graph"),
498 [](graph_t g) -> graph_t {
499 g.clear();
500 return g;
501 }
502 },
503 {
504 graph_description::node,
505 t.report("Remove loop"),
506 [](graph_t g) -> graph_t {
507 g.erase_edge(g.cbegin_edges(0));
508 return g;
509 }
510 },
511 {
512 graph_description::node_0_0,
513 t.report("Add a second loop"),
514 [](graph_t g) -> graph_t {
515 g.join(0, 0);
516 return g;
517 }
518 },
519 {
520 graph_description::node_0_0_interleaved,
521 t.report("Interleave a second loop"),
522 [](graph_t g) -> graph_t {
523 g.insert_join(g.cbegin_edges(0)+1, 3);
524 return g;
525 }
526 },
527 {
528 graph_description::node_0_0_interleaved,
529 t.report("Interleave a second loop, backwards"),
530 [](graph_t g) -> graph_t {
531 g.insert_join(g.cbegin_edges(0) + 1, 0);
532 return g;
533 }
534 },
535 {
536 graph_description::node_node_1,
537 t.report("Insert node"),
538 [&t](graph_t g) -> graph_t {
539 t.check(equality, "Index of added node is 0", g.insert_node(0), 0uz);
540 return g;
541 }
542 },
543 {
544 graph_description::node_0_node,
545 t.report("Insert node at end"),
546 [&t](graph_t g) -> graph_t {
547 t.check(equality, "Index of added node is 1", g.insert_node(1), 1uz);
548 return g;
549 }
550 },
551 {
552 graph_description::node_0,
553 t.report("Swap node with self"),
554 [](graph_t g) -> graph_t {
555 g.swap_nodes(0,0);
556 return g;
557 }
558 }
559 }, // end 'node_0'
560 { // begin 'node_0_0'
561 {
562 graph_description::empty,
563 t.report("Clear graph"),
564 [](graph_t g) -> graph_t {
565 g.clear();
566 return g;
567 }
568 },
569 {
570 graph_description::empty,
571 t.report("Erase node 0"),
572 [](graph_t g) -> graph_t {
573 g.erase_node(0);
574 return g;
575 }
576 },
577 {
578 graph_description::node_0,
579 t.report("Remove first loop"),
580 [](graph_t g) -> graph_t {
581 g.erase_edge(g.cbegin_edges(0));
582 return g;
583 }
584 },
585 {
586 graph_description::node_0,
587 t.report("Remove first loop via second insertion"),
588 [](graph_t g) -> graph_t {
589 g.erase_edge(g.cbegin_edges(0) + 1);
590 return g;
591 }
592 },
593 {
594 graph_description::node_0,
595 t.report("Remove second loop"),
596 [](graph_t g) -> graph_t {
597 g.erase_edge(std::ranges::next(g.cbegin_edges(0), 2));
598 return g;
599 }
600 },
601 {
602 graph_description::node_0,
603 t.report("Remove second loop via second insertion"),
604 [](graph_t g) -> graph_t {
605 g.erase_edge(std::ranges::next(g.cbegin_edges(0), 3));
606 return g;
607 }
608 }
609 }, // end 'node_0_0'
610 { // begin 'node_0_0_interleaved'
611 {
612 graph_description::empty,
613 t.report("Clear graph"),
614 [](graph_t g) -> graph_t {
615 g.clear();
616 return g;
617 }
618 },
619 {
620 graph_description::empty,
621 t.report("Erase node 0"),
622 [](graph_t g) -> graph_t {
623 g.erase_node(0);
624 return g;
625 }
626 },
627 {
628 graph_description::node_0,
629 t.report("Remove first loop via first insertion"),
630 [](graph_t g) -> graph_t {
631 g.erase_edge(g.cbegin_edges(0));
632 return g;
633 }
634 },
635 {
636 graph_description::node_0_0_0_interleaved,
637 t.report("Insert a third loop"),
638 [](graph_t g) -> graph_t {
639 g.insert_join(g.cbegin_edges(0), ++g.cbegin_edges(0));
640 return g;
641 }
642 }
643 ,
644 {
645 graph_description::node_0_0_0_interleaved,
646 t.report("Insert a third loop, inverted"),
647 [](graph_t g) -> graph_t {
648 g.insert_join(g.cbegin_edges(0), g.cbegin_edges(0));
649 return g;
650 }
651 },
652 {
653 graph_description::node_node_1_1_interleaved,
654 t.report("Insert node"),
655 [](graph_t g) -> graph_t {
656 g.insert_node(0);
657 return g;
658 }
659 }
660 }, // end 'node_0_0_interleaved'
661 { // begin 'node_0_0_0_interleaved'
662 {
663 graph_description::node_0_0_interleaved,
664 t.report("Remove first loop via first insertion"),
665 [](graph_t g) -> graph_t {
666 g.erase_edge(g.cbegin_edges(0));
667 return g;
668 }
669 },
670 {
671 graph_description::node_0_0_interleaved,
672 t.report("Remove first loop via second insertion"),
673 [](graph_t g) -> graph_t {
674 g.erase_edge(g.cbegin_edges(0)+1);
675 return g;
676 }
677 },
678 {
679 graph_description::node_0_0,
680 t.report("Remove second loop via first insertion"),
681 [](graph_t g) -> graph_t {
682 g.erase_edge(g.cbegin_edges(0)+2);
683 return g;
684 }
685 },
686 {
687 graph_description::node_0_0,
688 t.report("Remove second loop via second insertion"),
689 [](graph_t g) -> graph_t {
690 g.erase_edge(g.cbegin_edges(0)+4);
691 return g;
692 }
693 },
694 {
695 graph_description::node_0_0,
696 t.report("Remove third loop via first insertion"),
697 [](graph_t g) -> graph_t {
698 g.erase_edge(g.cbegin_edges(0) + 3);
699 return g;
700 }
701 },
702 {
703 graph_description::node_0_0,
704 t.report("Remove third loop via second insertion"),
705 [](graph_t g) -> graph_t {
706 g.erase_edge(g.cbegin_edges(0) + 5);
707 return g;
708 }
709 },
710 {
711 graph_description::node_node_1_1_1_interleaved,
712 t.report("Insert node"),
713 [](graph_t g) -> graph_t {
714 g.insert_node(0);
715 return g;
716 }
717 }
718 }, // end 'node_0_0_0_interleaved'
719 { // begin 'node_node'
720 {
721 graph_description::empty,
722 t.report("Clear graph"),
723 [](graph_t g) -> graph_t {
724 g.clear();
725 return g;
726 }
727 },
728 {
729 graph_description::node,
730 t.report("Erase node 0"),
731 [](graph_t g) -> graph_t {
732 g.erase_node(0);
733 return g;
734 }
735 },
736 {
737 graph_description::node,
738 t.report("Erase node 1"),
739 [](graph_t g) -> graph_t {
740 g.erase_node(1);
741 return g;
742 }
743 },
744 {
745 graph_description::node_1_node_0,
746 t.report("Join nodes 0,1"),
747 [](graph_t g) -> graph_t {
748 g.join(0, 1);
749 return g;
750 }
751 }
752 }, // end 'node_node'
753 { // begin 'node_1_node_0'
754 {
755 graph_description::empty,
756 t.report("Clear graph"),
757 [](graph_t g) -> graph_t {
758 g.clear();
759 return g;
760 }
761 },
762 {
763 graph_description::node,
764 t.report("Erase node 0"),
765 [](graph_t g) -> graph_t {
766 g.erase_node(0);
767 return g;
768 }
769 },
770 {
771 graph_description::node,
772 t.report("Erase node 1"),
773 [](graph_t g) -> graph_t {
774 g.erase_node(1);
775 return g;
776 }
777 },
778 {
779 graph_description::node_1_node_0,
780 t.report("Swap nodes {0,1}"),
781 [](graph_t g) -> graph_t {
782 g.swap_nodes(0,1);
783 return g;
784 }
785 },
786 {
787 graph_description::node_1_node_0,
788 t.report("Swap nodes {1,0}"),
789 [](graph_t g) -> graph_t {
790 g.swap_nodes(1,0);
791 return g;
792 }
793 },
794 {
795 graph_description::node_1_1_node_0_0,
796 t.report("Join {0,1}"),
797 [](graph_t g) {
798 g.join(0, 1);
799 return g;
800 }
801 }
802 }, // end 'node_1_node_0'
803 { // begin 'node_0_1_node_0'
804 {
805 graph_description::empty,
806 t.report("Clear graph"),
807 [](graph_t g) -> graph_t {
808 g.clear();
809 return g;
810 }
811 },
812 {
813 graph_description::node,
814 t.report("Erase node 0"),
815 [](graph_t g) -> graph_t {
816 g.erase_node(0);
817 return g;
818 }
819 },
820 {
821 graph_description::node_0,
822 t.report("Erase node 1"),
823 [](graph_t g) -> graph_t {
824 g.erase_node(1);
825 return g;
826 }
827 },
828 {
829 graph_description::node_1_node_0,
830 t.report("Remove loop"),
831 [](graph_t g) -> graph_t {
832 g.erase_edge(g.cbegin_edges(0));
833 return g;
834 }
835 },
836 {
837 graph_description::node_0_node,
838 t.report("Remove link"),
839 [](graph_t g) -> graph_t {
840 g.erase_edge(std::ranges::next(g.cbegin_edges(0), 2));
841 return g;
842 }
843 }
844 }, // end 'node_0_1_node_0'
845 { // begin 'node_0_node'
846 {
847 graph_description::empty,
848 t.report("Clear graph"),
849 [](graph_t g) -> graph_t {
850 g.clear();
851 return g;
852 }
853 },
854 {
855 graph_description::node_node,
856 t.report("Remove link"),
857 [](graph_t g) -> graph_t {
858 g.erase_edge(g.cbegin_edges(0));
859 return g;
860 }
861 },
862 {
863 graph_description::node_node_1_node,
864 t.report("Insert node"),
865 [&t](graph_t g) -> graph_t {
866 t.check(equality, "Index of added node is 0", g.insert_node(0), 0uz);
867 return g;
868 }
869 },
870 {
871 graph_description::node_node_1,
872 t.report("Swap nodes"),
873 [](graph_t g) -> graph_t {
874 g.swap_nodes(0,1);
875 return g;
876 }
877 }
878 }, // end 'node_0_node'
879 { // begin 'node_node_1'
880 {
881 graph_description::empty,
882 t.report("Clear graph"),
883 [](graph_t g) -> graph_t {
884 g.clear();
885 return g;
886 }
887 },
888 {
889 graph_description::node_0,
890 t.report("Erase node 0"),
891 [](graph_t g) -> graph_t {
892 g.erase_node(0);
893 return g;
894 }
895 },
896 {
897 graph_description::node,
898 t.report("Erase node 1"),
899 [](graph_t g) -> graph_t {
900 g.erase_node(1);
901 return g;
902 }
903 },
904 {
905 graph_description::node_node,
906 t.report("Remove link"),
907 [](graph_t g) -> graph_t {
908 g.erase_edge(g.cbegin_edges(1));
909 return g;
910 }
911 },
912 {
913 graph_description::node_0_node,
914 t.report("swap nodes"),
915 [](graph_t g) -> graph_t {
916 g.swap_nodes(0,1);
917 return g;
918 }
919 }
920 }, // end 'node_node_1'
921 { // begin 'node_node_1_1_interleaved'
922 {
923 graph_description::node_0_0_interleaved,
924 t.report("Erase node 0"),
925 [](graph_t g) -> graph_t {
926 g.erase_node(0);
927 return g;
928 }
929 }
930 }, // end 'node_node_1_1_interleaved'
931 { // begin 'node_node_1_1_1_interleaved'
932 {
933 graph_description::node_0_0_0_interleaved,
934 t.report("Erase node 0"),
935 [](graph_t g) -> graph_t {
936 g.erase_node(0);
937 return g;
938 }
939 },
940 {
941 graph_description::node_1_node_1_1_1_0_interleaved,
942 t.report("Join {0, 1; 4}"),
943 [](graph_t g) -> graph_t {
944 g.insert_join(g.cbegin_edges(0), g.cbegin_edges(1) + 4);
945 return g;
946 }
947 }
948 }, // end 'node_node_1_1_1_interleaved'
949 { // begin 'node_1_node_1_1_1_0_interleaved'
950 {
951 graph_description::node_0_0_0_interleaved,
952 t.report("Erase node 0"),
953 [](graph_t g) -> graph_t {
954 g.erase_node(0);
955 return g;
956 }
957 },
958 {
959 graph_description::node_1_1_node_1_0_1_0_1_interleaved,
960 t.report("Join {0(1), 1(6)}"),
961 [](graph_t g) -> graph_t {
962 g.insert_join(g.cbegin_edges(0)+1, g.cbegin_edges(1) + 6);
963 return g;
964 }
965 }
966 }, // end 'node_1_node_1_1_1_0_interleaved'
967 { // begin 'node_1_1_node_1_0_1_0_1_interleaved'
968 {
969 graph_description::node_1_node_1_1_1_0_interleaved,
970 t.report("Remove link {1(6), 0(1)}"),
971 [](graph_t g) -> graph_t {
972 g.erase_edge(g.cbegin_edges(1) + 6);
973 return g;
974 }
975 },
976 {
977 graph_description::node_1_node_1_1_1_0_interleaved,
978 t.report("Remove link {0(1), 1(6)}"),
979 [](graph_t g) -> graph_t {
980 g.erase_edge(g.cbegin_edges(0) + 1);
981 return g;
982 }
983 },
984 {
985 graph_description::node_0_0_0_interleaved,
986 t.report("Erase node 0"),
987 [](graph_t g) -> graph_t {
988 g.erase_node(0);
989 return g;
990 }
991 }
992 }, // end 'node_1_1_node_1_0_1_0_1_interleaved'
993 { // begin 'node_1_1_node_0_0'
994 {
995 graph_description::empty,
996 t.report("Clear graph"),
997 [](graph_t g) -> graph_t {
998 g.clear();
999 return g;
1000 }
1001 },
1002 {
1003 graph_description::node,
1004 t.report("Erase node 0"),
1005 [](graph_t g) -> graph_t {
1006 g.erase_node(0);
1007 return g;
1008 }
1009 },
1010 {
1011 graph_description::node,
1012 t.report("Erase node 1"),
1013 [](graph_t g) -> graph_t {
1014 g.erase_node(1);
1015 return g;
1016 }
1017 },
1018 {
1019 graph_description::node_1_node_0,
1020 t.report("Erase node 0 zeroth link"),
1021 [](graph_t g) -> graph_t {
1022 g.erase_edge(g.cbegin_edges(0));
1023 return g;
1024 }
1025 },
1026 {
1027 graph_description::node_1_node_0,
1028 t.report("Erase node 0 first link"),
1029 [](graph_t g) -> graph_t {
1030 g.erase_edge(g.cbegin_edges(0)+1);
1031 return g;
1032 }
1033 }
1034 }, // end 'node_1_1_node_0_0'
1035 { // begin 'node_1pos1_1pos0_node_0pos1_0pos0'
1036 {
1037 graph_description::empty,
1038 t.report("Clear graph"),
1039 [](graph_t g) -> graph_t {
1040 g.clear();
1041 return g;
1042 }
1043 },
1044 {
1045 graph_description::node,
1046 t.report("Erase node 0"),
1047 [](graph_t g) -> graph_t {
1048 g.erase_node(0);
1049 return g;
1050 }
1051 },
1052 {
1053 graph_description::node,
1054 t.report("Erease node 1"),
1055 [](graph_t g) -> graph_t {
1056 g.erase_node(1);
1057 return g;
1058 }
1059 },
1060 {
1061 graph_description::node_1_node_0,
1062 t.report("Erase node 0 link"),
1063 [](graph_t g) -> graph_t {
1064 g.erase_edge(g.cbegin_edges(0));
1065 return g;
1066 }
1067 },
1068 {
1069 graph_description::node_1_node_0,
1070 t.report("Erase node 1 link"),
1071 [](graph_t g) -> graph_t {
1072 g.erase_edge(g.cbegin_edges(1));
1073 return g;
1074 }
1075 },
1076 }, // end 'node_1pos1_1pos0_node_0pos1_0pos0'
1077 { // begin 'node_node_node'
1078 {
1079 graph_description::empty,
1080 t.report("Clear graph"),
1081 [](graph_t g) -> graph_t {
1082 g.clear();
1083 return g;
1084 }
1085 },
1086 {
1087 graph_description::node_node,
1088 t.report("Erase node 0"),
1089 [](graph_t g) -> graph_t {
1090 g.erase_node(0);
1091 return g;
1092 }
1093 },
1094 {
1095 graph_description::node_node,
1096 t.report("Erase node 1"),
1097 [](graph_t g) -> graph_t {
1098 g.erase_node(1);
1099 return g;
1100 }
1101 },
1102 {
1103 graph_description::node_node,
1104 t.report("Erase node 2"),
1105 [](graph_t g) -> graph_t {
1106 g.erase_node(2);
1107 return g;
1108 }
1109 },
1110 {
1111 graph_description::node_1_node_0_node,
1112 t.report("Join {0,1}"),
1113 [](graph_t g) -> graph_t {
1114 g.join(0,1);
1115 return g;
1116 }
1117 },
1118 {
1119 graph_description::node_node_2_node_1,
1120 t.report("Join {2,1}"),
1121 [](graph_t g) -> graph_t {
1122 g.join(2,1);
1123 return g;
1124 }
1125 }
1126 }, // end 'node_node_node'
1127 { // begin 'node_1_node_0_node'
1128 {
1129 graph_description::empty,
1130 t.report("Clear graph"),
1131 [](graph_t g) -> graph_t {
1132 g.clear();
1133 return g;
1134 }
1135 },
1136 {
1137 graph_description::node_node,
1138 t.report("Erase node 0"),
1139 [](graph_t g) -> graph_t {
1140 g.erase_node(0);
1141 return g;
1142 }
1143 },
1144 {
1145 graph_description::node_node,
1146 t.report("Erase node 1"),
1147 [](graph_t g) -> graph_t {
1148 g.erase_node(1);
1149 return g;
1150 }
1151 },
1152 {
1153 graph_description::node_1_node_0,
1154 t.report("Erase node 2"),
1155 [](graph_t g) -> graph_t {
1156 g.erase_node(2);
1157 return g;
1158 }
1159 },
1160 {
1161 graph_description::node_node_node,
1162 t.report("Remove link {0,1}"),
1163 [](graph_t g) -> graph_t {
1164 g.erase_edge(g.cbegin_edges(0));
1165 return g;
1166 }
1167 },
1168 {
1169 graph_description::node_1_node_0_2_node_1,
1170 t.report("Join {2,1}"),
1171 [](graph_t g) -> graph_t {
1172 g.join(1,2);
1173 return g;
1174 }
1175 },
1176 {
1177 graph_description::node_1_node_0_2_node_1,
1178 t.report("Join {2,1}"),
1179 [](graph_t g) -> graph_t {
1180 g.join(2,1);
1181 return g;
1182 }
1183 },
1184 {
1185 graph_description::node_node_2_node_1,
1186 t.report("Swap nodes {0,2}"),
1187 [](graph_t g) -> graph_t {
1188 g.swap_nodes(0,2);
1189 return g;
1190 }
1191 },
1192 {
1193 graph_description::node_node_2_node_1,
1194 t.report("Swap nodes {2,0}"),
1195 [](graph_t g) -> graph_t {
1196 g.swap_nodes(2,0);
1197 return g;
1198 }
1199 }
1200 }, // end 'node_1_node_0_node'
1201 { // begin 'node_node_2_node_1'
1202 {
1203 graph_description::empty,
1204 t.report("Clear graph"),
1205 [](graph_t g) -> graph_t {
1206 g.clear();
1207 return g;
1208 }
1209 },
1210 {
1211 graph_description::node_1_node_0,
1212 t.report("Erase node 0"),
1213 [](graph_t g) -> graph_t {
1214 g.erase_node(0);
1215 return g;
1216 }
1217 },
1218 {
1219 graph_description::node_node,
1220 t.report("Erase node 1"),
1221 [](graph_t g) -> graph_t {
1222 g.erase_node(1);
1223 return g;
1224 }
1225 },
1226 {
1227 graph_description::node_node,
1228 t.report("Erase node 2"),
1229 [](graph_t g) -> graph_t {
1230 g.erase_node(2);
1231 return g;
1232 }
1233 },
1234 {
1235 graph_description::node_node_node,
1236 t.report("Remove link {2,1}"),
1237 [](graph_t g) -> graph_t {
1238 g.erase_edge(g.cbegin_edges(2));
1239 return g;
1240 }
1241 },
1242 {
1243 graph_description::node_1_node_0_2_node_1,
1244 t.report("Join {0,1}"),
1245 [](graph_t g) -> graph_t {
1246 g.insert_join(g.cbegin_edges(0), g.cbegin_edges(1));
1247 return g;
1248 }
1249 },
1250 {
1251 graph_description::node_1_node_0_node,
1252 t.report("Swap nodes {0,2}"),
1253 [](graph_t g) -> graph_t {
1254 g.swap_nodes(0,2);
1255 return g;
1256 }
1257 },
1258 {
1259 graph_description::node_1_node_0_node,
1260 t.report("Swap nodes {2,0}"),
1261 [](graph_t g) -> graph_t {
1262 g.swap_nodes(2,0);
1263 return g;
1264 }
1265 }
1266 }, // end 'node_node_2_node_1'
1267 { // begin 'node_1_node_0_2_node_1'
1268 {
1269 graph_description::empty,
1270 t.report("Clear graph"),
1271 [](graph_t g) -> graph_t {
1272 g.clear();
1273 return g;
1274 }
1275 },
1276 {
1277 graph_description::node_1_node_0,
1278 t.report("Erase node 0"),
1279 [](graph_t g) -> graph_t {
1280 g.erase_node(0);
1281 return g;
1282 }
1283 },
1284 {
1285 graph_description::node_node,
1286 t.report("Erase node 1"),
1287 [](graph_t g) -> graph_t {
1288 g.erase_node(1);
1289 return g;
1290 }
1291 },
1292 {
1293 graph_description::node_1_node_0,
1294 t.report("Erase node 2"),
1295 [](graph_t g) -> graph_t {
1296 g.erase_node(2);
1297 return g;
1298 }
1299 },
1300 {
1301 graph_description::node_1_node_0_node,
1302 t.report("Remove link {1,2}"),
1303 [](graph_t g) -> graph_t {
1304 g.erase_edge(++g.cbegin_edges(1));
1305 return g;
1306 }
1307 }
1308 }, // end 'node_1_node_0_2_node_1'
1309 { // begin 'node_1_node_0_2_node_1_0'
1310 {
1311 graph_description::empty,
1312 t.report("Clear graph"),
1313 [](graph_t g) -> graph_t {
1314 g.clear();
1315 return g;
1316 }
1317 },
1318 {
1319 graph_description::node_1_node_0,
1320 t.report("Erase node 0"),
1321 [](graph_t g) -> graph_t {
1322 g.erase_node(0);
1323 return g;
1324 }
1325 },
1326 {
1327 graph_description::node_1_node_0,
1328 t.report("Erase node 1"),
1329 [](graph_t g) -> graph_t {
1330 g.erase_node(1);
1331 return g;
1332 }
1333 },
1334 {
1335 graph_description::node_1_node_0,
1336 t.report("Erase node 2"),
1337 [](graph_t g) -> graph_t {
1338 g.erase_node(2);
1339 return g;
1340 }
1341 },
1342 {
1343 graph_description::node_1_node_0_2_node_1,
1344 t.report("Remove {2,0}"),
1345 [](graph_t g) -> graph_t {
1346 g.erase_edge(++g.cbegin_edges(2));
1347 return g;
1348 }
1349 }
1350 }, // end 'node_1_node_0_2_node_1_0'
1351 { // begin 'node_node_1_node'
1352 {
1353 graph_description::empty,
1354 t.report("Clear graph"),
1355 [](graph_t g) -> graph_t {
1356 g.clear();
1357 return g;
1358 }
1359 },
1360 {
1361 graph_description::node_0_node,
1362 t.report("Erase node 0"),
1363 [](graph_t g) -> graph_t {
1364 g.erase_node(0);
1365 return g;
1366 }
1367 },
1368 {
1369 graph_description::node_node,
1370 t.report("Erase node 1"),
1371 [](graph_t g) -> graph_t {
1372 g.erase_node(1);
1373 return g;
1374 }
1375 },
1376 {
1377 graph_description::node_node_1,
1378 t.report("Erase node 2"),
1379 [](graph_t g) -> graph_t {
1380 g.erase_node(2);
1381 return g;
1382 }
1383 },
1384 }, // end 'node_node_1_node'
1385 { // begin 'node_1_node_0_1_node'
1386 {
1387 graph_description::node_0_node,
1388 t.report("Erase node 0"),
1389 [](graph_t g) -> graph_t {
1390 g.erase_node(0);
1391 return g;
1392 }
1393 },
1394 {
1395 graph_description::node_node,
1396 t.report("Erase node 1"),
1397 [](graph_t g) -> graph_t {
1398 g.erase_node(1);
1399 return g;
1400 }
1401 },
1402 {
1403 graph_description::node_node_1_node,
1404 t.report("Remove {0,1}"),
1405 [](graph_t g) -> graph_t {
1406 g.erase_edge(g.cbegin_edges(0));
1407 return g;
1408 }
1409 },
1410 {
1411 graph_description::node_1_node_1_0_node,
1412 t.report("Join {1,0}"),
1413 [](graph_t g) -> graph_t {
1414 g.join(1, 0);
1415 return g;
1416 }
1417 }
1418 }, // end 'node_1_node_0_1_node'
1419 { // begin 'node_1_node_1_0_node'
1420 {
1421 graph_description::node_0_node,
1422 t.report("Erase node 0"),
1423 [](graph_t g) -> graph_t {
1424 g.erase_node(0);
1425 return g;
1426 }
1427 },
1428 {
1429 graph_description::node_node,
1430 t.report("Erase node 1"),
1431 [](graph_t g) -> graph_t {
1432 g.erase_node(1);
1433 return g;
1434 }
1435 },
1436 {
1437 graph_description::node_1_node_0_1_node,
1438 t.report("Remove {1,0}"),
1439 [](graph_t g) -> graph_t {
1440 g.erase_edge(g.cbegin_edges(1)+3);
1441 return g;
1442 }
1443 },
1444 {
1445 graph_description::node_1_node_1_0_2_node_1,
1446 t.report("Join {1,2}"),
1447 [](graph_t g) -> graph_t {
1448 g.join(1, 2);
1449 return g;
1450 }
1451 }
1452 }, // end 'node_1_node_1_0_node'
1453 { // begin 'node_1_node_1_0_2_node_1'
1454 {
1455 graph_description::node_0_1_node_0,
1456 t.report("Erase node 0"),
1457 [](graph_t g) -> graph_t {
1458 g.erase_node(0);
1459 return g;
1460 }
1461 },
1462 {
1463 graph_description::node_node,
1464 t.report("Erase node 1"),
1465 [](graph_t g) -> graph_t {
1466 g.erase_node(1);
1467 return g;
1468 }
1469 },
1470 {
1471 graph_description::node_1_node_0_1_2_node_1,
1472 t.report("Remove {1,0}"),
1473 [](graph_t g) -> graph_t {
1474 g.erase_edge(g.cbegin_edges(1)+3);
1475 return g;
1476 }
1477 },
1478 {
1479 graph_description::node_1_node_1_0_node,
1480 t.report("Remove {1,2}"),
1481 [](graph_t g) -> graph_t {
1482 g.erase_edge(g.cbegin_edges(1)+4);
1483 return g;
1484 }
1485 }
1486 }, // end 'node_1_node_1_0_2_node_1'
1487 { // begin 'node_1_node_0_1_2_node_1'
1488 {
1489 graph_description::node_1_node_0_2_node_1,
1490 t.report("Remove {1,1}"),
1491 [](graph_t g) -> graph_t {
1492 g.erase_edge(g.cbegin_edges(1)+2);
1493 return g;
1494 }
1495 }
1496 }, // end 'node_1_node_0_1_2_node_1'
1497 { // begin 'node_2_node_node_0_2'
1498 {
1499 graph_description::node_1_node_0_1_node,
1500 t.report("Swap {1,2}"),
1501 [](graph_t g) -> graph_t {
1502 g.swap_nodes(1,2);
1503 return g;
1504 }
1505 }
1506 }, // end 'node_2_node_node_0_2'
1507 { // begin 'node_1_1_2_2_node_0_2_0_node_0_1_0'
1508 {
1509 graph_description::node_1_node_0,
1510 t.report("Erase node 0"),
1511 [](graph_t g) -> graph_t {
1512 g.erase_node(0);
1513 return g;
1514 }
1515 },
1516 {
1517 graph_description::node_1_1_node_0_0,
1518 t.report("Erase node 1"),
1519 [](graph_t g) -> graph_t {
1520 g.erase_node(1);
1521 return g;
1522 }
1523 },
1524 {
1525 graph_description::node_1_1_node_0_0,
1526 t.report("Erase node 2"),
1527 [](graph_t g) -> graph_t {
1528 g.erase_node(2);
1529 return g;
1530 }
1531 },
1532 {
1533 graph_description::node_1_1_2_2_node_0_2_2_0_node_0_1_1_0,
1534 t.report("Insert Join {2, 1}"),
1535 [](graph_t g) -> graph_t {
1536 g.insert_join(g.cbegin_edges(2)+1, g.cbegin_edges(1)+2);
1537 return g;
1538 }
1539 }
1540 }, // end 'node_1_1_2_2_node_0_2_0_node_0_1_0'
1541 { // begin 'node_1_1_2_2_node_0_2_2_0_node_0_1_1_0'
1542 {
1543 graph_description::node_1pos1_1pos0_node_0pos1_0pos0,
1544 t.report("Erase node 0"),
1545 [](graph_t g) -> graph_t {
1546 g.erase_node(0);
1547 return g;
1548 }
1549 },
1550 {
1551 graph_description::node_1_1_node_0_0,
1552 t.report("Erase node 1"),
1553 [](graph_t g) -> graph_t {
1554 g.erase_node(1);
1555 return g;
1556 }
1557 },
1558 {
1559 graph_description::node_1_1_node_0_0,
1560 t.report("Erase node 2"),
1561 [](graph_t g) -> graph_t {
1562 g.erase_node(2);
1563 return g;
1564 }
1565 },
1566 {
1567 graph_description::node_2_2_1_1_node_2pos3_node_1,
1568 t.report("Swap {1,2}"),
1569 [](graph_t g) -> graph_t {
1570 g.swap_nodes(1,2);
1571 return g;
1572 }
1573 },
1574 {
1575 graph_description::node_2_2_1_1_node_2pos3_node_1,
1576 t.report("Swap {2,1}"),
1577 [](graph_t g) -> graph_t {
1578 g.swap_nodes(2,1);
1579 return g;
1580 }
1581 }
1582 }, // end 'node_1_1_2_2_node_0_2_2_0_node_0_1_1_0'
1583 { // begin node_2_2_1_1_node_0_2_2_0_node_0_1_1_0
1584 {
1585 graph_description::node_1_1_2_2_node_0_2_2_0_node_0_1_1_0,
1586 t.report("Swap {1,2}"),
1587 [](graph_t g) -> graph_t {
1588 g.swap_nodes(1,2);
1589 return g;
1590 }
1591 },
1592 {
1593 graph_description::node_1_1_2_2_node_0_2_2_0_node_0_1_1_0,
1594 t.report("Swap {2,1}"),
1595 [](graph_t g) -> graph_t {
1596 g.swap_nodes(2,1);
1597 return g;
1598 }
1599 }
1600 }, // end node_2_2_1_1_node_0_2_2_0_node_0_1_1_0
1601 { // begin 'node_3_1_node_0_2_node_1_node_0'
1602 {
1603 graph_description::node_1_node_0_node,
1604 t.report("Erase node 0"),
1605 [](graph_t g) -> graph_t {
1606 g.erase_node(0);
1607 return g;
1608 }
1609 }
1610 }, // end 'node_3_1_node_0_2_node_1_node_0'
1611 { // begin 'node_1_node_0_node_3_node_2'
1612 {
1613 graph_description::node_2_node_3_node_0_node_1,
1614 t.report("Swap {2,1}"),
1615 [](graph_t g) -> graph_t {
1616 g.swap_nodes(2,1);
1617 return g;
1618 }
1619 },
1620 {
1621 graph_description::node_2_node_3_node_0_node_1,
1622 t.report("Swap {0,3}"),
1623 [](graph_t g) -> graph_t {
1624 g.swap_nodes(0,3);
1625 return g;
1626 }
1627 }
1628 }, // end 'node_1_node_0_node_3_node_2'
1629 { // begin 'node_2_node_3_node_0_node_1'
1630 {
1631 graph_description::node_1_node_0_node_3_node_2,
1632 t.report("Swap {2,1}"),
1633 [](graph_t g) -> graph_t {
1634 g.swap_nodes(2,1);
1635 return g;
1636 }
1637 },
1638 {
1639 graph_description::node_1_node_0_node_3_node_2,
1640 t.report("Swap {0,3}"),
1641 [](graph_t g) -> graph_t {
1642 g.swap_nodes(0,3);
1643 return g;
1644 }
1645 }
1646 }, // end 'node_2_node_3_node_0_node_1'
1647 },
1648 {
1649 // 'empty'
1650 make_and_check(t, t.report(""), {}),
1651
1652 // 'node'
1653 make_and_check(t, t.report(""), {{}}),
1654
1655 // 'node_0'
1656 make_and_check(t, t.report(""), {{edge_t{0, 1}, edge_t{0, 0}}}),
1657
1658 // 'node_0_0'
1659 make_and_check(t, t.report(""), {{edge_t{0, 1}, edge_t{0, 0}, edge_t{0, 3}, edge_t{0, 2}}}),
1660
1661 // 'node_0_0_interleaved'
1662 make_and_check(t, t.report(""), {{edge_t{0, 2}, edge_t{0, 3}, edge_t{0, 0}, edge_t{0, 1}}}),
1663
1664 // 'node_0_0_0_interleaved'
1665 make_and_check(t, t.report(""), {{edge_t{0, 1}, edge_t{0, 0}, edge_t{0, 4}, edge_t{0, 5}, edge_t{0, 2}, edge_t{0, 3}}}),
1666
1667 // 'node_node'
1668 make_and_check(t, t.report(""), {{}, {}}),
1669
1670 // 'node_1_node_0'
1671 make_and_check(t, t.report(""), {{edge_t{1, 0}}, {edge_t{0, 0}}}),
1672
1673 // 'node_0_1_node_0'
1674 make_and_check(t, t.report(""), {{edge_t{0, 1}, edge_t{0, 0}, edge_t{1, 0}}, {edge_t{0, 2}}}),
1675
1676 // 'node_0_node'
1677 make_and_check(t, t.report(""), {{edge_t{0, 1}, edge_t{0, 0}}, {}}),
1678
1679 // 'node_node_1'
1680 make_and_check(t, t.report(""), {{}, {edge_t{1, 1}, edge_t{1, 0}}}),
1681
1682 // 'node_node_1_1_interleaved'
1683 make_and_check(t, t.report(""), {{}, {edge_t{1, 2}, edge_t{1, 3}, edge_t{1, 0}, edge_t{1, 1}}}),
1684
1685 // 'node_node_1_1_1_interleaved'
1686 make_and_check(t, t.report(""), {{}, {edge_t{1, 1}, edge_t{1, 0}, edge_t{1, 4}, edge_t{1, 5}, edge_t{1, 2}, edge_t{1, 3}}}),
1687
1688 // 'node_1_node_1_1_1_0_interleaved'
1689 make_and_check(t, t.report(""), {{edge_t{1, 4}}, {edge_t{1, 1}, edge_t{1, 0}, edge_t{1, 5}, edge_t{1, 6}, edge_t{0, 0}, edge_t{1, 2}, edge_t{1, 3}}}),
1690
1691 // 'node_1_1_node_1_0_1_0_1_interleaved'
1692 make_and_check(t, t.report(""), {{edge_t{1, 4}, edge_t{1, 6}},
1693 {edge_t{1, 1}, edge_t{1, 0}, edge_t{1, 5}, edge_t{1, 7}, edge_t{0, 0}, edge_t{1, 2}, edge_t{0, 1}, edge_t{1, 3}}}),
1694
1695 // 'node_1_1_node_0_0'
1696 make_and_check(t, t.report(""), {{edge_t{1, 0}, edge_t{1, 1}}, {edge_t{0, 0}, edge_t{0, 1}}}),
1697
1698 // 'node_1pos1_1pos0_node_0pos1_0pos0'
1699 make_and_check(t, t.report(""), {{edge_t{1, 1}, edge_t{1, 0}}, {edge_t{0, 1}, edge_t{0, 0}}}),
1700
1701 // 'node_node_node'
1702 make_and_check(t, t.report(""), {{}, {}, {}}),
1703
1704 // 'node_1_node_0_node'
1705 make_and_check(t, t.report(""), {{edge_t{1, 0}}, {edge_t{0, 0}}, {}}),
1706
1707 // 'node_node_2_node_1'
1708 make_and_check(t, t.report(""), {{}, {edge_t{2, 0}}, {edge_t{1, 0}}}),
1709
1710 // 'node_1_node_0_2_node_1'
1711 make_and_check(t, t.report(""), {{edge_t{1, 0}}, {edge_t{0, 0}, edge_t{2, 0}}, {edge_t{1, 1}}}),
1712
1713 // 'node_1_node_0_2_node_1_0'
1714 make_and_check(t, t.report(""), {{edge_t{1, 0}, edge_t{2, 1}},
1715 {edge_t{0, 0}, edge_t{2, 0}},
1716 {edge_t{1, 1}, edge_t{0, 1}}}),
1717
1718 // 'node_node_1_node'
1719 make_and_check(t, t.report(""), {{}, {edge_t{1, 1}, edge_t{1, 0}}, {}}),
1720
1721 // 'node_1_node_0_1_node'
1722 make_and_check(t, t.report(""), {{edge_t{1, 0}}, {edge_t{0, 0}, edge_t{1, 2}, edge_t{1, 1}}, {}}),
1723
1724 // 'node_1_node_1_0_node'
1725 make_and_check(t, t.report(""), {{edge_t{1, 0}, edge_t{1, 3}},
1726 {edge_t{0, 0}, edge_t{1, 2}, edge_t{1, 1}, edge_t{0, 1}},
1727 {}}),
1728
1729 // 'node_1_node_1_0_2_node_1'
1730 make_and_check(t, t.report(""), {{edge_t{1, 0}, edge_t{1, 3}},
1731 {edge_t{0, 0}, edge_t{1, 2}, edge_t{1, 1}, edge_t{0, 1}, edge_t{2, 0}},
1732 {edge_t{1, 4}}}),
1733
1734 // 'node_1_node_0_1_2_node_1'
1735 make_and_check(t, t.report(""), {{edge_t{1, 0}},
1736 {edge_t{0, 0}, edge_t{1, 2}, edge_t{1, 1}, edge_t{2, 0}},
1737 {edge_t{1, 3}}}),
1738
1739 // 'node_2_node_node_0_2'
1740 make_and_check(t, t.report(""), {{edge_t{2, 0}}, {}, {edge_t{0, 0}, edge_t{2, 2}, edge_t{2, 1}}}),
1741
1742 // 'node_1_1_2_2_node_0_2_0_node_0_1_0'
1743 make_and_check(t, t.report(""), {{edge_t{1, 0}, edge_t{1, 2}, edge_t{2, 0}, edge_t{2, 2}},
1744 {edge_t{0, 0}, edge_t{2, 1}, edge_t{0, 1}},
1745 {edge_t{0, 2}, edge_t{1, 1}, edge_t{0, 3}}}),
1746
1747 // 'node_1_1_2_2_node_0_2_2_0_node_0_1_1_0'
1748 make_and_check(t, t.report(""), {{edge_t{1, 0}, edge_t{1, 3}, edge_t{2, 0}, edge_t{2, 3}},
1749 {edge_t{0, 0}, edge_t{2, 2}, edge_t{2, 1}, edge_t{0, 1}},
1750 {edge_t{0, 2}, edge_t{1, 2}, edge_t{1, 1}, edge_t{0, 3}}}),
1751
1752 // node_2_2_1_1_node_0_2_2_0_node_0_1_1_0
1753 make_and_check(t, t.report(""), {{edge_t{2, 0}, edge_t{2, 3}, edge_t{1, 0}, edge_t{1, 3}},
1754 {edge_t{0, 2}, edge_t{2, 2}, edge_t{2, 1}, edge_t{0, 3}},
1755 {edge_t{0, 0}, edge_t{1, 2}, edge_t{1, 1}, edge_t{0, 1}}}),
1756
1757 // 'node_3_1_node_0_2_node_1_node_0'
1758 make_and_check(t, t.report(""), {{edge_t{3, 0},edge_t{1, 0}},
1759 {edge_t{0, 1}, edge_t{2, 0}},
1760 {edge_t{1, 1}},
1761 {edge_t{0, 0}}}),
1762
1763 // 'node_1_node_0_node_3_node_2'
1764 make_and_check(t, t.report(""), {{edge_t{1, 0}}, {edge_t{0, 0}}, {edge_t{3, 0}}, {edge_t{2, 0}}}),
1765
1766 // 'node_2_node_3_node_0_node_1'
1767 make_and_check(t, t.report(""), {{edge_t{2, 0}}, {edge_t{3, 0}}, {edge_t{0, 0}}, {edge_t{1, 0}}})
1768 }
1769 };
1770 }
1771 };
1772}
graph_description
Convention: the indices following 'node' - separated by underscores - give the target node of the ass...
Definition: DynamicUndirectedEmbeddedGraphTestingUtilities.hpp:22
Utilities for checking regular semantics.
Facility to define tests via a graph comprising states of an object and transitions between them.
Definition: DynamicGraph.hpp:303
Definition: DynamicGraph.hpp:473
class template from which all concrete tests should derive.
Definition: FreeTestCore.hpp:144
Exposes elementary check methods, with the option to plug in arbitrary Extenders to compose functiona...
Definition: FreeCheckers.hpp:708
Definition: DynamicUndirectedEmbeddedGraphTestingUtilities.hpp:215
Definition: DynamicGraphTestingUtilities.hpp:173
Definition: StateTransitionUtilities.hpp:77