From 56ff7c5de400f1596315d95607dbc58a7b37e0e8 Mon Sep 17 00:00:00 2001 From: cedlemo Date: Mon, 8 Jan 2018 15:23:55 +0100 Subject: [PATCH 1/9] Create Test_lwt_sequence module --- test/core/main.ml | 1 + test/core/test_lwt_sequence.ml | 27 +++++++++++++++++++++++++++ 2 files changed, 28 insertions(+) create mode 100644 test/core/test_lwt_sequence.ml diff --git a/test/core/main.ml b/test/core/main.ml index bd292cd68b..123ddb32ed 100644 --- a/test/core/main.ml +++ b/test/core/main.ml @@ -29,4 +29,5 @@ Test.run "core" Test_lwt_mvar.suite; Test_lwt_condition.suite; Test_lwt_pool.suite; + Test_lwt_sequence.suite; ]) diff --git a/test/core/test_lwt_sequence.ml b/test/core/test_lwt_sequence.ml new file mode 100644 index 0000000000..bac6e27624 --- /dev/null +++ b/test/core/test_lwt_sequence.ml @@ -0,0 +1,27 @@ + +(* OCaml promise library + * http://www.ocsigen.org/lwt + * Copyright (C) 2009 Jérémie Dimino + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License as + * published by the Free Software Foundation, with linking exceptions; + * either version 2.1 of the License, or (at your option) any later + * version. See COPYING file for details. + * + * This program is distributed in the hope that it will be useful, but + * WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA + * 02111-1307, USA. + *) + +open Test + +let suite = suite "lwt_sequence" [ + +] From 98fe3050eeb2aba76c5633259b727b3cec836674 Mon Sep 17 00:00:00 2001 From: cedlemo Date: Tue, 9 Jan 2018 22:08:42 +0100 Subject: [PATCH 2/9] Lwt_sequence: create set of tests for create/add*/take* functions (#406) --- test/core/test_lwt_sequence.ml | 80 ++++++++++++++++++++++++++++++++++ 1 file changed, 80 insertions(+) diff --git a/test/core/test_lwt_sequence.ml b/test/core/test_lwt_sequence.ml index bac6e27624..13c7d0de88 100644 --- a/test/core/test_lwt_sequence.ml +++ b/test/core/test_lwt_sequence.ml @@ -22,6 +22,86 @@ open Test +[@@@ocaml.warning "-3"] +module Lwt_sequence = Lwt_sequence +[@@@ocaml.warning "+3"] + let suite = suite "lwt_sequence" [ + test "create" begin fun () -> + let s = Lwt_sequence.create () in + let _ = assert (Lwt_sequence.is_empty s) in + let len = Lwt_sequence.length s in + Lwt.return (len = 0) + end; + + test "add_l" begin fun () -> + let s = Lwt_sequence.create () in + let n = Lwt_sequence.add_l 1 s in + let _ = assert ((Lwt_sequence.get n) = 1) in + let len = Lwt_sequence.length s in + Lwt.return (len = 1) + end; + + test "add_r" begin fun () -> + let s = Lwt_sequence.create () in + let n = Lwt_sequence.add_r 1 s in + let _ = assert ((Lwt_sequence.get n) = 1) in + let len = Lwt_sequence.length s in + Lwt.return (len = 1) + end; + + test "take_l Empty" begin fun () -> + let s = Lwt_sequence.create () in + Lwt.catch + (fun () -> + let _ = Lwt_sequence.take_l s in + Lwt.return_false + ) + (function + | Lwt_sequence.Empty -> Lwt.return_true + | _ -> Lwt.return_false + ) + end; + + test "take_l" begin fun () -> + let s = Lwt_sequence.create () in + let v = 1 in + let _ = Lwt_sequence.add_l v s in + Lwt.catch + (fun () -> + let v' = Lwt_sequence.take_l s in + Lwt.return (v' = v) + ) + (function + | _ -> Lwt.return_false + ) + end; + + test "take_r Empty" begin fun () -> + let s = Lwt_sequence.create () in + Lwt.catch + (fun () -> + let _ = Lwt_sequence.take_r s in + Lwt.return_false + ) + (function + | Lwt_sequence.Empty -> Lwt.return_true + | _ -> Lwt.return_false + ) + end; + + test "take_r" begin fun () -> + let s = Lwt_sequence.create () in + let v = 1 in + let _ = Lwt_sequence.add_r v s in + Lwt.catch + (fun () -> + let v' = Lwt_sequence.take_r s in + Lwt.return (v' = v) + ) + (function + | _ -> Lwt.return_false + ) + end; ] From f16afba1305c9027fcf85b0a0fbce7f7919d1ec3 Mon Sep 17 00:00:00 2001 From: cedlemo Date: Wed, 10 Jan 2018 11:19:00 +0100 Subject: [PATCH 3/9] Lwt_sequence: add tests for take_opt_* functions (#406) --- test/core/test_lwt_sequence.ml | 32 ++++++++++++++++++++++++++++++++ 1 file changed, 32 insertions(+) diff --git a/test/core/test_lwt_sequence.ml b/test/core/test_lwt_sequence.ml index 13c7d0de88..ce8f09c730 100644 --- a/test/core/test_lwt_sequence.ml +++ b/test/core/test_lwt_sequence.ml @@ -104,4 +104,36 @@ let suite = suite "lwt_sequence" [ | _ -> Lwt.return_false ) end; + + test "take_opt_l Empty" begin fun () -> + let s = Lwt_sequence.create () in + match Lwt_sequence.take_opt_l s with + | None -> Lwt.return_true + | _ -> Lwt.return_false + end; + + test "take_opt_l" begin fun () -> + let s = Lwt_sequence.create () in + let v = 1 in + let _ = Lwt_sequence.add_l v s in + match Lwt_sequence.take_opt_l s with + | None -> Lwt.return_false + | Some v' -> Lwt.return (v = v') + end; + + test "take_opt_r Empty" begin fun () -> + let s = Lwt_sequence.create () in + match Lwt_sequence.take_opt_r s with + | None -> Lwt.return_true + | _ -> Lwt.return_false + end; + + test "take_opt_r" begin fun () -> + let s = Lwt_sequence.create () in + let v = 1 in + let _ = Lwt_sequence.add_r v s in + match Lwt_sequence.take_opt_r s with + | None -> Lwt.return_false + | Some v' -> Lwt.return (v = v') + end; ] From 18ab7f953ae3ee377070ef243770a70518f443b2 Mon Sep 17 00:00:00 2001 From: cedlemo Date: Wed, 10 Jan 2018 11:38:15 +0100 Subject: [PATCH 4/9] Lwt_sequence: create helpers variables and function (#406) --- test/core/test_lwt_sequence.ml | 42 +++++++++++++++++++--------------- 1 file changed, 24 insertions(+), 18 deletions(-) diff --git a/test/core/test_lwt_sequence.ml b/test/core/test_lwt_sequence.ml index ce8f09c730..c8cb46ed44 100644 --- a/test/core/test_lwt_sequence.ml +++ b/test/core/test_lwt_sequence.ml @@ -26,6 +26,20 @@ open Test module Lwt_sequence = Lwt_sequence [@@@ocaml.warning "+3"] +let filled_sequence () = + let s = Lwt_sequence.create () in + let _ = Lwt_sequence.add_l (-1) s in + let _ = Lwt_sequence.add_l (-2) s in + let _ = Lwt_sequence.add_l (-3) s in + let _ = Lwt_sequence.add_r 1 s in + let _ = Lwt_sequence.add_r 2 s in + let _ = Lwt_sequence.add_r 3 s in + s + +let leftmost_value = (-3) + +let rightmost_value = 3 + let suite = suite "lwt_sequence" [ test "create" begin fun () -> @@ -65,13 +79,11 @@ let suite = suite "lwt_sequence" [ end; test "take_l" begin fun () -> - let s = Lwt_sequence.create () in - let v = 1 in - let _ = Lwt_sequence.add_l v s in + let s = filled_sequence () in Lwt.catch (fun () -> - let v' = Lwt_sequence.take_l s in - Lwt.return (v' = v) + let v = Lwt_sequence.take_l s in + Lwt.return (leftmost_value = v) ) (function | _ -> Lwt.return_false @@ -92,13 +104,11 @@ let suite = suite "lwt_sequence" [ end; test "take_r" begin fun () -> - let s = Lwt_sequence.create () in - let v = 1 in - let _ = Lwt_sequence.add_r v s in + let s = filled_sequence () in Lwt.catch (fun () -> - let v' = Lwt_sequence.take_r s in - Lwt.return (v' = v) + let v = Lwt_sequence.take_r s in + Lwt.return (rightmost_value = v) ) (function | _ -> Lwt.return_false @@ -113,12 +123,10 @@ let suite = suite "lwt_sequence" [ end; test "take_opt_l" begin fun () -> - let s = Lwt_sequence.create () in - let v = 1 in - let _ = Lwt_sequence.add_l v s in + let s = filled_sequence () in match Lwt_sequence.take_opt_l s with | None -> Lwt.return_false - | Some v' -> Lwt.return (v = v') + | Some v -> Lwt.return (leftmost_value = v) end; test "take_opt_r Empty" begin fun () -> @@ -129,11 +137,9 @@ let suite = suite "lwt_sequence" [ end; test "take_opt_r" begin fun () -> - let s = Lwt_sequence.create () in - let v = 1 in - let _ = Lwt_sequence.add_r v s in + let s = filled_sequence () in match Lwt_sequence.take_opt_r s with | None -> Lwt.return_false - | Some v' -> Lwt.return (v = v') + | Some v -> Lwt.return (rightmost_value = v) end; ] From ade4c45be447558a3c5ea4378ba8b451e735cff6 Mon Sep 17 00:00:00 2001 From: cedlemo Date: Wed, 10 Jan 2018 11:54:57 +0100 Subject: [PATCH 5/9] Lwt_sequence: add tests for transfer_* functions (#406) --- test/core/test_lwt_sequence.ml | 48 ++++++++++++++++++++++++++++++++++ 1 file changed, 48 insertions(+) diff --git a/test/core/test_lwt_sequence.ml b/test/core/test_lwt_sequence.ml index c8cb46ed44..12205b6711 100644 --- a/test/core/test_lwt_sequence.ml +++ b/test/core/test_lwt_sequence.ml @@ -36,10 +36,20 @@ let filled_sequence () = let _ = Lwt_sequence.add_r 3 s in s +let filled_length = 6 + let leftmost_value = (-3) let rightmost_value = 3 +let transfer_sequence () = + let s = Lwt_sequence.create () in + let _ = Lwt_sequence.add_r 4 s in + let _ = Lwt_sequence.add_r 5 s in + s + +let transfer_length = 2 + let suite = suite "lwt_sequence" [ test "create" begin fun () -> @@ -142,4 +152,42 @@ let suite = suite "lwt_sequence" [ | None -> Lwt.return_false | Some v -> Lwt.return (rightmost_value = v) end; + + test "transfer_l Empty" begin fun () -> + let s = filled_sequence () in + let ts = Lwt_sequence.create () in + let _ = Lwt_sequence.transfer_l ts s in + let len = Lwt_sequence.length s in + Lwt.return (filled_length = len) + end; + + test "transfer_l " begin fun () -> + let s = filled_sequence () in + let ts = transfer_sequence () in + let _ = Lwt_sequence.transfer_l ts s in + let len = Lwt_sequence.length s in + let _ = assert ((filled_length + transfer_length) = len) in + match Lwt_sequence.take_opt_l s with + | None -> Lwt.return_false + | Some v -> Lwt.return (4 = v) + end; + + test "transfer_r Empty" begin fun () -> + let s = filled_sequence () in + let ts = Lwt_sequence.create () in + let _ = Lwt_sequence.transfer_r ts s in + let len = Lwt_sequence.length s in + Lwt.return (filled_length = len) + end; + + test "transfer_r " begin fun () -> + let s = filled_sequence () in + let ts = transfer_sequence () in + let _ = Lwt_sequence.transfer_r ts s in + let len = Lwt_sequence.length s in + let _ = assert ((filled_length + transfer_length) = len) in + match Lwt_sequence.take_opt_r s with + | None -> Lwt.return_false + | Some v -> Lwt.return (5 = v) + end; ] From 8c4c1c826d9aa45db6572b9c443cd24ea9472640 Mon Sep 17 00:00:00 2001 From: cedlemo Date: Wed, 10 Jan 2018 15:17:34 +0100 Subject: [PATCH 6/9] Lwt_sequence: add tests for iter_*, fold_* and find_* functions (#406) --- test/core/test_lwt_sequence.ml | 180 +++++++++++++++++++++++++++++++++ 1 file changed, 180 insertions(+) diff --git a/test/core/test_lwt_sequence.ml b/test/core/test_lwt_sequence.ml index 12205b6711..b0ebdd0233 100644 --- a/test/core/test_lwt_sequence.ml +++ b/test/core/test_lwt_sequence.ml @@ -50,6 +50,46 @@ let transfer_sequence () = let transfer_length = 2 +let empty_array = [||] + +let l_filled_array = [|-3; -2; -1; 1; 2; 3|] + +let r_filled_array = [|3; 2; 1; -1; -2; -3|] + +let test_iter iter_f array_values seq = + let index = ref 0 in + Lwt.catch + (fun () -> + iter_f (fun v -> + assert (v = array_values.(!index)); + index := (!index + 1)) seq; + Lwt.return_true + ) + (function _ -> Lwt.return_false) + +let test_iter_node iter_f array_values seq = + let index = ref 0 in + Lwt.catch + (fun () -> + iter_f (fun n -> + assert ((Lwt_sequence.get n) = array_values.(!index)); + index := (!index + 1)) seq; + Lwt.return_true + ) + (function _ -> Lwt.return_false) + +let test_iter_rem iter_f array_values seq = + let index = ref 0 in + Lwt.catch + (fun () -> + iter_f (fun n -> + assert ((Lwt_sequence.get n) = array_values.(!index)); + Lwt_sequence.remove n; + index := (!index + 1)) seq; + Lwt.return_true + ) + (function _ -> Lwt.return_false) + let suite = suite "lwt_sequence" [ test "create" begin fun () -> @@ -190,4 +230,144 @@ let suite = suite "lwt_sequence" [ | None -> Lwt.return_false | Some v -> Lwt.return (5 = v) end; + + test "iter_l Empty" begin fun () -> + test_iter Lwt_sequence.iter_l empty_array (Lwt_sequence.create ()) + end; + + test "iter_l" begin fun () -> + test_iter Lwt_sequence.iter_l l_filled_array (filled_sequence ()) + end; + + test "iter_r Empty" begin fun () -> + test_iter Lwt_sequence.iter_r empty_array (Lwt_sequence.create ()) + end; + + test "iter_r" begin fun () -> + test_iter Lwt_sequence.iter_r r_filled_array (filled_sequence ()) + end; + + test "iter_node_l Empty" begin fun () -> + test_iter_node Lwt_sequence.iter_node_l empty_array (Lwt_sequence.create ()) + end; + + test "iter_node_l" begin fun () -> + test_iter_node Lwt_sequence.iter_node_l l_filled_array (filled_sequence ()) + end; + + test "iter_node_r Empty" begin fun () -> + test_iter_node Lwt_sequence.iter_node_r empty_array (Lwt_sequence.create ()) + end; + + test "iter_node_r" begin fun () -> + test_iter_node Lwt_sequence.iter_node_r r_filled_array (filled_sequence ()) + end; + + test "iter_node_l with removal" begin fun () -> + test_iter_rem Lwt_sequence.iter_node_l l_filled_array (filled_sequence ()) + end; + + test "iter_node_r with removal" begin fun () -> + test_iter_rem Lwt_sequence.iter_node_r r_filled_array (filled_sequence ()) + end; + + test "fold_l" begin fun () -> + let sum = Lwt_sequence.fold_l (fun v e -> v + e) (filled_sequence ()) 0 in + Lwt.return (sum = 0) + end; + + test "fold_r" begin fun () -> + let sum = Lwt_sequence.fold_r (fun v e -> v + e) (filled_sequence ()) 0 in + Lwt.return (sum = 0) + end; + + test "find_node_opt_l Empty" begin fun () -> + let s = Lwt_sequence.create () in + match Lwt_sequence.find_node_opt_l (fun v -> v = 1) s with + | None -> Lwt.return_true + | _ -> Lwt.return_false + end; + + test "find_node_opt_l not found " begin fun () -> + let s = transfer_sequence () in + match Lwt_sequence.find_node_opt_l (fun v -> v = 1) s with + | None -> Lwt.return_true + | _ -> Lwt.return_false + end; + + test "find_node_opt_l" begin fun () -> + let s = filled_sequence () in + match Lwt_sequence.find_node_opt_l (fun v -> v = 1) s with + | None -> Lwt.return_false + | Some n -> if ((Lwt_sequence.get n) = 1) then Lwt.return_true + else Lwt.return_false + end; + + test "find_node_opt_r Empty" begin fun () -> + let s = Lwt_sequence.create () in + match Lwt_sequence.find_node_opt_r (fun v -> v = 1) s with + | None -> Lwt.return_true + | _ -> Lwt.return_false + end; + + test "find_node_opt_r not found " begin fun () -> + let s = transfer_sequence () in + match Lwt_sequence.find_node_opt_r (fun v -> v = 1) s with + | None -> Lwt.return_true + | _ -> Lwt.return_false + end; + + test "find_node_opt_r" begin fun () -> + let s = filled_sequence () in + match Lwt_sequence.find_node_opt_r (fun v -> v = 1) s with + | None -> Lwt.return_false + | Some n -> if ((Lwt_sequence.get n) = 1) then Lwt.return_true + else Lwt.return_false + end; + + test "find_node_l Empty" begin fun () -> + let s = Lwt_sequence.create () in + Lwt.catch + (fun () -> let n = Lwt_sequence.find_node_l (fun v -> v = 1) s in + if ((Lwt_sequence.get n) = 1) then Lwt.return_false + else Lwt.return_false + ) + (function + | Not_found -> Lwt.return_true + | _ -> Lwt.return_false + ) + end; + + test "find_node_l" begin fun () -> + let s = filled_sequence () in + Lwt.catch + (fun () -> let n = Lwt_sequence.find_node_l (fun v -> v = 1) s in + if ((Lwt_sequence.get n) = 1) then Lwt.return_true + else Lwt.return_false + ) + (function _ -> Lwt.return_false) + end; + + test "find_node_r Empty" begin fun () -> + let s = Lwt_sequence.create () in + Lwt.catch + (fun () -> let n = Lwt_sequence.find_node_r (fun v -> v = 1) s in + if ((Lwt_sequence.get n) = 1) then Lwt.return_false + else Lwt.return_false + ) + (function + | Not_found -> Lwt.return_true + | _ -> Lwt.return_false + ) + end; + + test "find_node_r" begin fun () -> + let s = filled_sequence () in + Lwt.catch + (fun () -> let n = Lwt_sequence.find_node_r (fun v -> v = 1) s in + if ((Lwt_sequence.get n) = 1) then Lwt.return_true + else Lwt.return_false + ) + (function _ -> Lwt.return_false) + end; ] From e94ff1002dfc5a2c4b1b3e3fd929ea5dc4770015 Mon Sep 17 00:00:00 2001 From: cedlemo Date: Wed, 10 Jan 2018 17:52:12 +0100 Subject: [PATCH 7/9] Lwt_sequence: improve tests for fold_* functions (#406) --- test/core/test_lwt_sequence.ml | 18 ++++++++++++++---- 1 file changed, 14 insertions(+), 4 deletions(-) diff --git a/test/core/test_lwt_sequence.ml b/test/core/test_lwt_sequence.ml index b0ebdd0233..7c8a5ba2d3 100644 --- a/test/core/test_lwt_sequence.ml +++ b/test/core/test_lwt_sequence.ml @@ -272,13 +272,23 @@ let suite = suite "lwt_sequence" [ end; test "fold_l" begin fun () -> - let sum = Lwt_sequence.fold_l (fun v e -> v + e) (filled_sequence ()) 0 in - Lwt.return (sum = 0) + let acc = Lwt_sequence.fold_l (fun v e -> v * e) (filled_sequence ()) 1 in + Lwt.return (acc = (-36)) + end; + + test "fold_l Empty" begin fun () -> + let acc = Lwt_sequence.fold_l (fun v e -> v * e) (Lwt_sequence.create ()) 1 in + Lwt.return (acc = 1) end; test "fold_r" begin fun () -> - let sum = Lwt_sequence.fold_r (fun v e -> v + e) (filled_sequence ()) 0 in - Lwt.return (sum = 0) + let acc = Lwt_sequence.fold_r (fun v e -> v * e) (filled_sequence ()) 1 in + Lwt.return (acc = (-36)) + end; + + test "fold_r Empty" begin fun () -> + let acc = Lwt_sequence.fold_r (fun v e -> v * e) (Lwt_sequence.create ()) 1 in + Lwt.return (acc = 1) end; test "find_node_opt_l Empty" begin fun () -> From 87829d0fed9c9d70e7fd162ba3cf5511e2d277e2 Mon Sep 17 00:00:00 2001 From: cedlemo Date: Wed, 10 Jan 2018 18:04:01 +0100 Subject: [PATCH 8/9] Lwt_sequence: add test for set function (#406) --- test/core/test_lwt_sequence.ml | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/test/core/test_lwt_sequence.ml b/test/core/test_lwt_sequence.ml index 7c8a5ba2d3..992a07c410 100644 --- a/test/core/test_lwt_sequence.ml +++ b/test/core/test_lwt_sequence.ml @@ -380,4 +380,13 @@ let suite = suite "lwt_sequence" [ ) (function _ -> Lwt.return_false) end; + + test "set" begin fun () -> + let s = filled_sequence () in + match Lwt_sequence.find_node_opt_l (fun v -> v = 1) s with + | None -> Lwt.return_false + | Some n -> let _ = Lwt_sequence.set n 10 in + let data = [|-3; -2; -1; 10; 2; 3|] in + test_iter Lwt_sequence.iter_l data s + end; ] From 3a8d210888821cc0f3329cd36f31f5a4688f9030 Mon Sep 17 00:00:00 2001 From: cedlemo Date: Thu, 11 Jan 2018 16:19:26 +0100 Subject: [PATCH 9/9] Lwt_sequence: add test for fold_r with multiple removal function (#406, #405) --- test/core/test_lwt_sequence.ml | 17 +++++++++++++++++ 1 file changed, 17 insertions(+) diff --git a/test/core/test_lwt_sequence.ml b/test/core/test_lwt_sequence.ml index 992a07c410..06dbf0797e 100644 --- a/test/core/test_lwt_sequence.ml +++ b/test/core/test_lwt_sequence.ml @@ -389,4 +389,21 @@ let suite = suite "lwt_sequence" [ let data = [|-3; -2; -1; 10; 2; 3|] in test_iter Lwt_sequence.iter_l data s end; + + test "fold_r with multiple removal" begin fun () -> + let s = filled_sequence () in + let acc = Lwt_sequence.fold_r + (fun v e -> + (if v = (-1) then + let n = Lwt_sequence.find_node_r (fun v' -> v' = 1) s in + let _ = Lwt_sequence.remove n in + let n = Lwt_sequence.find_node_r (fun v' -> v' = (-2)) s in + let _ = Lwt_sequence.remove n in + let n = Lwt_sequence.find_node_r (fun v' -> v' = (-1)) s in + ignore(Lwt_sequence.remove n) + ); + v * e + ) s 1 in + Lwt.return (acc = 18) + end; ]