bison-patches
[Top][All Lists]
Advanced

[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




reply via email to

[Prev in Thread] Current Thread [Next in Thread]