fpc/tests/test/jvm/tformalpara.pp
Jonas Maebe 71068ae7eb * made the tests Android-compatible (use the androidr14 unit instead
of the jdk15 unit in that case)
  * adjusted testall.sh script so it can also be used to test class
    files compiled for Android (still with the JVM though)

git-svn-id: branches/jvmbackend@19835 -
2011-12-12 20:34:02 +00:00

713 lines
20 KiB
ObjectPascal

unit tformalpara;
{$mode delphi}
{$modeswitch unicodestrings}
interface
procedure main(args: array of string);
implementation
uses
{$ifdef java}jdk15{$else}androidr14{$endif};
type
tc = class
end;
procedure freeandnil(var obj);
begin
obj:=nil;
end;
procedure test;
var
c: tc;
begin
c:=tc.create;
freeandnil(c);
if assigned(c) then
raise jlexception.create('help');
end;
type
tformalkind = (fboolean,fbyte,fsmallint,fcardinal,fint64,fchar,fwidechar,fsingle,fdouble,fsetint,fsetenum,frec,fshortstring,funicodestring,farrbyte,farrset,fenum);
tsetint = set of 30..40;
tsetenum = set of tformalkind;
tarrbyte = array[4..6] of byte;
tarrset = array[1..2] of tsetint;
trec = record
a: longint;
b: array[3..4] of ansistring;
end;
const
cbooleanin: boolean = true;
cbytein: byte = 35;
csmallintin: smallint = 1234;
ccardinalin: cardinal = $1234567;
cint64in: int64 = $deadcafebabe;
ccharin: ansichar = 'S';
cwidecharin: widechar = 'U';
csinglein: single = 1234.5;
cdoublein: double = 1239643.75;
csetintin: tsetint = [36..39];
csetenumin: tsetenum = [fsmallint,fint64,funicodestring];
crecin: trec = (a:98765; b:('abc','def'));
cshortstringin: shortstring = 'greaT';
cunicodestringin: unicodestring = 'a bit longer!';
carrbytein: tarrbyte = (4,2,5);
carrsetin: tarrset = ([31,33,37],[]);
cenumin: tformalkind = fsmallint;
cbooleanout: boolean = false;
cbyteout: byte = 128;
csmallintout: smallint = 4321;
ccardinalout: cardinal = $7654321;
cint64out: int64 = $B4B3154713;
ccharout: ansichar = 's';
cwidecharout: widechar = 'u';
csingleout: single = 4321.5;
cdoubleout: double = 9876543.75;
csetintout: tsetint = [31..36];
csetenumout: tsetenum = [fbyte];
crecout: trec = (a:4365246; b:('cbax','iiiiii'));
cshortstringout: shortstring = 'tiny';
cunicodestringout: unicodestring = 'yet another bit longer!';
carrbyteout: tarrbyte = (6,6,6);
carrsetout: tarrset = ([30,31],[33..38]);
cenumout: tformalkind = farrbyte;
procedure testformalvar(var x; typ: tformalkind);
var
i: longint;
begin
case typ of
fboolean:
begin
if cbooleanin<>boolean(x) then
raise jlexception.create('boolean in');
x:=cbooleanout;
end;
fbyte:
begin
if cbytein<>byte(x) then
raise jlexception.create('byte in');
x:=cbyteout;
end;
fsmallint:
begin
if csmallintin<>smallint(x) then
raise jlexception.create('smallint in');
x:=csmallintout;
end;
fcardinal:
begin
if ccardinalin<>cardinal(x) then
raise jlexception.create('cardinal in');
x:=ccardinalout;
end;
fint64:
begin
if cint64in<>int64(x) then
raise jlexception.create('int64 in');
x:=cint64out;
end;
fchar:
begin
if ccharin<>ansichar(x) then
raise jlexception.create('char in');
x:=ccharout;
end;
fwidechar:
begin
if cwidecharin<>widechar(x) then
raise jlexception.create('widechar in');
x:=cwidecharout;
end;
fsingle:
begin
if csinglein<>single(x) then
raise jlexception.create('single in');
x:=csingleout;
end;
fdouble:
begin
if cdoublein<>double(x) then
raise jlexception.create('double in');
x:=cdoubleout;
end;
fsetint:
begin
if csetintin<>tsetint(x) then
raise jlexception.create('setint in');
x:=csetintout;
end;
fsetenum:
begin
if csetenumin<>tsetenum(x) then
raise jlexception.create('setenum in');
x:=csetenumout;
end;
frec:
begin
if crecin.a<>trec(x).a then
raise jlexception.create('rec.a in');
if crecin.b[3]<>trec(x).b[3] then
raise jlexception.create('rec.b[3] in');
if crecin.b[4]<>trec(x).b[4] then
raise jlexception.create('rec.b[4] in');
x:=crecout;
end;
fshortstring:
begin
if cshortstringin<>shortstring(x) then
raise jlexception.create('shortstring in');
x:=cshortstringout;
end;
funicodestring:
begin
if cunicodestringin<>unicodestring(x) then
raise jlexception.create('unicodestring in');
x:=cunicodestringout;
end;
farrbyte:
begin
for i:=low(carrbytein) to high(carrbytein) do
if carrbytein[i]<>tarrbyte(x)[i] then
raise jlexception.create('arrbyte in');
x:=carrbyteout;
end;
farrset:
begin
for i:=low(carrsetin) to high(carrsetin) do
if carrsetin[i]<>tarrset(x)[i] then
raise jlexception.create('arrset in');
x:=carrsetout;
end;
fenum:
begin
if cenumin<>tformalkind(x) then
raise jlexception.create('enum in');
x:=cenumout;
end;
end;
end;
procedure testformalout(out x; typ: tformalkind);
var
i: longint;
begin
case typ of
fboolean:
begin
x:=cbooleanout;
end;
fbyte:
begin
x:=cbyteout;
end;
fsmallint:
begin
x:=csmallintout;
end;
fcardinal:
begin
x:=ccardinalout;
end;
fint64:
begin
x:=cint64out;
end;
fchar:
begin
x:=ccharout;
end;
fwidechar:
begin
x:=cwidecharout;
end;
fsingle:
begin
x:=csingleout;
end;
fdouble:
begin
x:=cdoubleout;
end;
fsetint:
begin
x:=csetintout;
end;
fsetenum:
begin
x:=csetenumout;
end;
frec:
begin
{ fpc only decreases the reference, it doesn't finalize/init with empty/nil
if ''<>trec(x).b[3] then
raise jlexception.create('out rec.b[3] in');
if ''<>trec(x).b[4] then
raise jlexception.create('out rec.b[4] in');
}
x:=crecout;
end;
fshortstring:
begin
x:=cshortstringout;
end;
funicodestring:
begin
{ fpc only decreases the reference, it doesn't finalize/init with if ''<>unicodestring(x) then
raise jlexception.create('out unicodestring in');
}
x:=cunicodestringout;
end;
farrbyte:
begin
x:=carrbyteout;
end;
farrset:
begin
x:=carrsetout;
end;
fenum:
begin
x:=cenumout;
end;
end;
end;
procedure testformalconst(const x; typ: tformalkind);
var
i: longint;
begin
case typ of
fboolean:
begin
if cbooleanin<>boolean(x) then
raise jlexception.create('const boolean in');
end;
fbyte:
begin
if cbytein<>byte(x) then
raise jlexception.create('const byte in');
end;
fsmallint:
begin
if csmallintin<>smallint(x) then
raise jlexception.create('const smallint in');
end;
fcardinal:
begin
if ccardinalin<>cardinal(x) then
raise jlexception.create('const cardinal in');
end;
fint64:
begin
if cint64in<>int64(x) then
raise jlexception.create('const int64 in');
end;
fchar:
begin
if ccharin<>ansichar(x) then
raise jlexception.create('const char in');
end;
fwidechar:
begin
if cwidecharin<>widechar(x) then
raise jlexception.create('const widechar in');
end;
fsingle:
begin
if csinglein<>single(x) then
raise jlexception.create('const single in');
end;
fdouble:
begin
if cdoublein<>double(x) then
raise jlexception.create('const double in');
end;
fsetint:
begin
if csetintin<>tsetint(x) then
raise jlexception.create('const setint in');
end;
fsetenum:
begin
if csetenumin<>tsetenum(x) then
raise jlexception.create('const setenum in');
end;
frec:
begin
if crecin.a<>trec(x).a then
raise jlexception.create('const rec.a in');
if crecin.b[3]<>trec(x).b[3] then
raise jlexception.create('const rec.b[3] in');
if crecin.b[4]<>trec(x).b[4] then
raise jlexception.create('const rec.b[4] in');
end;
fshortstring:
begin
if cshortstringin<>shortstring(x) then
raise jlexception.create('const shortstring in');
end;
funicodestring:
begin
if cunicodestringin<>unicodestring(x) then
raise jlexception.create('const unicodestring in');
end;
farrbyte:
begin
for i:=low(carrbytein) to high(carrbytein) do
if carrbytein[i]<>tarrbyte(x)[i] then
raise jlexception.create('const arrbyte in');
end;
farrset:
begin
for i:=low(carrsetin) to high(carrsetin) do
if carrsetin[i]<>tarrset(x)[i] then
raise jlexception.create('const arrset in');
end;
fenum:
begin
if cenumin<>tformalkind(x) then
raise jlexception.create('const enum in');
end;
end;
end;
procedure testformalvars;
var
vboolean: boolean;
vbyte: byte;
vsmallint: smallint;
vcardinal: cardinal;
vint64: int64;
vchar: ansichar;
vwidechar: widechar;
vsingle: single;
vdouble: double;
vsetint: tsetint;
vsetenum: tsetenum;
vrec: trec;
vshortstring: shortstring;
vunicodestring: unicodestring;
varrbyte: tarrbyte;
varrset: tarrset;
venum: tformalkind;
i: longint;
begin
vboolean:=cbooleanin;
testformalvar(vboolean,fboolean);
if vboolean<>cbooleanout then
raise jlexception.create('boolean out');
vbyte:=cbytein;
testformalvar(vbyte,fbyte);
if vbyte<>cbyteout then
raise jlexception.create('byte out');
vsmallint:=csmallintin;
testformalvar(vsmallint,fsmallint);
if vsmallint<>csmallintout then
raise jlexception.create('smallint out');
vunicodestring:=widechar(csmallintin);
testformalvar(smallint(vunicodestring[1]),fsmallint);
if smallint(vunicodestring[1])<>csmallintout then
raise jlexception.create('stringsmallint out');
vcardinal:=ccardinalin;
testformalvar(vcardinal,fcardinal);
if vcardinal<>ccardinalout then
raise jlexception.create('cardinal out');
vint64:=cint64in;
testformalvar(vint64,fint64);
if vint64<>cint64out then
raise jlexception.create('int64 out');
vchar:=ccharin;
testformalvar(vchar,fchar);
if vchar<>ccharout then
raise jlexception.create('char out');
vwidechar:=cwidecharin;
testformalvar(vwidechar,fwidechar);
if vwidechar<>cwidecharout then
raise jlexception.create('widechar out');
vunicodestring:=cwidecharin;
testformalvar(vunicodestring[1],fwidechar);
if vunicodestring[1]<>cwidecharout then
raise jlexception.create('stringwidechar out');
vsingle:=csinglein;
testformalvar(vsingle,fsingle);
if vsingle<>csingleout then
raise jlexception.create('single out');
vdouble:=cdoublein;
testformalvar(vdouble,fdouble);
if vdouble<>cdoubleout then
raise jlexception.create('double out');
vsetint:=csetintin;
testformalvar(vsetint,fsetint);
if vsetint<>csetintout then
raise jlexception.create('setint out');
vsetenum:=csetenumin;
testformalvar(vsetenum,fsetenum);
if vsetenum<>csetenumout then
raise jlexception.create('setenum out');
vrec:=crecin;
testformalvar(vrec,frec);
if crecout.a<>vrec.a then
raise jlexception.create('rec.a out');
if crecout.b[3]<>vrec.b[3] then
raise jlexception.create('rec.b[3] out');
if crecout.b[4]<>vrec.b[4] then
raise jlexception.create('rec.b[4] out');
vshortstring:=cshortstringin;
testformalvar(vshortstring,fshortstring);
if vshortstring<>cshortstringout then
raise jlexception.create('shortstring out');
vunicodestring:=cunicodestringin;
testformalvar(vunicodestring,funicodestring);
if vunicodestring<>cunicodestringout then
raise jlexception.create('unicodestring out');
varrbyte:=carrbytein;
testformalvar(varrbyte,farrbyte);
for i:=low(carrbyteout) to high(carrbyteout) do
if carrbyteout[i]<>varrbyte[i] then
raise jlexception.create('arrbyte out');
varrset:=carrsetin;
testformalvar(varrset,farrset);
for i:=low(carrsetout) to high(carrsetout) do
if varrset[i]<>carrsetout[i] then
raise jlexception.create('arrset out');
venum:=cenumin;
testformalvar(venum,fenum);
if venum<>cenumout then
raise jlexception.create('enum out');
end;
procedure testformalouts;
var
vboolean: boolean;
vbyte: byte;
vsmallint: smallint;
vcardinal: cardinal;
vint64: int64;
vchar: ansichar;
vwidechar: widechar;
vsingle: single;
vdouble: double;
vsetint: tsetint;
vsetenum: tsetenum;
vrec: trec;
vshortstring: shortstring;
vunicodestring: unicodestring;
varrbyte: tarrbyte;
varrset: tarrset;
venum: tformalkind;
i: longint;
begin
vboolean:=cbooleanin;
testformalout(vboolean,fboolean);
if vboolean<>cbooleanout then
raise jlexception.create('out boolean out');
vbyte:=cbytein;
testformalout(vbyte,fbyte);
if vbyte<>cbyteout then
raise jlexception.create('out byte out');
vsmallint:=csmallintin;
testformalout(vsmallint,fsmallint);
if vsmallint<>csmallintout then
raise jlexception.create('out smallint out');
vunicodestring:=widechar(csmallintin);
testformalout(smallint(vunicodestring[1]),fsmallint);
if smallint(vunicodestring[1])<>csmallintout then
raise jlexception.create('out stringsmallint out');
vcardinal:=ccardinalin;
testformalout(vcardinal,fcardinal);
if vcardinal<>ccardinalout then
raise jlexception.create('out cardinal out');
vint64:=cint64in;
testformalout(vint64,fint64);
if vint64<>cint64out then
raise jlexception.create('out int64 out');
vchar:=ccharin;
testformalout(vchar,fchar);
if vchar<>ccharout then
raise jlexception.create('out char out');
vwidechar:=cwidecharin;
testformalout(vwidechar,fwidechar);
if vwidechar<>cwidecharout then
raise jlexception.create('out widechar out');
vunicodestring:=cwidecharin;
testformalout(vunicodestring[1],fwidechar);
if vunicodestring[1]<>cwidecharout then
raise jlexception.create('out stringwidechar out');
vsingle:=csinglein;
testformalout(vsingle,fsingle);
if vsingle<>csingleout then
raise jlexception.create('out single out');
vdouble:=cdoublein;
testformalout(vdouble,fdouble);
if vdouble<>cdoubleout then
raise jlexception.create('out double out');
vsetint:=csetintin;
testformalout(vsetint,fsetint);
if vsetint<>csetintout then
raise jlexception.create('out setint out');
vsetenum:=csetenumin;
testformalout(vsetenum,fsetenum);
if vsetenum<>csetenumout then
raise jlexception.create('out setenum out');
vrec:=crecin;
testformalout(vrec,frec);
if crecout.a<>vrec.a then
raise jlexception.create('out rec.a out');
if crecout.b[3]<>vrec.b[3] then
raise jlexception.create('out rec.b[3] out');
if crecout.b[4]<>vrec.b[4] then
raise jlexception.create('out rec.b[4] out');
vshortstring:=cshortstringin;
testformalout(vshortstring,fshortstring);
if vshortstring<>cshortstringout then
raise jlexception.create('out shortstring out');
vunicodestring:=cunicodestringin;
testformalout(vunicodestring,funicodestring);
if vunicodestring<>cunicodestringout then
raise jlexception.create('out unicodestring out');
varrbyte:=carrbytein;
testformalout(varrbyte,farrbyte);
for i:=low(carrbyteout) to high(carrbyteout) do
if carrbyteout[i]<>varrbyte[i] then
raise jlexception.create('out arrbyte out');
varrset:=carrsetin;
testformalout(varrset,farrset);
for i:=low(carrsetout) to high(carrsetout) do
if varrset[i]<>carrsetout[i] then
raise jlexception.create('out arrset out');
venum:=cenumin;
testformalout(venum,fenum);
if venum<>cenumout then
raise jlexception.create('out enum out');
end;
procedure testformalconsts;
var
vboolean: boolean;
vbyte: byte;
vsmallint: smallint;
vcardinal: cardinal;
vint64: int64;
vchar: ansichar;
vwidechar: widechar;
vsingle: single;
vdouble: double;
vsetint: tsetint;
vsetenum: tsetenum;
vrec: trec;
vshortstring: shortstring;
vunicodestring: unicodestring;
varrbyte: tarrbyte;
varrset: tarrset;
venum: tformalkind;
i: longint;
begin
vboolean:=cbooleanin;
testformalconst(vboolean,fboolean);
if vboolean<>cbooleanin then
raise jlexception.create('const boolean out');
vbyte:=cbytein;
testformalconst(vbyte,fbyte);
if vbyte<>cbytein then
raise jlexception.create('const byte out');
vsmallint:=csmallintin;
testformalconst(vsmallint,fsmallint);
if vsmallint<>csmallintin then
raise jlexception.create('const smallint out');
vunicodestring:=widechar(csmallintin);
testformalconst(smallint(vunicodestring[1]),fsmallint);
if smallint(vunicodestring[1])<>csmallintin then
raise jlexception.create('const stringsmallint out');
vcardinal:=ccardinalin;
testformalconst(vcardinal,fcardinal);
if vcardinal<>ccardinalin then
raise jlexception.create('const cardinal out');
vint64:=cint64in;
testformalconst(vint64,fint64);
if vint64<>cint64in then
raise jlexception.create('const int64 out');
vchar:=ccharin;
testformalconst(vchar,fchar);
if vchar<>ccharin then
raise jlexception.create('const char out');
vwidechar:=cwidecharin;
testformalconst(vwidechar,fwidechar);
if vwidechar<>cwidecharin then
raise jlexception.create('const widechar out');
vunicodestring:=cwidecharin;
testformalconst(vunicodestring[1],fwidechar);
if vunicodestring[1]<>cwidecharin then
raise jlexception.create('const stringwidechar out');
vsingle:=csinglein;
testformalconst(vsingle,fsingle);
if vsingle<>csinglein then
raise jlexception.create('const single out');
vdouble:=cdoublein;
testformalconst(vdouble,fdouble);
if vdouble<>cdoublein then
raise jlexception.create('const double out');
vsetint:=csetintin;
testformalconst(vsetint,fsetint);
if vsetint<>csetintin then
raise jlexception.create('const setint out');
vsetenum:=csetenumin;
testformalconst(vsetenum,fsetenum);
if vsetenum<>csetenumin then
raise jlexception.create('const setenum out');
vrec:=crecin;
testformalconst(vrec,frec);
if crecin.a<>vrec.a then
raise jlexception.create('const rec.a out');
if crecin.b[3]<>vrec.b[3] then
raise jlexception.create('const rec.b[3] out');
if crecin.b[4]<>vrec.b[4] then
raise jlexception.create('const rec.b[4] out');
vshortstring:=cshortstringin;
testformalconst(vshortstring,fshortstring);
if vshortstring<>cshortstringin then
raise jlexception.create('const shortstring out');
vunicodestring:=cunicodestringin;
testformalconst(vunicodestring,funicodestring);
if vunicodestring<>cunicodestringin then
raise jlexception.create('const unicodestring out');
varrbyte:=carrbytein;
testformalconst(varrbyte,farrbyte);
for i:=low(carrbytein) to high(carrbytein) do
if carrbytein[i]<>varrbyte[i] then
raise jlexception.create('const arrbyte out');
varrset:=carrsetin;
testformalconst(varrset,farrset);
for i:=low(carrsetin) to high(carrsetin) do
if varrset[i]<>carrsetin[i] then
raise jlexception.create('const arrset out');
venum:=cenumin;
testformalconst(venum,fenum);
if venum<>cenumin then
raise jlexception.create('const enum out');
end;
procedure main(args: array of string);
begin
test;
testformalvars;
testformalouts;
testformalconsts;
end;
end.