fpc/tests/test/jvm/test.pp
Jonas Maebe 6f165b6c01 * fixed tests
o fixed use of loop counter after end of loop
   o fixed reliance on old behaviour for int -> real typecasts

git-svn-id: trunk@45379 -
2020-05-16 13:31:28 +00:00

2166 lines
39 KiB
ObjectPascal

{$mode delphi}
{$codepage utf-8}
{$namespace org.freepascal.test}
{$j-}
Unit test;
interface
const
unitintconst = 3;
unitfloatconst = 2.0;
unitdoubleconst = 0.1;
const
tcl: longint = 4;
type
trec = record
a,b,c,d,e: longint;
end;
const
tcrec: trec = (a:1;b:2;c:3;d:4;e:5);
type
TMyClass = class
const
classintconst = 4;
classfloatconst = 3.0;
classdoubleconst = 0.3;
classtcstringconst: unicodestring = 'abcdef';
class var
rec: trec;
var
intfield: jint;
staticbytefield: jbyte; static;
constructor create; overload;
constructor create(l: longint);overload;
constructor create(l1, l2: longint);overload;
function sub(a1, a2: longint): longint;
function test(l1, l2: longint): longint;
class function staticmul3(l: longint): longint; static;
procedure longboolobj(l: jlong; b: boolean; obj: tobject);
procedure setintfield(l: jint);
function getintfield: jint;
property propintfield: jint read getintfield write setintfield;
procedure setstaticbytefield(b: byte);
function getstaticbytefield: byte;
class procedure setstaticbytefieldstatic(b: byte); static;
class function getstaticbytefieldstatic: byte; static;
class procedure settestglobal(l: longint); static;
class function gettestglobal: longint; static;
end;
tisinterface = interface
end;
tisclassbase = class
procedure abstr; virtual; abstract;
end;
tisclassbase2 = class(tisclassbase)
end;
tisclass1 = class(tisclassbase2)
type
tisclass1nested = class(tisinterface)
var
anonrec: record c: char; end;
type
tisclass1nestedl2 = class
anonrec: record l: longint; end;
constructor create;
function testl2: jint;
end;
constructor create;
function testl1: jint;
end;
constructor create;
procedure abstr; override;
end;
tisclass1ref = class of tisclass1;
type
tnestrec = record
r: trec;
arr: array[3..4] of byte;
end;
const
tcnestrec: tnestrec = (r:(a:1;b:2;c:3;d:4;e:5);arr:(7,6));
var
anonrec: record s: string; end;
function testset: jint;
function testloop: longint;
function testfloat: jint;
function testcnvint1: longint;
function testint2real: longint;
function TestCmpListOneShort: longint;
function TestCmpListTwoShort: longint;
function TestCmpListOneWord: longint;
function TestCmpListTwoWord: longint;
function TestCmpListOneInt64: longint;
function TestCmpListTwoInt64: longint;
function TestCmpListThreeInt64: longint;
function TestCmpListRangesOneShort: longint;
function TestCmpListRangesTwoShort: longint;
function TestCmpListRangesOneWord: longint;
function TestCmpListRangesTwoWord: longint;
function TestCmpListRangesThreeWord: longint;
function TestCmpListRangesOneInt64: longint;
function TestCmpListRangesTwoInt64: longint;
function testsqr: longint;
function testtrunc: longint;
function testdynarr: longint;
function testdynarr2: longint;
function testbitcastintfloat: jint;
function testis: longint;
function testneg: longint;
function testtry1: longint;
function testtry2: longint;
function testtryfinally1: longint;
function testtryfinally2: longint;
function testtryfinally3: longint;
function testsmallarr1: longint;
function testopenarr1: longint;
function testopenarr2: longint;
function testopenarr3: longint;
function testopendynarr: longint;
function testsmallarr2: longint;
function testsmallarr3: longint;
function testsmallarr4: longint;
function testrec1: longint;
function testopenarr1rec: longint;
function testrec2: longint;
function testunicodestring: JLString;
function testunicodestring2: JLString;
function testunicodestring3(a: unicodestring): unicodestring;
function testunicodestring4(a: unicodestring): unicodestring;
function testunicodestring5: unicodestring;
function testunicodestring6: unicodestring;
function testunicodestring7: unicodestring;
procedure main(const args: array of string);
var
myrec: trec;
implementation
uses
{$ifdef java}jdk15{$else}androidr14{$endif};
{ package visibility }
var
testglobal: jint;
var
funkyl: longint;
function funky: longint;
begin
result:=funkyl;
inc(funkyl);
end;
function testset: jint;
var
s,s2: set of 0..31;
c1, c2: cardinal;
const
exit1: jint = 1;
begin
result:=0;
s:=[3..6];
s:=s+[10..20];
if not([3..4]<=s) then
exit(exit1);
s:=s-[15..20];
s2:=[15..20];
if s2<=s then
exit(2);
s:=s+s2;
if not(s2<=s) then
exit(3);
if s<=s2 then
exit(4);
c1:=1234;
c2:=c1 mod 5;
if c2<>4 then
exit(5);
end;
function testloop: longint;
var
i,j: longint;
const
exit1: jint = 1;
begin
result:=0;
i:=0;
while i<10 do
i:=i+1;
if i<>10 then
exit(exit1);
i:=0;
repeat
i:=i+5;
until i=20;
if (i<20) or
(i>20) then
exit(2);
j:=0;
for i:=1 to 10 do
j:=j+i;
i:=10;
if (j<(i*(i+1) div 2)) or
(j>(i*(i+1) div 2)) then
exit(3);
end;
function testfloat: jint;
var
s1, s2: single;
d1, d2: double;
begin
result:=0;
s1:=0.5;
s1:=s1+1.5;
s2:=2.0;
if (s1 < s2) or
(s1 > s2) or
(s1 <> s2) then
exit(1);
s1:=s1+s2;
if s1<>4.0 then
exit(2);
s1:=s1-s2;
if s1<>s2 then
exit(3);
s1:=s1*s2;
if s1<>4.0 then
exit(4);
s1:=s1/s2;
if s1<>s2 then
exit(5);
d1:=0.5;
d1:=d1+1.5;
d2:=2.0;
if (d1 < d2) or
(d1 > d2) or
(d1 <> d2) then
exit(6);
d1:=d1+d2;
if d1<>4.0 then
exit(7);
d1:=d1-d2;
if d1<>d2 then
exit(8);
d1:=d1*d2;
if d1<>4.0 then
exit(9);
d1:=d1/d2;
if d1<>d2 then
exit(10);
end;
function testcnvint1: longint;
var
tobyte : byte;
toword : word;
tolong : longint;
{$ifndef tp}
toint64 : int64;
{$endif}
b1 : boolean;
bb1 : bytebool;
wb1 : wordbool;
lb1 : longbool;
b2 : boolean;
bb2 : bytebool;
wb2 : wordbool;
lb2 : longbool;
begin
result:=0;
{ left : LOC_REGISTER }
{ from : LOC_REFERENCE/LOC_REGISTER }
b1 := TRUE;
tobyte := byte(b1);
if tobyte <> 1 then
exit(1);
b1 := FALSE;
tobyte := byte(b1);
if tobyte <> 0 then
exit(2);
b1 := TRUE;
toword := word(b1);
if toword <> 1 then
exit(3);
b1 := FALSE;
toword := word(b1);
if toword <> 0 then
exit(4);
b1 := TRUE;
tolong := longint(b1);
if tolong <> 1 then
exit(5);
b1 := FALSE;
tolong := longint(b1);
if tolong <> 0 then
exit(6);
bb1 := TRUE;
tobyte := byte(bb1);
if tobyte <> 255 then
exit(7);
bb1 := FALSE;
tobyte := byte(bb1);
if tobyte <> 0 then
exit(8);
bb1 := TRUE;
toword := word(bb1);
if toword <> 65535 then
exit(9);
bb1 := FALSE;
toword := word(bb1);
if toword <> 0 then
exit(10);
bb1 := TRUE;
tolong := longint(bb1);
if tolong <> -1 then
exit(11);
bb1 := FALSE;
tolong := longint(bb1);
if tolong <> 0 then
exit(12);
wb1 := TRUE;
tobyte := byte(wb1);
if tobyte <> 255 then
exit(13);
wb1 := FALSE;
tobyte := byte(wb1);
if tobyte <> 0 then
exit(14);
wb1 := TRUE;
toword := word(wb1);
if toword <> 65535 then
exit(15);
wb1 := FALSE;
toword := word(wb1);
if toword <> 0 then
exit(16);
wb1 := TRUE;
tolong := longint(wb1);
if tolong <> -1 then
exit(17);
wb1 := FALSE;
tolong := longint(wb1);
if tolong <> 0 then
exit(18);
{$ifndef tp}
b1 := TRUE;
toint64 :=int64(b1);
if toint64 <> 1 then
exit(19);
b1 := FALSE;
toint64 :=int64(b1);
if toint64 <> 0 then
exit(20);
bb1 := TRUE;
toint64 :=int64(bb1);
if toint64 <> -1 then
exit(21);
bb1 := FALSE;
toint64 :=int64(bb1);
if toint64 <> 0 then
exit(22);
wb1 := TRUE;
toint64 :=int64(wb1);
if toint64 <> -1 then
exit(23);
wb1 := FALSE;
toint64 :=int64(wb1);
if toint64 <> 0 then
exit(24);
{$endif}
lb1 := TRUE;
tobyte := byte(lb1);
if tobyte <> 255 then
exit(25);
lb1 := FALSE;
tobyte := byte(lb1);
if tobyte <> 0 then
exit(26);
lb1 := TRUE;
toword := word(lb1);
if toword <> 65535 then
exit(27);
lb1 := FALSE;
toword := word(lb1);
if toword <> 0 then
exit(28);
lb1 := TRUE;
tolong := longint(lb1);
if tolong <> -1 then
exit(29);
lb1 := FALSE;
tolong := longint(lb1);
if tolong <> 0 then
exit(30);
{ left : LOC_REGISTER }
{ from : LOC_REFERENCE }
wb1 := TRUE;
b2 := wb1;
if not b2 then
exit(31);
wb1 := FALSE;
b2 := wb1;
if b2 then
exit(32);
lb1 := TRUE;
b2 := lb1;
if not b2 then
exit(33);
lb1 := FALSE;
b2 := lb1;
if b2 then
exit(34);
wb1 := TRUE;
bb2 := wb1;
if not bb2 then
exit(35);
wb1 := FALSE;
bb2 := wb1;
if bb2 then
exit(36);
lb1 := TRUE;
bb2 := lb1;
if not bb2 then
exit(37);
lb1 := FALSE;
bb2 := lb1;
if bb2 then
exit(38);
b1 := TRUE;
lb2 := b1;
if not lb2 then
exit(39);
b1 := FALSE;
lb2 := b1;
if lb2 then
exit(40);
bb1 := TRUE;
lb2 := bb1;
if not lb2 then
exit(41);
bb1 := FALSE;
lb2 := bb1;
if lb2 then
exit(42);
{ left : LOC_REGISTER }
{ from : LOC_JUMP }
toword := 0;
tobyte := 1;
tobyte:=byte(toword > tobyte);
if tobyte <> 0 then
exit(43);
toword := 2;
tobyte := 1;
tobyte:=byte(toword > tobyte);
if tobyte <> 1 then
exit(44);
toword := 0;
tobyte := 1;
toword:=word(toword > tobyte);
if toword <> 0 then
exit(45);
toword := 2;
tobyte := 1;
toword:=word(toword > tobyte);
if toword <> 1 then
exit(46);
toword := 0;
tobyte := 1;
tolong:=longint(toword > tobyte);
if tolong <> 0 then
exit(47);
toword := 2;
tobyte := 1;
tolong:=longint(toword > tobyte);
if tolong <> 1 then
exit(48);
{$ifndef tp}
toword := 0;
tobyte := 1;
toint64:=int64(toword > tobyte);
if toint64 <> 0 then
exit(49);
toword := 2;
tobyte := 1;
toint64:=int64(toword > tobyte);
if toint64 <> 1 then
exit(50);
{$endif}
{ left : LOC_REGISTER }
{ from : LOC_FLAGS }
wb1 := TRUE;
bb1 := FALSE;
bb1 := (wb1 <> bb1);
if not bb1 then
exit(51);
wb1 := FALSE;
bb1 := FALSE;
bb1 := (wb1 <> bb1);
if bb1 then
exit(52);
lb1 := TRUE;
bb1 := FALSE;
bb1 := (bb1 = lb1);
if bb1 then
exit(53);
lb1 := FALSE;
bb1 := TRUE;
bb1 := (bb1 <> lb1);
if not bb1 then
exit(54);
lb1 := TRUE;
bb1 := FALSE;
wb1 := (bb1 = lb1);
if wb1 then
exit(55);
lb1 := TRUE;
bb1 := TRUE;
wb1 := (bb1 = lb1);
if not wb1 then
exit(56);
lb1 := TRUE;
bb1 := FALSE;
lb1 := (bb1 = lb1);
if lb1 then
exit(57);
lb1 := FALSE;
bb1 := FALSE;
lb1 := (bb1 = lb1);
if not lb1 then
exit(58);
bb1 := TRUE;
bb2 := FALSE;
lb1 := (bb1 <> bb2);
if not lb1 then
exit(59);
bb1 := FALSE;
bb2 := TRUE;
lb1 := (bb1 = bb2);
if lb1 then
exit(60);
end;
function testint2real: longint;
var
l: longint;
c: cardinal;
i: int64;
q: qword;
s: single;
d: double;
begin
result:=0;
l:=-12345;
c:=high(longint)+33;
i:=-56789;
q:=qword(high(int64))+48;
s:=l;
if s<>-12345 then
exit(1);
s:=c;
if s<>high(longint)+33 then
exit(2);
s:=i;
if s<>-56789 then
exit(3);
s:=q;
if s<>qword(high(int64))+48 then
exit(4);
l:=-12345;
c:=high(longint)+33;
i:=-56789;
q:=qword(high(int64))+48;
d:=l;
if d<>-12345 then
exit(5);
d:=c;
if d<>high(longint)+33 then
exit(6);
d:=i;
if d<>-56789 then
exit(7);
d:=q;
if d<>qword(high(int64))+48 then
exit(8);
l:=123456789;
c:=987654321;
i:=high(cardinal)+12345;
q:=12345;
s:=l;
if s<>123456789 then
exit(11);
s:=c;
if s<>987654321 then
exit(12);
s:=i;
if s<>high(cardinal)+12345 then
exit(13);
s:=q;
if s<>12345 then
exit(14);
l:=123456789;
c:=987654321;
i:=high(cardinal)+12345;
q:=12345;
d:=l;
if d<>123456789 then
exit(16);
d:=c;
if d<>987654321 then
exit(17);
d:=i;
if d<>high(cardinal)+12345 then
exit(18);
d:=q;
if d<>12345 then
exit(19);
end;
{ low = high }
function TestCmpListOneShort: longint;
var
s: smallint;
failed :boolean;
begin
s := -12;
failed := true;
case s of
-12 : failed := false;
-10 : ;
3 : ;
else
end;
if failed then
result:=1
else
result:=0;
end;
{ low = high }
function TestCmpListTwoShort: longint;
var
s: smallint;
failed :boolean;
begin
s := 30000;
failed := true;
case s of
-12 : ;
-10 : ;
3 : ;
else
failed := false;
end;
if failed then
result:=1
else
result:=0;
end;
{ low = high }
function TestCmpListOneWord: longint;
var
s: word;
failed :boolean;
begin
s := 12;
failed := true;
case s of
12 : failed := false;
10 : ;
3 : ;
end;
if failed then
result:=1
else
result:=0;
end;
{ low = high }
function TestCmpListTwoWord: longint;
var
s: word;
failed :boolean;
begin
s := 30000;
failed := true;
case s of
0 : ;
512 : ;
3 : ;
else
failed := false;
end;
if failed then
result:=1
else
result:=0;
end;
{ low = high }
function TestCmpListOneInt64: longint;
var
s: int64;
failed :boolean;
begin
s := 3000000;
failed := true;
case s of
3000000 : failed := false;
10 : ;
3 : ;
end;
if failed then
result:=1
else
result:=0;
end;
{ low = high }
function TestCmpListTwoInt64: longint;
var
s: int64;
failed :boolean;
begin
s := 30000;
failed := true;
case s of
0 : ;
512 : ;
3 : ;
else
failed := false;
end;
if failed then
result:=1
else
result:=0;
end;
{ low = high }
function TestCmpListThreeInt64: longint;
var
s: int64;
l : longint;
failed :boolean;
begin
l:=3000000;
s := (int64(l) shl 32);
failed := true;
case s of
(int64(3000000) shl 32) : failed := false;
10 : ;
3 : ;
end;
if failed then
result:=1
else
result:=0;
end;
function TestCmpListRangesOneShort: longint;
var
s: smallint;
failed :boolean;
begin
s := -12;
failed := true;
case s of
-12..-8 : failed := false;
-7 : ;
3 : ;
else
end;
if failed then
result:=1
else
result:=0;
end;
function TestCmpListRangesTwoShort: longint;
var
s: smallint;
failed :boolean;
begin
s := 30000;
failed := true;
case s of
-12..-8 : ;
-7 : ;
3 : ;
else
failed := false;
end;
if failed then
result:=1
else
result:=0;
end;
{ low = high }
function TestCmpListRangesOneWord: longint;
var
s: word;
failed :boolean;
begin
s := 12;
failed := true;
case s of
12..13 : failed := false;
10 : ;
3..7 : ;
end;
if failed then
result:=1
else
result:=0;
end;
{ low = high }
function TestCmpListRangesTwoWord: longint;
var
s: word;
failed :boolean;
begin
s := 30000;
failed := true;
case s of
0..2 : ;
3..29999 : ;
else
failed := false;
end;
if failed then
result:=1
else
result:=0;
end;
function TestCmpListRangesThreeWord: longint;
var
s: word;
failed :boolean;
begin
s := 3;
failed := true;
case s of
12..13 : ;
10 : ;
3..7 : failed := false;
end;
if failed then
result:=1
else
result:=0;
end;
{ low = high }
function TestCmpListRangesOneInt64: longint;
var
s: int64;
failed :boolean;
begin
s := 3000000;
failed := true;
case s of
11..3000000 : failed := false;
10 : ;
0..2 : ;
end;
if failed then
result:=1
else
result:=0;
end;
{ low = high }
function TestCmpListRangesTwoInt64: longint;
var
s: int64;
failed :boolean;
begin
s := 30000;
failed := true;
case s of
513..10000 : ;
512 : ;
0..3 : ;
else
failed := false;
end;
if failed then
result:=1
else
result:=0;
end;
function testsqr: longint;
var
s1, s2: single;
d1, d2: double;
begin
result:=0;
s1:=25.0;
s2:=sqr(s1);
if s2<>625.0 then
exit(1);
d2:=sqr(s1);
if d2<>625.0 then
exit(2);
d1:=7.0;
d2:=sqr(d1);
if d2<>49.0 then
exit(3);
d2:=sqr(d1);
if d2<>49.0 then
exit(4);
end;
function testtrunc: longint;
var
s1: single;
d1: double;
l: longint;
i: int64;
begin
result:=0;
s1:=123.99;
l:=trunc(s1);
if l<>123 then
exit(1);
i:=trunc(s1);
if i<>123 then
exit(2);
d1:=67533.345923;
l:=trunc(d1);
if l<>67533 then
exit(3);
i:=trunc(d1);
if i<>67533 then
exit(4);
end;
function testdynarr: longint;
type
TReal1DArray = array of Double;
TReal2DArray = array of array of Double;
var
MaxMN : Integer;
PassCount : Integer;
Threshold : Double;
AEffective : TReal2DArray;
AParam : TReal2DArray;
XE : TReal1DArray;
B : TReal1DArray;
N : Integer;
Pass : Integer;
I : Integer;
J : Integer;
CntS : Integer;
CntU : Integer;
CntT : Integer;
CntM : Integer;
WasErrors : Boolean;
IsUpper : Boolean;
IsTrans : Boolean;
IsUnit : Boolean;
V : Double;
S : Double;
begin
SetLength(AEffective, 2, 2); // crash occurs at this line
WasErrors := False;
MaxMN := 10;
PassCount := 5;
N:=2;
isupper:=false;
isunit:=true;
istrans:=false;
while N<=MaxMN do
begin
for i:=low(aeffective) to pred(length(aeffective)) do
for j:=low(aeffective[i]) to pred(length(aeffective[i])) do
aeffective[i,j]:=i*10+j;
SetLength(AEffective, N+1, N+1);
for i:=low(aeffective) to pred(length(aeffective))-1 do
for j:=low(aeffective[i]) to pred(length(aeffective[i]))-1 do
if aeffective[i,j]<>i*10+j then
begin
result:=-1;
exit;
end;
for i:=low(aeffective) to pred(length(aeffective))-1 do
if aeffective[i,pred(length(aeffective[i]))]<>0 then
begin
result:=-2;
exit;
end;
Inc(N);
end;
{ check shallow copy }
AParam:=aeffective;
aeffective[1,1]:=123;
if AParam[1,1]<>123 then
exit(-3);
result:=0;
end;
function testdynarr2: longint;
type
tstaticarr = array[0..1] of longint;
tstaticarr2 = array[0..1] of array of array of longint;
var
a,b: array of array of tstaticarr;
c,d: tstaticarr2;
w: word;
arrb: array of byte;
arrc: array of char;
arrw: array of word;
arrwc: array of unicodechar;
arrd: array of dword;
arrq: array of qword;
arra: array of ansistring;
arrs: array of shortstring;
begin
setlength(a,2,2);
a[0,0,0]:=1;
b:=a;
a[0,0,1]:=1;
funkyl:=1;
setlength(a[funky],35);
if b[0,0,0]<>1 then
exit(1);
if b[0,0,1]<>1 then
exit(2);
if length(b[1])<>35 then
exit(3);
setlength(c[0],2,2);
d:=c;
c[0,0,0]:=1;
setlength(c[1],42);
if d[0,0,0]<>1 then
exit(4);
if length(d[1])<>0 then
exit(5);
b[1,0,0]:=555;
a:=copy(b,1,1);
if length(a)<>1 then
exit(6);
if a[0,0,0]<>555 then
exit(7);
setlength(arrb,4);
if length(arrb)<>4 then
exit(8);
for w:=low(arrb) to high(arrb) do
if arrb[w]<>0 then
exit(9);
setlength(arrc,32);
if length(arrc)<>32 then
exit(10);
for w:=low(arrc) to high(arrc) do
if arrc[w]<>#0 then
exit(11);
setlength(arrw,666);
if length(arrw)<>666 then
exit(11);
for w:=low(arrw) to high(arrw) do
if arrw[w]<>0 then
exit(12);
setlength(arrwc,12346);
if length(arrwc)<>12346 then
exit(13);
for w:=low(arrwc) to high(arrwc) do
if arrwc[w]<>#0 then
exit(14);
setlength(arrd,20000);
if length(arrd)<>20000 then
exit(15);
for w:=low(arrd) to high(arrd) do
if arrd[w]<>0 then
exit(16);
setlength(arrq,21532);
if length(arrq)<>21532 then
exit(17);
for w:=low(arrq) to high(arrq) do
if arrq[w]<>0 then
exit(18);
setlength(arra,21533);
if length(arra)<>21533 then
exit(19);
for w:=low(arra) to high(arra) do
if arra[w]<>'' then
exit(20);
setlength(arrs,21534);
if length(arrs)<>21534 then
exit(21);
for w:=low(arrs) to high(arrs) do
if arrs[w]<>'' then
exit(12);
result:=0;
end;
function testbitcastintfloat: jint;
var
f: jfloat;
d: jdouble;
i: jint;
l: jlong;
begin
result:=-1;
f:=123.125;
i:=jint(f);
f:=1.0;
f:=jfloat(i);
if f<>1123434496.0 then
exit;
result:=-2;
d:=9876.0625;
l:=jlong(d);
d:=1.0;
d:=jdouble(l);
if d<>4666655037106159616 then
exit;
result:=0;
end;
{ ********************** Is test ******************** }
type
tisclass2 = class(tisclass1)
constructor create;
end;
constructor tisclass1.create;
begin
end;
constructor tisclass1.tisclass1nested.create;
begin
anonrec.c:='x';
end;
function tisclass1.tisclass1nested.testl1: jint;
begin
if anonrec.c='x' then
result:=12345
else
result:=-1;
end;
constructor tisclass1.tisclass1nested.tisclass1nestedl2.create;
begin
anonrec.l:=961;
end;
function tisclass1.tisclass1nested.tisclass1nestedl2.testl2: jint;
begin
if anonrec.l=961 then
result:=42
else
result:=-1;
end;
procedure tisclass1.abstr;
begin
end;
constructor tisclass2.create;
begin
end;
function testispara(cref: tisclass1ref): longint;
begin
if cref<>tisclass2 then
result:=14;
result:=0;
end;
function testis: longint;
var
myclass1 : tisclass1;
myclass2 : tisclass2;
nested1 : tisclass1.tisclass1nested;
nested2 : tisclass1.tisclass1nested.tisclass1nestedl2;
myclassref : tisclass1ref;
begin
{ create class instance }
myclass1:=tisclass1.create;
myclass2:=tisclass2.create;
{if myclass1 is tisclass1 }
if not(myclass1 is tisclass1) then
exit(1);
if (myclass1 is tisclass2) then
exit(2);
if not (myclass2 is tisclass2) then
exit(3);
if (myclass1 is tisclass2) then
exit(4);
nested1:=tisclass1.tisclass1nested.create;
nested2:=tisclass1.tisclass1nested.tisclass1nestedl2.create;
if not(nested1 is tisclass1.tisclass1nested) then
exit(5);
if nested1.testl1<>12345 then
exit(6);
if not(nested2 is tisclass2.tisclass1nested.tisclass1nestedl2) then
exit(7);
if nested2.testl2<>42 then
exit(8);
{$ifndef oldcomp}
myclassref:=tisclass1;
if not(myclass1 is myclassref) then
exit(10);
if not(myclass2 is myclassref) then
exit(11);
myclassref:=tisclass2;
if (myclass1 is myclassref) then
exit(12);
if not(myclass2 is myclassref) then
exit(13);
myclass1:=myclass2;
myclass1.abstr;
myclass2:=tisclass2(myclass1 as myclassref);
result:=testispara(tisclass2);
if result<>0 then
exit(14);
if not(nested1 is tisinterface) then
exit(15);
if nested2 is tisinterface then
exit(16);
{$endif}
result:=0;
end;
function testneg: longint;
var
b: shortint;
l: longint;
i: int64;
s: single;
d: double;
begin
b:=1;
b:=-b;
if b<>-1 then
exit(1);
l:=-1234567;
l:=-l;
if l<>1234567 then
exit(2);
i:=-123456789012345;
i:=-i;
if i<>123456789012345 then
exit(3);
s:=123.5;
s:=-s;
if s<>-123.5 then
exit(4);
d:=-4567.78;
d:=-d;
if d<>4567.78 then
exit(5);
result:=0;
end;
{ ******************** End Is test ****************** }
{ ****************** Exception test ***************** }
function testtry1: longint;
begin
result:=-1;
try
raise JLException.create;
except
result:=0;
end;
end;
function testtry2: longint;
begin
result:=-1;
try
raise JLException.create;
except
on JLException do
result:=0;
else
result:=-2
end;
if result<>0 then
exit;
result:=-3;
try
try
raise JLException.create;
except
result:=-4;
raise
end;
except
on JLException do
if result=-4 then
result:=0;
end;
end;
function testtryfinally1: longint;
begin
result:=-1;
try
try
try
raise JLException.create;
except
on JLException do
begin
result:=1;
raise;
end
else
result:=-2
end;
finally
if result=1 then
result:=0;
end;
except
on JLException do
if result<>0 then
raise
end;
end;
function testtryfinally2: longint;
var
i,j: longint;
check1, check2: byte;
begin
j:=0;
check1:=0;
check2:=0;
result:=-1;
try
for i:=1 to 10 do
try
inc(j);
if j=1 then
begin
inc(check1);
continue;
end;
if j=2 then
begin
inc(check2);
break;
end;
finally
if j=1 then
inc(check1);
if j=2 then
inc(check2);
end;
finally
if check1<>2 then
result:=-1
else if check2<>2 then
result:=-2
else if j<>2 then
result:=-3
else
result:=0;
end;
end;
function testtryfinally3: longint;
var
i,j: longint;
check1, check2: byte;
begin
j:=0;
check1:=0;
check2:=0;
result:=-1;
try
for i:=1 to 10 do
try
inc(j);
if j=1 then
begin
inc(check1);
continue;
end;
if j=2 then
begin
inc(check2);
exit;
end;
finally
if j=1 then
inc(check1);
if j=2 then
inc(check2);
end;
finally
if check1<>2 then
result:=-10
else if check2<>2 then
result:=-20
else if j<>2 then
result:=-30
else
result:=0;
end;
end;
{ **************** End Exception test *************** }
{ **************** Begin array test *************** }
function testsmallarr1: longint;
type
tarr = array[4..6] of longint;
var
a1,a2: tarr;
a3,a4: array[1..2,3..5] of tarr;
i,j,k: longint;
begin
a1[4]:=1;
a1[5]:=2;
a1[6]:=3;
{ plain copy }
a2:=a1;
if (a2[4]<>1) or
(a2[5]<>2) or
(a2[6]<>3) then
exit(1);
{ has to be deep copy }
a1[5]:=255;
if a2[5]<>2 then
exit(2);
{ copy to multi-dim array }
a3[1,4]:=a1;
if (a3[1,4,4]<>1) or
(a3[1,4,5]<>255) or
(a3[1,4,6]<>3) then
exit(3);
i:=2;
j:=3;
a1[4]:=38;
a1[5]:=39;
a1[6]:=40;
{ copy to multi-dim array }
a3[i,j]:=a1;
if (a3[i,j,4]<>38) or
(a3[i,j,5]<>39) or
(a3[i,j,6]<>40) then
exit(4);
{ copy multi-dim array to multi-dim array }
a4:=a3;
{ check for deep copy }
for i:=low(a3) to high(a3) do
for j:=low(a3[i]) to high(a3[i]) do
for k:=low(a3[i,j]) to high(a3[i,j]) do
a3[i,j,k]:=-1;
if (a4[1,4,4]<>1) or
(a4[1,4,5]<>255) or
(a4[1,4,6]<>3) then
exit(5);
i:=2;
j:=3;
if (a4[i,j,4]<>38) or
(a4[i,j,5]<>39) or
(a4[i,j,6]<>40) then
exit(6);
result:=0;
end;
function testopenarrval(a1: longint; arr: array of jfloat; a2: longint): longint;
var
i: longint;
begin
result:=a1+length(arr)+trunc(arr[high(arr)])+a2;
for i:=low(arr) to high(arr) do
arr[i]:=1.0;
end;
function testopenarrconst(a1: longint; const arr: array of jfloat; a2: longint): longint;
begin
result:=a1+length(arr)+trunc(arr[high(arr)])+a2;
end;
function testopenarrvar(a1: longint; var arr: array of jfloat; a2: longint): longint;
begin
result:=a1+length(arr)+trunc(arr[high(arr)])+a2;
arr[0]:=3.0;
end;
function testopenarr1: longint;
var
arr: array[4..10] of jfloat;
i: longint;
begin
result:=0;
arr[10]:=2.0;
if testopenarrval(1,arr,3)<>13 then
exit(1);
for i:=4 to 9 do
if arr[i]<>0.0 then
exit(2);
if arr[10]<>2.0 then
exit(3);
if testopenarrconst(2,arr,4)<>15 then
exit(4);
if testopenarrvar(3,arr,5)<>17 then
exit(5);
if arr[4]<>3.0 then
exit(6);
end;
type
tarrdynarr = array[1..10,1..4] of array of array of byte;
function testoutopenarrdyn(out arr: array of tarrdynarr): longint;
var
i, j, k: longint;
begin
for i:=low(arr) to high(arr) do
for j:=low(arr[i]) to high(arr[i]) do
for k:=low(arr[i][j]) to high(arr[i][j]) do
begin
if length(arr[i][j,k])<>0 then
exit(-1);
setlength(arr[i][j,k],j,k);
end;
result:=0;
end;
function testopenarr2: longint;
var
arr: array[20..30] of tarrdynarr;
dynarr: array of tarrdynarr;
i,j,k: longint;
barr, barr2: array of byte;
rarr: array of trec;
rarr2: array of array of trec;
begin
setlength(barr,4);
barr[1]:=4;
if barr[1]<>4 then
exit(-40);
barr2:=copy(barr);
if barr2[1]<>4 then
exit(-50);
barr2[2]:=48;
if barr[2]=48 then
exit(-60);
setlength(rarr,5);
rarr[4].a:=135;
if rarr[4].a<>135 then
exit(-70);
setlength(rarr2,4,5);
rarr2[3,4].b:=124;
if rarr2[3,4].b<>124 then
exit(-80);
for i:=low(arr) to high(arr) do
for j:=low(arr[i]) to high(arr[i]) do
for k:=low(arr[i][j]) to high(arr[i][j]) do
begin
setlength(arr[i][j,k],20,20);
end;
result:=testoutopenarrdyn(arr);
if result<>0 then
exit;
for i:=low(arr) to high(arr) do
for j:=low(arr[i]) to high(arr[i]) do
for k:=low(arr[i][j]) to high(arr[i][j]) do
begin
if (length(arr[i][j,k])<>j) then
exit(-2);
if (length(arr[i][j,k][0])<>k) then
exit(-3);
if (length(arr[i][j,k][j-1])<>k) then
exit(-4);
end;
setlength(dynarr,31);
result:=testoutopenarrdyn(dynarr);
for i:=low(arr) to high(arr) do
for j:=low(arr[i]) to high(arr[i]) do
for k:=low(arr[i][j]) to high(arr[i][j]) do
begin
if (length(arr[i][j,k])<>j) then
exit(-5);
if (length(arr[i][j,k][0])<>k) then
exit(-6);
if (length(arr[i][j,k][j-1])<>k) then
exit(-7);
end;
end;
function testopenarr3: longint;
var
arr: array[4..10] of jfloat;
i: longint;
begin
result:=0;
arr[10]:=2.0;
if testopenarrval(1,[1.0,2.0,3.0,4.0,5.0,6.0,2.0],3)<>13 then
exit(1);
if testopenarrconst(2,[1.0,2.0,3.0,4.0,5.0,6.0,7.0],4)<>20 then
exit(2);
end;
type
ByteArray = array of byte;
procedure FillChar(var X: Array of Byte; Count: integer; Value: byte; FirstIndex: integer);
var
i: integer;
y: bytearray;
begin
for i := FirstIndex to (FirstIndex + Count) - 1 do
X[i] := Value;
end;
function Err : ByteArray;
begin
SetLength(Result, 10);
FillChar(Result, Length(Result)-2, 1, 2); // !!!!
end;
function testopendynarr: longint;
var
x: bytearray;
i: longint;
begin
x:=err;
for i:=0 to 1 do
if x[i]<>0 then
exit(1);
for i:=2 to high(x) do
if x[i]<>1 then
exit(2);
result:=0;
end;
type
tdoublearray10 = array[1..10] of jdouble;
function testarrval(arr: tdoublearray10): double;
var
i: longint;
begin
result:=0.0;
for i:=low(arr) to high(arr) do
begin
result:=result+arr[i];
arr[i]:=-1.0;
end;
end;
function testsmallarr2: longint;
var
arr: tdoublearray10;
i: longint;
barr1,barr2: array[1..2] of byte;
begin
result:=0;
for i:=low(arr) to high(arr) do
arr[i]:=i;
if testarrval(arr)<>(10*11 div 2) then
exit(1);
for i:=low(arr) to high(arr) do
if arr[i]<>i then
exit(2);
barr1[1]:=1;
barr1[2]:=2;
barr2:=barr1;
if barr2[1]<>1 then
exit(3);
if barr2[2]<>2 then
exit(4);
end;
type
tsmall2darr = array[1..10,5..9] of longint;
function smallarr2dfunc: tsmall2darr;
var
i, j: longint;
begin
for i:=low(result) to high(result) do
for j:=low(result[i]) to high(result[i]) do
result[i,j]:=i*(high(result[i])-low(result[i])+1)+(j-low(result[i]));
end;
function testsmallarr3: longint;
var
a: tsmall2darr;
begin
a:=smallarr2dfunc;
if a[1,5]<>5 then
exit(1);
if a[2,9]<>14 then
exit(2);
result:=0;
end;
function testoutarrdyn(out arr: tarrdynarr): longint;
var
i, j: longint;
begin
for i:=low(arr) to high(arr) do
for j:=low(arr[i]) to high(arr[i]) do
begin
if length(arr[i,j])<>0 then
exit(-1);
setlength(arr[i,j],i,j);
end;
result:=0;
end;
function testsmallarr4: longint;
var
arr: tarrdynarr;
i,j: longint;
begin
for i:=low(arr) to high(arr) do
for j:=low(arr[i]) to high(arr[i]) do
begin
setlength(arr[i,j],20,20);
end;
result:=testoutarrdyn(arr);
if result<>0 then
exit;
for i:=low(arr) to high(arr) do
for j:=low(arr[i]) to high(arr[i]) do
begin
if (length(arr[i,j])<>i) then
exit(-2);
if (length(arr[i,j][0])<>j) then
exit(-3);
if (length(arr[i,j][i-1])<>j) then
exit(-4);
end;
end;
function testrec1: longint;
var
r1, r2: trec;
begin
r1.a:=1;
r1.b:=2;
r1.c:=3;
r1.d:=4;
r1.e:=5;
if r1.a<>1 then
exit(1);
if r1.b<>2 then
exit(2);
if r1.c<>3 then
exit(3);
if r1.d<>4 then
exit(4);
if r1.e<>5 then
exit(5);
r2:=r1;
if r2.a<>1 then
exit(6);
if r2.b<>2 then
exit(7);
if r2.c<>3 then
exit(8);
if r2.d<>4 then
exit(9);
if r2.e<>5 then
exit(10);
r2.a:=10;
if r1.a<>1 then
exit(11);
result:=0;
end;
function testrec2: longint;
var
r1, r2: tnestrec;
begin
r1:=tcnestrec;
r1.r.a:=1;
r1.r.b:=2;
r1.r.c:=3;
r1.r.d:=4;
r1.r.e:=5;
r1.arr[4]:=6;
if r1.r.a<>1 then
exit(1);
if r1.r.b<>2 then
exit(2);
if r1.r.c<>3 then
exit(3);
if r1.r.d<>4 then
exit(4);
if r1.r.e<>5 then
exit(5);
if r1.arr[4]<>6 then
exit(12);
r2:=r1;
if r2.r.a<>1 then
exit(6);
if r2.r.b<>2 then
exit(7);
if r2.r.c<>3 then
exit(8);
if r2.r.d<>4 then
exit(9);
if r2.r.e<>5 then
exit(10);
if r1.arr[4]<>6 then
exit(13);
r2.r.a:=10;
r2.arr[4]:=7;
if r1.r.a<>1 then
exit(11);
if r1.arr[4]<>6 then
exit(14);
anonrec.s:='abcdef';
if anonrec.s<>'abcdef' then
exit(15);
result:=0;
end;
function testopenarrvalrec(a1: longint; arr: array of trec; a2: longint): longint;
var
i: longint;
begin
result:=a1+length(arr)+arr[high(arr)].a+a2;
for i:=low(arr) to high(arr) do
arr[i].a:=123;
end;
function testopenarrconstrec(a1: longint; const arr: array of trec; a2: longint): longint;
begin
result:=a1+length(arr)+arr[high(arr)].b+a2;
end;
function testopenarrvarrec(a1: longint; var arr: array of trec; a2: longint): longint;
begin
result:=a1+length(arr)+arr[high(arr)].c+a2;
arr[0].d:=987;
end;
function testopenarr1rec: longint;
var
arr: array[4..10] of trec;
i: longint;
begin
result:=0;
arr[10].a:=2;
arr[10].b:=2;
arr[10].c:=2;
arr[10].d:=2;
arr[10].e:=2;
if testopenarrvalrec(1,arr,3)<>13 then
exit(1);
for i:=4 to 9 do
if arr[i].a<>0.0 then
exit(2);
if arr[10].a<>2.0 then
exit(3);
if testopenarrconstrec(2,arr,4)<>15 then
exit(4);
if testopenarrvarrec(3,arr,5)<>17 then
exit(5);
if arr[4].d<>987 then
exit(6);
end;
function testunicodestring: JLString;
var
s1, s2: unicodestring;
sarr: array[0..0] of unicodestring;
begin
s1:='abc';
sarr[0]:=s1;
funkyl:=0;
if length(sarr[funky])<>3 then
begin
result:='';
exit;
end;
s2:=s1;
s2:='~ê∂êºîƒ~©¬';
result:=s2;
end;
function testunicodestring2: JLString;
begin
result:='\'#13#10'"';
end;
function testunicodestring3(a: unicodestring): unicodestring;
begin
result:=a+'def';
end;
function testunicodestring4(a: unicodestring): unicodestring;
begin
// JLSystem.fout.println(JLString('in testunicodestring4'));
// JLSystem.fout.println(JLString(a));
result:=a;
// JLSystem.fout.println(JLString(result));
result[2]:='x';
// JLSystem.fout.println(JLString(result));
result[3]:='2';
// JLSystem.fout.println(JLString(result));
end;
function testunicodestring5: unicodestring;
var
arr: array[0..3] of ansichar;
arr2: array[1..5] of ansichar;
c: ansichar;
wc: widechar;
begin
arr:='abc'#0;
arr2:='defgh';
c:='i';
wc:='j';
result:=arr+arr2;
result:=copy(result,1,length(result))+c;
result:=result+wc;
end;
function testunicodestring6: unicodestring;
const
tcstr: string = 'ab';
var
arr: array[0..3] of widechar;
arr2: array[1..5] of widechar;
swap: ansichar;
wc: widechar;
i: longint;
begin
arr:='ab';
arr2:='cdefg';
swap:='h';
wc:='i';
result:=arr+arr2+swap;
result:=result+wc;
end;
function testunicodestring7: unicodestring;
const
tcstr: string = 'ab';
var
arr: array[0..3] of unicodechar;
arr2: array[1..5] of unicodechar;
c: ansichar = 'h';
wc: unicodechar;
begin
funkyl:=1;
arr:=tcstr;
arr2:='cdefg';
wc:='i';
result:=arr+arr2;
result:=result+c;
result:=result+wc;
result[funky]:='x';
end;
{ **************** End array test *************** }
constructor TMyClass.create;
begin
end;
constructor TMyClass.create(l: longint);
var
dummy: TMyClass;
begin
dummy:=TMyClass.create;
create(l,l);
end;
constructor TMyClass.create(l1,l2: longint);
begin
inherited create;
propintfield:=4;
if propintfield<>4 then
jlsystem.fout.println('WRONG!!!!!!!!!!!!!!!!!!!');
end;
function TMyClass.sub(a1, a2: longint): longint;
begin
result:=a1-a2;
end;
function TMyClass.test(l1, l2: longint): longint;
var
locall: longint;
localsub: TMyClass;
begin
localsub:=TMyClass.create(1245);
locall:=localsub.sub(l1,l2);
result:=locall+1;
if result>4 then
result:=-1;
end;
class function tmyclass.staticmul3(l: longint): longint; static;
begin
result:=l*3;
end;
procedure tmyclass.longboolobj(l: jlong; b: boolean; obj: tobject);
begin
l:=5;
b:=true;
obj:=nil;
end;
procedure tmyclass.setintfield(l: jint);
const
xxx: longint = 4;
begin
intfield:=l;
longboolobj(xxx,true,self);
end;
function tmyclass.getintfield: jint;
begin
result:=intfield;
end;
procedure tmyclass.setstaticbytefield(b: byte);
begin
staticbytefield:=b;
myrec.a:=b;
end;
function tmyclass.getstaticbytefield: byte;
begin
result:=staticbytefield;
end;
class procedure tmyclass.setstaticbytefieldstatic(b: byte);
begin
staticbytefield:=b;
end;
class function tmyclass.getstaticbytefieldstatic: byte;
begin
result:=staticbytefield;
end;
class procedure tmyclass.settestglobal(l: longint);
begin
testglobal:=l;
end;
class function tmyclass.gettestglobal: longint;
begin
result:=testglobal;
end;
procedure main(const args: array of string);
begin
JLSystem.fout.println('This is the entry point');
end;
begin
myrec.b:=1234;
TMyClass.rec.c:=5678;
end.