From b976fd557104ee1bc7f364215a5ae7917ff98c23 Mon Sep 17 00:00:00 2001
From: Matthew Hague <matthew.hague@rhul.ac.uk>
Date: Thu, 11 Nov 2021 11:46:37 +0000
Subject: [PATCH] Fail if too much output

Add "expectFinished" method to SubmissionWrapper, use it in the
scriptedInteraction convenience method defined in BaseTester.
---
 .../uk/ac/rhul/cs/javatester/BaseTester.java  | 11 +++++++-
 .../rhul/cs/javatester/SubmissionWrapper.java | 26 ++++++++++++++++++-
 .../uk/ac/rhul/cs/javatester/UnitTests.java   | 18 +++++++++++++
 3 files changed, 53 insertions(+), 2 deletions(-)

diff --git a/src/main/java/uk/ac/rhul/cs/javatester/BaseTester.java b/src/main/java/uk/ac/rhul/cs/javatester/BaseTester.java
index 7a2ec70..d19933f 100644
--- a/src/main/java/uk/ac/rhul/cs/javatester/BaseTester.java
+++ b/src/main/java/uk/ac/rhul/cs/javatester/BaseTester.java
@@ -14,6 +14,7 @@ import java.nio.file.Path;
 import java.nio.file.Paths;
 import java.nio.file.StandardCopyOption;
 
+import java.util.ArrayList;
 import java.util.Arrays;
 import java.util.Comparator;
 import java.util.List;
@@ -206,7 +207,8 @@ public abstract class BaseTester {
      * Create a wrapper and run wrapper.scriptedInteraction then output
      * the result to the user
      *
-     * Convenience method
+     * Convenience method. Will error if more output occurs than is
+     * expected.
      *
      * @return true if the test passed
      */
@@ -216,6 +218,13 @@ public abstract class BaseTester {
         SubmissionWrapper wrapper = getNewSubmissionWrapper();
         try {
             msgs = wrapper.scriptedInteraction(interaction);
+            String closedError = wrapper.expectFinished();
+            if (closedError != null) {
+                if (msgs == null) {
+                    msgs = new ArrayList<String>();
+                    msgs.add(closedError);
+                }
+            }
         } finally {
             wrapper.close();
         }
diff --git a/src/main/java/uk/ac/rhul/cs/javatester/SubmissionWrapper.java b/src/main/java/uk/ac/rhul/cs/javatester/SubmissionWrapper.java
index f62ad6b..4560d11 100644
--- a/src/main/java/uk/ac/rhul/cs/javatester/SubmissionWrapper.java
+++ b/src/main/java/uk/ac/rhul/cs/javatester/SubmissionWrapper.java
@@ -358,7 +358,8 @@ public class SubmissionWrapper implements AutoCloseable {
     }
 
     /**
-     * Get any output that has not been used in an interaction
+     * Get any output that has been read but has not been used in an
+     * interaction
      */
     public String getRemainingOutput() {
         return lineBuilder.toString();
@@ -415,6 +416,9 @@ public class SubmissionWrapper implements AutoCloseable {
      * the program then outputs "You like music?" the input "Yep" will
      * be provided.  Else the input is not provided.
      *
+     * Note: does not care if there is output after the script finishes.
+     * Calls to scriptedInteraction may be chained together.
+     *
      * After each expected output, a message is given to identify the
      * failure.
      *
@@ -486,6 +490,26 @@ public class SubmissionWrapper implements AutoCloseable {
         return null;
     }
 
+    /**
+     * The program is expected to have finished with no further output
+     *
+     * @return null if no problem, a failure message if failed
+     */
+    public String expectFinished() {
+        try {
+            String line = getLine();
+            if (line == null)
+                return line;
+            else
+                return String.format(
+                    "Expected the end of the program, but received the ouput '%s'",
+                    line
+                );
+        } catch (TimeoutException e) {
+            return "Expected the end of the program, but it continued to run without producing any standard output.";
+        }
+    }
+
     /**
      * Concatenates the given string arrays
      *
diff --git a/src/test/java/uk/ac/rhul/cs/javatester/UnitTests.java b/src/test/java/uk/ac/rhul/cs/javatester/UnitTests.java
index ea885a3..8606639 100644
--- a/src/test/java/uk/ac/rhul/cs/javatester/UnitTests.java
+++ b/src/test/java/uk/ac/rhul/cs/javatester/UnitTests.java
@@ -145,6 +145,24 @@ public class UnitTests {
         }
     }
 
+    @Test
+    public void testUnfinishedInteractionFail() {
+        BaseTester tester = new BaseTester(SIMPLE_IN_OUT) {
+            @SuppressWarnings("unused")
+            public boolean testUnfinished() throws IOException {
+                return scriptedInteraction(
+                    "> .*Hello.*", "Expected Hello",
+                    "< Matt",
+                    "> .*Matt.*", "Expected Matt",
+                    "! .*band.*",
+                        "< High Rise",
+                        "The band question was malformed."
+                );
+            }
+        };
+        assertFalse(tester.runTests());
+    }
+
     @Test
     public void testLoadClass() {
         BaseTester tester = new BaseTester(STORAGE) {
-- 
GitLab