7 #include <ccan/tap/tap.h>
8 #include <ccan/tal/tal.h>
9 #include <ccan/array_size/array_size.h>
11 #include <ccan/agar/agar.h>
13 #include "simple-graphr.h"
15 static void test_trivial(void)
17 struct trivial_graphr tgr;
18 struct agar_state *sr;
22 trivial_graphr_init(&tgr);
24 ok1(sr = agar_dijkstra_new(NULL, &tgr.gr, int2ptr(1)));
25 ok1(agar_dijkstra_step(sr, &node));
26 ok1(ptr2int(node) == 1);
27 ok1(!agar_dijkstra_step(sr, &node));
28 ok1(agar_dijkstra_path(sr, int2ptr(1), &cost, NULL, NULL));
33 static void test_parallel(void)
35 struct parallel_graphr pgr;
36 struct agar_state *sr;
40 parallel_graphr_init(&pgr, 3);
42 ok1(sr = agar_dijkstra_new(NULL, &pgr.gr, int2ptr(1)));
43 ok1(agar_dijkstra_step(sr, &node));
44 ok1(ptr2int(node) == 1);
45 ok1(agar_dijkstra_step(sr, &node));
46 ok1(ptr2int(node) == 2);
47 ok1(!agar_dijkstra_step(sr, &node));
48 ok1(agar_dijkstra_path(sr, int2ptr(1), &cost, NULL, NULL));
50 ok1(agar_dijkstra_path(sr, int2ptr(2), &cost, &node, NULL));
52 ok1(node == int2ptr(1));
55 ok1(sr = agar_dijkstra_new(NULL, &pgr.gr, int2ptr(2)));
56 ok1(agar_dijkstra_step(sr, &node));
57 ok1(ptr2int(node) == 2);
58 ok1(!agar_dijkstra_step(sr, &node));
59 ok1(agar_dijkstra_path(sr, int2ptr(2), &cost, NULL, NULL));
61 ok1(!agar_dijkstra_path(sr, int2ptr(1), NULL, NULL, NULL));
67 static void test_full(void)
69 struct full_graphr fgr;
72 full_graphr_init(&fgr, FULL_LEN);
74 for (i = 1; i <= FULL_LEN; i++) {
75 struct agar_state *sr;
77 ok1(sr = agar_dijkstra_new(NULL, &fgr.gr, int2ptr(i)));
79 for (j = 1; j <= FULL_LEN; j++) {
81 const void *node, *edge;
83 ok1(agar_dijkstra_path(sr, int2ptr(j),
84 &cost, &node, &edge));
89 ok1(node == int2ptr(i));
90 ok1(edge == int2ptr(j));
100 static void test_chain(void)
102 struct chain_graphr cgr;
105 chain_graphr_init(&cgr, CHAIN_LEN);
107 for (i = 1; i <= CHAIN_LEN; i++) {
108 struct agar_state *sr;
110 ok1(sr = agar_dijkstra_new(NULL, &cgr.fgr.gr, int2ptr(i)));
112 for (j = 1; j <= CHAIN_LEN; j++) {
115 ok1(agar_dijkstra_path(sr, int2ptr(j),
117 ok1(cost == labs(i - j));
124 static void test_error(void)
126 struct error_graphr egr;
127 struct agar_state *sr;
130 error_graphr_init(&egr);
132 ok1(sr = agar_dijkstra_new(NULL, &egr.gr, int2ptr(1)));
133 ok1(agar_dijkstra_path(sr, int2ptr(1), &cost, NULL, NULL));
135 ok1(agar_dijkstra_path(sr, int2ptr(2), &cost, NULL, NULL));
137 ok1(!agar_dijkstra_path(sr, int2ptr(3), &cost, NULL, NULL));
138 ok1(!agar_dijkstra_path(sr, int2ptr(4), &cost, NULL, NULL));
141 ok1(sr = agar_dijkstra_new(NULL, &egr.gr, int2ptr(3)));
142 ok1(agar_dijkstra_path(sr, int2ptr(3), &cost, NULL, NULL));
144 ok1(!agar_dijkstra_path(sr, int2ptr(4), &cost, NULL, NULL));
145 ok1(agar_error(sr) == -1);
149 static void test_traversal1(void)
151 struct traversal1_graphr t1gr;
152 struct agar_state *sr;
155 /* This is mostly about testing we correctly handle
156 * non-reachable nodes */
157 traversal1_graphr_init(&t1gr);
159 ok1(sr = agar_dijkstra_new(NULL, &t1gr.gr, int2ptr(1)));
160 ok1(agar_dijkstra_path(sr, int2ptr(1),
163 ok1(agar_dijkstra_path(sr, int2ptr(2),
166 ok1(agar_dijkstra_path(sr, int2ptr(3),
169 ok1(agar_dijkstra_path(sr, int2ptr(4),
172 ok1(agar_dijkstra_path(sr, int2ptr(5),
175 ok1(agar_dijkstra_path(sr, int2ptr(6),
178 ok1(!agar_dijkstra_path(sr, int2ptr(7),
180 ok1(!agar_dijkstra_path(sr, int2ptr(8),
182 ok1(!agar_dijkstra_path(sr, int2ptr(9),
186 ok1(sr = agar_dijkstra_new(NULL, &t1gr.gr, int2ptr(9)));
187 ok1(agar_dijkstra_path(sr, int2ptr(9),
190 ok1(agar_dijkstra_path(sr, int2ptr(8),
193 ok1(agar_dijkstra_path(sr, int2ptr(7),
196 ok1(agar_dijkstra_path(sr, int2ptr(6),
199 ok1(agar_dijkstra_path(sr, int2ptr(5),
202 ok1(agar_dijkstra_path(sr, int2ptr(4),
205 ok1(!agar_dijkstra_path(sr, int2ptr(3),
207 ok1(!agar_dijkstra_path(sr, int2ptr(2),
209 ok1(!agar_dijkstra_path(sr, int2ptr(1),
217 + FULL_LEN * (FULL_LEN*4 - 1)
218 + CHAIN_LEN * (1 + CHAIN_LEN*2)
228 return exit_status();