コード例 #1
0
ファイル: api-dijkstra.c プロジェクト: dooglus/ccan
static void test_traversal1(void)
{
	struct traversal1_graphr t1gr;
	struct agar_state *sr;
	aga_icost_t cost;

	/* This is mostly about testing we correctly handle
	 * non-reachable nodes */
	traversal1_graphr_init(&t1gr);

	ok1(sr = agar_dijkstra_new(NULL, &t1gr.gr, int2ptr(1)));
	ok1(agar_dijkstra_path(sr, int2ptr(1),
			      &cost, NULL, NULL));
	ok1(cost == 0);
	ok1(agar_dijkstra_path(sr, int2ptr(2),
			      &cost, NULL, NULL));
	ok1(cost == 1);
	ok1(agar_dijkstra_path(sr, int2ptr(3),
			      &cost, NULL, NULL));
	ok1(cost == 1);
	ok1(agar_dijkstra_path(sr, int2ptr(4),
			      &cost, NULL, NULL));
	ok1(cost == 2);
	ok1(agar_dijkstra_path(sr, int2ptr(5),
			      &cost, NULL, NULL));
	ok1(cost == 2);
	ok1(agar_dijkstra_path(sr, int2ptr(6),
			      &cost, NULL, NULL));
	ok1(cost == 2);
	ok1(!agar_dijkstra_path(sr, int2ptr(7),
			       NULL, NULL, NULL));
	ok1(!agar_dijkstra_path(sr, int2ptr(8),
			       NULL, NULL, NULL));
	ok1(!agar_dijkstra_path(sr, int2ptr(9),
			       NULL, NULL, NULL));
	tal_free(sr);

	ok1(sr = agar_dijkstra_new(NULL, &t1gr.gr, int2ptr(9)));
	ok1(agar_dijkstra_path(sr, int2ptr(9),
			      &cost, NULL, NULL));
	ok1(cost == 0);
	ok1(agar_dijkstra_path(sr, int2ptr(8),
			      &cost, NULL, NULL));
	ok1(cost == 1);
	ok1(agar_dijkstra_path(sr, int2ptr(7),
			      &cost, NULL, NULL));
	ok1(cost == 1);
	ok1(agar_dijkstra_path(sr, int2ptr(6),
			      &cost, NULL, NULL));
	ok1(cost == 2);
	ok1(agar_dijkstra_path(sr, int2ptr(5),
			      &cost, NULL, NULL));
	ok1(cost == 2);
	ok1(agar_dijkstra_path(sr, int2ptr(4),
			      &cost, NULL, NULL));
	ok1(cost == 2);
	ok1(!agar_dijkstra_path(sr, int2ptr(3),
			       NULL, NULL, NULL));
	ok1(!agar_dijkstra_path(sr, int2ptr(2),
			       NULL, NULL, NULL));
	ok1(!agar_dijkstra_path(sr, int2ptr(1),
			       NULL, NULL, NULL));
	tal_free(sr);
}
コード例 #2
0
ファイル: api-dfs.c プロジェクト: Maxime2/ccan
int main(void)
{
	struct trivial_graphr tgr;
	struct parallel_graphr pgr;
	struct full_graphr fgr;
	struct chain_graphr cgr;
	struct grid_graphr ggr1, ggr2;
	struct error_graphr egr;
	struct traversal1_graphr t1gr;
	struct agar_state *sr;
	const void *nr;
	
	plan_tests(2 * 13 + 12 + 10);

	trivial_graphr_init(&tgr);
	test_dfs(&tgr.gr, 1, 1);

	parallel_graphr_init(&pgr, 3);
	test_dfs(&pgr.gr, 1, 1, 2);

	full_graphr_init(&fgr, 5);
	test_dfs(&fgr.gr, 1, 1, 2, 3, 4, 5);
	test_dfs(&fgr.gr, 3, 3, 1, 2, 4, 5);

	chain_graphr_init(&cgr, 8);
	test_dfs(&cgr.fgr.gr, 1, 1, 2, 3, 4, 5, 6, 7, 8);
	test_dfs(&cgr.fgr.gr, 8, 8, 7, 6, 5, 4, 3, 2, 1);
	test_dfs(&cgr.fgr.gr, 5, 5, 4, 3, 2, 1, 6, 7, 8);

	grid_graphr_init(&ggr1, 3, 3, true, true, false, false);
	test_dfs(&ggr1.gr, 1, 1, 2, 3, 6, 9, 5, 8, 4, 7);
	test_dfs(&ggr1.gr, 5, 5, 6, 9, 8);
	test_dfs(&ggr1.gr, 9, 9);

	grid_graphr_init(&ggr2, 3, 3, true, true, true, true);
	test_dfs(&ggr2.gr, 1, 1, 2, 3, 6, 9, 8, 7, 4, 5);
	test_dfs(&ggr2.gr, 5, 5, 6, 9, 8, 7, 4, 1, 2, 3);
	test_dfs(&ggr2.gr, 9, 9, 8, 7, 4, 5, 6, 3, 2, 1);

	error_graphr_init(&egr);
	test_dfs(&egr.gr, 1, 1, 2);
	ok((sr = agar_dfs_new(NULL, &egr.gr)), "started error traversal");
	ok1(agar_dfs_explore(sr, int2ptr(3), &nr));
	ok(ptr2int(nr) == 3, "Expected node #3, actually #%ld", ptr2int(nr));
	ok1(agar_dfs_explore(sr, nr, &nr));
	ok(ptr2int(nr) == 4, "Expected node #4, actually #%ld", ptr2int(nr));
	ok1(!agar_dfs_explore(sr, nr, &nr));
	ok(agar_error(sr) == -1, "Error is %d (expected -1)", agar_error(sr));
	ok1(!agar_dfs_explore(sr, nr, &nr));
	tal_free(sr);
	test_dfs(&egr.gr, 1, 1, 2);

	traversal1_graphr_init(&t1gr);
	test_dfs(&t1gr.gr, 1, 1, 2, 4, 5, 3, 6);
	test_dfs(&t1gr.gr, 9, 9, 8, 6, 5, 7, 4);

	ok1((sr = agar_dfs_new(NULL, &t1gr.gr)));
	test_dfs_partial(sr, 1, 1, 2, 4, 5, 3, 6);
	test_dfs_partial(sr, 9, 9, 8, 7);
	tal_free(sr);

	ok1((sr = agar_dfs_new(NULL, &t1gr.gr)));
	test_dfs_partial(sr, 9, 9, 8, 6, 5, 7, 4);
	test_dfs_partial(sr, 1, 1, 2, 3);
	tal_free(sr);

	return exit_status();
}