mirror of
https://github.com/c-cube/ocaml-containers.git
synced 2025-12-06 19:25:28 -05:00
merge remaining tests as qtest, remove lwt stuff including bench_io
This commit is contained in:
parent
507fe33086
commit
ed31060d7d
11 changed files with 76 additions and 349 deletions
20
Makefile
20
Makefile
|
|
@ -79,16 +79,10 @@ QTESTABLE=$(filter-out $(DONTTEST), \
|
||||||
$(wildcard src/threads/*.mli) \
|
$(wildcard src/threads/*.mli) \
|
||||||
)
|
)
|
||||||
|
|
||||||
QTESTABLE_LWT=$(filter-out $(DONTTEST), \
|
|
||||||
$(wildcard src/lwt/*.ml) \
|
|
||||||
$(wildcard src/lwt/*.mli) \
|
|
||||||
)
|
|
||||||
|
|
||||||
qtest-clean:
|
qtest-clean:
|
||||||
@rm -rf qtest/
|
@rm -rf qtest/
|
||||||
|
|
||||||
QTEST_PREAMBLE='open CCFun;; '
|
QTEST_PREAMBLE='open CCFun;; '
|
||||||
QTEST_LWT_PREAMBLE=$(QTEST_PREAMBLE)
|
|
||||||
|
|
||||||
#qtest-build: qtest-clean build
|
#qtest-build: qtest-clean build
|
||||||
# @mkdir -p qtest
|
# @mkdir -p qtest
|
||||||
|
|
@ -108,15 +102,6 @@ qtest-gen:
|
||||||
else touch qtest/run_qtest.ml ; \
|
else touch qtest/run_qtest.ml ; \
|
||||||
fi
|
fi
|
||||||
|
|
||||||
qtest-lwt-gen:
|
|
||||||
@mkdir -p qtest/lwt/
|
|
||||||
@if which qtest > /dev/null ; then \
|
|
||||||
qtest extract --preamble $(QTEST_LWT_PREAMBLE) \
|
|
||||||
-o qtest/lwt/run_qtest_lwt.ml \
|
|
||||||
$(QTESTABLE_LWT) 2> /dev/null ; \
|
|
||||||
else touch qtest/lwt/run_qtest_lwt.ml ; \
|
|
||||||
fi
|
|
||||||
|
|
||||||
push-stable:
|
push-stable:
|
||||||
git checkout stable
|
git checkout stable
|
||||||
git merge master -m 'merge from master'
|
git merge master -m 'merge from master'
|
||||||
|
|
@ -128,11 +113,6 @@ push-stable:
|
||||||
clean-generated:
|
clean-generated:
|
||||||
rm **/*.{mldylib,mlpack,mllib} myocamlbuild.ml -f
|
rm **/*.{mldylib,mlpack,mllib} myocamlbuild.ml -f
|
||||||
|
|
||||||
run-test: build
|
|
||||||
./run_qtest.native
|
|
||||||
|
|
||||||
test-all: run-test
|
|
||||||
|
|
||||||
tags:
|
tags:
|
||||||
otags *.ml *.mli
|
otags *.ml *.mli
|
||||||
|
|
||||||
|
|
|
||||||
23
_oasis
23
_oasis
|
|
@ -161,22 +161,6 @@ Executable run_bench_hash
|
||||||
MainIs: run_bench_hash.ml
|
MainIs: run_bench_hash.ml
|
||||||
BuildDepends: containers
|
BuildDepends: containers
|
||||||
|
|
||||||
Executable run_bench_io
|
|
||||||
Path: benchs/
|
|
||||||
Install: false
|
|
||||||
CompiledObject: best
|
|
||||||
Build$: flag(bench) && flag(unix)
|
|
||||||
MainIs: run_bench_io.ml
|
|
||||||
BuildDepends: containers, containers_lwt, unix, lwt.unix, benchmark
|
|
||||||
|
|
||||||
Executable run_test_future
|
|
||||||
Path: tests/threads/
|
|
||||||
Install: false
|
|
||||||
CompiledObject: best
|
|
||||||
Build$: flag(tests) && flag(thread)
|
|
||||||
MainIs: run_test_future.ml
|
|
||||||
BuildDepends: containers, threads, sequence, oUnit, containers.thread
|
|
||||||
|
|
||||||
PreBuildCommand: make qtest-gen
|
PreBuildCommand: make qtest-gen
|
||||||
|
|
||||||
Executable run_qtest
|
Executable run_qtest
|
||||||
|
|
@ -192,15 +176,10 @@ Executable run_qtest
|
||||||
sequence, gen, unix, oUnit, QTest2Lib
|
sequence, gen, unix, oUnit, QTest2Lib
|
||||||
|
|
||||||
Test all
|
Test all
|
||||||
Command: make test-all
|
Command: ./run_qtest.native
|
||||||
TestTools: run_qtest
|
TestTools: run_qtest
|
||||||
Run$: flag(tests) && flag(unix) && flag(advanced) && flag(bigarray)
|
Run$: flag(tests) && flag(unix) && flag(advanced) && flag(bigarray)
|
||||||
|
|
||||||
Test future
|
|
||||||
Command: echo "run test future" ; ./run_test_future.native
|
|
||||||
TestTools: run_test_future
|
|
||||||
Run$: flag(tests) && flag(thread)
|
|
||||||
|
|
||||||
Executable id_sexp
|
Executable id_sexp
|
||||||
Path: examples/
|
Path: examples/
|
||||||
Install: false
|
Install: false
|
||||||
|
|
|
||||||
|
|
@ -1,88 +0,0 @@
|
||||||
|
|
||||||
let read_input_char file =
|
|
||||||
CCIO.with_in file
|
|
||||||
(fun ic ->
|
|
||||||
let count = ref 0 in
|
|
||||||
try
|
|
||||||
while true do
|
|
||||||
let _ = input_char ic in
|
|
||||||
incr count
|
|
||||||
done;
|
|
||||||
assert false
|
|
||||||
with End_of_file -> !count
|
|
||||||
)
|
|
||||||
|
|
||||||
let read_input file =
|
|
||||||
CCIO.with_in file
|
|
||||||
(fun ic ->
|
|
||||||
let count = ref 0 in
|
|
||||||
let n = 4096 in
|
|
||||||
let b = Bytes.make n ' ' in
|
|
||||||
try
|
|
||||||
while true do
|
|
||||||
let n' = input ic b 0 n in
|
|
||||||
if n'=0 then raise Exit;
|
|
||||||
count := !count + n'
|
|
||||||
done;
|
|
||||||
assert false
|
|
||||||
with Exit ->
|
|
||||||
!count
|
|
||||||
)
|
|
||||||
|
|
||||||
let read_read file =
|
|
||||||
let fd = Unix.openfile file [Unix.O_RDONLY] 0o644 in
|
|
||||||
let count = ref 0 in
|
|
||||||
let n = 4096 in
|
|
||||||
let b = Bytes.make n ' ' in
|
|
||||||
try
|
|
||||||
while true do
|
|
||||||
let n' = Unix.read fd b 0 n in
|
|
||||||
if n'=0 then raise Exit;
|
|
||||||
count := !count + n'
|
|
||||||
done;
|
|
||||||
assert false
|
|
||||||
with Exit ->
|
|
||||||
Unix.close fd;
|
|
||||||
!count
|
|
||||||
|
|
||||||
let read_lwt file =
|
|
||||||
let open Lwt.Infix in
|
|
||||||
Lwt_io.with_file ~mode:Lwt_io.input file
|
|
||||||
(fun ic ->
|
|
||||||
let n = 4096 in
|
|
||||||
let b = Bytes.make n ' ' in
|
|
||||||
let rec read_chunk count =
|
|
||||||
Lwt_io.read_into ic b 0 n >>= fun n' ->
|
|
||||||
let count = count + n' in
|
|
||||||
if n'>0 then read_chunk count else Lwt.return count
|
|
||||||
in
|
|
||||||
read_chunk 0
|
|
||||||
)
|
|
||||||
|
|
||||||
let read_lwt' file = Lwt_main.run (read_lwt file)
|
|
||||||
|
|
||||||
let profile ~f file () = (f file)
|
|
||||||
|
|
||||||
let bench file =
|
|
||||||
let n1 = read_input_char file in
|
|
||||||
let n2 = read_input file in
|
|
||||||
let n3 = read_read file in
|
|
||||||
let n4 = read_lwt' file in
|
|
||||||
Printf.printf "results: %d, %d, %d, %d\n" n1 n2 n3 n4;
|
|
||||||
assert (n1=n2 && n2 = n3 && n3=n4);
|
|
||||||
Benchmark.throughputN ~repeat:5 4
|
|
||||||
[ "input_char", profile ~f:read_input_char file, ()
|
|
||||||
; "input", profile ~f:read_input file, ()
|
|
||||||
; "Unix.read", profile ~f:read_read file, ()
|
|
||||||
; "Lwt_io.read", profile ~f:read_lwt' file, ()
|
|
||||||
]
|
|
||||||
|
|
||||||
let () =
|
|
||||||
if Array.length Sys.argv < 2 then invalid_arg "use: truc file";
|
|
||||||
let file = Sys.argv.(1) in
|
|
||||||
Printf.printf "read file %s\n" file;
|
|
||||||
let res = bench file in
|
|
||||||
Benchmark.tabulate res;
|
|
||||||
()
|
|
||||||
|
|
||||||
|
|
||||||
|
|
@ -127,6 +127,10 @@ module Pool = struct
|
||||||
)
|
)
|
||||||
end
|
end
|
||||||
|
|
||||||
|
(*$inject
|
||||||
|
open Infix
|
||||||
|
*)
|
||||||
|
|
||||||
let pool = Pool.create ~max_size:50 ()
|
let pool = Pool.create ~max_size:50 ()
|
||||||
(** Default pool of threads, should be ok for most uses. *)
|
(** Default pool of threads, should be ok for most uses. *)
|
||||||
|
|
||||||
|
|
@ -214,6 +218,22 @@ let make1 f x =
|
||||||
|
|
||||||
let make f = make1 f ()
|
let make f = make1 f ()
|
||||||
|
|
||||||
|
(*$R
|
||||||
|
List.iter
|
||||||
|
(fun n ->
|
||||||
|
let l = Sequence.(1 -- n) |> Sequence.to_list in
|
||||||
|
let l = List.map (fun i ->
|
||||||
|
make
|
||||||
|
(fun () ->
|
||||||
|
Thread.delay 0.1;
|
||||||
|
1
|
||||||
|
)) l in
|
||||||
|
let l' = List.map get l in
|
||||||
|
OUnit.assert_equal n (List.fold_left (+) 0 l');
|
||||||
|
)
|
||||||
|
[ 10; 300 ]
|
||||||
|
*)
|
||||||
|
|
||||||
let make2 f x y =
|
let make2 f x y =
|
||||||
let cell = create_cell() in
|
let cell = create_cell() in
|
||||||
Pool.run pool (run_and_set2 cell f x) y;
|
Pool.run pool (run_and_set2 cell f x) y;
|
||||||
|
|
@ -286,6 +306,13 @@ let map f fut = match fut with
|
||||||
);
|
);
|
||||||
Run cell'
|
Run cell'
|
||||||
|
|
||||||
|
(*$R
|
||||||
|
let a = make (fun () -> 1) in
|
||||||
|
let b = map (fun x -> x+1) a in
|
||||||
|
let c = map (fun x -> x-1) b in
|
||||||
|
OUnit.assert_equal 1 (get c)
|
||||||
|
*)
|
||||||
|
|
||||||
let flat_map f fut = match fut with
|
let flat_map f fut = match fut with
|
||||||
| Return x -> f x
|
| Return x -> f x
|
||||||
| FailNow e -> FailNow e
|
| FailNow e -> FailNow e
|
||||||
|
|
@ -342,6 +369,29 @@ let sequence futures =
|
||||||
) futures;
|
) futures;
|
||||||
Run cell
|
Run cell
|
||||||
|
|
||||||
|
(*$R
|
||||||
|
let l = CCList.(1 -- 10) in
|
||||||
|
let l' = l
|
||||||
|
|> List.map
|
||||||
|
(fun x -> make (fun () -> Thread.delay 0.2; x*10))
|
||||||
|
|> sequence
|
||||||
|
|> map (List.fold_left (+) 0)
|
||||||
|
in
|
||||||
|
let expected = List.fold_left (fun acc x -> acc + 10 * x) 0 l in
|
||||||
|
OUnit.assert_equal expected (get l')
|
||||||
|
*)
|
||||||
|
|
||||||
|
(*$R
|
||||||
|
let l = CCList.(1 -- 10) in
|
||||||
|
let l' = l
|
||||||
|
|> List.map
|
||||||
|
(fun x -> make (fun () -> Thread.delay 0.2; if x = 5 then raise Exit; x))
|
||||||
|
|> sequence
|
||||||
|
|> map (List.fold_left (+) 0)
|
||||||
|
in
|
||||||
|
OUnit.assert_raises Exit (fun () -> get l')
|
||||||
|
*)
|
||||||
|
|
||||||
let choose futures =
|
let choose futures =
|
||||||
let cell = create_cell() in
|
let cell = create_cell() in
|
||||||
let state = ref `Waiting in
|
let state = ref `Waiting in
|
||||||
|
|
@ -399,6 +449,16 @@ let spawn_process ?(stdin="") cmd : subprocess_res t =
|
||||||
|
|
||||||
let sleep time = make (fun () -> Thread.delay time)
|
let sleep time = make (fun () -> Thread.delay time)
|
||||||
|
|
||||||
|
(*$R
|
||||||
|
let start = Unix.gettimeofday () in
|
||||||
|
let l = CCList.(1 -- 10)
|
||||||
|
|> List.map (fun _ -> make (fun () -> Thread.delay 0.5))
|
||||||
|
in
|
||||||
|
List.iter get l;
|
||||||
|
let stop = Unix.gettimeofday () in
|
||||||
|
OUnit.assert_bool "some_parallelism" (stop -. start < 10. *. 0.5);
|
||||||
|
*)
|
||||||
|
|
||||||
(** {2 Event timer} *)
|
(** {2 Event timer} *)
|
||||||
|
|
||||||
module Timer = struct
|
module Timer = struct
|
||||||
|
|
@ -528,6 +588,21 @@ module Timer = struct
|
||||||
)
|
)
|
||||||
end
|
end
|
||||||
|
|
||||||
|
(*$R
|
||||||
|
let timer = Timer.create () in
|
||||||
|
let n = CCLock.create 1 in
|
||||||
|
let getter = make (fun () -> Thread.delay 0.8; CCLock.get n) in
|
||||||
|
let _ =
|
||||||
|
Timer.after timer 0.6
|
||||||
|
>>= fun () -> CCLock.update n (fun x -> x+2); return()
|
||||||
|
in
|
||||||
|
let _ =
|
||||||
|
Timer.after timer 0.4
|
||||||
|
>>= fun () -> CCLock.update n (fun x -> x * 4); return()
|
||||||
|
in
|
||||||
|
OUnit.assert_equal 6 (get getter);
|
||||||
|
*)
|
||||||
|
|
||||||
module Infix = struct
|
module Infix = struct
|
||||||
let (>>=) x f = flat_map f x
|
let (>>=) x f = flat_map f x
|
||||||
let (>>) a f = and_then a f
|
let (>>) a f = and_then a f
|
||||||
|
|
|
||||||
|
|
@ -1,3 +0,0 @@
|
||||||
S .
|
|
||||||
B ../_build/tests/
|
|
||||||
REC
|
|
||||||
|
|
@ -1,19 +0,0 @@
|
||||||
#use "topfind";;
|
|
||||||
#directory "_build/src/core/";;
|
|
||||||
#directory "_build/src/string";;
|
|
||||||
#directory "_build/src/misc";;
|
|
||||||
#directory "_build/src/io";;
|
|
||||||
#directory "_build/src/lwt";;
|
|
||||||
|
|
||||||
#require "unix";;
|
|
||||||
|
|
||||||
let ok () =
|
|
||||||
print_endline "... OK";
|
|
||||||
exit 0;;
|
|
||||||
|
|
||||||
let fail msg =
|
|
||||||
print_endline ("... FAILURE " ^ msg);
|
|
||||||
exit 1;;
|
|
||||||
|
|
||||||
(* vim:syntax=ocaml
|
|
||||||
*)
|
|
||||||
|
|
@ -1,33 +0,0 @@
|
||||||
#!/usr/bin/env ocaml
|
|
||||||
#use "tests/quick/.common.ml";;
|
|
||||||
#load "containers.cma";;
|
|
||||||
#require "lwt.unix";;
|
|
||||||
#load "containers_misc.cma";;
|
|
||||||
#load "containers_lwt.cma";;
|
|
||||||
|
|
||||||
let (>>=) = Lwt.(>>=)
|
|
||||||
|
|
||||||
module A = Containers_lwt.Lwt_actor
|
|
||||||
|
|
||||||
let a = A.spawn
|
|
||||||
(fun _ (`Ping sender) ->
|
|
||||||
Lwt_io.printl "ping!" >>= fun () ->
|
|
||||||
Lwt_unix.sleep 1. >>= fun () ->
|
|
||||||
A.send sender `Pong
|
|
||||||
)
|
|
||||||
|
|
||||||
let b = A.spawn
|
|
||||||
(fun self -> function
|
|
||||||
| `Pong
|
|
||||||
| `Start ->
|
|
||||||
Lwt_io.printl "pong!" >>= fun () ->
|
|
||||||
Lwt_unix.sleep 1. >>= fun () ->
|
|
||||||
A.send a (`Ping self)
|
|
||||||
)
|
|
||||||
|
|
||||||
let () = Lwt_main.run (
|
|
||||||
Lwt_io.printl "start" >>= fun () ->
|
|
||||||
A.send b `Start >>= fun () ->
|
|
||||||
A.wait_all ()
|
|
||||||
)
|
|
||||||
|
|
||||||
|
|
@ -1,6 +0,0 @@
|
||||||
#!/usr/bin/env bash
|
|
||||||
|
|
||||||
for i in tests/quick/*.ml ; do
|
|
||||||
echo -n "${i}..."
|
|
||||||
$i
|
|
||||||
done
|
|
||||||
|
|
@ -1,18 +0,0 @@
|
||||||
#!/usr/bin/env ocaml
|
|
||||||
#use "tests/quick/.common.ml";;
|
|
||||||
#load "containers.cma";;
|
|
||||||
#load "containers_string.cma";;
|
|
||||||
#load "containers_io.cma";;
|
|
||||||
|
|
||||||
open Containers_string
|
|
||||||
|
|
||||||
let words =
|
|
||||||
CCIO.with_in "/usr/share/dict/words" CCIO.read_lines_l
|
|
||||||
|
|
||||||
let idx = List.fold_left
|
|
||||||
(fun idx s -> Levenshtein.Index.add idx s s)
|
|
||||||
Levenshtein.Index.empty words;;
|
|
||||||
|
|
||||||
Levenshtein.Index.retrieve ~limit:1 idx "hell"
|
|
||||||
|> Levenshtein.klist_to_list
|
|
||||||
|> List.iter print_endline;;
|
|
||||||
|
|
@ -1,52 +0,0 @@
|
||||||
|
|
||||||
open OUnit
|
|
||||||
open Containers_misc
|
|
||||||
|
|
||||||
(** Test Univ embedding *)
|
|
||||||
|
|
||||||
let test_val () =
|
|
||||||
let e1 = Univ.embed () in
|
|
||||||
let e2 = Univ.embed () in
|
|
||||||
let v1 = Univ.pack e1 42 in
|
|
||||||
let v2 = Univ.pack e2 "hello" in
|
|
||||||
OUnit.assert_equal (Some 42) (Univ.unpack e1 v1);
|
|
||||||
OUnit.assert_equal None (Univ.unpack e1 v2);
|
|
||||||
OUnit.assert_equal (Some "hello") (Univ.unpack e2 v2);
|
|
||||||
OUnit.assert_equal None (Univ.unpack e2 v1);
|
|
||||||
()
|
|
||||||
|
|
||||||
let test_compatible () =
|
|
||||||
let e1 = Univ.embed () in
|
|
||||||
let e2 = Univ.embed () in
|
|
||||||
let v1 = Univ.pack e1 42 in
|
|
||||||
let v2 = Univ.pack e2 "hello" in
|
|
||||||
OUnit.assert_bool "compatible" (Univ.compatible e1 v1);
|
|
||||||
OUnit.assert_bool "not compatible" (not (Univ.compatible e1 v2));
|
|
||||||
OUnit.assert_bool "compatible" (Univ.compatible e2 v2);
|
|
||||||
OUnit.assert_bool "not compatible" (not (Univ.compatible e2 v1));
|
|
||||||
()
|
|
||||||
|
|
||||||
let test_set () =
|
|
||||||
let e1 = (Univ.embed () : int Univ.embedding) in
|
|
||||||
let e2 = (Univ.embed () : string Univ.embedding) in
|
|
||||||
(* create val *)
|
|
||||||
let v = Univ.pack e1 42 in
|
|
||||||
OUnit.assert_equal (Some 42) (Univ.unpack e1 v);
|
|
||||||
OUnit.assert_equal None (Univ.unpack e2 v);
|
|
||||||
(* set content, keeping type *)
|
|
||||||
Univ.set e1 v 100;
|
|
||||||
OUnit.assert_equal (Some 100) (Univ.unpack e1 v);
|
|
||||||
OUnit.assert_equal None (Univ.unpack e2 v);
|
|
||||||
(* set content, changing type *)
|
|
||||||
Univ.set e2 v "hello";
|
|
||||||
OUnit.assert_equal None (Univ.unpack e1 v);
|
|
||||||
OUnit.assert_equal (Some "hello") (Univ.unpack e2 v);
|
|
||||||
()
|
|
||||||
|
|
||||||
let suite =
|
|
||||||
"test_univ" >:::
|
|
||||||
[ "test_val" >:: test_val;
|
|
||||||
"test_compatible" >:: test_compatible;
|
|
||||||
"test_set" >:: test_set;
|
|
||||||
]
|
|
||||||
|
|
||||||
|
|
@ -1,88 +0,0 @@
|
||||||
|
|
||||||
(** Test Future *)
|
|
||||||
|
|
||||||
open OUnit
|
|
||||||
open CCFun
|
|
||||||
|
|
||||||
module Future = CCFuture
|
|
||||||
open Future.Infix
|
|
||||||
|
|
||||||
let test_parallel n () =
|
|
||||||
let l = Sequence.(1 -- n) |> Sequence.to_list in
|
|
||||||
let l = List.map (fun i ->
|
|
||||||
Future.make
|
|
||||||
(fun () ->
|
|
||||||
Thread.delay 0.1;
|
|
||||||
1
|
|
||||||
)) l in
|
|
||||||
let l' = List.map Future.get l in
|
|
||||||
OUnit.assert_equal n (List.fold_left (+) 0 l');
|
|
||||||
()
|
|
||||||
|
|
||||||
let test_map () =
|
|
||||||
let a = Future.make (fun () -> 1) in
|
|
||||||
let b = Future.map (fun x -> x+1) a in
|
|
||||||
let c = Future.map (fun x -> x-1) b in
|
|
||||||
OUnit.assert_equal 1 (Future.get c)
|
|
||||||
|
|
||||||
let test_sequence_ok () =
|
|
||||||
let l = CCList.(1 -- 10) in
|
|
||||||
let l' = l
|
|
||||||
|> List.map
|
|
||||||
(fun x -> Future.make (fun () -> Thread.delay 0.2; x*10))
|
|
||||||
|> Future.sequence
|
|
||||||
|> Future.map (List.fold_left (+) 0)
|
|
||||||
in
|
|
||||||
let expected = List.fold_left (fun acc x -> acc + 10 * x) 0 l in
|
|
||||||
OUnit.assert_equal expected (Future.get l')
|
|
||||||
|
|
||||||
let test_sequence_fail () =
|
|
||||||
let l = CCList.(1 -- 10) in
|
|
||||||
let l' = l
|
|
||||||
|> List.map
|
|
||||||
(fun x -> Future.make (fun () -> Thread.delay 0.2; if x = 5 then raise Exit; x))
|
|
||||||
|> Future.sequence
|
|
||||||
|> Future.map (List.fold_left (+) 0)
|
|
||||||
in
|
|
||||||
OUnit.assert_raises Exit (fun () -> Future.get l')
|
|
||||||
|
|
||||||
let test_time () =
|
|
||||||
let start = Unix.gettimeofday () in
|
|
||||||
let l = CCList.(1 -- 10)
|
|
||||||
|> List.map (fun _ -> Future.make (fun () -> Thread.delay 0.5))
|
|
||||||
in
|
|
||||||
List.iter Future.get l;
|
|
||||||
let stop = Unix.gettimeofday () in
|
|
||||||
OUnit.assert_bool "some_parallelism" (stop -. start < 10. *. 0.5);
|
|
||||||
()
|
|
||||||
|
|
||||||
let test_timer () =
|
|
||||||
let timer = Future.Timer.create () in
|
|
||||||
let n = CCLock.create 1 in
|
|
||||||
let get = Future.make (fun () -> Thread.delay 0.8; CCLock.get n) in
|
|
||||||
let _ =
|
|
||||||
Future.Timer.after timer 0.6
|
|
||||||
>>= fun () -> CCLock.update n (fun x -> x+2); Future.return()
|
|
||||||
in
|
|
||||||
let _ =
|
|
||||||
Future.Timer.after timer 0.4
|
|
||||||
>>= fun () -> CCLock.update n (fun x -> x * 4); Future.return()
|
|
||||||
in
|
|
||||||
OUnit.assert_equal 6 (Future.get get);
|
|
||||||
()
|
|
||||||
|
|
||||||
let suite =
|
|
||||||
"test_future" >:::
|
|
||||||
[
|
|
||||||
"test_parallel_10" >:: test_parallel 10;
|
|
||||||
"test_parallel_300" >:: test_parallel 300;
|
|
||||||
"test_time" >:: test_time;
|
|
||||||
"test_map" >:: test_map;
|
|
||||||
"test_sequence_ok" >:: test_sequence_ok;
|
|
||||||
"test_sequence_fail" >:: test_sequence_fail;
|
|
||||||
"test_timer" >:: test_timer;
|
|
||||||
]
|
|
||||||
|
|
||||||
let () =
|
|
||||||
let _ = OUnit.run_test_tt_main suite in
|
|
||||||
()
|
|
||||||
Loading…
Add table
Reference in a new issue