Skip to content

Commit

Permalink
Test let* and and*
Browse files Browse the repository at this point in the history
Follow-on to #775.
  • Loading branch information
aantron committed Apr 22, 2020
1 parent 5d7d7c4 commit fb6fea0
Show file tree
Hide file tree
Showing 4 changed files with 67 additions and 2 deletions.
3 changes: 2 additions & 1 deletion src/core/lwt.mli
Original file line number Diff line number Diff line change
Expand Up @@ -1397,14 +1397,15 @@ let () =
end
end

(** {3 Syntax} *)
(** {3 Let syntax} *)
module Syntax :
sig
val (let*) : 'a t -> ('a -> 'b t) -> 'b t
val (and*) : 'a t -> 'b t -> ('a * 'b) t
end



(** {3 Pre-allocated promises} *)

val return_unit : unit t
Expand Down
1 change: 1 addition & 0 deletions test/core/dune
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
(executable
(name main)
(libraries lwttester)
(preprocess (future_syntax))
(flags (:standard -w +A-40-42)))

(alias
Expand Down
33 changes: 33 additions & 0 deletions test/core/test_lwt.ml
Original file line number Diff line number Diff line change
Expand Up @@ -3903,6 +3903,39 @@ let suites = suites @ [ppx_let_tests]



let let_syntax_tests = suite "let syntax" [
test "let*" begin fun () ->
let p1, r1 = Lwt.wait () in
let p2, r2 = Lwt.wait () in
let p' =
let open Lwt.Syntax in
let* s1 = p1 in
let* s2 = p2 in
Lwt.return (s1 ^ s2)
in
Lwt.wakeup r1 "foo";
Lwt.wakeup r2 "bar";
state_is (Lwt.Return "foobar") p'
end;

test "and*" begin fun () ->
let p1, r1 = Lwt.wait () in
let p2, r2 = Lwt.wait () in
let p' =
let open Lwt.Syntax in
let* s1 = p1
and* s2 = p2 in
Lwt.return (s1 ^ s2)
in
Lwt.wakeup r1 "foo";
Lwt.wakeup r2 "bar";
state_is (Lwt.Return "foobar") p'
end;
]
let suites = suites @ [let_syntax_tests]



(* Tests for [Lwt.add_task_l] and [Lwt.add_task_r]. *)

let lwt_sequence_contains sequence list =
Expand Down
32 changes: 31 additions & 1 deletion test/core/test_lwt_result.ml
Original file line number Diff line number Diff line change
Expand Up @@ -131,7 +131,7 @@ let suite =
let f y = Result.Ok (y + 1) in
Lwt.return (Lwt_result.bind_result x f = Lwt_result.fail 0)
);

test "both ok"
(fun () ->
let p =
Expand Down Expand Up @@ -185,4 +185,34 @@ let suite =
Lwt.wakeup_later r1 (Result.Error 0);
Lwt.bind p (fun x -> Lwt.return (x = Result.Error 1))
);

test "let*"
(fun () ->
let p1, r1 = Lwt.wait () in
let p2, r2 = Lwt.wait () in
let p' =
let open Lwt_result.Syntax in
let* s1 = p1 in
let* s2 = p2 in
Lwt.return (Result.Ok (s1 ^ s2))
in
Lwt.wakeup r1 (Result.Ok "foo");
Lwt.wakeup r2 (Result.Ok "bar");
state_is (Lwt.Return (Result.Ok "foobar")) p'
);

test "and*"
(fun () ->
let p1, r1 = Lwt.wait () in
let p2, r2 = Lwt.wait () in
let p' =
let open Lwt_result.Syntax in
let* s1 = p1
and* s2 = p2 in
Lwt.return (Result.Ok (s1 ^ s2))
in
Lwt.wakeup r1 (Result.Ok "foo");
Lwt.wakeup r2 (Result.Ok "bar");
state_is (Lwt.Return (Result.Ok "foobar")) p'
);
]

0 comments on commit fb6fea0

Please sign in to comment.