mirror of
https://github.com/c-cube/ocaml-containers.git
synced 2025-12-06 11:15:31 -05:00
79 lines
1.9 KiB
OCaml
79 lines
1.9 KiB
OCaml
|
|
open OUnit
|
|
|
|
module B = Behavior
|
|
|
|
let lwt_get fut = match Lwt.state fut with
|
|
| Lwt.Sleep
|
|
| Lwt.Fail _ -> None
|
|
| Lwt.Return x -> Some x
|
|
|
|
let test_do () =
|
|
let r = ref false in
|
|
let t = B.do_succeed (fun () -> r := true) in
|
|
let res = B.run t in
|
|
OUnit.assert_equal true !r;
|
|
OUnit.assert_equal (Some true) (lwt_get res);
|
|
()
|
|
|
|
let test_seq () =
|
|
let l = ref [] in
|
|
(* add int to [l] *)
|
|
let add x = l := x :: !l in
|
|
let t = B.sequence
|
|
[ B.do_ (fun () -> add 3; true);
|
|
B.do_ (fun () -> add 2; true);
|
|
B.test (fun () -> List.length !l = 2);
|
|
B.do_ (fun () -> add 1; true);
|
|
] in
|
|
let res = B.run t in
|
|
OUnit.assert_equal [1;2;3] !l;
|
|
OUnit.assert_equal (Some true) (lwt_get res);
|
|
()
|
|
|
|
let test_wait () =
|
|
let e, send_e = Lwt.wait () in
|
|
let t = B.run (B.sequence [B.wait_ e; B.succeed]) in
|
|
OUnit.assert_equal None (lwt_get t);
|
|
Lwt.wakeup send_e ();
|
|
OUnit.assert_equal (Some true) (lwt_get t);
|
|
()
|
|
|
|
let test_parallel () =
|
|
(* forall fails *)
|
|
let e, send_e = Lwt.wait () in
|
|
let t =
|
|
B.parallel ~strat:B.PSForall
|
|
[ B.sequence [B.wait_ e; B.succeed];
|
|
B.fail
|
|
] in
|
|
let t = B.run t in
|
|
let res = Lwt_main.run
|
|
(let open Lwt in
|
|
choose [t; Lwt_unix.sleep 0.1 >>= fun () -> (Lwt.wakeup send_e (); return true)])
|
|
in
|
|
OUnit.assert_equal false res;
|
|
(* exists succeeds *)
|
|
let e, send_e = Lwt.wait () in
|
|
let t =
|
|
B.parallel ~strat:B.PSExists
|
|
[ B.sequence [B.wait_ e; B.succeed];
|
|
B.fail
|
|
] in
|
|
let t = B.run t in
|
|
let res = Lwt_main.run
|
|
(let open Lwt in
|
|
choose [t; Lwt_unix.sleep 0.1 >>= fun () -> (Lwt.wakeup send_e ();
|
|
Lwt_unix.sleep 0.1 >>= (fun () -> return true))])
|
|
in
|
|
OUnit.assert_equal true res;
|
|
()
|
|
|
|
|
|
let suite =
|
|
"test_behavior" >:::
|
|
[ "test_do" >:: test_do;
|
|
"test_seq" >:: test_seq;
|
|
"test_wait" >:: test_wait;
|
|
"test_parallel" >:: test_parallel;
|
|
]
|