From: Bennet Bleßmann Date: Sat, 26 Jul 2025 21:10:29 +0000 (+0200) Subject: adjust options checking and add more tests X-Git-Tag: v0.10.0~35^2^2~7 X-Git-Url: https://git.sagredo.dev/?a=commitdiff_plain;h=143f32be233e8e19ad771b937c1a6d01db58af47;p=scryer-prolog.git adjust options checking and add more tests --- diff --git a/src/lib/process.pl b/src/lib/process.pl index fcc17491..6f293179 100644 --- a/src/lib/process.pl +++ b/src/lib/process.pl @@ -9,7 +9,7 @@ :- use_module(library(error)). :- use_module(library(iso_ext)). -:- use_module(library(lists), [member/2, maplist/2]). +:- use_module(library(lists), [member/2, maplist/2, maplist/3, append/2]). :- use_module(library(reif), [tfilter/3, memberd_t/3]). @@ -48,7 +48,6 @@ process_create(Exe, Args, Options) :- must_be(list, Args), maplist(must_be(chars), Args), must_be(list, Options), - must_be_known_options([stdin, stdout, stderr, env, environment, process, cwd], [], Options), check_options( [ option([stdin], valid_stdio, stdin(std), stdin(Stdin)), @@ -58,7 +57,9 @@ process_create(Exe, Args, Options) :- option([process], valid_uninit_process, process(_), process(Process)), option([cwd], valid_cwd, cwd("."), cwd(Cwd)) ], - Options + Options, + process_create_option, + process_create/3 ), Stdin =.. Stdin1, Stdout =.. Stdout1, @@ -100,11 +101,13 @@ process_wait(Process, Status) :- process_wait(Process, Status, []). % process_wait(Process, Status, Options) :- valid_process(Process, process_wait/3), - must_be_known_options([timeout], [], Options),check_options( + check_options( [ option([timeout], valid_timeout, timeout(infinite), timeout(Timeout)) ], - Options + Options, + process_wait_option, + process_wait/3 ), '$process_wait'(Process, Exit, Timeout), Exit = Status. @@ -136,24 +139,34 @@ process_release(Process) :- '$process_release'(Process). -must_be_known_options(_, _, []). -must_be_known_options(Valid, Found, [X|XS]) :- +must_be_known_options(Valid, Options, Domain, Context) :- must_be_known_options_(Valid, [], Options, Domain, Context). + +must_be_known_options_(_, _, [], _, _). +must_be_known_options_(Valid, Found, [X|XS], Domain, Context) :- functor(X, Option, 1), - ( member(Option, Found) -> domain_error(non_duplicate_process_create_options, process_create/3) + ( member(Option, Found) -> domain_error(non_duplicate_options, Option , Context) ; member(Option, Valid) -> true - ; domain_error(process_create_option, Option, process_create/3) + ; domain_error(Domain, Option, Context) ), - must_be_known_options(Valid, [Option | Found], XS). + must_be_known_options_(Valid, [Option | Found], XS, Domain, Context). + +check_options(KnownOptions, Options, Domain, Context) :- + maplist(option_names, KnownOptions, Namess), + append(Namess, Names), + must_be_known_options(Names, Options, Domain, Context), + check_options_(KnownOptions, Options, Context). + +option_names(option(Names,_,_,_), Names). -check_options([], _). -check_options([X | XS], Options) :- +check_options_([], _, _). +check_options_([X | XS], Options, Context) :- option(Kinds, Pred, Default, Choice) = X, tfilter(find_option(Kinds), Options, Solutions), ( Solutions = [] -> Choice = Default ; Solutions = [Provided] -> call(Pred, Provided), Choice = Provided - ; error(domain_error(non_confliction_process_options, Solutions), process_create/3) + ; domain_error(non_conflicting_options, Solutions, Context) ), - check_options(XS, Options). + check_options_(XS, Options, Context). find_option(Names, Found, T) :- functor(Found, Name, 1), @@ -162,7 +175,7 @@ find_option(Names, Found, T) :- valid_stdio(IO) :- arg(1, IO, Arg), ( var(Arg) -> instantiation_error(process_create/3) ; valid_stdio_(Arg) -> true - ; domain_error(process_create_option, Arg, process_create/3) + ; domain_error(stdio_spec, Arg, process_create/3) ). valid_stdio_(std). diff --git a/tests/scryer/cli/src_tests/process.md b/tests/scryer/cli/src_tests/process.md new file mode 100644 index 00000000..76f8b3e4 --- /dev/null +++ b/tests/scryer/cli/src_tests/process.md @@ -0,0 +1,29 @@ +```trycmd +$ scryer-prolog -f --no-add-history -g 'use_module(library(process)), process_create("", [], [invalid(_), process(P)]), process_kill(P, _), halt' +use_module(library(process)),process_create([],[],[invalid(_[..]),process(P)]),process_kill(P,_[..]),halt causes: error(domain_error(process_create_option,invalid),process_create/3) + +``` + +```trycmd +$ scryer-prolog -f --no-add-history -g 'use_module(library(process)), process_create("", [], [stdin(null), stdin(null), process(P)]), process_kill(P, _), halt' +use_module(library(process)),process_create([],[],[stdin(null),stdin(null),process(P)]),process_kill(P,_[..]),halt causes: error(domain_error(non_duplicate_options,stdin),process_create/3) + +``` + +```trycmd +$ scryer-prolog -f --no-add-history -g 'use_module(library(process)), process_create("", [], [env([]), environment([]), process(P)]), process_kill(P, _), halt' +use_module(library(process)),process_create([],[],[env([]),environment([]),process(P)]),process_kill(P,_[..]),halt causes: error(domain_error(non_conflicting_options,[env([]),environment([])]),process_create/3) + +``` + +```trycmd +$ scryer-prolog -f --no-add-history -g 'use_module(library(process)), process_wait(pid, _, [invalid(_), timeout(0)]), halt' +use_module(library(process)),process_wait(pid,_[..],[invalid(_[..]),timeout(0)]),halt causes: error(domain_error(process_wait_option,invalid),process_wait/3) + +``` + +```trycmd +$ scryer-prolog -f --no-add-history -g 'use_module(library(process)), process_create("", [], [stdin(invalid), process(P)]), process_kill(P, _), halt' +use_module(library(process)),process_create([],[],[stdin(invalid),process(P)]),process_kill(P,_[..]),halt causes: error(domain_error(stdio_spec,invalid),process_create/3) + +``` diff --git a/tests/scryer/main.rs b/tests/scryer/main.rs index 19c78c59..c46ced24 100644 --- a/tests/scryer/main.rs +++ b/tests/scryer/main.rs @@ -23,7 +23,8 @@ fn cli_tests() { cases .default_bin_name("scryer-prolog") .case("tests/scryer/cli/issues/*.toml") - .case("tests/scryer/cli/src_tests/*.toml"); + .case("tests/scryer/cli/src_tests/*.toml") + .case("tests/scryer/cli/src_tests/*.md"); #[cfg(windows)] {