package ppx_expect

  1. Overview
  2. Docs

Source file file.ml

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
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
open! Base
open Import

module Name : sig
  type t [@@deriving_inline sexp, compare]

  include sig
    [@@@ocaml.warning "-32"]

    include Ppx_sexp_conv_lib.Sexpable.S with type t := t

    val compare : t -> t -> int
  end
  [@@ocaml.doc "@inline"]

  [@@@end]

  val relative_to : dir:string -> t -> string

  include Identifiable.S with type t := t
end = struct
  include String

  let relative_to ~dir t =
    if not (Caml.Filename.is_relative t) then t else Caml.Filename.concat dir t
  ;;
end

let initial_dir =
  let dir_or_error =
    match Caml.Sys.getcwd () with
    | v -> `Ok v
    | exception exn -> `Exn exn
  in
  fun () ->
    match dir_or_error with
    | `Ok v -> v
    | `Exn exn -> raise exn
;;

module Location = struct
  module T = struct
    type t =
      { filename : Name.t
      ; line_number : int
      ; line_start : int
      ; start_pos : int
      ; end_pos : int
      }
    [@@deriving_inline sexp, compare]

    let _ = fun (_ : t) -> ()

    let t_of_sexp =
      (let _tp_loc = "file.ml.Location.T.t" in
       function
       | Ppx_sexp_conv_lib.Sexp.List field_sexps as sexp ->
         let filename_field = ref Ppx_sexp_conv_lib.Option.None
         and line_number_field = ref Ppx_sexp_conv_lib.Option.None
         and line_start_field = ref Ppx_sexp_conv_lib.Option.None
         and start_pos_field = ref Ppx_sexp_conv_lib.Option.None
         and end_pos_field = ref Ppx_sexp_conv_lib.Option.None
         and duplicates = ref []
         and extra = ref [] in
         let rec iter = function
           | Ppx_sexp_conv_lib.Sexp.List
               (Ppx_sexp_conv_lib.Sexp.Atom field_name :: (([] | [ _ ]) as _field_sexps))
             :: tail ->
             let _field_sexp () =
               match _field_sexps with
               | [ x ] -> x
               | [] ->
                 Ppx_sexp_conv_lib.Conv_error.record_only_pairs_expected _tp_loc sexp
               | _ -> assert false
             in
             (match field_name with
              | "filename" ->
                (match !filename_field with
                 | Ppx_sexp_conv_lib.Option.None ->
                   let _field_sexp = _field_sexp () in
                   let fvalue = Name.t_of_sexp _field_sexp in
                   filename_field := Ppx_sexp_conv_lib.Option.Some fvalue
                 | Ppx_sexp_conv_lib.Option.Some _ ->
                   duplicates := field_name :: !duplicates)
              | "line_number" ->
                (match !line_number_field with
                 | Ppx_sexp_conv_lib.Option.None ->
                   let _field_sexp = _field_sexp () in
                   let fvalue = int_of_sexp _field_sexp in
                   line_number_field := Ppx_sexp_conv_lib.Option.Some fvalue
                 | Ppx_sexp_conv_lib.Option.Some _ ->
                   duplicates := field_name :: !duplicates)
              | "line_start" ->
                (match !line_start_field with
                 | Ppx_sexp_conv_lib.Option.None ->
                   let _field_sexp = _field_sexp () in
                   let fvalue = int_of_sexp _field_sexp in
                   line_start_field := Ppx_sexp_conv_lib.Option.Some fvalue
                 | Ppx_sexp_conv_lib.Option.Some _ ->
                   duplicates := field_name :: !duplicates)
              | "start_pos" ->
                (match !start_pos_field with
                 | Ppx_sexp_conv_lib.Option.None ->
                   let _field_sexp = _field_sexp () in
                   let fvalue = int_of_sexp _field_sexp in
                   start_pos_field := Ppx_sexp_conv_lib.Option.Some fvalue
                 | Ppx_sexp_conv_lib.Option.Some _ ->
                   duplicates := field_name :: !duplicates)
              | "end_pos" ->
                (match !end_pos_field with
                 | Ppx_sexp_conv_lib.Option.None ->
                   let _field_sexp = _field_sexp () in
                   let fvalue = int_of_sexp _field_sexp in
                   end_pos_field := Ppx_sexp_conv_lib.Option.Some fvalue
                 | Ppx_sexp_conv_lib.Option.Some _ ->
                   duplicates := field_name :: !duplicates)
              | _ ->
                if !Ppx_sexp_conv_lib.Conv.record_check_extra_fields
                then extra := field_name :: !extra
                else ());
             iter tail
           | ((Ppx_sexp_conv_lib.Sexp.Atom _ | Ppx_sexp_conv_lib.Sexp.List _) as sexp)
             :: _ -> Ppx_sexp_conv_lib.Conv_error.record_only_pairs_expected _tp_loc sexp
           | [] -> ()
         in
         iter field_sexps;
         (match !duplicates with
          | _ :: _ ->
            Ppx_sexp_conv_lib.Conv_error.record_duplicate_fields _tp_loc !duplicates sexp
          | [] ->
            (match !extra with
             | _ :: _ ->
               Ppx_sexp_conv_lib.Conv_error.record_extra_fields _tp_loc !extra sexp
             | [] ->
               (match
                  ( !filename_field
                  , !line_number_field
                  , !line_start_field
                  , !start_pos_field
                  , !end_pos_field )
                with
                | ( Ppx_sexp_conv_lib.Option.Some filename_value
                  , Ppx_sexp_conv_lib.Option.Some line_number_value
                  , Ppx_sexp_conv_lib.Option.Some line_start_value
                  , Ppx_sexp_conv_lib.Option.Some start_pos_value
                  , Ppx_sexp_conv_lib.Option.Some end_pos_value ) ->
                  { filename = filename_value
                  ; line_number = line_number_value
                  ; line_start = line_start_value
                  ; start_pos = start_pos_value
                  ; end_pos = end_pos_value
                  }
                | _ ->
                  Ppx_sexp_conv_lib.Conv_error.record_undefined_elements
                    _tp_loc
                    sexp
                    [ ( Ppx_sexp_conv_lib.Conv.( = )
                          !filename_field
                          Ppx_sexp_conv_lib.Option.None
                      , "filename" )
                    ; ( Ppx_sexp_conv_lib.Conv.( = )
                          !line_number_field
                          Ppx_sexp_conv_lib.Option.None
                      , "line_number" )
                    ; ( Ppx_sexp_conv_lib.Conv.( = )
                          !line_start_field
                          Ppx_sexp_conv_lib.Option.None
                      , "line_start" )
                    ; ( Ppx_sexp_conv_lib.Conv.( = )
                          !start_pos_field
                          Ppx_sexp_conv_lib.Option.None
                      , "start_pos" )
                    ; ( Ppx_sexp_conv_lib.Conv.( = )
                          !end_pos_field
                          Ppx_sexp_conv_lib.Option.None
                      , "end_pos" )
                    ])))
       | Ppx_sexp_conv_lib.Sexp.Atom _ as sexp ->
         Ppx_sexp_conv_lib.Conv_error.record_list_instead_atom _tp_loc sexp
         : Ppx_sexp_conv_lib.Sexp.t -> t)
    ;;

    let _ = t_of_sexp

    let sexp_of_t =
      (function
        | { filename = v_filename
          ; line_number = v_line_number
          ; line_start = v_line_start
          ; start_pos = v_start_pos
          ; end_pos = v_end_pos
          } ->
          let bnds = [] in
          let bnds =
            let arg = sexp_of_int v_end_pos in
            Ppx_sexp_conv_lib.Sexp.List [ Ppx_sexp_conv_lib.Sexp.Atom "end_pos"; arg ]
            :: bnds
          in
          let bnds =
            let arg = sexp_of_int v_start_pos in
            Ppx_sexp_conv_lib.Sexp.List [ Ppx_sexp_conv_lib.Sexp.Atom "start_pos"; arg ]
            :: bnds
          in
          let bnds =
            let arg = sexp_of_int v_line_start in
            Ppx_sexp_conv_lib.Sexp.List [ Ppx_sexp_conv_lib.Sexp.Atom "line_start"; arg ]
            :: bnds
          in
          let bnds =
            let arg = sexp_of_int v_line_number in
            Ppx_sexp_conv_lib.Sexp.List [ Ppx_sexp_conv_lib.Sexp.Atom "line_number"; arg ]
            :: bnds
          in
          let bnds =
            let arg = Name.sexp_of_t v_filename in
            Ppx_sexp_conv_lib.Sexp.List [ Ppx_sexp_conv_lib.Sexp.Atom "filename"; arg ]
            :: bnds
          in
          Ppx_sexp_conv_lib.Sexp.List bnds
          : t -> Ppx_sexp_conv_lib.Sexp.t)
    ;;

    let _ = sexp_of_t

    let compare =
      (fun a__001_ b__002_ ->
         if Ppx_compare_lib.phys_equal a__001_ b__002_
         then 0
         else (
           match Name.compare a__001_.filename b__002_.filename with
           | 0 ->
             (match compare_int a__001_.line_number b__002_.line_number with
              | 0 ->
                (match compare_int a__001_.line_start b__002_.line_start with
                 | 0 ->
                   (match compare_int a__001_.start_pos b__002_.start_pos with
                    | 0 -> compare_int a__001_.end_pos b__002_.end_pos
                    | n -> n)
                 | n -> n)
              | n -> n)
           | n -> n)
           : t -> t -> int)
    ;;

    let _ = compare

    [@@@end]

    let compare a b =
      if not (Name.equal a.filename b.filename)
      then invalid_arg "Expect_test_collector.File.Location.compare"
      else compare a b
    ;;
  end

  include T
  include Comparable.Make (T)

  let beginning_of_file filename =
    { filename; line_number = 1; line_start = 0; start_pos = 0; end_pos = 0 }
  ;;
end

module Digest : sig
  type t [@@deriving_inline sexp_of, compare]

  include sig
    [@@@ocaml.warning "-32"]

    val sexp_of_t : t -> Ppx_sexp_conv_lib.Sexp.t
    val compare : t -> t -> int
  end
  [@@ocaml.doc "@inline"]

  [@@@end]

  val to_string : t -> string
  val of_string : string -> t
end = struct
  type t = string [@@deriving_inline sexp_of, compare]

  let _ = fun (_ : t) -> ()
  let sexp_of_t = (sexp_of_string : t -> Ppx_sexp_conv_lib.Sexp.t)
  let _ = sexp_of_t
  let compare = (compare_string : t -> t -> int)
  let _ = compare

  [@@@end]

  let to_string t = t

  let of_string s =
    let expected_length = 32 in
    if String.length s <> expected_length
    then invalid_arg "Expect_test_collector.File.Digest.of_string, unexpected length";
    for i = 0 to expected_length - 1 do
      match s.[i] with
      | '0' .. '9' | 'a' .. 'f' -> ()
      | _ -> invalid_arg "Expect_test_collector.File.Digest.of_string"
    done;
    s
  ;;
end
OCaml

Innovation. Community. Security.