ocaml-containers/tests/data/t_graph.ml
2022-07-02 22:09:25 -04:00

68 lines
2.1 KiB
OCaml

module Test = (val Containers_testlib.make ~__FILE__())
open Test
open CCGraph;;
t @@ fun () ->
let l =
let tbl = mk_table ~eq:CCInt.equal 128 in
Traverse.Event.dfs ~tbl ~eq:CCInt.equal ~graph:divisors_graph (Iter.return 345614)
|> Iter.to_list in
let expected =
[`Enter (345614, 0, []); `Edge (345614, (), 172807, `Forward);
`Enter (172807, 1, [(345614, (), 172807)]); `Edge (172807, (), 1, `Forward);
`Enter (1, 2, [(172807, (), 1); (345614, (), 172807)]); `Exit 1; `Exit 172807;
`Edge (345614, (), 2, `Forward); `Enter (2, 3, [(345614, (), 2)]);
`Edge (2, (), 1, `Cross); `Exit 2; `Edge (345614, (), 1, `Cross);
`Exit 345614]
in
assert_equal expected l;
true;;
t @@ fun () ->
let tbl = mk_table ~eq:CCInt.equal 128 in
let l = topo_sort ~eq:CCInt.equal ~tbl ~graph:divisors_graph (Iter.return 42) in
List.for_all (fun (i,j) ->
let idx_i = CCList.find_idx ((=)i) l |> CCOption.get_exn_or "" |> fst in
let idx_j = CCList.find_idx ((=)j) l |> CCOption.get_exn_or "" |> fst in
idx_i < idx_j)
[ 42, 21; 14, 2; 3, 1; 21, 7; 42, 3];;
t @@ fun () ->
let tbl = mk_table ~eq:CCInt.equal 128 in
let l = topo_sort ~eq:CCInt.equal ~rev:true ~tbl ~graph:divisors_graph (Iter.return 42) in
List.for_all (fun (i,j) ->
let idx_i = CCList.find_idx ((=)i) l |> CCOption.get_exn_or "" |> fst in
let idx_j = CCList.find_idx ((=)j) l |> CCOption.get_exn_or "" |> fst in
idx_i > idx_j)
[ 42, 21; 14, 2; 3, 1; 21, 7; 42, 3];;
(* example from https://en.wikipedia.org/wiki/Strongly_connected_component *)
t @@ fun () ->
let set_eq ?(eq=(=)) l1 l2 = CCList.subset ~eq l1 l2 && CCList.subset ~eq l2 l1 in
let graph = of_list ~eq:CCString.equal
[ "a", "b"
; "b", "e"
; "e", "a"
; "b", "f"
; "e", "f"
; "f", "g"
; "g", "f"
; "b", "c"
; "c", "g"
; "c", "d"
; "d", "c"
; "d", "h"
; "h", "d"
; "h", "g"
] in
let tbl = mk_table ~eq:CCString.equal 128 in
let res = scc ~tbl ~graph (Iter.return "a") |> Iter.to_list in
assert_bool "scc"
(set_eq ~eq:(set_eq ?eq:None) res
[ [ "a"; "b"; "e" ]
; [ "f"; "g" ]
; [ "c"; "d"; "h" ]
]
);
true;;