fpc/tests/test/minmax.inc

711 lines
13 KiB
PHP

uses
Math;
procedure TestFail(ErrCode: LongInt); noreturn;
begin
WriteLn('FAIL on test ', ErrCode);
Halt(ErrCode);
end;
procedure TestSingle;
function Min1(a, b: Single): Single; inline;
begin
if a < b then
Result := a
else
Result := b;
end;
function Max1(a, b: Single): Single; inline;
begin
if a > b then
Result := a
else
Result := b;
end;
function Min2(a, b: Single): Single; inline;
begin
if a <= b then
Result := a
else
Result := b;
end;
function Max2(a, b: Single): Single; inline;
begin
if a >= b then
Result := a
else
Result := b;
end;
function Min3(a, b: Single): Single; inline;
begin
Result := b;
if a < Result then
Result := a;
end;
function Max3(a, b: Single): Single; inline;
begin
Result := b;
if a > Result then
Result := a;
end;
function Min4(a, b: Single): Single; inline;
begin
Result := b;
if a <= Result then
Result := a;
end;
function Max4(a, b: Single): Single; inline;
begin
Result := b;
if a >= Result then
Result := a;
end;
var
v1,v3,vNaN : Single;
begin
v1:=1;
v3:=3;
if Min1(1,3)<>1 then
TestFail(1);
if Max1(1,3)<>3 then
TestFail(2);
if Min2(1,3)<>1 then
TestFail(3);
if Max2(1,3)<>3 then
TestFail(4);
if Min3(1,3)<>1 then
TestFail(5);
if Max3(1,3)<>3 then
TestFail(6);
if Min3(1,3)<>1 then
TestFail(7);
if Max3(1,3)<>3 then
TestFail(8);
if Min1(1,v3)<>1 then
TestFail(11);
if Max1(1,v3)<>3 then
TestFail(12);
if Min2(1,v3)<>1 then
TestFail(13);
if Max2(1,v3)<>3 then
TestFail(14);
if Min3(1,v3)<>1 then
TestFail(15);
if Max3(1,v3)<>3 then
TestFail(16);
if Min4(1,v3)<>1 then
TestFail(17);
if Max4(1,v3)<>3 then
TestFail(18);
if Min1(1,v3)<>1 then
TestFail(21);
if Max1(1,v3)<>v3 then
TestFail(22);
if Min2(1,v3)<>1 then
TestFail(23);
if Max2(1,v3)<>v3 then
TestFail(24);
if Min3(1,v3)<>1 then
TestFail(25);
if Max3(1,v3)<>v3 then
TestFail(26);
if Min4(1,v3)<>1 then
TestFail(27);
if Max4(1,v3)<>v3 then
TestFail(28);
if Min1(v1,v3)<>v1 then
TestFail(31);
if Max1(v1,v3)<>v3 then
TestFail(32);
if Min2(v1,v3)<>v1 then
TestFail(33);
if Max2(v1,v3)<>v3 then
TestFail(34);
if Min3(v1,v3)<>v1 then
TestFail(35);
if Max3(v1,v3)<>v3 then
TestFail(36);
if Min4(v1,v3)<>v1 then
TestFail(37);
if Max4(v1,v3)<>v3 then
TestFail(38);
SetExceptionMask([exInvalidOp]);
vNaN:=NaN;
if not(IsNaN(Min1(v1,vNaN))) then
TestFail(41);
if Min1(NaN,v1)<>v1 then
TestFail(42);
if not(IsNaN(Max1(v1,vNaN))) then
TestFail(43);
if Max1(vNaN,v3)<>v3 then
TestFail(44);
if not(IsNaN(Min2(v1,vNaN))) then
TestFail(45);
if Min2(vNaN,v3)<>v3 then
TestFail(46);
if not(IsNaN(Max2(v1,vNaN))) then
TestFail(47);
if Max2(vNaN,v3)<>v3 then
TestFail(48);
if not(IsNaN(Min3(v1,vNaN))) then
TestFail(49);
if Min3(NaN,v1)<>v1 then
TestFail(50);
if not(IsNaN(Max3(v1,vNaN))) then
TestFail(51);
if Max3(vNaN,v3)<>v3 then
TestFail(52);
if not(IsNaN(Min4(v1,vNaN))) then
TestFail(53);
if Min4(vNaN,v3)<>v3 then
TestFail(54);
if not(IsNaN(Max4(v1,vNaN))) then
TestFail(55);
if Max4(vNaN,v3)<>v3 then
TestFail(56);
SetExceptionMask([]);
end;
procedure TestDouble;
function Min1(a, b: Double): Double; inline;
begin
if a < b then
Result := a
else
Result := b;
end;
function Max1(a, b: Double): Double; inline;
begin
if a > b then
Result := a
else
Result := b;
end;
function Min2(a, b: Double): Double; inline;
begin
if a <= b then
Result := a
else
Result := b;
end;
function Max2(a, b: Double): Double; inline;
begin
if a >= b then
Result := a
else
Result := b;
end;
function Min3(a, b: Double): Double; inline;
begin
Result := b;
if a < b then
Result := a;
end;
function Max3(a, b: Double): Double; inline;
begin
Result := b;
if a > b then
Result := a;
end;
function Min4(a, b: Double): Double; inline;
begin
Result := b;
if a <= b then
Result := a;
end;
function Max4(a, b: Double): Double; inline;
begin
Result := b;
if a >= b then
Result := a;
end;
var
v1,v3,vNaN : Double;
begin
v1:=1;
v3:=3;
if Min1(1,3)<>1 then
TestFail(101);
if Max1(1,3)<>3 then
TestFail(102);
if Min2(1,3)<>1 then
TestFail(103);
if Max2(1,3)<>3 then
TestFail(104);
if Min3(1,3)<>1 then
TestFail(105);
if Max3(1,3)<>3 then
TestFail(106);
if Min3(1,3)<>1 then
TestFail(107);
if Max3(1,3)<>3 then
TestFail(108);
if Min1(1,v3)<>1 then
TestFail(111);
if Max1(1,v3)<>3 then
TestFail(112);
if Min2(1,v3)<>1 then
TestFail(113);
if Max2(1,v3)<>3 then
TestFail(114);
if Min3(1,v3)<>1 then
TestFail(115);
if Max3(1,v3)<>3 then
TestFail(116);
if Min4(1,v3)<>1 then
TestFail(117);
if Max4(1,v3)<>3 then
TestFail(118);
if Min1(1,v3)<>1 then
TestFail(121);
if Max1(1,v3)<>v3 then
TestFail(122);
if Min2(1,v3)<>1 then
TestFail(123);
if Max2(1,v3)<>v3 then
TestFail(124);
if Min3(1,v3)<>1 then
TestFail(125);
if Max3(1,v3)<>v3 then
TestFail(126);
if Min4(1,v3)<>1 then
TestFail(127);
if Max4(1,v3)<>v3 then
TestFail(128);
if Min1(v1,v3)<>v1 then
TestFail(131);
if Max1(v1,v3)<>v3 then
TestFail(132);
if Min2(v1,v3)<>v1 then
TestFail(133);
if Max2(v1,v3)<>v3 then
TestFail(134);
if Min3(v1,v3)<>v1 then
TestFail(135);
if Max3(v1,v3)<>v3 then
TestFail(136);
if Min4(v1,v3)<>v1 then
TestFail(137);
if Max4(v1,v3)<>v3 then
TestFail(138);
SetExceptionMask([exInvalidOp]);
vNaN:=NaN;
if not(IsNaN(Min1(v1,vNaN))) then
TestFail(141);
if Min1(NaN,v1)<>v1 then
TestFail(142);
if not(IsNaN(Max1(v1,vNaN))) then
TestFail(143);
if Max1(vNaN,v3)<>v3 then
TestFail(144);
if not(IsNaN(Min2(v1,vNaN))) then
TestFail(145);
if Min2(vNaN,v3)<>v3 then
TestFail(146);
if not(IsNaN(Max2(v1,vNaN))) then
TestFail(147);
if Max2(vNaN,v3)<>v3 then
TestFail(148);
if not(IsNaN(Min3(v1,vNaN))) then
TestFail(149);
if Min3(NaN,v1)<>v1 then
TestFail(150);
if not(IsNaN(Max3(v1,vNaN))) then
TestFail(151);
if Max3(vNaN,v3)<>v3 then
TestFail(152);
if not(IsNaN(Min4(v1,vNaN))) then
TestFail(153);
if Min4(vNaN,v3)<>v3 then
TestFail(154);
if not(IsNaN(Max4(v1,vNaN))) then
TestFail(155);
if Max4(vNaN,v3)<>v3 then
TestFail(156);
SetExceptionMask([]);
end;
procedure TestDWord;
function Min1(a, b: DWord): DWord; inline;
begin
if a < b then
Result := a
else
Result := b;
end;
function Max1(a, b: DWord): DWord; inline;
begin
if a > b then
Result := a
else
Result := b;
end;
function Min2(a, b: DWord): DWord; inline;
begin
if a <= b then
Result := a
else
Result := b;
end;
function Max2(a, b: DWord): DWord; inline;
begin
if a >= b then
Result := a
else
Result := b;
end;
function Min3(a, b: DWord): DWord; inline;
begin
Result := b;
if a < b then
Result := a;
end;
function Max3(a, b: DWord): DWord; inline;
begin
Result := b;
if a > b then
Result := a;
end;
function Min4(a, b: DWord): DWord; inline;
begin
Result := b;
if a <= b then
Result := a;
end;
function Max4(a, b: Double): Double; inline;
begin
Result := b;
if a >= b then
Result := a;
end;
var
v1,v3 : DWord;
begin
v1:=1;
v3:=3;
if Min1(1,3)<>1 then
TestFail(201);
if Max1(1,3)<>3 then
TestFail(202);
if Min2(1,3)<>1 then
TestFail(203);
if Max2(1,3)<>3 then
TestFail(204);
if Min3(1,3)<>1 then
TestFail(205);
if Max3(1,3)<>3 then
TestFail(206);
if Min3(1,3)<>1 then
TestFail(207);
if Max3(1,3)<>3 then
TestFail(208);
if Min1(1,v3)<>1 then
TestFail(211);
if Max1(1,v3)<>3 then
TestFail(212);
if Min2(1,v3)<>1 then
TestFail(213);
if Max2(1,v3)<>3 then
TestFail(214);
if Min3(1,v3)<>1 then
TestFail(215);
if Max3(1,v3)<>3 then
TestFail(216);
if Min4(1,v3)<>1 then
TestFail(217);
if Max4(1,v3)<>3 then
TestFail(218);
if Min1(1,v3)<>1 then
TestFail(221);
if Max1(1,v3)<>v3 then
TestFail(222);
if Min2(1,v3)<>1 then
TestFail(223);
if Max2(1,v3)<>v3 then
TestFail(224);
if Min3(1,v3)<>1 then
TestFail(225);
if Max3(1,v3)<>v3 then
TestFail(226);
if Min4(1,v3)<>1 then
TestFail(227);
if Max4(1,v3)<>v3 then
TestFail(228);
if Min1(v1,v3)<>v1 then
TestFail(231);
if Max1(v1,v3)<>v3 then
TestFail(232);
if Min2(v1,v3)<>v1 then
TestFail(233);
if Max2(v1,v3)<>v3 then
TestFail(234);
if Min3(v1,v3)<>v1 then
TestFail(235);
if Max3(v1,v3)<>v3 then
TestFail(236);
if Min4(v1,v3)<>v1 then
TestFail(237);
if Max4(v1,v3)<>v3 then
TestFail(238);
end;
procedure TestLongint;
function Min1(a, b: Longint): Longint; inline;
begin
if a < b then
Result := a
else
Result := b;
end;
function Max1(a, b: Longint): Longint; inline;
begin
if a > b then
Result := a
else
Result := b;
end;
function Min2(a, b: Longint): Longint; inline;
begin
if a <= b then
Result := a
else
Result := b;
end;
function Max2(a, b: Longint): Longint; inline;
begin
if a >= b then
Result := a
else
Result := b;
end;
function Min3(a, b: Longint): Longint; inline;
begin
Result := b;
if a < b then
Result := a;
end;
function Max3(a, b: Longint): Longint; inline;
begin
Result := b;
if a > b then
Result := a;
end;
function Min4(a, b: Longint): Longint; inline;
begin
Result := b;
if a <= b then
Result := a;
end;
function Max4(a, b: Longint): Longint; inline;
begin
Result := b;
if a >= b then
Result := a;
end;
var
v1,v3 : Longint;
begin
v1:=1;
v3:=3;
if Min1(1,3)<>1 then
TestFail(301);
if Max1(1,3)<>3 then
TestFail(302);
if Min2(1,3)<>1 then
TestFail(303);
if Max2(1,3)<>3 then
TestFail(304);
if Min3(1,3)<>1 then
TestFail(305);
if Max3(1,3)<>3 then
TestFail(306);
if Min3(1,3)<>1 then
TestFail(307);
if Max3(1,3)<>3 then
TestFail(308);
if Min1(1,v3)<>1 then
TestFail(311);
if Max1(1,v3)<>3 then
TestFail(312);
if Min2(1,v3)<>1 then
TestFail(313);
if Max2(1,v3)<>3 then
TestFail(314);
if Min3(1,v3)<>1 then
TestFail(315);
if Max3(1,v3)<>3 then
TestFail(316);
if Min4(1,v3)<>1 then
TestFail(317);
if Max4(1,v3)<>3 then
TestFail(318);
if Min1(1,v3)<>1 then
TestFail(321);
if Max1(1,v3)<>v3 then
TestFail(322);
if Min2(1,v3)<>1 then
TestFail(323);
if Max2(1,v3)<>v3 then
TestFail(324);
if Min3(1,v3)<>1 then
TestFail(325);
if Max3(1,v3)<>v3 then
TestFail(326);
if Min4(1,v3)<>1 then
TestFail(327);
if Max4(1,v3)<>v3 then
TestFail(328);
if Min1(v1,v3)<>v1 then
TestFail(331);
if Max1(v1,v3)<>v3 then
TestFail(332);
if Min2(v1,v3)<>v1 then
TestFail(333);
if Max2(v1,v3)<>v3 then
TestFail(334);
if Min3(v1,v3)<>v1 then
TestFail(335);
if Max3(v1,v3)<>v3 then
TestFail(336);
if Min4(v1,v3)<>v1 then
TestFail(337);
if Max4(v1,v3)<>v3 then
TestFail(338);
end;
var
v1,v3 : Longint;
function Min1: Longint; inline;
begin
if v1 < v3 then
Result := v1
else
Result := v3;
end;
function Max1: Longint; inline;
begin
if v1 > v3 then
Result := v1
else
Result := v3;
end;
var
c1 : Longint = 1;
c3 : Longint = 3;
function Min11: Longint; inline;
begin
if c1 < c3 then
Result := c1
else
Result := c3;
end;
function Max11: Longint; inline;
begin
if c1 > c3 then
Result := c1
else
Result := c3;
end;
procedure TestLongintGlobal;
begin
v1:=1;
v3:=3;
if Min1<>1 then
TestFail(1301);
if Max1<>3 then
TestFail(1302);
if Min11<>1 then
TestFail(1311);
if Max11<>3 then
TestFail(1312);
end;
begin
TestSingle;
TestDouble;
TestDWord;
TestLongint;
TestLongintGlobal;
WriteLn('ok');
end.