package ppx_expect
Cram like framework for OCaml
Install
Dune Dependency
Authors
Maintainers
Sources
v0.15.1.tar.gz
sha256=dd3eaa86e921501414dac6b2f68238ff5455a0f7bec13f851dc51eba2f9a2097
doc/src/ppx_expect.matcher/reconcile.ml.html
Source file reconcile.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
open! Base open Import open Expect_test_common open Sexplib0.Sexp_conv module Result = struct (* Either match with an explicit success, or (lazily) produce a correction. *) type 'a t = | Match | Correction of 'a [@@deriving_inline sexp_of, compare] let _ = fun (_ : 'a t) -> () let sexp_of_t : 'a. ('a -> Sexplib0.Sexp.t) -> 'a t -> Sexplib0.Sexp.t = fun (type a__004_) : ((a__004_ -> Sexplib0.Sexp.t) -> a__004_ t -> Sexplib0.Sexp.t) -> fun _of_a__001_ -> function | Match -> Sexplib0.Sexp.Atom "Match" | Correction arg0__002_ -> let res0__003_ = _of_a__001_ arg0__002_ in Sexplib0.Sexp.List [ Sexplib0.Sexp.Atom "Correction"; res0__003_ ] ;; let _ = sexp_of_t let compare : 'a. ('a -> 'a -> int) -> 'a t -> 'a t -> int = fun _cmp__a a__005_ b__006_ -> if Ppx_compare_lib.phys_equal a__005_ b__006_ then 0 else ( match a__005_, b__006_ with | Match, Match -> 0 | Match, _ -> -1 | _, Match -> 1 | Correction _a__007_, Correction _b__008_ -> _cmp__a _a__007_ _b__008_) ;; let _ = compare [@@@end] let map t ~f = match t with | Match -> Match | Correction x -> Correction (f x) ;; let value t ~success = match t with | Match -> success | Correction f -> f ;; end let matches_regexp ~(pat : Re.t) s = Re.execp (Re.compile (Re.whole_string pat)) s ;; let glob = Re.Glob.glob ~anchored:true ~pathname:false ~expand_braces:true let line_matches ~(expect : Fmt.t) ~actual = match expect with | Literal expect -> expect = actual | Glob expect -> matches_regexp ~pat:(glob expect) actual | Regexp expect -> matches_regexp ~pat:(Re.Emacs.re expect) actual ;; let literal_line ~allow_output_patterns actual : Fmt.t Cst.Line.t = match actual with | "" -> Blank "" | _ -> let line_matches_itself = (not allow_output_patterns) || line_matches ~expect:(Lexer.parse_pretty_line actual ~allow_output_patterns) ~actual in Not_blank { data = Literal actual ; orig = (if line_matches_itself then actual else actual ^ " (literal)") ; trailing_blanks = "" } ;; let reconcile_line ~(expect : Fmt.t) ~actual ~allow_output_patterns : Fmt.t Cst.Line.t Result.t = assert (not (String.contains actual '\n')); if line_matches ~expect ~actual then Match else Correction (literal_line actual ~allow_output_patterns) ;; let rec lines_match ~(expect_lines : Fmt.t Cst.Line.t list) ~(actual_lines : string list) ~allow_output_patterns : bool = match expect_lines, actual_lines with | [], [] -> true | [], _ -> false | _, [] -> false | expect :: expect_lines, actual :: actual_lines -> let format = Cst.Line.data expect ~blank:(Literal "") ~conflict_marker:(fun marker -> Literal marker) in let line = reconcile_line ~expect:format ~actual ~allow_output_patterns in (match line with | Match -> lines_match ~expect_lines ~actual_lines ~allow_output_patterns | Correction _ -> false) ;; let rec corrected_rev acc ~(expect_lines : Fmt.t Cst.Line.t list) ~(actual_lines : string list) ~allow_output_patterns : Fmt.t Cst.Line.t list = match expect_lines, actual_lines with | [], [] -> acc | [], actual_lines -> List.fold actual_lines ~init:acc ~f:(fun acc x -> literal_line x ~allow_output_patterns :: acc) | _, [] -> acc | expect :: expect_lines, actual :: actual_lines -> let format = Cst.Line.data expect ~blank:(Literal "") ~conflict_marker:(fun marker -> Literal marker) in let line = reconcile_line ~expect:format ~actual ~allow_output_patterns |> Result.value ~success:expect in corrected_rev ~expect_lines ~actual_lines (line :: acc) ~allow_output_patterns ;; let reconcile_lines ~expect_lines ~actual_lines ~allow_output_patterns : Fmt.t Cst.Line.t list Result.t = if lines_match ~expect_lines ~actual_lines ~allow_output_patterns then Match else Correction (List.rev (corrected_rev [] ~expect_lines ~actual_lines ~allow_output_patterns)) ;; let expectation_body_internal ~(expect : Fmt.t Cst.t Expectation.Body.t) ~actual ~default_indent ~pad_single_line ~allow_output_patterns : Fmt.t Cst.t Expectation.Body.t Result.t = match expect with | Exact expect -> if expect = actual then Match else Correction (Exact actual) | Output -> Match | Pretty expect -> let actual_lines = Lexer.strip_surrounding_whitespaces actual |> Cst.stripped_original_lines in let expect_lines = Cst.to_lines expect in (match reconcile_lines ~expect_lines ~actual_lines ~allow_output_patterns with | Match -> Match | Correction reconciled_lines -> let reconciled = Cst.reconcile expect ~lines:reconciled_lines ~default_indentation:default_indent ~pad_single_line in Correction (Pretty reconciled)) | Unreachable -> let actual_lines = Lexer.strip_surrounding_whitespaces actual |> Cst.stripped_original_lines in (match reconcile_lines ~expect_lines:[] ~actual_lines ~allow_output_patterns with | Match -> Correction (Pretty (Empty "")) | Correction reconciled_lines -> let reconciled = Cst.reconcile (Empty "") ~lines:reconciled_lines ~default_indentation:default_indent ~pad_single_line in Correction (Pretty reconciled)) ;; let expectation_body ~(expect : Fmt.t Cst.t Expectation.Body.t) ~actual ~default_indent ~pad_single_line ~allow_output_patterns : Fmt.t Cst.t Expectation.Body.t Result.t = let res = expectation_body_internal ~expect ~actual ~default_indent ~pad_single_line ~allow_output_patterns in match res with | Match -> Match | Correction c -> (match expectation_body_internal ~expect:c ~actual ~default_indent ~pad_single_line ~allow_output_patterns with | Match -> res | Correction _ -> assert false) ;; module Private = struct let line_matches = line_matches let reconcile_line = reconcile_line end
sectionYPositions = computeSectionYPositions($el), 10)"
x-init="setTimeout(() => sectionYPositions = computeSectionYPositions($el), 10)"
>