diff --git a/examples/c/bistromathic/bistromathic.test b/examples/c/bistromathic/bistromathic.test index 5e8b044b..c32c1f45 100755 --- a/examples/c/bistromathic/bistromathic.test +++ b/examples/c/bistromathic/bistromathic.test @@ -17,7 +17,7 @@ # macOS' version of readline does not repeat stdin on stdout in # non-interactive mode. -if ! echo '1-1' | prog | grep '1-1'; then +if ! echo '1-1' | prog | grep '1-1' >/dev/null; then strip_prompt=true fi @@ -65,26 +65,30 @@ cat >input < * -> err: 1.1: syntax error: expected end of file or - or ( or exit or number or function or variable before *' +> '' +err: 1.1: syntax error: expected end of file or - or ( or exit or number or function or variable before *' cat >input < 1 + 2 * * 3 -> err: 1.9: syntax error: expected - or ( or number or function or variable before *' +> '' +err: 1.9: syntax error: expected - or ( or number or function or variable before *' + +cat >input < 1 / 0 +> '' +err: 1.1-5: error: division by zero' cat >input < 100% 100 -> err: 1.4: error: invalid character' - -cat >input < 1 / 0 -> err: 1.1-5: error: division by zero' +> '' +err: 1.4: error: invalid character' ## ------------ ## @@ -109,21 +113,24 @@ EOF run 0 '> (1+ ( - atan cos exp ln number sin sqrt > (1+ -> err: 1.4: syntax error: expected - or ( or number or function or variable before end of file' +> '' +err: 1.4: syntax error: expected - or ( or number or function or variable before end of file' # Check the completion of a word. sed -e 's/\\t/ /g' >input < (atan ( '' -> err: 1.9: syntax error: expected - or ( or number or function or variable before end of file' +> '' +err: 1.9: syntax error: expected - or ( or number or function or variable before end of file' # Check the completion at the very beginning. sed -e 's/\\t/ /g' >input < e +run -n 0 '> e end of file exit exp '' > e 0 -> err: ' +> '' +err: ' diff --git a/examples/c/bistromathic/parse.y b/examples/c/bistromathic/parse.y index c47bec75..607a6ef4 100644 --- a/examples/c/bistromathic/parse.y +++ b/examples/c/bistromathic/parse.y @@ -543,7 +543,11 @@ int main (int argc, char const* argv[]) { char *line = readline ("> "); if (!line) - return 0; + { + // Finish the line started by the prompt. + putchar ('\n'); + break; + } if (*line) add_history (line); process_line (&lloc, line); diff --git a/examples/test b/examples/test index 9544cb8d..044446ec 100755 --- a/examples/test +++ b/examples/test @@ -68,15 +68,21 @@ trap cleanup 0 1 2 13 15 mkdir $$.dir cd $$.dir -# run [-noerr] EXPECTED-EXIT-STATUS EXPECTED-OUTPUT [PARSER-OPTIONS] -# ------------------------------------------------------------------ +# run [-noerr, -n] EXPECTED-EXIT-STATUS EXPECTED-OUTPUT [PARSER-OPTIONS] +# ---------------------------------------------------------------------- # -noerr: ignore stderr, otherwise merge it into effective output. +# -n: not final end-of-line in expected-output run () { noerr=false - case $1 in - (-noerr) noerr=true; shift;; - esac + echo=echo + while true; do + case $1 in + (-noerr) noerr=true; shift;; + (-n) echo=printf; shift;; + (*) break;; + esac + done # Expected exit status. sta_exp=$1 @@ -84,9 +90,9 @@ run () # Expected output. if $strip_prompt; then - out_exp=$(echo "$1" | sed -e 's/^> err:/err:/;/^> /d') + $echo "$1" | sed -e '/^> /d' >exp else - out_exp=$1 + $echo "$1" >exp fi shift @@ -96,19 +102,21 @@ run () prog "$@" - out_eff 2>err_eff || sta_eff=$? # Combine effective output and error streams. - out_eff=$(cat out_eff && $noerr || sed -e 's/^/err: /g' err_eff) + { cat out_eff && $noerr || sed -e 's/^/err: /g' err_eff; } >eff if test $sta_eff -eq $sta_exp; then - if test "$out_eff" = "$out_exp"; then + if cmp eff exp 2>/dev/null; then echo "$me: PASS: $number" else echo "$me: FAIL: $number" echo "$me: input:" sed -e 's/^/ /' input echo "$me: expected output:" - echo "$out_exp" | sed -e 's/^/ /' + sed -e 's/^/ /' exp echo "$me: effective output:" - echo "$out_eff" | sed -e 's/^/ /' + sed -e 's/^/ /' eff + echo "$me: diff:" + diff -u exp eff | sed -e 's/^/ /' exit=false fi else