mirror of
https://github.com/Mercury-Language/mercury.git
synced 2026-04-22 04:43:53 +00:00
There was a bug that prevented the tests in each directory from being run
in parallel, even when the mmake was invoked with e.g. -j4. The bug
was the absence of a '+' on an action that invoked tests/run_one_test.
Without that +, the make process inside the "mmake -j4 runtests_local"
command issued by bootcheck screwed up its connection with the recursive
make invoked by run_one_test, and apparently decided to stop using
parallelism. It was telling us this all this time but its messages,
which looked like this:
make[2]: warning: -jN forced in submake: disabling jobserver mode.
were lost in the sea of other bootcheck output until my recent change
to run_one_test.
A single-character change fixes the bug; the rest of this big change is
dealing with the consequences of fixing the bug. Many test cases in
the hard_coded and valid directories contain nested modules, which
need to be compiled sequentially.
tests/Mmake.common:
Fix the bug.
Delete the duplicate "ALL TESTS SUCCEEDED" message from the runtests
target, since the runtests_local target already prints a message
to that effect. Make this message more emphatic.
tests/run_one_test:
Make the output a bit easier to understand.
tests/hard_coded/*.{m,exp}:
tests/submodules/*.{m,exp}:
Move the source files and expected output files of the test cases that
use nested modules from hard_coded to submodules, since most of the tests
in the hard_coded can be done in parallel, while the ones in submodules
are already done in sequence.
tests/hard_coded/Mmakefile:
tests/hard_coded/Mercury.options:
tests/submodules/Mmakefile:
tests/submodules/Mercury.options:
Move the Mmakefile and Mercury.options entries of the moved test cases
from hard_coded to submodules.
tests/valid_seq:
A new test directory, to hold the test cases originally in tests/valid
that contain nested modules. Moving these to a new directory, which
forces -j1, allows us to execute the remaining ones in parallel.
tests/valid/*.m:
tests/valid_seq/*.m:
Move the source files of the test cases that use nested modules
from valid to valid_seq.
In a few cases, clean up the test cases a bit.
tests/valid/Mmakefile:
tests/valid/Mercury.options:
tests/valid_seq/Mmakefile:
tests/valid_seq/Mercury.options:
tests/valid/Mmake.valid.common:
Add valid_seq/Mmakefile to list the test cases now in valid_seq,
and add valid_seq/Mercury.options to hold their option values.
Delete the entries of those tests from valid/Mmakefile, and their option
values from valid/Mercury.options. Unlike valid/Mmakefile,
valid_seq/Mmakefile forces -j1.
To avoid unnecessary duplication between the two Makefiles, put
all the rules that both need into valid/Mmake.valid.common, and
include this in both Mmakefiles.
tests/string_format/Mmakefile:
Force -j1, since these tests share a library module.
tests/Mmakefile:
List the new valid_seq directory among the others.
tests/bootcheck:
Execute the tests in the new valid_seq directory as well as the others.
Record when the execution of the test suite is started.
Comment out invocations of set -x, since they add no useful information
in the vast majority of cases. The comment sign can be removed if and
when the information *would* be useful.
Don't try to copy a nonexistent file. (The error message about this
was also lost in the noise.)
61 lines
1.5 KiB
Mathematica
61 lines
1.5 KiB
Mathematica
%---------------------------------------------------------------------------%
|
|
% vim: ts=4 sw=4 et ft=mercury
|
|
%---------------------------------------------------------------------------%
|
|
|
|
:- module constraint_proof_bug.
|
|
|
|
:- interface.
|
|
|
|
:- import_module io.
|
|
|
|
:- pred main(io.state::di, io.state::uo) is det.
|
|
|
|
:- implementation.
|
|
|
|
:- import_module constraint_proof_bug_lib.
|
|
:- import_module io.
|
|
:- import_module require.
|
|
:- import_module string.
|
|
|
|
:- type service == string.
|
|
:- type prestationid == int.
|
|
:- type provider == int.
|
|
|
|
:- type bevent
|
|
---> prest(prestationid, date, code, provider)
|
|
; day(int, date)
|
|
; admit(date, service)
|
|
; discharge(date, service)
|
|
; transfer(date, service, service)
|
|
; wrong(date).
|
|
|
|
:- some [T] pred get_field(bevent, string, T) => constrainable(T).
|
|
:- mode get_field(in, in, out) is semidet.
|
|
|
|
get_field(Ev, Field, R) :-
|
|
( Field = "date" ->
|
|
R = d(Dt),
|
|
get_date_field(Ev, Dt)
|
|
; Field = "code" ->
|
|
R = c(Cd),
|
|
get_code_field(Ev, Cd)
|
|
;
|
|
error("No handler for this field")
|
|
).
|
|
|
|
:- pred get_date_field(bevent::in, date::out) is det.
|
|
|
|
get_date_field(prest(_, Dt, _, _), Dt).
|
|
get_date_field(day(_, Dt), Dt).
|
|
get_date_field(admit(Dt, _), Dt).
|
|
get_date_field(discharge(Dt, _), Dt).
|
|
get_date_field(transfer(Dt, _, _), Dt).
|
|
get_date_field(wrong(Dt), Dt).
|
|
|
|
:- pred get_code_field(bevent::in, code::out) is semidet.
|
|
|
|
get_code_field(prest(_, _, Cd, _), Cd).
|
|
|
|
main -->
|
|
print("hello world\n").
|