(* I diverged from the required output format by replacing tabs with 2 spaces for simplicity *) MODULE DejaGnu; IMPORT Texts, Oberon; VAR passed, failed: INTEGER; W: Texts.Writer; PROCEDURE Pass(s: ARRAY OF CHAR); BEGIN Texts.WriteString(W, " PASSED: "); Texts.WriteString(W, s); Texts.WriteLn(W); passed := passed + 1 END Pass; PROCEDURE Fail(s: ARRAY OF CHAR); BEGIN Texts.WriteString(W, " FAILED: "); Texts.WriteString(W, s); Texts.WriteLn(W); failed := failed + 1 END Fail; PROCEDURE TestRun*(b: BOOLEAN; s: ARRAY OF CHAR); BEGIN IF b THEN Pass(s) ELSE Fail(s) END END TestRun; PROCEDURE Totals*; BEGIN Texts.WriteString(W, " passed: "); Texts.WriteInt(W, passed, 4); Texts.WriteLn(W); Texts.WriteString(W, " real failed: "); Texts.WriteInt(W, failed, 4); Texts.WriteLn(W); Texts.Append(Oberon.Log, W.buf) END Totals; BEGIN Texts.OpenWriter(W) END DejaGnu.