fpc/tests/test/tminmax.pp

646 lines
12 KiB
ObjectPascal

{ %opt=-Oonofastmath } { with fast math, the operands of min/max might be swapped and this breaks the tests using NaN }
{$mode objfpc}
uses
Math;
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
halt(1);
if Max1(1,3)<>3 then
halt(2);
if Min2(1,3)<>1 then
halt(3);
if Max2(1,3)<>3 then
halt(4);
if Min3(1,3)<>1 then
halt(5);
if Max3(1,3)<>3 then
halt(6);
if Min3(1,3)<>1 then
halt(7);
if Max3(1,3)<>3 then
halt(8);
if Min1(1,v3)<>1 then
halt(11);
if Max1(1,v3)<>3 then
halt(12);
if Min2(1,v3)<>1 then
halt(13);
if Max2(1,v3)<>3 then
halt(14);
if Min3(1,v3)<>1 then
halt(15);
if Max3(1,v3)<>3 then
halt(16);
if Min4(1,v3)<>1 then
halt(17);
if Max4(1,v3)<>3 then
halt(18);
if Min1(1,v3)<>1 then
halt(21);
if Max1(1,v3)<>v3 then
halt(22);
if Min2(1,v3)<>1 then
halt(23);
if Max2(1,v3)<>v3 then
halt(24);
if Min3(1,v3)<>1 then
halt(25);
if Max3(1,v3)<>v3 then
halt(26);
if Min4(1,v3)<>1 then
halt(27);
if Max4(1,v3)<>v3 then
halt(28);
if Min1(v1,v3)<>v1 then
halt(31);
if Max1(v1,v3)<>v3 then
halt(32);
if Min2(v1,v3)<>v1 then
halt(33);
if Max2(v1,v3)<>v3 then
halt(34);
if Min3(v1,v3)<>v1 then
halt(35);
if Max3(v1,v3)<>v3 then
halt(36);
if Min4(v1,v3)<>v1 then
halt(37);
if Max4(v1,v3)<>v3 then
halt(38);
SetExceptionMask([exInvalidOp]);
vNaN:=NaN;
if not(IsNaN(Min1(v1,vNaN))) then
halt(41);
if Min1(NaN,v1)<>v1 then
halt(42);
if not(IsNaN(Max1(v1,vNaN))) then
halt(43);
if Max1(vNaN,v3)<>v3 then
halt(44);
if not(IsNaN(Min2(v1,vNaN))) then
halt(45);
if Min2(vNaN,v3)<>v3 then
halt(46);
if not(IsNaN(Max2(v1,vNaN))) then
halt(47);
if Max2(vNaN,v3)<>v3 then
halt(48);
if not(IsNaN(Min3(v1,vNaN))) then
halt(49);
if Min3(NaN,v1)<>v1 then
halt(50);
if not(IsNaN(Max3(v1,vNaN))) then
halt(51);
if Max3(vNaN,v3)<>v3 then
halt(52);
if not(IsNaN(Min4(v1,vNaN))) then
halt(53);
if Min4(vNaN,v3)<>v3 then
halt(54);
if not(IsNaN(Max4(v1,vNaN))) then
halt(55);
if Max4(vNaN,v3)<>v3 then
halt(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
halt(101);
if Max1(1,3)<>3 then
halt(102);
if Min2(1,3)<>1 then
halt(103);
if Max2(1,3)<>3 then
halt(104);
if Min3(1,3)<>1 then
halt(105);
if Max3(1,3)<>3 then
halt(106);
if Min3(1,3)<>1 then
halt(107);
if Max3(1,3)<>3 then
halt(108);
if Min1(1,v3)<>1 then
halt(111);
if Max1(1,v3)<>3 then
halt(112);
if Min2(1,v3)<>1 then
halt(113);
if Max2(1,v3)<>3 then
halt(114);
if Min3(1,v3)<>1 then
halt(115);
if Max3(1,v3)<>3 then
halt(116);
if Min4(1,v3)<>1 then
halt(117);
if Max4(1,v3)<>3 then
halt(118);
if Min1(1,v3)<>1 then
halt(121);
if Max1(1,v3)<>v3 then
halt(122);
if Min2(1,v3)<>1 then
halt(123);
if Max2(1,v3)<>v3 then
halt(124);
if Min3(1,v3)<>1 then
halt(125);
if Max3(1,v3)<>v3 then
halt(126);
if Min4(1,v3)<>1 then
halt(127);
if Max4(1,v3)<>v3 then
halt(128);
if Min1(v1,v3)<>v1 then
halt(131);
if Max1(v1,v3)<>v3 then
halt(132);
if Min2(v1,v3)<>v1 then
halt(133);
if Max2(v1,v3)<>v3 then
halt(134);
if Min3(v1,v3)<>v1 then
halt(135);
if Max3(v1,v3)<>v3 then
halt(136);
if Min4(v1,v3)<>v1 then
halt(137);
if Max4(v1,v3)<>v3 then
halt(138);
SetExceptionMask([exInvalidOp]);
vNaN:=NaN;
if not(IsNaN(Min1(v1,vNaN))) then
halt(141);
if Min1(NaN,v1)<>v1 then
halt(142);
if not(IsNaN(Max1(v1,vNaN))) then
halt(143);
if Max1(vNaN,v3)<>v3 then
halt(144);
if not(IsNaN(Min2(v1,vNaN))) then
halt(145);
if Min2(vNaN,v3)<>v3 then
halt(146);
if not(IsNaN(Max2(v1,vNaN))) then
halt(147);
if Max2(vNaN,v3)<>v3 then
halt(148);
if not(IsNaN(Min3(v1,vNaN))) then
halt(149);
if Min3(NaN,v1)<>v1 then
halt(150);
if not(IsNaN(Max3(v1,vNaN))) then
halt(151);
if Max3(vNaN,v3)<>v3 then
halt(152);
if not(IsNaN(Min4(v1,vNaN))) then
halt(153);
if Min4(vNaN,v3)<>v3 then
halt(154);
if not(IsNaN(Max4(v1,vNaN))) then
halt(155);
if Max4(vNaN,v3)<>v3 then
halt(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
halt(201);
if Max1(1,3)<>3 then
halt(202);
if Min2(1,3)<>1 then
halt(203);
if Max2(1,3)<>3 then
halt(204);
if Min3(1,3)<>1 then
halt(205);
if Max3(1,3)<>3 then
halt(206);
if Min3(1,3)<>1 then
halt(207);
if Max3(1,3)<>3 then
halt(208);
if Min1(1,v3)<>1 then
halt(211);
if Max1(1,v3)<>3 then
halt(212);
if Min2(1,v3)<>1 then
halt(213);
if Max2(1,v3)<>3 then
halt(214);
if Min3(1,v3)<>1 then
halt(215);
if Max3(1,v3)<>3 then
halt(216);
if Min4(1,v3)<>1 then
halt(217);
if Max4(1,v3)<>3 then
halt(218);
if Min1(1,v3)<>1 then
halt(221);
if Max1(1,v3)<>v3 then
halt(222);
if Min2(1,v3)<>1 then
halt(223);
if Max2(1,v3)<>v3 then
halt(224);
if Min3(1,v3)<>1 then
halt(225);
if Max3(1,v3)<>v3 then
halt(226);
if Min4(1,v3)<>1 then
halt(227);
if Max4(1,v3)<>v3 then
halt(228);
if Min1(v1,v3)<>v1 then
halt(231);
if Max1(v1,v3)<>v3 then
halt(232);
if Min2(v1,v3)<>v1 then
halt(233);
if Max2(v1,v3)<>v3 then
halt(234);
if Min3(v1,v3)<>v1 then
halt(235);
if Max3(v1,v3)<>v3 then
halt(236);
if Min4(v1,v3)<>v1 then
halt(237);
if Max4(v1,v3)<>v3 then
halt(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
halt(301);
if Max1(1,3)<>3 then
halt(302);
if Min2(1,3)<>1 then
halt(303);
if Max2(1,3)<>3 then
halt(304);
if Min3(1,3)<>1 then
halt(305);
if Max3(1,3)<>3 then
halt(306);
if Min3(1,3)<>1 then
halt(307);
if Max3(1,3)<>3 then
halt(308);
if Min1(1,v3)<>1 then
halt(311);
if Max1(1,v3)<>3 then
halt(312);
if Min2(1,v3)<>1 then
halt(313);
if Max2(1,v3)<>3 then
halt(314);
if Min3(1,v3)<>1 then
halt(315);
if Max3(1,v3)<>3 then
halt(316);
if Min4(1,v3)<>1 then
halt(317);
if Max4(1,v3)<>3 then
halt(318);
if Min1(1,v3)<>1 then
halt(321);
if Max1(1,v3)<>v3 then
halt(322);
if Min2(1,v3)<>1 then
halt(323);
if Max2(1,v3)<>v3 then
halt(324);
if Min3(1,v3)<>1 then
halt(325);
if Max3(1,v3)<>v3 then
halt(326);
if Min4(1,v3)<>1 then
halt(327);
if Max4(1,v3)<>v3 then
halt(328);
if Min1(v1,v3)<>v1 then
halt(331);
if Max1(v1,v3)<>v3 then
halt(332);
if Min2(v1,v3)<>v1 then
halt(333);
if Max2(v1,v3)<>v3 then
halt(334);
if Min3(v1,v3)<>v1 then
halt(335);
if Max3(v1,v3)<>v3 then
halt(336);
if Min4(v1,v3)<>v1 then
halt(337);
if Max4(v1,v3)<>v3 then
halt(338);
end;
begin
TestSingle;
TestDWord;
TestLongint;
end.