[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[PATCH 12/16] examples: bistromathic: when quitting, close the current l
From: |
Akim Demaille |
Subject: |
[PATCH 12/16] examples: bistromathic: when quitting, close the current line |
Date: |
Sun, 26 Apr 2020 16:40:47 +0200 |
When the user ctrl-d the line, we left the cursor not at col 0.
Let's fix that.
This revealed a few short-comings in the testing framework.
* examples/test (run): Also display the diffs.
And support -n.
* examples/c/bistromathic/bistromathic.test
* examples/c/bistromathic/parse.y
---
examples/c/bistromathic/bistromathic.test | 35 ++++++++++++++---------
examples/c/bistromathic/parse.y | 6 +++-
examples/test | 30 ++++++++++++-------
3 files changed, 45 insertions(+), 26 deletions(-)
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 <<EOF
*
EOF
run 0 '> *
-> 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 <<EOF
1 + 2 * * 3
EOF
run 0 '> 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 <<EOF
-100%
+1 / 0
EOF
-run 0 '> 100%
-100
-> err: 1.4: error: invalid character'
+run 0 '> 1 / 0
+> ''
+err: 1.1-5: error: division by zero'
cat >input <<EOF
-1 / 0
+100%
EOF
-run 0 '> 1 / 0
-> err: 1.1-5: error: division by zero'
+run 0 '> 100%
+100
+> ''
+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 <<EOF
(at\t\t
EOF
run 0 '> (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 <<EOF
e\t\t
EOF
-run 0 '> 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 "$@" - <input >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
--
2.26.2
- [PATCH 04/16] style: prefer b4_has_translations_if, (continued)
- [PATCH 04/16] style: prefer b4_has_translations_if, Akim Demaille, 2020/04/26
- [PATCH 02/16] style: fix a few remaining 'type' instead of 'kind', Akim Demaille, 2020/04/26
- [PATCH 01/16] skeletons: make the warning about implementation details clearer, Akim Demaille, 2020/04/26
- [PATCH 06/16] all: prefer YYERRCODE to YYERROR, Akim Demaille, 2020/04/26
- [PATCH 08/16] c++: always define symbol_name, Akim Demaille, 2020/04/26
- [PATCH 09/16] c++: make valid to print the empty symbol, Akim Demaille, 2020/04/26
- [PATCH 11/16] examples: bistromathic: comment changes, Akim Demaille, 2020/04/26
- [PATCH 10/16] doc: hacking tricks, Akim Demaille, 2020/04/26
- [PATCH 05/16] style: glr.c: clarify, Akim Demaille, 2020/04/26
- [PATCH 13/16] examples: bistromathic: demonstrate error recovery, Akim Demaille, 2020/04/26
- [PATCH 12/16] examples: bistromathic: when quitting, close the current line,
Akim Demaille <=
- [PATCH 15/16] all: don't emit an error message when the scanner returns YYERRCODE, Akim Demaille, 2020/04/26
- [PATCH 16/16] todo: update, Akim Demaille, 2020/04/26
- [PATCH 14/16] c: don't emit an error message when the scanner returns YYERRCODE, Akim Demaille, 2020/04/26