Explorar o código

Improved error handling

git-svn-id: https://svn.inf.ethz.ch/svn/lecturers/a2/trunk@7525 8c9fc860-2736-0410-a75d-ab315db34111
negelef %!s(int64=7) %!d(string=hai) anos
pai
achega
8639b09349
Modificáronse 3 ficheiros con 29 adicións e 14 borrados
  1. 13 4
      source/FoxTest.Mod
  2. 3 2
      source/PCTest.Mod
  3. 13 8
      source/TestSuite.Mod

+ 13 - 4
source/FoxTest.Mod

@@ -103,7 +103,7 @@ TYPE
 		RETURN options
 	END GetOptions;
 
-	PROCEDURE DriveTest (options: Options.Options; diagnostics: Diagnostics.Diagnostics; reader: Streams.Reader; error, writer: Streams.Writer);
+	PROCEDURE DriveTest (options: Options.Options; diagnostics: Diagnostics.Diagnostics; reader: Streams.Reader; error, writer: Streams.Writer): BOOLEAN;
 	VAR
 		tester: Tester; prolog, epilog, command: Command;
 		verbose, mayTrap: BOOLEAN; report: TestSuite.StreamReport; fileName, logFileName: Files.FileName; logFileWriter, log:Streams.Writer;
@@ -122,6 +122,8 @@ TYPE
 					baseOptions := GetOptions();
 					IF baseOptions.Parse(stringReader, error) THEN
 						Options.Merge(options, baseOptions);
+					ELSE
+						RETURN FALSE;
 					END;
 				ELSE
 					reader.SkipLn()
@@ -152,7 +154,7 @@ TYPE
 
 		NEW (report, writer);
 		reader.SetPos(0);
-		TestSuite.DriveByReader(reader, error, resultname, tester);
+		IF ~TestSuite.DriveByReader(reader, error, resultname, tester) THEN RETURN FALSE END;
 		tester.Print (report);
 		IF logFileWriter # NIL THEN
 			NEW(report, logFileWriter);
@@ -161,6 +163,7 @@ TYPE
 			writer.String("testing logged in "); writer.String(logFileName); writer.Ln;
 		END;
 		writer.Update;
+		RETURN report.failed = 0;
 	END DriveTest;
 
 	PROCEDURE Compile* (context: Commands.Context);
@@ -185,7 +188,11 @@ TYPE
 				context.result := Commands.CommandParseError;
 			END;
 			Files.OpenReader(reader, test, 0);
-			DriveTest (options, diagnostics, reader, context.error, writer);
+			IF ~DriveTest (options, diagnostics, reader, context.error, writer) THEN
+				context.result := Commands.CommandError;
+			END;
+		ELSE
+			context.result := Commands.CommandError;
 		END;
 	END Compile;
 
@@ -224,7 +231,9 @@ BEGIN
 	NEW(optionReader, LEN(opt));
 	optionReader.Set(opt);
 	IF options.Parse(optionReader, log) THEN
-		DriveTest (options, diagnostics, reader, log, log);
+		error := ~DriveTest (options, diagnostics, reader, log, log);
+	ELSE
+		error := TRUE;
 	END;
 END RunTests;
 

+ 3 - 2
source/PCTest.Mod

@@ -69,8 +69,9 @@ VAR
 BEGIN
 	NEW(tester, log, diagnostics, execute, "\s");
 	NEW(report, log);
-	TestSuite.DriveByReader(reader, log, regrfile, tester);
-	tester.Print(report);
+	IF TestSuite.DriveByReader(reader, log, regrfile, tester) THEN
+		tester.Print(report);
+	END;
 END DriveTextTests;
 
 PROCEDURE ParseTests(

+ 13 - 8
source/TestSuite.Mod

@@ -50,7 +50,7 @@ TYPE
 	BEGIN SELF.diagnostics := diagnostics;
 	END Init;
 
-	PROCEDURE Process* (r: Streams.Reader);
+	PROCEDURE Process* (r: Streams.Reader): BOOLEAN;
 	VAR type: TestType; name: TestName; line: ARRAY 200 OF CHAR;
 		code: Strings.Buffer; writer : Streams.Writer;
 		string : Strings.String; reader: Streams.StringReader;
@@ -59,10 +59,10 @@ TYPE
 		ClearList (tests);
 		WHILE SkipComment (r) DO
 			IF ~ReadType (r, type) OR ~SkipWhitespace (r) OR ~ReadText (r, name) THEN
-				diagnostics.Error (name, r.Pos(), Diagnostics.Invalid, "parse error"); RETURN;
+				diagnostics.Error (name, r.Pos(), Diagnostics.Invalid, "parse error"); RETURN FALSE;
 			END;
 			IF FindResult (tests, name) # NIL THEN
-				diagnostics.Error (name, Diagnostics.Invalid, Diagnostics.Invalid, "duplicated test"); RETURN;
+				diagnostics.Error (name, Diagnostics.Invalid, Diagnostics.Invalid, "duplicated test"); RETURN FALSE;
 			END;
 			code.Clear; writer.Reset;
 			WHILE SkipLn (r) & Tabulator (r) & ReadText (r, line) DO writer.Char (09X); writer.String (line); writer.Char (0AX); END;
@@ -71,6 +71,7 @@ TYPE
 			reader.Set (string^);
 			AddResult (tests, type, name, Handle (reader, r.Pos () - writer.Pos () - 1, name, type) = type);
 		END;
+		RETURN TRUE;
 	END Process;
 
 	PROCEDURE Handle* (r: Streams.Reader; pos: LONGINT; CONST name: ARRAY OF CHAR; type: TestType): INTEGER;
@@ -227,11 +228,11 @@ END FindResult;
 
 
 (* public interface helper *)
-PROCEDURE DriveByReader* (reader: Streams.Reader; error: Streams.Writer; CONST resultname: ARRAY OF CHAR; tester: Tester);
+PROCEDURE DriveByReader* (reader: Streams.Reader; error: Streams.Writer; CONST resultname: ARRAY OF CHAR; tester: Tester): BOOLEAN;
 VAR resreader: Files.Reader;result: Files.File; writer: Files.Writer;
 BEGIN
 	IF reader = NIL THEN
-		RETURN;
+		RETURN TRUE;
 	END;
 	ClearList (tester.results);
 	IF resultname # "" THEN
@@ -240,16 +241,17 @@ BEGIN
 			NEW (resreader, result, 0); ReadResults (resreader, tester.results)
 		END
 	END;
-	tester.Process (reader);
+	IF ~tester.Process (reader) THEN RETURN FALSE END;
 	IF resultname # "" THEN
 		result := Files.New (resultname);
 		IF result = NIL THEN
 			error.String ("Failed to open result file "); error.String (resultname); error.Ln;
-			RETURN;
+			RETURN FALSE;
 		ELSE
 			NEW (writer, result, 0); WriteResults (writer, tester.tests); writer.Update; Files.Register (result);
 		END
 	END;
+	RETURN TRUE;
 END DriveByReader;
 
 (* public interface helper *)
@@ -260,6 +262,7 @@ BEGIN
 		test := Files.Old (testname);
 		IF test = NIL THEN
 			context.error.String ("Failed to open test file "); context.error.String (testname); context.error.Ln;
+			context.result := Commands.CommandError;
 			RETURN;
 		END;
 	ELSE
@@ -269,7 +272,9 @@ BEGIN
 	IF ~context.arg.GetString (resultname) THEN
 		resultname := "";
 	END;
-	DriveByReader(reader, context.error, resultname, tester);
+	IF DriveByReader(reader, context.error, resultname, tester) THEN
+		context.result := Commands.CommandError;
+	END;
 END Drive;