(******************************
 * Programm von Dieter Seidel *
 *  Eingegeben am 26.11.1991  *
 *  Ergaenzt   am 27.11.1991  *
 ******************************)

(* Dieses Modul laedt ein paar while-Programme in den String 'BefehlsListe' *
 * und laesst daraus dann die Quadrupel-Form bestimmen.                     *
 * Die letzten beiden Programme sind sogar sinnvoll, weshalb bei diesen     *
 * dann auch noch der Interpreter getestet wird.                            *)


IMPLEMENTATION MODULE QuadTester;

FROM InOut            IMPORT WriteCard, WriteLn, WriteString;
FROM QuadLese         IMPORT MaxBefehle, arrList, arrQuad;
FROM QuadBerechneQuad IMPORT BerechneQuad;
FROM QuadDrucke       IMPORT Drucke;
FROM QuadInterpreter  IMPORT Interpreter;


VAR Feld : ARRAY [1..30] OF CHAR;


PROCEDURE VereinigeStrings(VAR BefehlsListe : arrList; Position : CARDINAL);
VAR i : CARDINAL;
BEGIN
  FOR i:=Position TO Position + 30 DO
    IF i > MaxBefehle THEN
      WriteLn;
      WriteString("Fehler in QuadTester!!! Erhoehe MaxBefehle.");
      WriteLn;
      HALT;
    END;
    BefehlsListe[i]:=Feld[i-Position+1];
  END;
END VereinigeStrings;


PROCEDURE ZeigeTest(Counter : CARDINAL; BefehlsListe : arrList);
VAR QuadListe    : arrQuad;
BEGIN
  WriteString("Testeingabe Nr.: ");
  WriteCard(Counter,1);WriteLn;
  WriteString(BefehlsListe);WriteLn;
  BerechneQuad(BefehlsListe,QuadListe);
  Drucke(BefehlsListe,QuadListe);
  WriteLn;
END ZeigeTest;


PROCEDURE ZeigeTestInter(Counter : CARDINAL; BefehlsListe : arrList);
VAR QuadListe    : arrQuad;
BEGIN
  WriteString("Testeingabe Nr.: ");
  WriteCard(Counter,1);WriteLn;
  WriteString(BefehlsListe);WriteLn;
  BerechneQuad(BefehlsListe,QuadListe);
  Drucke(BefehlsListe,QuadListe);
  Interpreter(QuadListe);
  WriteLn;
END ZeigeTestInter;


PROCEDURE Tester() : BOOLEAN;
VAR Counter      : CARDINAL;
    BefehlsListe : arrList;
BEGIN
  Counter:=1;
  BefehlsListe:="bX1:X2;X2:2;X3:0;X4:s(X4);X5:p(X2)e";
  ZeigeTest(Counter,BefehlsListe);INC(Counter);
  
  BefehlsListe:="bwX1#X2dbX1:X2;X2:s(X2);X1:s(X1)ee";
  ZeigeTest(Counter,BefehlsListe);INC(Counter);

  Feld:="bwX1#X2dbwX2#X3dbX1:X2;wX3#X4d";
  VereinigeStrings(BefehlsListe,1);
  Feld:="wX4#X5dX1:p(X1);eX1:X2;wX1#X2d";
  VereinigeStrings(BefehlsListe,31);
  Feld:="X1:X8;X1:123ee";
  VereinigeStrings(BefehlsListe,61);
  ZeigeTest(Counter,BefehlsListe);INC(Counter);

  Feld:="bwX1#X2dbwX2#X3dbX1:X2wX3#X4dw";
  VereinigeStrings(BefehlsListe,1);
  Feld:="X4#X5dX1:p(X1);X88:X99eX1:X2wX";
  VereinigeStrings(BefehlsListe,31);
  Feld:="1#X2dX1:X8X1:123ee";
  VereinigeStrings(BefehlsListe,61);
  ZeigeTest(Counter,BefehlsListe);INC(Counter);

  Feld:="bwX1#X2dwX3#X4dbwX5#X7dX1:X2;e";
  VereinigeStrings(BefehlsListe,1);
  Feld:="X1:99wX1#X2dwX1#X3dwX2#X3dbX1:";
  VereinigeStrings(BefehlsListe,31);
  Feld:="2;wX3#X4dX1:X2;X2:1wX1#X2dbwX2";
  VereinigeStrings(BefehlsListe,61);
  Feld:="#X3dbwX3#X4dbX1:3;X2:7eeeX1:X7";
  VereinigeStrings(BefehlsListe,91);
  Feld:="ee";
  VereinigeStrings(BefehlsListe,121);
  ZeigeTest(Counter,BefehlsListe);INC(Counter);

  WriteString("Das folgende Programm berechnet das Produkt X1:=X1*X2.");
  WriteLn;
  Feld:="bX1:5;X2:7;X3:0;X4:X1;X5:X2;wX";
  VereinigeStrings(BefehlsListe,1);
  Feld:="5#0dbX5:p(X5);X3:s(X3)eX4:p(X4";
  VereinigeStrings(BefehlsListe,31);
  Feld:=");wX4#0dbX5:X2;wX5#0dbX5:p(X5)";
  VereinigeStrings(BefehlsListe,61);
  Feld:=";X3:s(X3)eX4:p(X4)eX1:X3e";
  VereinigeStrings(BefehlsListe,91);
  ZeigeTestInter(Counter,BefehlsListe);INC(Counter);

  WriteString("Das folgende Programm berechnet die Division mit Rest.");
  WriteString(" Also 47 = X3 * 7 + X1.");
  WriteLn;
  Feld:="bX1:47;X2:7;X3:0;X4:X1;X4:s(X4";
  VereinigeStrings(BefehlsListe,1);
  Feld:=");X6:X2;wX6#0dbX4:p(X4);X6:p(X";
  VereinigeStrings(BefehlsListe,31);
  Feld:="6)e;wX4#0dbX6:X2;wX6#0dbX1:p(X";
  VereinigeStrings(BefehlsListe,61);
  Feld:="1);X6:p(X6)e;X3:s(X3);X4:X1;X4";
  VereinigeStrings(BefehlsListe,91);
  Feld:=":s(X4);X6:X2;wX6#0dbX4:p(X4);X";
  VereinigeStrings(BefehlsListe,121);
  Feld:="6:p(X6)eee";
  VereinigeStrings(BefehlsListe,151);
  ZeigeTestInter(Counter,BefehlsListe);INC(Counter);
  
  RETURN TRUE;                     (* Es sind keine Fehler aufgetreten. *)
END Tester;


END QuadTester.
