(* TEST
   flags = "-w -3"
   include testing
*)

let is_empty s =
  try Stream.empty s; true with Stream.Failure -> false

let test_icons =
  let s = Stream.of_string "ab" in
  let s = Stream.icons 'c' s in
  Testing.test (Stream.next s = 'c');
  Testing.test (Stream.next s = 'a');
  Testing.test (Stream.next s = 'b');
  Testing.test (is_empty s);
  ()

let test_lcons =
  let s = Stream.of_string "ab" in
  let s = Stream.lcons (fun () -> 'c') s in
  Testing.test (Stream.next s = 'c');
  Testing.test (Stream.next s = 'a');
  Testing.test (Stream.next s = 'b');
  Testing.test (is_empty s);
  ()

let test_iapp =
  let s = Stream.of_string "ab" in
  let s = Stream.iapp (Stream.of_list ['c']) s in
  Testing.test (Stream.next s = 'c');
  Testing.test (Stream.next s = 'a');
  Testing.test (Stream.next s = 'b');
  Testing.test (is_empty s);
  ()

let test_lapp_right =
  let s1 = Stream.of_list ['c'] in
  let s2 = Stream.of_string "ab" in
  let s = Stream.lapp (fun () -> s1) s2 in
  Testing.test (Stream.next s = 'c');
  Testing.test (Stream.next s = 'a');
  Testing.test (Stream.next s = 'b');
  Testing.test (is_empty s);
  ()

let test_lapp_left =
  let s1 = Stream.of_string "bc" in
  let s2 = Stream.of_list ['a'] in
  Testing.test (Stream.next s1 = 'b');
  let s = Stream.lapp (fun () -> s1) s2 in
  Testing.test (Stream.next s = 'c');
  Testing.test (Stream.next s = 'a');
  Testing.test (is_empty s);
  ()

let test_slazy =
  let s = Stream.of_string "ab" in
  Testing.test (Stream.next s = 'a');
  let s = Stream.slazy (fun () -> s) in
  Testing.test (Stream.next s = 'b');
  Testing.test (is_empty s);
  ()
