Add tests for all permutations of virtual modules field

All permutations of:

* presence of implementation
* presence in virtual_modules
* presence in modules_without_implementation

Signed-off-by: Rudi Grinberg <rudi.grinberg@gmail.com>
This commit is contained in:
Rudi Grinberg 2018-09-04 10:02:43 +04:00
parent 15e06f8008
commit cf86781ad2
2 changed files with 105 additions and 0 deletions

View File

@ -0,0 +1,60 @@
module List = ListLabels
open Printf
let write_file ~file ~contents =
let ch = open_out file in
output_string ch contents;
close_out_noerr ch
let lib_stanza ~modules_without_implementation ~virtual_modules =
sprintf "(library\n (name foo)%s%s)"
(if modules_without_implementation then
"\n (modules_without_implementation m)"
else
"")
(if virtual_modules then
"\n (virtual_modules m)"
else
"")
let chdir dir ~f =
let old_dir = Sys.getcwd () in
begin try
Sys.chdir dir;
f ()
with e ->
Sys.chdir old_dir;
raise e
end;
Sys.chdir old_dir
let gen_test ~impl ~modules_without_implementation ~virtual_modules =
printf "impl: %b. modules_without_implementation: %b. virtual_modules: %b\n%!"
impl modules_without_implementation virtual_modules;
let dir =
sprintf "%b-%b-%b" impl modules_without_implementation virtual_modules
in
let _ = Sys.command (sprintf "mkdir -p %s" dir) in
chdir dir ~f:(fun () ->
write_file ~file:"dune-project"
~contents:"(lang dune 1.2)\n\
(using in_development_do_not_use_variants 0.1)";
write_file ~file:"m.mli" ~contents:"";
if impl then
write_file ~file:"m.ml" ~contents:"";
write_file ~file:"dune" ~contents:(
lib_stanza ~modules_without_implementation ~virtual_modules);
ignore (Sys.command "dune build");
print_endline "-------------------------"
)
let bools = [true; false]
let () =
List.iter bools ~f:(fun impl ->
List.iter bools ~f:(fun modules_without_implementation ->
List.iter bools ~f:(fun virtual_modules ->
gen_test ~impl ~modules_without_implementation ~virtual_modules
)
)
)

View File

@ -15,3 +15,48 @@ virtual libraries may not implement their virtual modules
^^^
Error: Module Foo has an implementation, it cannot be listed here
[1]
$ cd module-fields && ocaml test.ml
impl: true. modules_without_implementation: true. virtual_modules: true
File "dune", line 3, characters 33-34:
3 | (modules_without_implementation m)
^
Error: Module M has an implementation, it cannot be listed here
-------------------------
impl: true. modules_without_implementation: true. virtual_modules: false
File "dune", line 3, characters 33-34:
3 | (modules_without_implementation m))
^
Error: Module M has an implementation, it cannot be listed here
-------------------------
impl: true. modules_without_implementation: false. virtual_modules: true
File "dune", line 3, characters 18-19:
3 | (virtual_modules m))
^
Error: Module M has an implementation, it cannot be listed here
-------------------------
impl: true. modules_without_implementation: false. virtual_modules: false
-------------------------
impl: false. modules_without_implementation: true. virtual_modules: true
File "dune", line 4, characters 18-19:
4 | (virtual_modules m))
^
Error: These modules appear in the virtual_libraries and modules_without_implementation fields:
- m
This is not possible.
-------------------------
impl: false. modules_without_implementation: true. virtual_modules: false
-------------------------
impl: false. modules_without_implementation: false. virtual_modules: true
-------------------------
impl: false. modules_without_implementation: false. virtual_modules: false
File "dune", line 1, characters 0-21:
1 | (library
2 | (name foo))
Warning: Some modules don't have an implementation.
You need to add the following field to this stanza:
(modules_without_implementation m)
This will become an error in the future.
-------------------------