]> Repositorios git - scryer-prolog.git/commitdiff
adjust options checking and add more tests
authorBennet Bleßmann <[email protected]>
Sat, 26 Jul 2025 21:10:29 +0000 (23:10 +0200)
committerBennet Bleßmann <[email protected]>
Fri, 1 Aug 2025 18:48:44 +0000 (20:48 +0200)
src/lib/process.pl
tests/scryer/cli/src_tests/process.md [new file with mode: 0644]
tests/scryer/main.rs

index fcc174917f2e8bef585df77ad04949a6d31ceba4..6f293179c1fd3e6814748386a576660e41842b7b 100644 (file)
@@ -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 (file)
index 0000000..76f8b3e
--- /dev/null
@@ -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)
+
+```
index 19c78c5959069ea9e3ba815c07e15975c28a3933..c46ced24f448fea95e7300f52e1b2c01c4894924 100644 (file)
@@ -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)]
     {