17namespace sequoia::testing
19 namespace undirected_embedded_graph
51 node_0_0_0_interleaved,
78 node_node_1_1_interleaved,
87 node_node_1_1_1_interleaved,
96 node_1_node_1_1_1_0_interleaved,
105 node_1_1_node_1_0_1_0_1_interleaved,
112 node_1pos1_1pos0_node_0pos1_0pos0,
124 node_1_node_0_2_node_1,
127 node_1_node_0_2_node_1_0,
137 node_1_node_0_1_node,
144 node_1_node_1_0_node,
150 node_1_node_1_0_2_node_1,
155 node_1_node_0_1_2_node_1,
160 node_2_node_node_0_2,
169 node_1_1_2_2_node_0_2_0_node_0_1_0,
178 node_1_1_2_2_node_0_2_2_0_node_0_1_1_0,
187 node_2_2_1_1_node_2pos3_node_1,
195 node_3_1_node_0_2_node_1_node_0,
198 node_1_node_0_node_3_node_2,
201 node_2_node_3_node_0_node_1,
211 class EdgeStorageConfig,
212 class NodeWeightStorage
218 using edge_t =
typename graph_t::edge_init_type;
219 using edges_equivalent_t = std::initializer_list<std::initializer_list<edge_t>>;
224 auto trg{make_transition_graph(t)};
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);
237 static graph_t make_and_check(
regular_test& t, std::string_view description, edges_equivalent_t init)
242 static void check_initialization_exceptions(
regular_test& t)
244 using namespace maths;
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}}}; });
254 t.check_exception_thrown<std::logic_error>(
"Mismatched complimentary indices", [](){
return graph_t{{{1, 0}, {0, 2}, {0, 1}}, {{0, 1}}}; });
258 static transition_graph make_transition_graph(
regular_test& t)
260 using namespace undirected_embedded_graph;
262 check_initialization_exceptions(t);
264 return transition_graph{
268 graph_description::empty,
271 t.check_exception_thrown<std::out_of_range>(
"cbegin_edges throws for empty graph", [&g]() {
return g.cbegin_edges(0); });
276 graph_description::empty,
279 t.check_exception_thrown<std::out_of_range>(
"cend_edges throws for empty graph", [&g]() {
return g.cend_edges(0); });
284 graph_description::empty,
287 t.check_exception_thrown<std::out_of_range>(
"crbegin_edges throws for empty graph", [&g]() {
return g.crbegin_edges(0); });
292 graph_description::empty,
295 t.check_exception_thrown<std::out_of_range>(
"crend_edges throws for empty graph", [&g]() {
return g.crend_edges(0); });
300 graph_description::empty,
303 t.check_exception_thrown<std::out_of_range>(
"cedges throws for empty graph", [&g]() {
return g.cedges(0); });
308 graph_description::empty,
311 t.check_exception_thrown<std::out_of_range>(
"swapping nodes throws for empty graph", [g{g}]()
mutable { g.swap_nodes(0, 0); });
316 graph_description::empty,
319 t.check_exception_thrown<std::out_of_range>(
"joining nodes throws for empty graph", [g{g}]()
mutable { g.join(0, 0); });
324 graph_description::empty,
325 t.report(
"Clear empty graph"),
332 graph_description::node,
333 t.report(
"Add node to empty graph"),
335 t.check(equality,
"Index of added node is 0", g.add_node(), 0uz);
340 graph_description::node,
341 t.report(
"insert node into empty graph"),
343 t.check(equality,
"Index of added node is 0", g.insert_node(0), 0uz);
350 graph_description::node,
353 t.check_exception_thrown<std::out_of_range>(
"cbegin_edges throws when index is out of range", [&g]() {
return g.cbegin_edges(1); });
358 graph_description::node,
361 t.check_exception_thrown<std::out_of_range>(
"cend_edges throws when index is out of range", [&g]() {
return g.cend_edges(1); });
366 graph_description::node,
369 t.check_exception_thrown<std::out_of_range>(
"crbegin_edges throws when index is out of range", [&g]() {
return g.crbegin_edges(1); });
374 graph_description::node,
377 t.check_exception_thrown<std::out_of_range>(
"crend_edges throws when index is out of range", [&g]() {
return g.crend_edges(1); });
382 graph_description::node,
385 t.check_exception_thrown<std::out_of_range>(
"cedges throws when index is out of range", [&g]() {
return g.cedges(1); });
390 graph_description::node,
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); });
398 graph_description::node,
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); });
406 graph_description::node,
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); });
414 graph_description::node,
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); });
422 graph_description::node,
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); });
430 graph_description::empty,
431 t.report(
"Clear graph"),
438 graph_description::empty,
439 t.report(
"Erase node to give empty graph"),
446 graph_description::node,
447 t.report(
"Attempt to erase edge past the end"),
449 g.erase_edge(g.cend_edges(0));
454 graph_description::node_0,
455 t.report(
"Add loop"),
462 graph_description::node_node,
463 t.report(
"Add second node"),
465 t.check(equality,
"Index of added node is 1", g.add_node(), 1uz);
470 graph_description::node_node,
471 t.report(
"Insert second node"),
473 t.check(equality,
"Index of added node is 0", g.insert_node(0), 0uz);
478 graph_description::node_node,
479 t.report(
"Insert second node at end"),
481 t.check(equality,
"Index of added node is 1", g.insert_node(1), 1uz);
486 graph_description::node,
487 t.report(
"Swap node with self"),
496 graph_description::empty,
497 t.report(
"Clear graph"),
504 graph_description::node,
505 t.report(
"Remove loop"),
507 g.erase_edge(g.cbegin_edges(0));
512 graph_description::node_0_0,
513 t.report(
"Add a second loop"),
520 graph_description::node_0_0_interleaved,
521 t.report(
"Interleave a second loop"),
523 g.insert_join(g.cbegin_edges(0)+1, 3);
528 graph_description::node_0_0_interleaved,
529 t.report(
"Interleave a second loop, backwards"),
531 g.insert_join(g.cbegin_edges(0) + 1, 0);
536 graph_description::node_node_1,
537 t.report(
"Insert node"),
539 t.check(equality,
"Index of added node is 0", g.insert_node(0), 0uz);
544 graph_description::node_0_node,
545 t.report(
"Insert node at end"),
547 t.check(equality,
"Index of added node is 1", g.insert_node(1), 1uz);
552 graph_description::node_0,
553 t.report(
"Swap node with self"),
562 graph_description::empty,
563 t.report(
"Clear graph"),
570 graph_description::empty,
571 t.report(
"Erase node 0"),
578 graph_description::node_0,
579 t.report(
"Remove first loop"),
581 g.erase_edge(g.cbegin_edges(0));
586 graph_description::node_0,
587 t.report(
"Remove first loop via second insertion"),
589 g.erase_edge(g.cbegin_edges(0) + 1);
594 graph_description::node_0,
595 t.report(
"Remove second loop"),
597 g.erase_edge(std::ranges::next(g.cbegin_edges(0), 2));
602 graph_description::node_0,
603 t.report(
"Remove second loop via second insertion"),
605 g.erase_edge(std::ranges::next(g.cbegin_edges(0), 3));
612 graph_description::empty,
613 t.report(
"Clear graph"),
620 graph_description::empty,
621 t.report(
"Erase node 0"),
628 graph_description::node_0,
629 t.report(
"Remove first loop via first insertion"),
631 g.erase_edge(g.cbegin_edges(0));
636 graph_description::node_0_0_0_interleaved,
637 t.report(
"Insert a third loop"),
639 g.insert_join(g.cbegin_edges(0), ++g.cbegin_edges(0));
645 graph_description::node_0_0_0_interleaved,
646 t.report(
"Insert a third loop, inverted"),
648 g.insert_join(g.cbegin_edges(0), g.cbegin_edges(0));
653 graph_description::node_node_1_1_interleaved,
654 t.report(
"Insert node"),
663 graph_description::node_0_0_interleaved,
664 t.report(
"Remove first loop via first insertion"),
666 g.erase_edge(g.cbegin_edges(0));
671 graph_description::node_0_0_interleaved,
672 t.report(
"Remove first loop via second insertion"),
674 g.erase_edge(g.cbegin_edges(0)+1);
679 graph_description::node_0_0,
680 t.report(
"Remove second loop via first insertion"),
682 g.erase_edge(g.cbegin_edges(0)+2);
687 graph_description::node_0_0,
688 t.report(
"Remove second loop via second insertion"),
690 g.erase_edge(g.cbegin_edges(0)+4);
695 graph_description::node_0_0,
696 t.report(
"Remove third loop via first insertion"),
698 g.erase_edge(g.cbegin_edges(0) + 3);
703 graph_description::node_0_0,
704 t.report(
"Remove third loop via second insertion"),
706 g.erase_edge(g.cbegin_edges(0) + 5);
711 graph_description::node_node_1_1_1_interleaved,
712 t.report(
"Insert node"),
721 graph_description::empty,
722 t.report(
"Clear graph"),
729 graph_description::node,
730 t.report(
"Erase node 0"),
737 graph_description::node,
738 t.report(
"Erase node 1"),
745 graph_description::node_1_node_0,
746 t.report(
"Join nodes 0,1"),
755 graph_description::empty,
756 t.report(
"Clear graph"),
763 graph_description::node,
764 t.report(
"Erase node 0"),
771 graph_description::node,
772 t.report(
"Erase node 1"),
779 graph_description::node_1_node_0,
780 t.report(
"Swap nodes {0,1}"),
787 graph_description::node_1_node_0,
788 t.report(
"Swap nodes {1,0}"),
795 graph_description::node_1_1_node_0_0,
796 t.report(
"Join {0,1}"),
805 graph_description::empty,
806 t.report(
"Clear graph"),
813 graph_description::node,
814 t.report(
"Erase node 0"),
821 graph_description::node_0,
822 t.report(
"Erase node 1"),
829 graph_description::node_1_node_0,
830 t.report(
"Remove loop"),
832 g.erase_edge(g.cbegin_edges(0));
837 graph_description::node_0_node,
838 t.report(
"Remove link"),
840 g.erase_edge(std::ranges::next(g.cbegin_edges(0), 2));
847 graph_description::empty,
848 t.report(
"Clear graph"),
855 graph_description::node_node,
856 t.report(
"Remove link"),
858 g.erase_edge(g.cbegin_edges(0));
863 graph_description::node_node_1_node,
864 t.report(
"Insert node"),
866 t.check(equality,
"Index of added node is 0", g.insert_node(0), 0uz);
871 graph_description::node_node_1,
872 t.report(
"Swap nodes"),
881 graph_description::empty,
882 t.report(
"Clear graph"),
889 graph_description::node_0,
890 t.report(
"Erase node 0"),
897 graph_description::node,
898 t.report(
"Erase node 1"),
905 graph_description::node_node,
906 t.report(
"Remove link"),
908 g.erase_edge(g.cbegin_edges(1));
913 graph_description::node_0_node,
914 t.report(
"swap nodes"),
923 graph_description::node_0_0_interleaved,
924 t.report(
"Erase node 0"),
933 graph_description::node_0_0_0_interleaved,
934 t.report(
"Erase node 0"),
941 graph_description::node_1_node_1_1_1_0_interleaved,
942 t.report(
"Join {0, 1; 4}"),
944 g.insert_join(g.cbegin_edges(0), g.cbegin_edges(1) + 4);
951 graph_description::node_0_0_0_interleaved,
952 t.report(
"Erase node 0"),
959 graph_description::node_1_1_node_1_0_1_0_1_interleaved,
960 t.report(
"Join {0(1), 1(6)}"),
962 g.insert_join(g.cbegin_edges(0)+1, g.cbegin_edges(1) + 6);
969 graph_description::node_1_node_1_1_1_0_interleaved,
970 t.report(
"Remove link {1(6), 0(1)}"),
972 g.erase_edge(g.cbegin_edges(1) + 6);
977 graph_description::node_1_node_1_1_1_0_interleaved,
978 t.report(
"Remove link {0(1), 1(6)}"),
980 g.erase_edge(g.cbegin_edges(0) + 1);
985 graph_description::node_0_0_0_interleaved,
986 t.report(
"Erase node 0"),
995 graph_description::empty,
996 t.report(
"Clear graph"),
1003 graph_description::node,
1004 t.report(
"Erase node 0"),
1011 graph_description::node,
1012 t.report(
"Erase node 1"),
1019 graph_description::node_1_node_0,
1020 t.report(
"Erase node 0 zeroth link"),
1022 g.erase_edge(g.cbegin_edges(0));
1027 graph_description::node_1_node_0,
1028 t.report(
"Erase node 0 first link"),
1030 g.erase_edge(g.cbegin_edges(0)+1);
1037 graph_description::empty,
1038 t.report(
"Clear graph"),
1045 graph_description::node,
1046 t.report(
"Erase node 0"),
1053 graph_description::node,
1054 t.report(
"Erease node 1"),
1061 graph_description::node_1_node_0,
1062 t.report(
"Erase node 0 link"),
1064 g.erase_edge(g.cbegin_edges(0));
1069 graph_description::node_1_node_0,
1070 t.report(
"Erase node 1 link"),
1072 g.erase_edge(g.cbegin_edges(1));
1079 graph_description::empty,
1080 t.report(
"Clear graph"),
1087 graph_description::node_node,
1088 t.report(
"Erase node 0"),
1095 graph_description::node_node,
1096 t.report(
"Erase node 1"),
1103 graph_description::node_node,
1104 t.report(
"Erase node 2"),
1111 graph_description::node_1_node_0_node,
1112 t.report(
"Join {0,1}"),
1119 graph_description::node_node_2_node_1,
1120 t.report(
"Join {2,1}"),
1129 graph_description::empty,
1130 t.report(
"Clear graph"),
1137 graph_description::node_node,
1138 t.report(
"Erase node 0"),
1145 graph_description::node_node,
1146 t.report(
"Erase node 1"),
1153 graph_description::node_1_node_0,
1154 t.report(
"Erase node 2"),
1161 graph_description::node_node_node,
1162 t.report(
"Remove link {0,1}"),
1164 g.erase_edge(g.cbegin_edges(0));
1169 graph_description::node_1_node_0_2_node_1,
1170 t.report(
"Join {2,1}"),
1177 graph_description::node_1_node_0_2_node_1,
1178 t.report(
"Join {2,1}"),
1185 graph_description::node_node_2_node_1,
1186 t.report(
"Swap nodes {0,2}"),
1193 graph_description::node_node_2_node_1,
1194 t.report(
"Swap nodes {2,0}"),
1203 graph_description::empty,
1204 t.report(
"Clear graph"),
1211 graph_description::node_1_node_0,
1212 t.report(
"Erase node 0"),
1219 graph_description::node_node,
1220 t.report(
"Erase node 1"),
1227 graph_description::node_node,
1228 t.report(
"Erase node 2"),
1235 graph_description::node_node_node,
1236 t.report(
"Remove link {2,1}"),
1238 g.erase_edge(g.cbegin_edges(2));
1243 graph_description::node_1_node_0_2_node_1,
1244 t.report(
"Join {0,1}"),
1246 g.insert_join(g.cbegin_edges(0), g.cbegin_edges(1));
1251 graph_description::node_1_node_0_node,
1252 t.report(
"Swap nodes {0,2}"),
1259 graph_description::node_1_node_0_node,
1260 t.report(
"Swap nodes {2,0}"),
1269 graph_description::empty,
1270 t.report(
"Clear graph"),
1277 graph_description::node_1_node_0,
1278 t.report(
"Erase node 0"),
1285 graph_description::node_node,
1286 t.report(
"Erase node 1"),
1293 graph_description::node_1_node_0,
1294 t.report(
"Erase node 2"),
1301 graph_description::node_1_node_0_node,
1302 t.report(
"Remove link {1,2}"),
1304 g.erase_edge(++g.cbegin_edges(1));
1311 graph_description::empty,
1312 t.report(
"Clear graph"),
1319 graph_description::node_1_node_0,
1320 t.report(
"Erase node 0"),
1327 graph_description::node_1_node_0,
1328 t.report(
"Erase node 1"),
1335 graph_description::node_1_node_0,
1336 t.report(
"Erase node 2"),
1343 graph_description::node_1_node_0_2_node_1,
1344 t.report(
"Remove {2,0}"),
1346 g.erase_edge(++g.cbegin_edges(2));
1353 graph_description::empty,
1354 t.report(
"Clear graph"),
1361 graph_description::node_0_node,
1362 t.report(
"Erase node 0"),
1369 graph_description::node_node,
1370 t.report(
"Erase node 1"),
1377 graph_description::node_node_1,
1378 t.report(
"Erase node 2"),
1387 graph_description::node_0_node,
1388 t.report(
"Erase node 0"),
1395 graph_description::node_node,
1396 t.report(
"Erase node 1"),
1403 graph_description::node_node_1_node,
1404 t.report(
"Remove {0,1}"),
1406 g.erase_edge(g.cbegin_edges(0));
1411 graph_description::node_1_node_1_0_node,
1412 t.report(
"Join {1,0}"),
1421 graph_description::node_0_node,
1422 t.report(
"Erase node 0"),
1429 graph_description::node_node,
1430 t.report(
"Erase node 1"),
1437 graph_description::node_1_node_0_1_node,
1438 t.report(
"Remove {1,0}"),
1440 g.erase_edge(g.cbegin_edges(1)+3);
1445 graph_description::node_1_node_1_0_2_node_1,
1446 t.report(
"Join {1,2}"),
1455 graph_description::node_0_1_node_0,
1456 t.report(
"Erase node 0"),
1463 graph_description::node_node,
1464 t.report(
"Erase node 1"),
1471 graph_description::node_1_node_0_1_2_node_1,
1472 t.report(
"Remove {1,0}"),
1474 g.erase_edge(g.cbegin_edges(1)+3);
1479 graph_description::node_1_node_1_0_node,
1480 t.report(
"Remove {1,2}"),
1482 g.erase_edge(g.cbegin_edges(1)+4);
1489 graph_description::node_1_node_0_2_node_1,
1490 t.report(
"Remove {1,1}"),
1492 g.erase_edge(g.cbegin_edges(1)+2);
1499 graph_description::node_1_node_0_1_node,
1500 t.report(
"Swap {1,2}"),
1509 graph_description::node_1_node_0,
1510 t.report(
"Erase node 0"),
1517 graph_description::node_1_1_node_0_0,
1518 t.report(
"Erase node 1"),
1525 graph_description::node_1_1_node_0_0,
1526 t.report(
"Erase node 2"),
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}"),
1536 g.insert_join(g.cbegin_edges(2)+1, g.cbegin_edges(1)+2);
1543 graph_description::node_1pos1_1pos0_node_0pos1_0pos0,
1544 t.report(
"Erase node 0"),
1551 graph_description::node_1_1_node_0_0,
1552 t.report(
"Erase node 1"),
1559 graph_description::node_1_1_node_0_0,
1560 t.report(
"Erase node 2"),
1567 graph_description::node_2_2_1_1_node_2pos3_node_1,
1568 t.report(
"Swap {1,2}"),
1575 graph_description::node_2_2_1_1_node_2pos3_node_1,
1576 t.report(
"Swap {2,1}"),
1585 graph_description::node_1_1_2_2_node_0_2_2_0_node_0_1_1_0,
1586 t.report(
"Swap {1,2}"),
1593 graph_description::node_1_1_2_2_node_0_2_2_0_node_0_1_1_0,
1594 t.report(
"Swap {2,1}"),
1603 graph_description::node_1_node_0_node,
1604 t.report(
"Erase node 0"),
1613 graph_description::node_2_node_3_node_0_node_1,
1614 t.report(
"Swap {2,1}"),
1621 graph_description::node_2_node_3_node_0_node_1,
1622 t.report(
"Swap {0,3}"),
1631 graph_description::node_1_node_0_node_3_node_2,
1632 t.report(
"Swap {2,1}"),
1639 graph_description::node_1_node_0_node_3_node_2,
1640 t.report(
"Swap {0,3}"),
1650 make_and_check(t, t.report(
""), {}),
1653 make_and_check(t, t.report(
""), {{}}),
1656 make_and_check(t, t.report(
""), {{edge_t{0, 1}, edge_t{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}}}),
1662 make_and_check(t, t.report(
""), {{edge_t{0, 2}, edge_t{0, 3}, edge_t{0, 0}, edge_t{0, 1}}}),
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}}}),
1668 make_and_check(t, t.report(
""), {{}, {}}),
1671 make_and_check(t, t.report(
""), {{edge_t{1, 0}}, {edge_t{0, 0}}}),
1674 make_and_check(t, t.report(
""), {{edge_t{0, 1}, edge_t{0, 0}, edge_t{1, 0}}, {edge_t{0, 2}}}),
1677 make_and_check(t, t.report(
""), {{edge_t{0, 1}, edge_t{0, 0}}, {}}),
1680 make_and_check(t, t.report(
""), {{}, {edge_t{1, 1}, edge_t{1, 0}}}),
1683 make_and_check(t, t.report(
""), {{}, {edge_t{1, 2}, edge_t{1, 3}, edge_t{1, 0}, edge_t{1, 1}}}),
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}}}),
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}}}),
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}}}),
1696 make_and_check(t, t.report(
""), {{edge_t{1, 0}, edge_t{1, 1}}, {edge_t{0, 0}, edge_t{0, 1}}}),
1699 make_and_check(t, t.report(
""), {{edge_t{1, 1}, edge_t{1, 0}}, {edge_t{0, 1}, edge_t{0, 0}}}),
1702 make_and_check(t, t.report(
""), {{}, {}, {}}),
1705 make_and_check(t, t.report(
""), {{edge_t{1, 0}}, {edge_t{0, 0}}, {}}),
1708 make_and_check(t, t.report(
""), {{}, {edge_t{2, 0}}, {edge_t{1, 0}}}),
1711 make_and_check(t, t.report(
""), {{edge_t{1, 0}}, {edge_t{0, 0}, edge_t{2, 0}}, {edge_t{1, 1}}}),
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}}}),
1719 make_and_check(t, t.report(
""), {{}, {edge_t{1, 1}, edge_t{1, 0}}, {}}),
1722 make_and_check(t, t.report(
""), {{edge_t{1, 0}}, {edge_t{0, 0}, edge_t{1, 2}, edge_t{1, 1}}, {}}),
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}},
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}},
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}},
1740 make_and_check(t, t.report(
""), {{edge_t{2, 0}}, {}, {edge_t{0, 0}, edge_t{2, 2}, edge_t{2, 1}}}),
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}}}),
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}}}),
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}}}),
1758 make_and_check(t, t.report(
""), {{edge_t{3, 0},edge_t{1, 0}},
1759 {edge_t{0, 1}, edge_t{2, 0}},
1764 make_and_check(t, t.report(
""), {{edge_t{1, 0}}, {edge_t{0, 0}}, {edge_t{3, 0}}, {edge_t{2, 0}}}),
1767 make_and_check(t, t.report(
""), {{edge_t{2, 0}}, {edge_t{3, 0}}, {edge_t{0, 0}}, {edge_t{1, 0}}})
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