program TestPascal(input, output);
{test some features of Pascal, ie. test the compiler}
{L.Allison, Computer Science, Monash University, 1992}

label 99;

type alfa = packed array [1..10] of char;

procedure Line;
   var i :1..80;
begin writeln; for i := 1 to 79 do write('-'); writeln end;

procedure Error(m:alfa);
begin Line; writeln('Error: ', m); goto 99 end;

procedure Assertion(b :boolean; m :alfa);
begin if not b then Error(m) end;

procedure Test(m :alfa; procedure P);
begin Line; writeln('Test ', m); P; Line end;

{-----------------------------------------------------------------------------}

procedure PFA(i, j:integer; r:real; var iv:integer);
begin write('PFA(', i:1, ',', j:1, ',', r:5:2, ',', iv:1, ') '); iv:=iv+1
end;

procedure ProcFormal;
   var i, j, n :integer; x :real;

   procedure PFB(m, n:integer; x:real; var nv:integer);
   begin write('PFB(', m:1, ',', n:1, ',', x:5:2, ',', nv:1, ') ');
         nv:=nv+1
   end;

   procedure ProcF( procedure PF(i, j:integer; r:real; var iv:integer);
                    intval :integer; var intvar :integer );
   begin write('ProcF: '); PF(i, intval, x, intvar);
         writeln(' intvar=',intvar:1)
   end;

   procedure ProcG;
      var k, n :integer;
      procedure PFC(i, j:integer; r:real; var iv:integer);
      begin write('PFA2(', i:1, ',', j:1, ',', r:5:2, ',', iv:1, ') ');
            iv:=iv+1
      end;
   begin k:=22; n:=56; ProcF( PFC, k, n ); writeln(' n=', n:1);
         Assertion(n=57, 'n<>57     ')
   end;

begin {ProcFormal}
      i:=1; j:=2; x:= 3.4; n:=5;
      ProcF( PFA, j, n );
      ProcF( PFB, j, n );
      writeln(' n=', n:1); Assertion( n=7, 'n<>7      ');
      ProcG
end   {ProcFormal};

{-----------------------------------------------------------------------------}

begin {main}
      Test('ProcFormal', ProcFormal);
  99: writeln('Finish')
end.

