File: test_write.ml

package info (click to toggle)
yojson 2.0.2-2
  • links: PTS, VCS
  • area: main
  • in suites: bookworm
  • size: 2,044 kB
  • sloc: ml: 3,068; makefile: 38
file content (61 lines) | stat: -rw-r--r-- 2,204 bytes parent folder | download
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
let to_string_tests =
  let test ?suf expected = 
    Alcotest.(check string) __LOC__ expected (Yojson.Safe.to_string ?suf Fixtures.json_value)
  in
  [
    "to_string with default settings", `Quick, (fun () -> test Fixtures.json_string);
    "to_string with newline", `Quick, (fun () -> test ~suf:"\n" Fixtures.json_string_newline);
    "to_string without newline", `Quick, (fun () -> test ~suf:"" Fixtures.json_string);
  ]

let to_file_tests =
  let test ?suf expected =
    let output_file = Filename.temp_file "test_yojson_to_file" ".json" in
    Yojson.Safe.to_file ?suf output_file Fixtures.json_value;
    let file_content =
      let ic = open_in output_file in
      let length = in_channel_length ic in
      let s = really_input_string ic length in
      close_in ic;
      s
    in
    Sys.remove output_file;
    Alcotest.(check string) __LOC__ expected file_content
  in
  [
    "to_file with default settings", `Quick, (fun () -> test Fixtures.json_string_newline);
    "to_file with newline", `Quick, (fun () -> test ~suf:"\n" Fixtures.json_string_newline);
    "to_file without newline", `Quick, (fun () -> test ~suf:"" Fixtures.json_string);
  ]

(* List.to_seq is not available on old OCaml versions. *)
let rec list_to_seq = function
  | [] -> (fun () -> Seq.Nil)
  | x :: xs -> (fun () -> Seq.Cons (x, list_to_seq xs))

let seq_to_file_tests =
  let test ?suf () =
    let output_file = Filename.temp_file "test_yojson_seq_to_file" ".json" in
    let data = [`String "foo"; `String "bar"] in
    Yojson.Safe.seq_to_file ?suf output_file (list_to_seq data);
    let read_data =
      let seq = Yojson.Safe.seq_from_file output_file in
      let acc = ref [] in
      Seq.iter (fun v -> acc := v :: !acc) seq;
      List.rev !acc
    in
    Sys.remove output_file;
    Alcotest.(check (list Testable.yojson)) "seq_{to,from}_file roundtrip" data read_data
  in
  [
    "seq_to_file with default settings", `Quick, (fun () -> test ());
    "seq_to_file with newline", `Quick, (fun () -> test ~suf:"\n" ());
    "seq_to_file without newline", `Quick, (fun () -> test ~suf:"" ());
  ]

let single_json =
  List.flatten [
    to_file_tests;
    to_string_tests;
    seq_to_file_tests;
  ]