From 7e1300ab959df979e425f45df4e303441481cbb0 Mon Sep 17 00:00:00 2001 From: Rudi Grinberg Date: Wed, 14 Feb 2018 02:13:57 +0800 Subject: [PATCH] Add .merlin tests (#508) These require post-processing all the absolute paths out of the .merlin --- test/blackbox-tests/jbuild | 11 ++++++- .../test-cases/merlin-tests/exe/jbuild | 5 ++++ .../test-cases/merlin-tests/exe/x.ml | 0 .../test-cases/merlin-tests/jbuild | 6 ++++ .../test-cases/merlin-tests/lib/jbuild | 4 +++ .../test-cases/merlin-tests/ppx/jbuild | 5 ++++ .../test-cases/merlin-tests/run.t | 29 +++++++++++++++++++ .../merlin-tests/sanitize-dot-merlin/jbuild | 5 ++++ .../sanitize_dot_merlin.ml | 25 ++++++++++++++++ 9 files changed, 89 insertions(+), 1 deletion(-) create mode 100644 test/blackbox-tests/test-cases/merlin-tests/exe/jbuild create mode 100644 test/blackbox-tests/test-cases/merlin-tests/exe/x.ml create mode 100644 test/blackbox-tests/test-cases/merlin-tests/jbuild create mode 100644 test/blackbox-tests/test-cases/merlin-tests/lib/jbuild create mode 100644 test/blackbox-tests/test-cases/merlin-tests/ppx/jbuild create mode 100644 test/blackbox-tests/test-cases/merlin-tests/run.t create mode 100644 test/blackbox-tests/test-cases/merlin-tests/sanitize-dot-merlin/jbuild create mode 100644 test/blackbox-tests/test-cases/merlin-tests/sanitize-dot-merlin/sanitize_dot_merlin.ml diff --git a/test/blackbox-tests/jbuild b/test/blackbox-tests/jbuild index 267fe68b..11e912a7 100644 --- a/test/blackbox-tests/jbuild +++ b/test/blackbox-tests/jbuild @@ -308,7 +308,6 @@ (run ${exe:cram.exe} run.t) (diff? run.t run.t.corrected))))))) - (alias ((name runtest) (deps ((files_recursively_in test-cases/byte-code-only))) @@ -319,6 +318,16 @@ (run ${exe:cram.exe} run.t) (diff? run.t run.t.corrected))))))) +(alias + ((name runtest) + (deps ((files_recursively_in test-cases/merlin-tests))) + (action + (chdir test-cases/merlin-tests + (setenv JBUILDER ${bin:jbuilder} + (progn + (run ${exe:cram.exe} run.t) + (diff? run.t run.t.corrected))))))) + (alias ((name runtest) (deps ((files_recursively_in test-cases/findlib))) diff --git a/test/blackbox-tests/test-cases/merlin-tests/exe/jbuild b/test/blackbox-tests/test-cases/merlin-tests/exe/jbuild new file mode 100644 index 00000000..7e327a8e --- /dev/null +++ b/test/blackbox-tests/test-cases/merlin-tests/exe/jbuild @@ -0,0 +1,5 @@ +(jbuild_version 1) + +(executable + ((name x) + (libraries (foo)))) diff --git a/test/blackbox-tests/test-cases/merlin-tests/exe/x.ml b/test/blackbox-tests/test-cases/merlin-tests/exe/x.ml new file mode 100644 index 00000000..e69de29b diff --git a/test/blackbox-tests/test-cases/merlin-tests/jbuild b/test/blackbox-tests/test-cases/merlin-tests/jbuild new file mode 100644 index 00000000..ebf8aa95 --- /dev/null +++ b/test/blackbox-tests/test-cases/merlin-tests/jbuild @@ -0,0 +1,6 @@ +(jbuild_version 1) + +(alias + ((name print-merlins) + (deps (lib/.merlin exe/.merlin)) + (action (run ./sanitize-dot-merlin/sanitize_dot_merlin.exe ${^})))) diff --git a/test/blackbox-tests/test-cases/merlin-tests/lib/jbuild b/test/blackbox-tests/test-cases/merlin-tests/lib/jbuild new file mode 100644 index 00000000..5a288279 --- /dev/null +++ b/test/blackbox-tests/test-cases/merlin-tests/lib/jbuild @@ -0,0 +1,4 @@ +(library + ((name foo) + (libraries (bytes unix findlib)) + (preprocess (pps (fooppx))))) diff --git a/test/blackbox-tests/test-cases/merlin-tests/ppx/jbuild b/test/blackbox-tests/test-cases/merlin-tests/ppx/jbuild new file mode 100644 index 00000000..0ec6ef55 --- /dev/null +++ b/test/blackbox-tests/test-cases/merlin-tests/ppx/jbuild @@ -0,0 +1,5 @@ +(jbuild_version 1) + +(library + ((name fooppx) + (kind ppx_rewriter))) diff --git a/test/blackbox-tests/test-cases/merlin-tests/run.t b/test/blackbox-tests/test-cases/merlin-tests/run.t new file mode 100644 index 00000000..2531cc6f --- /dev/null +++ b/test/blackbox-tests/test-cases/merlin-tests/run.t @@ -0,0 +1,29 @@ + $ $JBUILDER build @print-merlins -j1 --display short --root . + ocamldep sanitize-dot-merlin/sanitize_dot_merlin.ml.d + ocamlc sanitize-dot-merlin/.sanitize_dot_merlin.eobjs/sanitize_dot_merlin.{cmi,cmo,cmt} + ocamlopt sanitize-dot-merlin/.sanitize_dot_merlin.eobjs/sanitize_dot_merlin.{cmx,o} + ocamlopt sanitize-dot-merlin/sanitize_dot_merlin.exe + sanitize_dot_merlin alias print-merlins + # Processing exe/.merlin + B ../_build/default/exe/.x.eobjs + B ../_build/default/lib/.foo.objs + B $LIB_PREFIX/lib/bytes + B $LIB_PREFIX/lib/findlib + B $LIB_PREFIX/lib/ocaml + FLG -w -40 + S . + S ../lib + S $LIB_PREFIX/lib/bytes + S $LIB_PREFIX/lib/findlib + S $LIB_PREFIX/lib/ocaml + # Processing lib/.merlin + B ../_build/default/lib/.foo.objs + B $LIB_PREFIX/lib/bytes + B $LIB_PREFIX/lib/findlib + B $LIB_PREFIX/lib/ocaml + FLG -open Foo -w -40 + FLG -ppx '$PPX/fooppx@/ppx.exe --as-ppx --cookie '\''library-name="foo"'\''' + S . + S $LIB_PREFIX/lib/bytes + S $LIB_PREFIX/lib/findlib + S $LIB_PREFIX/lib/ocaml diff --git a/test/blackbox-tests/test-cases/merlin-tests/sanitize-dot-merlin/jbuild b/test/blackbox-tests/test-cases/merlin-tests/sanitize-dot-merlin/jbuild new file mode 100644 index 00000000..c05c8d98 --- /dev/null +++ b/test/blackbox-tests/test-cases/merlin-tests/sanitize-dot-merlin/jbuild @@ -0,0 +1,5 @@ +(jbuild_version 1) + +(executable + ((name sanitize_dot_merlin) + (libraries (str)))) diff --git a/test/blackbox-tests/test-cases/merlin-tests/sanitize-dot-merlin/sanitize_dot_merlin.ml b/test/blackbox-tests/test-cases/merlin-tests/sanitize-dot-merlin/sanitize_dot_merlin.ml new file mode 100644 index 00000000..6194ea4d --- /dev/null +++ b/test/blackbox-tests/test-cases/merlin-tests/sanitize-dot-merlin/sanitize_dot_merlin.ml @@ -0,0 +1,25 @@ +open Printf + +let process_line = + let path_re = Str.regexp {|^\([SB]\) /.+/lib/\(.+\)$|} in + let ppx_re = Str.regexp {|^FLG -ppx '/.+/\.ppx/\(.+\)$|} in + fun line -> + line + |> Str.replace_first path_re {|\1 $LIB_PREFIX/lib/\2|} + |> Str.global_replace ppx_re {|FLG -ppx '$PPX/\1|} + +let () = + let files = ref [] in + let anon s = files := s :: !files in + let usage = sprintf "%s [FILES]" (Filename.basename Sys.executable_name) in + Arg.parse [] anon usage; + List.iter (fun f -> + Printf.printf "# Processing %s\n" f; + let ch = open_in f in + let rec loop () = + match input_line ch with + | exception End_of_file -> () + | line -> print_endline (process_line line); loop () in + loop (); + close_in ch + ) !files