Why Gemfury? Push, build, and install  RubyGems npm packages Python packages Maven artifacts PHP packages Go Modules Debian packages RPM packages NuGet packages

Repository URL to install this package:

Details    
fpc-src / usr / share / fpcsrc / 3.0.0 / tests / webtbs / tw8258b.pp
Size: Mime:
program SetTests;

{$APPTYPE CONSOLE}

{$IFDEF FPC}
  {$mode delphi}
  {$packset 1}
{$ENDIF}

{$R+}
{$Q+}

uses
  SysUtils;

var
  u8      : Byte;
  s8      : ShortInt;
  u16     : Word;
  s16     : SmallInt;
  u32     : LongWord;
  s32     : LongInt;
  u64     : QWord;
  s64     : Int64;

  LargeSet : set of 67..221;
  SmallSet : set of 9..21;

  Error    : Boolean;

procedure CheckResult(const s: string; aIs, aExpected: Boolean); overload;
begin
  if aIs <> aExpected then begin
    WriteLn(s, aIs, ' <> ', aExpected, '   * * * ERROR * * * ERROR * * * ERROR * * *');
    Error := True;
  end else
    WriteLn(s, aIs);
end;

procedure CheckResult(const s: string; aIs: Boolean); overload;
begin
  WriteLn(s, aIs, ' <> EXCEPTION   * * * ERROR * * * ERROR * * * ERROR * * *');
  Error := True;
end;


begin
  Error := False;

  WriteLn('--- Variable against constant set [0, 2, 8..20, 99..192] ---' );
  WriteLn;

  u8  := 100;
  s8  := 100;
  u16 := 100;
  s16 := 100;
  u32 := 100;
  s32 := 100;
  u64 := 100;
  s64 := 100;

  WriteLn('100, should be true');
  CheckResult(' u8 -> ',  u8 in [0, 2, 8..20, 99..192], True);
  CheckResult(' s8 -> ',  s8 in [0, 2, 8..20, 99..192], True);
  CheckResult('u16 -> ', u16 in [0, 2, 8..20, 99..192], True);
  CheckResult('s16 -> ', s16 in [0, 2, 8..20, 99..192], True);
  CheckResult('u32 -> ', u32 in [0, 2, 8..20, 99..192], True);
  CheckResult('s32 -> ', s32 in [0, 2, 8..20, 99..192], True);
  CheckResult('u64 -> ', u64 in [0, 2, 8..20, 99..192], True);
  CheckResult('s64 -> ', s64 in [0, 2, 8..20, 99..192], True);
  WriteLn;

  u8  := 98;
  s8  := 98;
  u16 := 98;
  s16 := 98;
  u32 := 98;
  s32 := 98;
  u64 := 98;
  s64 := 98;

  WriteLn('98, should be false');
  CheckResult(' u8 -> ',  u8 in [0, 2, 8..20, 99..192], False);
  CheckResult(' s8 -> ',  s8 in [0, 2, 8..20, 99..192], False);
  CheckResult('u16 -> ', u16 in [0, 2, 8..20, 99..192], False);
  CheckResult('s16 -> ', s16 in [0, 2, 8..20, 99..192], False);
  CheckResult('u32 -> ', u32 in [0, 2, 8..20, 99..192], False);
  CheckResult('s32 -> ', s32 in [0, 2, 8..20, 99..192], False);
  CheckResult('u64 -> ', u64 in [0, 2, 8..20, 99..192], False);
  CheckResult('s64 -> ', s64 in [0, 2, 8..20, 99..192], False);
  WriteLn;

  u8  := 193;
//  s8  := 193;
  u16 := 193;
  s16 := 193;
  u32 := 193;
  s32 := 193;
  u64 := 193;
  s64 := 193;

  WriteLn('193, should be false');
  CheckResult(' u8 -> ',  u8 in [0, 2, 8..20, 99..192], False);
//  CheckResult(' s8 -> ',  s8 in [0, 2, 8..20, 99..192], False);
  CheckResult('u16 -> ', u16 in [0, 2, 8..20, 99..192], False);
  CheckResult('s16 -> ', s16 in [0, 2, 8..20, 99..192], False);
  CheckResult('u32 -> ', u32 in [0, 2, 8..20, 99..192], False);
  CheckResult('s32 -> ', s32 in [0, 2, 8..20, 99..192], False);
  CheckResult('u64 -> ', u64 in [0, 2, 8..20, 99..192], False);
  CheckResult('s64 -> ', s64 in [0, 2, 8..20, 99..192], False);
  WriteLn;

//  u8  := 256;
//  s8  := 256;
  u16 := 256;
  s16 := 256;
  u32 := 256;
  s32 := 256;
  u64 := 256;
  s64 := 256;

  WriteLn('256, should be false');
//  CheckResult(' u8 -> ',  u8 in [0, 2, 8..20, 99..192], False);
//  CheckResult(' s8 -> ',  s8 in [0, 2, 8..20, 99..192], False);
  CheckResult('u16 -> ', u16 in [0, 2, 8..20, 99..192], False);
  CheckResult('s16 -> ', s16 in [0, 2, 8..20, 99..192], False);
  CheckResult('u32 -> ', u32 in [0, 2, 8..20, 99..192], False);
  CheckResult('s32 -> ', s32 in [0, 2, 8..20, 99..192], False);
  CheckResult('u64 -> ', u64 in [0, 2, 8..20, 99..192], False);
  CheckResult('s64 -> ', s64 in [0, 2, 8..20, 99..192], False);
  WriteLn;

  u8  := High(u8);
  s8  := High(s8);
  u16 := High(u16);
  s16 := High(s16);
  u32 := High(u32);
  s32 := High(s32);
  u64 := High(u64);
  s64 := High(s64);

  WriteLn('High(type), s8 should be true, u64/s64 should cause range check');
  CheckResult(' u8 -> ',  u8 in [0, 2, 8..20, 99..192], False);
  CheckResult(' s8 -> ',  s8 in [0, 2, 8..20, 99..192], True);
  CheckResult('u16 -> ', u16 in [0, 2, 8..20, 99..192], False);
  CheckResult('s16 -> ', s16 in [0, 2, 8..20, 99..192], False);
  CheckResult('u32 -> ', u32 in [0, 2, 8..20, 99..192], False);
  CheckResult('s32 -> ', s32 in [0, 2, 8..20, 99..192], False);
  try
    CheckResult('u64 -> ', u64 in [0, 2, 8..20, 99..192]);
  except
    on E: Exception do
      WriteLn('u64 -> ', E.Classname,': ',E.Message);
  end;
  try
    CheckResult('s64 -> ', s64 in [0, 2, 8..20, 99..192]);
  except
    on E: Exception do
      WriteLn('s64 -> ', E.Classname,': ',E.Message);
  end;
  WriteLn;

  u8  := Low(u8);
  s8  := Low(s8);
  u16 := Low(u16);
  s16 := Low(s16);
  u32 := Low(u32);
  s32 := Low(s32);
  u64 := Low(u64);
  s64 := Low(s64);

  WriteLn('Low(type), all unsigned true, all signed false, except s64 -> range check error');
  CheckResult('u8  -> ',  u8 in [0, 2, 8..20, 99..192], True);
  CheckResult('s8  -> ',  s8 in [0, 2, 8..20, 99..192], False);
  CheckResult('u16 -> ', u16 in [0, 2, 8..20, 99..192], True);
  CheckResult('s16 -> ', s16 in [0, 2, 8..20, 99..192], False);
  CheckResult('u32 -> ', u32 in [0, 2, 8..20, 99..192], True);
  CheckResult('s32 -> ', s32 in [0, 2, 8..20, 99..192], False);
  CheckResult('u64 -> ', u64 in [0, 2, 8..20, 99..192], True);

  try
    CheckResult('s64 -> ', s64 in [0, 2, 8..20, 99..192]);
  except
    on E: Exception do
      WriteLn('s64 -> ', E.Classname,': ',E.Message);
  end;
  WriteLn;

  WriteLn('--- Variable against set of byte with value [8..20, 68, 72..83, 99..192] ---' );
  WriteLn;

  LargeSet := [68, 72..83, 99..192];

  u8  := 100;
  s8  := 100;
  u16 := 100;
  s16 := 100;
  u32 := 100;
  s32 := 100;
  u64 := 100;
  s64 := 100;

  WriteLn('100, should be true');
  CheckResult(' u8 -> ',  u8 in LargeSet, True);
  CheckResult(' s8 -> ',  s8 in LargeSet, True);
  CheckResult('u16 -> ', u16 in LargeSet, True);
  CheckResult('s16 -> ', s16 in LargeSet, True);
  CheckResult('u32 -> ', u32 in LargeSet, True);
  CheckResult('s32 -> ', s32 in LargeSet, True);
  CheckResult('u64 -> ', u64 in LargeSet, True);
  CheckResult('s64 -> ', s64 in LargeSet, True);
  WriteLn;

  u8  := 98;
  s8  := 98;
  u16 := 98;
  s16 := 98;
  u32 := 98;
  s32 := 98;
  u64 := 98;
  s64 := 98;

  WriteLn('98, should be false');
  CheckResult(' u8 -> ',  u8 in LargeSet, False);
  CheckResult(' s8 -> ',  s8 in LargeSet, False);
  CheckResult('u16 -> ', u16 in LargeSet, False);
  CheckResult('s16 -> ', s16 in LargeSet, False);
  CheckResult('u32 -> ', u32 in LargeSet, False);
  CheckResult('s32 -> ', s32 in LargeSet, False);
  CheckResult('u64 -> ', u64 in LargeSet, False);
  CheckResult('s64 -> ', s64 in LargeSet, False);
  WriteLn;

  u8  := 193;
//  s8  := 193;
  u16 := 193;
  s16 := 193;
  u32 := 193;
  s32 := 193;
  u64 := 193;
  s64 := 193;

  WriteLn('193, should be false');
  CheckResult(' u8 -> ',  u8 in LargeSet, False);
//  CheckResult(' s8 -> ',  s8 in LargeSet, False);
  CheckResult('u16 -> ', u16 in LargeSet, False);
  CheckResult('s16 -> ', s16 in LargeSet, False);
  CheckResult('u32 -> ', u32 in LargeSet, False);
  CheckResult('s32 -> ', s32 in LargeSet, False);
  CheckResult('u64 -> ', u64 in LargeSet, False);
  CheckResult('s64 -> ', s64 in LargeSet, False);
  WriteLn;

//  u8  := 256;
//  s8  := 256;
  u16 := 256;
  s16 := 256;
  u32 := 256;
  s32 := 256;
  u64 := 256;
  s64 := 256;

  WriteLn('256, should be false');
//  CheckResult(' u8 -> ',  u8 in LargeSet, False);
//  CheckResult(' s8 -> ',  s8 in LargeSet, False);
  CheckResult('u16 -> ', u16 in LargeSet, False);
  CheckResult('s16 -> ', s16 in LargeSet, False);
  CheckResult('u32 -> ', u32 in LargeSet, False);
  CheckResult('s32 -> ', s32 in LargeSet, False);
  CheckResult('u64 -> ', u64 in LargeSet, False);
  CheckResult('s64 -> ', s64 in LargeSet, False);
  WriteLn;

  u8  := High(u8);
  s8  := High(s8);
  u16 := High(u16);
  s16 := High(s16);
  u32 := High(u32);
  s32 := High(s32);
  u64 := High(u64);
  s64 := High(s64);

  WriteLn('High(type), s8 should be true, u64/s64 should cause range check');
  CheckResult(' u8 -> ',  u8 in LargeSet, False);
  CheckResult(' s8 -> ',  s8 in LargeSet, True);
  CheckResult('u16 -> ', u16 in LargeSet, False);
  CheckResult('s16 -> ', s16 in LargeSet, False);
  CheckResult('u32 -> ', u32 in LargeSet, False);
  CheckResult('s32 -> ', s32 in LargeSet, False);
  try
    CheckResult('u64 -> ', u64 in LargeSet);
  except
    on E: Exception do
      WriteLn('u64 -> ', E.Classname,': ',E.Message);
  end;
  try
    CheckResult('s64 -> ', s64 in LargeSet);
  except
    on E: Exception do
      WriteLn('s64 -> ', E.Classname,': ',E.Message);
  end;
  WriteLn;

  u8  := Low(u8);
  s8  := Low(s8);
  u16 := Low(u16);
  s16 := Low(s16);
  u32 := Low(u32);
  s32 := Low(s32);
  u64 := Low(u64);
  s64 := Low(s64);

  WriteLn('Low(type), all false, except s64 -> range check error');
  CheckResult('u8  -> ',  u8 in LargeSet, False);
  CheckResult('s8  -> ',  s8 in LargeSet, False);
  CheckResult('u16 -> ', u16 in LargeSet, False);
  CheckResult('s16 -> ', s16 in LargeSet, False);
  CheckResult('u32 -> ', u32 in LargeSet, False);
  CheckResult('s32 -> ', s32 in LargeSet, False);
  CheckResult('u64 -> ', u64 in LargeSet, False);

  try
    CheckResult('s64 -> ', s64 in LargeSet);
  except
    on E: Exception do
      WriteLn('s64 -> ', E.Classname,': ',E.Message);
  end;
  WriteLn;

  WriteLn('--- constant value against constant set [0, 2, 8..20, 99..192] ---' );
  WriteLn;

  WriteLn('100, should be true');
  CheckResult('100 -> ', 100 in [0, 2, 8..20, 99..192], True);
  WriteLn;

  WriteLn('98, should be false');
  CheckResult(' 98 -> ', 98 in [0, 2, 8..20, 99..192], False);
  WriteLn;

  WriteLn('193, should be false');
  CheckResult('193 -> ', 193 in [0, 2, 8..20, 99..192], False);
  WriteLn;

  WriteLn('256, should be false');
  CheckResult('256 -> ', 256 in [0, 2, 8..20, 99..192], False);
  WriteLn;

  WriteLn('High(type), s8 should be true, u64/s64 should cause range check at compile time');
  CheckResult(' u8 -> ', High(u8)  in [0, 2, 8..20, 99..192], False);
  CheckResult(' s8 -> ', High(s8)  in [0, 2, 8..20, 99..192], True);
  CheckResult('u16 -> ', High(u16) in [0, 2, 8..20, 99..192], False);
  CheckResult('s16 -> ', High(s16) in [0, 2, 8..20, 99..192], False);
  CheckResult('u32 -> ', High(u32) in [0, 2, 8..20, 99..192], False);
  CheckResult('s32 -> ', High(s32) in [0, 2, 8..20, 99..192], False);
  try
//    CheckResult('u64 -> ', High(u64) in [0, 2, 8..20, 99..192]);
    WriteLn('u64 -> Error: range check error while evaluating constants');
  except
    on E: Exception do
      WriteLn('u64 -> ', E.Classname,': ',E.Message);
  end;
  try
//    CheckResult('s64 -> ', High(s64) in [0, 2, 8..20, 99..192]);
    WriteLn('s64 -> Error: range check error while evaluating constants');
  except
    on E: Exception do
      WriteLn('s64 -> ', E.Classname,': ',E.Message);
  end;
  WriteLn;

  WriteLn('Low(type), all unsigned true, all signed false, except s64 -> range check error at compile time');
  CheckResult('u8  -> ',  Low(u8) in [0, 2, 8..20, 99..192], True);
  CheckResult('s8  -> ',  Low(s8) in [0, 2, 8..20, 99..192], False);
  CheckResult('u16 -> ', Low(u16) in [0, 2, 8..20, 99..192], True);
  CheckResult('s16 -> ', Low(s16) in [0, 2, 8..20, 99..192], False);
  CheckResult('u32 -> ', Low(u32) in [0, 2, 8..20, 99..192], True);
  CheckResult('s32 -> ', Low(s32) in [0, 2, 8..20, 99..192], False);
  CheckResult('u64 -> ', Low(u64) in [0, 2, 8..20, 99..192], True);

  try
//    CheckResult('s64 -> ', Low(s64) in [0, 2, 8..20, 99..192]);
    WriteLn('s64 -> Error: range check error while evaluating constants');
  except
    on E: Exception do
      WriteLn('s64 -> ', E.Classname,': ',E.Message);
  end;
  WriteLn;

  WriteLn('--- constant value against set of byte with value [0, 2, 8..20, 99..192] ---' );
  WriteLn;

  LargeSet := [68, 72..83, 99..192];

  WriteLn('100, should be true');
  CheckResult('100 -> ', 100 in LargeSet, True);
  WriteLn;

  WriteLn('98, should be false');
  CheckResult(' 98 -> ',  98 in LargeSet, False);
  WriteLn;

  WriteLn('193, should be false');
  CheckResult('193 -> ', 193 in LargeSet, False);
  WriteLn;

  WriteLn('256, should be false');
  CheckResult('256 -> ', 256 in LargeSet, False);
  WriteLn;

  WriteLn('High(type), s8 should be true, u64/s64 should cause range check at compile time');
  CheckResult(' u8 -> ',  High(u8) in LargeSet, False);
  CheckResult(' s8 -> ',  High(s8) in LargeSet, True);
  CheckResult('u16 -> ', High(u16) in LargeSet, False);
  CheckResult('s16 -> ', High(s16) in LargeSet, False);
  CheckResult('u32 -> ', High(u32) in LargeSet, False);
  CheckResult('s32 -> ', High(s32) in LargeSet, False);
  try
//    CheckResult('u64 -> ', High(u64) in LargeSet);
    WriteLn('u64 -> Error: range check error while evaluating constants');
  except
    on E: Exception do
      WriteLn('u64 -> ', E.Classname,': ',E.Message);
  end;
  try
//    CheckResult('s64 -> ', High(s64) in LargeSet);
    WriteLn('s64 -> Error: range check error while evaluating constants');
  except
    on E: Exception do
      WriteLn('s64 -> ', E.Classname,': ',E.Message);
  end;
  WriteLn;


  WriteLn('Low(type), all false, except s64 -> range check error at compile time');
  CheckResult(' u8 -> ',  Low(u8) in LargeSet, False);
  CheckResult(' s8 -> ',  Low(s8) in LargeSet, False);
  CheckResult('u16 -> ', Low(u16) in LargeSet, False);
  CheckResult('s16 -> ', Low(s16) in LargeSet, False);
  CheckResult('u32 -> ', Low(u32) in LargeSet, False);
  CheckResult('s32 -> ', Low(s32) in LargeSet, False);
  CheckResult('u64 -> ', Low(u64) in LargeSet, False);
  try
//    CheckResult('s64 -> ', Low(s64) in LargeSet);
    WriteLn('s64 -> Error: range check error while evaluating constants');
  except
    on E: Exception do
      WriteLn('s64 -> ', E.Classname,': ',E.Message);
  end;
  WriteLn;

  WriteLn('--- Variable against constant set [0, 2, 8..20] ---' );
  WriteLn;

  u8  := 10;
  s8  := 10;
  u16 := 10;
  s16 := 10;
  u32 := 10;
  s32 := 10;
  u64 := 10;
  s64 := 10;

  WriteLn('10, should be true');
  CheckResult(' u8 -> ',  u8 in [0, 2, 8..20], True);
  CheckResult(' s8 -> ',  s8 in [0, 2, 8..20], True);
  CheckResult('u16 -> ', u16 in [0, 2, 8..20], True);
  CheckResult('s16 -> ', s16 in [0, 2, 8..20], True);
  CheckResult('u32 -> ', u32 in [0, 2, 8..20], True);
  CheckResult('s32 -> ', s32 in [0, 2, 8..20], True);
  CheckResult('u64 -> ', u64 in [0, 2, 8..20], True);
  CheckResult('s64 -> ', s64 in [0, 2, 8..20], True);
  WriteLn;

  u8  := 7;
  s8  := 7;
  u16 := 7;
  s16 := 7;
  u32 := 7;
  s32 := 7;
  u64 := 7;
  s64 := 7;

  WriteLn('7, should be false');
  CheckResult(' u8 -> ',  u8 in [0, 2, 8..20], False);
  CheckResult(' s8 -> ',  s8 in [0, 2, 8..20], False);
  CheckResult('u16 -> ', u16 in [0, 2, 8..20], False);
  CheckResult('s16 -> ', s16 in [0, 2, 8..20], False);
  CheckResult('u32 -> ', u32 in [0, 2, 8..20], False);
  CheckResult('s32 -> ', s32 in [0, 2, 8..20], False);
  CheckResult('u64 -> ', u64 in [0, 2, 8..20], False);
  CheckResult('s64 -> ', s64 in [0, 2, 8..20], False);
  WriteLn;

  u8  := 30;
  s8  := 30;
  u16 := 30;
  s16 := 30;
  u32 := 30;
  s32 := 30;
  u64 := 30;
  s64 := 30;

  WriteLn('30, should be false');
  CheckResult(' u8 -> ',  u8 in [0, 2, 8..20], False);
  CheckResult(' s8 -> ',  s8 in [0, 2, 8..20], False);
  CheckResult('u16 -> ', u16 in [0, 2, 8..20], False);
  CheckResult('s16 -> ', s16 in [0, 2, 8..20], False);
  CheckResult('u32 -> ', u32 in [0, 2, 8..20], False);
  CheckResult('s32 -> ', s32 in [0, 2, 8..20], False);
  CheckResult('u64 -> ', u64 in [0, 2, 8..20], False);
  CheckResult('s64 -> ', s64 in [0, 2, 8..20], False);
  WriteLn;

//  u8  := 256;
//  s8  := 256;
  u16 := 256;
  s16 := 256;
  u32 := 256;
  s32 := 256;
  u64 := 256;
  s64 := 256;

  WriteLn('256, should be false');
//  CheckResult(' u8 -> ',  u8 in [0, 2, 8..20], False);
//  CheckResult(' s8 -> ',  s8 in [0, 2, 8..20], False);
  CheckResult('u16 -> ', u16 in [0, 2, 8..20], False);
  CheckResult('s16 -> ', s16 in [0, 2, 8..20], False);
  CheckResult('u32 -> ', u32 in [0, 2, 8..20], False);
  CheckResult('s32 -> ', s32 in [0, 2, 8..20], False);
  CheckResult('u64 -> ', u64 in [0, 2, 8..20], False);
  CheckResult('s64 -> ', s64 in [0, 2, 8..20], False);
  WriteLn;

  u8  := High(u8);
  s8  := High(s8);
  u16 := High(u16);
  s16 := High(s16);
  u32 := High(u32);
  s32 := High(s32);
  u64 := High(u64);
  s64 := High(s64);

  WriteLn('High(type), should be false, u64/s64 should cause range check');
  CheckResult(' u8 -> ',  u8 in [0, 2, 8..20], False);
  CheckResult(' s8 -> ',  s8 in [0, 2, 8..20], False);
  CheckResult('u16 -> ', u16 in [0, 2, 8..20], False);
  CheckResult('s16 -> ', s16 in [0, 2, 8..20], False);
  CheckResult('u32 -> ', u32 in [0, 2, 8..20], False);
  CheckResult('s32 -> ', s32 in [0, 2, 8..20], False);
  try
    CheckResult('u64 -> ', u64 in [0, 2, 8..20]);
  except
    on E: Exception do
      WriteLn('u64 -> ', E.Classname,': ',E.Message);
  end;
  try
    CheckResult('s64 -> ', s64 in [0, 2, 8..20]);
  except
    on E: Exception do
      WriteLn('s64 -> ', E.Classname,': ',E.Message);
  end;
  WriteLn;

  u8  := Low(u8);
  s8  := Low(s8);
  u16 := Low(u16);
  s16 := Low(s16);
  u32 := Low(u32);
  s32 := Low(s32);
  u64 := Low(u64);
  s64 := Low(s64);

  WriteLn('Low(type), all unsigned true, all signed false, except s64 -> range check error');
  CheckResult('u8  -> ',  u8 in [0, 2, 8..20], True);
  CheckResult('s8  -> ',  s8 in [0, 2, 8..20], False);
  CheckResult('u16 -> ', u16 in [0, 2, 8..20], True);
  CheckResult('s16 -> ', s16 in [0, 2, 8..20], False);
  CheckResult('u32 -> ', u32 in [0, 2, 8..20], True);
  CheckResult('s32 -> ', s32 in [0, 2, 8..20], False);
  CheckResult('u64 -> ', u64 in [0, 2, 8..20], True);

  try
    CheckResult('s64 -> ', s64 in [0, 2, 8..20]);
  except
    on E: Exception do
      WriteLn('s64 -> ', E.Classname,': ',E.Message);
  end;
  WriteLn;

  WriteLn('--- Variable against set of 0..31 with value [0, 2, 8..20] ---' );
  WriteLn;

  SmallSet := [10..16];

  u8  := 10;
  s8  := 10;
  u16 := 10;
  s16 := 10;
  u32 := 10;
  s32 := 10;
  u64 := 10;
  s64 := 10;

  WriteLn('10, should be true');
  CheckResult(' u8 -> ',  u8 in SmallSet, True);
  CheckResult(' s8 -> ',  s8 in SmallSet, True);
  CheckResult('u16 -> ', u16 in SmallSet, True);
  CheckResult('s16 -> ', s16 in SmallSet, True);
  CheckResult('u32 -> ', u32 in SmallSet, True);
  CheckResult('s32 -> ', s32 in SmallSet, True);
  CheckResult('u64 -> ', u64 in SmallSet, True);
  CheckResult('s64 -> ', s64 in SmallSet, True);
  WriteLn;

  u8  := 9;
  s8  := 9;
  u16 := 9;
  s16 := 9;
  u32 := 9;
  s32 := 9;
  u64 := 9;
  s64 := 9;

  WriteLn('9, should be false');
  CheckResult(' u8 -> ',  u8 in SmallSet, False);
  CheckResult(' s8 -> ',  s8 in SmallSet, False);
  CheckResult('u16 -> ', u16 in SmallSet, False);
  CheckResult('s16 -> ', s16 in SmallSet, False);
  CheckResult('u32 -> ', u32 in SmallSet, False);
  CheckResult('s32 -> ', s32 in SmallSet, False);
  CheckResult('u64 -> ', u64 in SmallSet, False);
  CheckResult('s64 -> ', s64 in SmallSet, False);
  WriteLn;

  u8  := 17;
  s8  := 17;
  u16 := 17;
  s16 := 17;
  u32 := 17;
  s32 := 17;
  u64 := 17;
  s64 := 17;

  WriteLn('17, should be false');
  CheckResult(' u8 -> ',  u8 in SmallSet, False);
  CheckResult(' s8 -> ',  s8 in SmallSet, False);
  CheckResult('u16 -> ', u16 in SmallSet, False);
  CheckResult('s16 -> ', s16 in SmallSet, False);
  CheckResult('u32 -> ', u32 in SmallSet, False);
  CheckResult('s32 -> ', s32 in SmallSet, False);
  CheckResult('u64 -> ', u64 in SmallSet, False);
  CheckResult('s64 -> ', s64 in SmallSet, False);
  WriteLn;

//  u8  := 256;
//  s8  := 256;
  u16 := 256;
  s16 := 256;
  u32 := 256;
  s32 := 256;
  u64 := 256;
  s64 := 256;

  WriteLn('256, should be false');
//  CheckResult(' u8 -> ',  u8 in SmallSet, False);
//  CheckResult(' s8 -> ',  s8 in SmallSet, False);
  CheckResult('u16 -> ', u16 in SmallSet, False);
  CheckResult('s16 -> ', s16 in SmallSet, False);
  CheckResult('u32 -> ', u32 in SmallSet, False);
  CheckResult('s32 -> ', s32 in SmallSet, False);
  CheckResult('u64 -> ', u64 in SmallSet, False);
  CheckResult('s64 -> ', s64 in SmallSet, False);
  WriteLn;

  u8  := High(u8);
  s8  := High(s8);
  u16 := High(u16);
  s16 := High(s16);
  u32 := High(u32);
  s32 := High(s32);
  u64 := High(u64);
  s64 := High(s64);

  WriteLn('High(type), should be false, u64/s64 should cause range check');
  CheckResult(' u8 -> ',  u8 in SmallSet, False);
  CheckResult(' s8 -> ',  s8 in SmallSet, False);
  CheckResult('u16 -> ', u16 in SmallSet, False);
  CheckResult('s16 -> ', s16 in SmallSet, False);
  CheckResult('u32 -> ', u32 in SmallSet, False);
  CheckResult('s32 -> ', s32 in SmallSet, False);
  try
    CheckResult('u64 -> ', u64 in SmallSet);
  except
    on E: Exception do
      WriteLn('u64 -> ', E.Classname,': ',E.Message);
  end;
  try
    CheckResult('s64 -> ', s64 in SmallSet);
  except
    on E: Exception do
      WriteLn('s64 -> ', E.Classname,': ',E.Message);
  end;
  WriteLn;

  u8  := Low(u8);
  s8  := Low(s8);
  u16 := Low(u16);
  s16 := Low(s16);
  u32 := Low(u32);
  s32 := Low(s32);
  u64 := Low(u64);
  s64 := Low(s64);

  WriteLn('Low(type), all false, except s64 -> range check error');
  CheckResult('u8  -> ',  u8 in SmallSet, False);
  CheckResult('s8  -> ',  s8 in SmallSet, False);
  CheckResult('u16 -> ', u16 in SmallSet, False);
  CheckResult('s16 -> ', s16 in SmallSet, False);
  CheckResult('u32 -> ', u32 in SmallSet, False);
  CheckResult('s32 -> ', s32 in SmallSet, False);
  CheckResult('u64 -> ', u64 in SmallSet, False);

  try
    CheckResult('s64 -> ', s64 in SmallSet);
  except
    on E: Exception do
      WriteLn('s64 -> ', E.Classname,': ',E.Message);
  end;
  WriteLn;

  WriteLn('--- constant value against constant set [0, 2, 8..20] ---' );
  WriteLn;

  WriteLn('10, should be true');
  CheckResult('10 -> ', 10 in [0, 2, 8..20], True);
  WriteLn;

  WriteLn('7, should be false');
  CheckResult(' 7 -> ', 7 in [0, 2, 8..20], False);
  WriteLn;

  WriteLn('30, should be false');
  CheckResult('30 -> ', 30 in [0, 2, 8..20], False);
  WriteLn;

  WriteLn('256, should be false');
  CheckResult('256 -> ', 256 in [0, 2, 8..20], False);
  WriteLn;

  WriteLn('High(type), should be false, u64/s64 should cause range check at compile time');
  CheckResult(' u8 -> ', High(u8)  in [0, 2, 8..20], False);
  CheckResult(' s8 -> ', High(s8)  in [0, 2, 8..20], False);
  CheckResult('u16 -> ', High(u16) in [0, 2, 8..20], False);
  CheckResult('s16 -> ', High(s16) in [0, 2, 8..20], False);
  CheckResult('u32 -> ', High(u32) in [0, 2, 8..20], False);
  CheckResult('s32 -> ', High(s32) in [0, 2, 8..20], False);
  try
//    CheckResult('u64 -> ', High(u64) in [0, 2, 8..20]);
    WriteLn('u64 -> Error: range check error while evaluating constants');
  except
    on E: Exception do
      WriteLn('u64 -> ', E.Classname,': ',E.Message);
  end;
  try
//    CheckResult('s64 -> ', High(s64) in [0, 2, 8..20]);
    WriteLn('s64 -> Error: range check error while evaluating constants');
  except
    on E: Exception do
      WriteLn('s64 -> ', E.Classname,': ',E.Message);
  end;
  WriteLn;

  WriteLn('Low(type), all unsigned true, all signed false, except s64 -> range check error at compile time');
  CheckResult('u8  -> ',  Low(u8) in [0, 2, 8..20], True);
  CheckResult('s8  -> ',  Low(s8) in [0, 2, 8..20], False);
  CheckResult('u16 -> ', Low(u16) in [0, 2, 8..20], True);
  CheckResult('s16 -> ', Low(s16) in [0, 2, 8..20], False);
  CheckResult('u32 -> ', Low(u32) in [0, 2, 8..20], True);
  CheckResult('s32 -> ', Low(s32) in [0, 2, 8..20], False);
  CheckResult('u64 -> ', Low(u64) in [0, 2, 8..20], True);

  try
//    CheckResult('s64 -> ', Low(s64) in [0, 2, 8..20]);
    WriteLn('s64 -> Error: range check error while evaluating constants');
  except
    on E: Exception do
      WriteLn('s64 -> ', E.Classname,': ',E.Message);
  end;
  WriteLn;

  WriteLn('--- constant value against set of 0..31 with value [0, 2, 8..20] ---' );
  WriteLn;

  SmallSet := [9..17];

  WriteLn('10, should be true');
  CheckResult('10 -> ', 10 in SmallSet, True);
  WriteLn;

  WriteLn('7, should be false');
  CheckResult(' 7 -> ',  7 in SmallSet, False);
  WriteLn;

  WriteLn('18, should be false');
  CheckResult('18 -> ', 18 in SmallSet, False);
  WriteLn;

  WriteLn('256, should be false');
  CheckResult('256 -> ', 256 in SmallSet, False);
  WriteLn;

  WriteLn('High(type), all false, u64/s64 should cause range check at compile time');
  CheckResult(' u8 -> ',  High(u8) in SmallSet, False);
  CheckResult(' s8 -> ',  High(s8) in SmallSet, False);
  CheckResult('u16 -> ', High(u16) in SmallSet, False);
  CheckResult('s16 -> ', High(s16) in SmallSet, False);
  CheckResult('u32 -> ', High(u32) in SmallSet, False);
  CheckResult('s32 -> ', High(s32) in SmallSet, False);
  try
//    CheckResult('u64 -> ', High(u64) in SmallSet);
    WriteLn('u64 -> Error: range check error while evaluating constants');
  except
    on E: Exception do
      WriteLn('u64 -> ', E.Classname,': ',E.Message);
  end;
  try
//    CheckResult('s64 -> ', High(s64) in SmallSet);
    WriteLn('s64 -> Error: range check error while evaluating constants');
  except
    on E: Exception do
      WriteLn('s64 -> ', E.Classname,': ',E.Message);
  end;
  WriteLn;


  WriteLn('Low(type), all false, except s64 -> range check error at compile time');
  CheckResult(' u8 -> ',  Low(u8) in SmallSet, False);
  CheckResult(' s8 -> ',  Low(s8) in SmallSet, False);
  CheckResult('u16 -> ', Low(u16) in SmallSet, False);
  CheckResult('s16 -> ', Low(s16) in SmallSet, False);
  CheckResult('u32 -> ', Low(u32) in SmallSet, False);
  CheckResult('s32 -> ', Low(s32) in SmallSet, False);
  CheckResult('u64 -> ', Low(u64) in SmallSet, False);
  try
//    CheckResult('s64 -> ', Low(s64) in SmallSet);
    WriteLn('s64 -> Error: range check error while evaluating constants');
  except
    on E: Exception do
      WriteLn('s64 -> ', E.Classname,': ',E.Message);
  end;
  WriteLn;

  WriteLn('--- Variable against constant set [1, 3, 5, 7, 9, 11, 13, 15, 17, 19, 21, 23, 25, 27, 29, 31, 33, 35, 37, 39, 41] ---' );
  WriteLn;

  u8  := 25;
  s8  := 25;
  u16 := 25;
  s16 := 25;
  u32 := 25;
  s32 := 25;
  u64 := 25;
  s64 := 25;

  WriteLn('25, should be true');
  CheckResult(' u8 -> ',  u8 in [1, 3, 5, 7, 9, 11, 13, 15, 17, 19, 21, 23, 25, 27, 29, 31, 33, 35, 37, 39, 41], True);
  CheckResult(' s8 -> ',  s8 in [1, 3, 5, 7, 9, 11, 13, 15, 17, 19, 21, 23, 25, 27, 29, 31, 33, 35, 37, 39, 41], True);
  CheckResult('u16 -> ', u16 in [1, 3, 5, 7, 9, 11, 13, 15, 17, 19, 21, 23, 25, 27, 29, 31, 33, 35, 37, 39, 41], True);
  CheckResult('s16 -> ', s16 in [1, 3, 5, 7, 9, 11, 13, 15, 17, 19, 21, 23, 25, 27, 29, 31, 33, 35, 37, 39, 41], True);
  CheckResult('u32 -> ', u32 in [1, 3, 5, 7, 9, 11, 13, 15, 17, 19, 21, 23, 25, 27, 29, 31, 33, 35, 37, 39, 41], True);
  CheckResult('s32 -> ', s32 in [1, 3, 5, 7, 9, 11, 13, 15, 17, 19, 21, 23, 25, 27, 29, 31, 33, 35, 37, 39, 41], True);
  CheckResult('u64 -> ', u64 in [1, 3, 5, 7, 9, 11, 13, 15, 17, 19, 21, 23, 25, 27, 29, 31, 33, 35, 37, 39, 41], True);
  CheckResult('s64 -> ', s64 in [1, 3, 5, 7, 9, 11, 13, 15, 17, 19, 21, 23, 25, 27, 29, 31, 33, 35, 37, 39, 41], True);
  WriteLn;

  u8  := 26;
  s8  := 26;
  u16 := 26;
  s16 := 26;
  u32 := 26;
  s32 := 26;
  u64 := 26;
  s64 := 26;

  WriteLn('26, should be false');
  CheckResult(' u8 -> ',  u8 in [1, 3, 5, 7, 9, 11, 13, 15, 17, 19, 21, 23, 25, 27, 29, 31, 33, 35, 37, 39, 41], False);
  CheckResult(' s8 -> ',  s8 in [1, 3, 5, 7, 9, 11, 13, 15, 17, 19, 21, 23, 25, 27, 29, 31, 33, 35, 37, 39, 41], False);
  CheckResult('u16 -> ', u16 in [1, 3, 5, 7, 9, 11, 13, 15, 17, 19, 21, 23, 25, 27, 29, 31, 33, 35, 37, 39, 41], False);
  CheckResult('s16 -> ', s16 in [1, 3, 5, 7, 9, 11, 13, 15, 17, 19, 21, 23, 25, 27, 29, 31, 33, 35, 37, 39, 41], False);
  CheckResult('u32 -> ', u32 in [1, 3, 5, 7, 9, 11, 13, 15, 17, 19, 21, 23, 25, 27, 29, 31, 33, 35, 37, 39, 41], False);
  CheckResult('s32 -> ', s32 in [1, 3, 5, 7, 9, 11, 13, 15, 17, 19, 21, 23, 25, 27, 29, 31, 33, 35, 37, 39, 41], False);
  CheckResult('u64 -> ', u64 in [1, 3, 5, 7, 9, 11, 13, 15, 17, 19, 21, 23, 25, 27, 29, 31, 33, 35, 37, 39, 41], False);
  CheckResult('s64 -> ', s64 in [1, 3, 5, 7, 9, 11, 13, 15, 17, 19, 21, 23, 25, 27, 29, 31, 33, 35, 37, 39, 41], False);
  WriteLn;

  u8  := 49;
  s8  := 49;
  u16 := 49;
  s16 := 49;
  u32 := 49;
  s32 := 49;
  u64 := 49;
  s64 := 49;

  WriteLn('49, should be false');
  CheckResult(' u8 -> ',  u8 in [1, 3, 5, 7, 9, 11, 13, 15, 17, 19, 21, 23, 25, 27, 29, 31, 33, 35, 37, 39, 41], False);
  CheckResult(' s8 -> ',  s8 in [1, 3, 5, 7, 9, 11, 13, 15, 17, 19, 21, 23, 25, 27, 29, 31, 33, 35, 37, 39, 41], False);
  CheckResult('u16 -> ', u16 in [1, 3, 5, 7, 9, 11, 13, 15, 17, 19, 21, 23, 25, 27, 29, 31, 33, 35, 37, 39, 41], False);
  CheckResult('s16 -> ', s16 in [1, 3, 5, 7, 9, 11, 13, 15, 17, 19, 21, 23, 25, 27, 29, 31, 33, 35, 37, 39, 41], False);
  CheckResult('u32 -> ', u32 in [1, 3, 5, 7, 9, 11, 13, 15, 17, 19, 21, 23, 25, 27, 29, 31, 33, 35, 37, 39, 41], False);
  CheckResult('s32 -> ', s32 in [1, 3, 5, 7, 9, 11, 13, 15, 17, 19, 21, 23, 25, 27, 29, 31, 33, 35, 37, 39, 41], False);
  CheckResult('u64 -> ', u64 in [1, 3, 5, 7, 9, 11, 13, 15, 17, 19, 21, 23, 25, 27, 29, 31, 33, 35, 37, 39, 41], False);
  CheckResult('s64 -> ', s64 in [1, 3, 5, 7, 9, 11, 13, 15, 17, 19, 21, 23, 25, 27, 29, 31, 33, 35, 37, 39, 41], False);
  WriteLn;

//  u8  := 256;
//  s8  := 256;
  u16 := 256;
  s16 := 256;
  u32 := 256;
  s32 := 256;
  u64 := 256;
  s64 := 256;

  WriteLn('256, should be false');
//  CheckResult(' u8 -> ',  u8 in [1, 3, 5, 7, 9, 11, 13, 15, 17, 19, 21, 23, 25, 27, 29, 31, 33, 35, 37, 39, 41], False);
//  CheckResult(' s8 -> ',  s8 in [1, 3, 5, 7, 9, 11, 13, 15, 17, 19, 21, 23, 25, 27, 29, 31, 33, 35, 37, 39, 41], False);
  CheckResult('u16 -> ', u16 in [1, 3, 5, 7, 9, 11, 13, 15, 17, 19, 21, 23, 25, 27, 29, 31, 33, 35, 37, 39, 41], False);
  CheckResult('s16 -> ', s16 in [1, 3, 5, 7, 9, 11, 13, 15, 17, 19, 21, 23, 25, 27, 29, 31, 33, 35, 37, 39, 41], False);
  CheckResult('u32 -> ', u32 in [1, 3, 5, 7, 9, 11, 13, 15, 17, 19, 21, 23, 25, 27, 29, 31, 33, 35, 37, 39, 41], False);
  CheckResult('s32 -> ', s32 in [1, 3, 5, 7, 9, 11, 13, 15, 17, 19, 21, 23, 25, 27, 29, 31, 33, 35, 37, 39, 41], False);
  CheckResult('u64 -> ', u64 in [1, 3, 5, 7, 9, 11, 13, 15, 17, 19, 21, 23, 25, 27, 29, 31, 33, 35, 37, 39, 41], False);
  CheckResult('s64 -> ', s64 in [1, 3, 5, 7, 9, 11, 13, 15, 17, 19, 21, 23, 25, 27, 29, 31, 33, 35, 37, 39, 41], False);
  WriteLn;

  u8  := High(u8);
  s8  := High(s8);
  u16 := High(u16);
  s16 := High(s16);
  u32 := High(u32);
  s32 := High(s32);
  u64 := High(u64);
  s64 := High(s64);

  WriteLn('High(type), should be false, u64/s64 should cause range check');
  CheckResult(' u8 -> ',  u8 in [1, 3, 5, 7, 9, 11, 13, 15, 17, 19, 21, 23, 25, 27, 29, 31, 33, 35, 37, 39, 41], False);
  CheckResult(' s8 -> ',  s8 in [1, 3, 5, 7, 9, 11, 13, 15, 17, 19, 21, 23, 25, 27, 29, 31, 33, 35, 37, 39, 41], False);
  CheckResult('u16 -> ', u16 in [1, 3, 5, 7, 9, 11, 13, 15, 17, 19, 21, 23, 25, 27, 29, 31, 33, 35, 37, 39, 41], False);
  CheckResult('s16 -> ', s16 in [1, 3, 5, 7, 9, 11, 13, 15, 17, 19, 21, 23, 25, 27, 29, 31, 33, 35, 37, 39, 41], False);
  CheckResult('u32 -> ', u32 in [1, 3, 5, 7, 9, 11, 13, 15, 17, 19, 21, 23, 25, 27, 29, 31, 33, 35, 37, 39, 41], False);
  CheckResult('s32 -> ', s32 in [1, 3, 5, 7, 9, 11, 13, 15, 17, 19, 21, 23, 25, 27, 29, 31, 33, 35, 37, 39, 41], False);
  try
    CheckResult('u64 -> ', u64 in [1, 3, 5, 7, 9, 11, 13, 15, 17, 19, 21, 23, 25, 27, 29, 31, 33, 35, 37, 39, 41]);
  except
    on E: Exception do
      WriteLn('u64 -> ', E.Classname,': ',E.Message);
  end;
  try
    CheckResult('s64 -> ', s64 in [1, 3, 5, 7, 9, 11, 13, 15, 17, 19, 21, 23, 25, 27, 29, 31, 33, 35, 37, 39, 41]);
  except
    on E: Exception do
      WriteLn('s64 -> ', E.Classname,': ',E.Message);
  end;
  WriteLn;

  u8  := Low(u8);
  s8  := Low(s8);
  u16 := Low(u16);
  s16 := Low(s16);
  u32 := Low(u32);
  s32 := Low(s32);
  u64 := Low(u64);
  s64 := Low(s64);

  WriteLn('Low(type), all false, except s64 -> range check error');
  CheckResult('u8  -> ',  u8 in [1, 3, 5, 7, 9, 11, 13, 15, 17, 19, 21, 23, 25, 27, 29, 31, 33, 35, 37, 39, 41], False);
  CheckResult('s8  -> ',  s8 in [1, 3, 5, 7, 9, 11, 13, 15, 17, 19, 21, 23, 25, 27, 29, 31, 33, 35, 37, 39, 41], False);
  CheckResult('u16 -> ', u16 in [1, 3, 5, 7, 9, 11, 13, 15, 17, 19, 21, 23, 25, 27, 29, 31, 33, 35, 37, 39, 41], False);
  CheckResult('s16 -> ', s16 in [1, 3, 5, 7, 9, 11, 13, 15, 17, 19, 21, 23, 25, 27, 29, 31, 33, 35, 37, 39, 41], False);
  CheckResult('u32 -> ', u32 in [1, 3, 5, 7, 9, 11, 13, 15, 17, 19, 21, 23, 25, 27, 29, 31, 33, 35, 37, 39, 41], False);
  CheckResult('s32 -> ', s32 in [1, 3, 5, 7, 9, 11, 13, 15, 17, 19, 21, 23, 25, 27, 29, 31, 33, 35, 37, 39, 41], False);
  CheckResult('u64 -> ', u64 in [1, 3, 5, 7, 9, 11, 13, 15, 17, 19, 21, 23, 25, 27, 29, 31, 33, 35, 37, 39, 41], False);

  try
    CheckResult('s64 -> ', s64 in [1, 3, 5, 7, 9, 11, 13, 15, 17, 19, 21, 23, 25, 27, 29, 31, 33, 35, 37, 39, 41]);
  except
    on E: Exception do
      WriteLn('s64 -> ', E.Classname,': ',E.Message);
  end;
  WriteLn;

  WriteLn('--- constant value against constant set [1, 3, 5, 7, 9, 11, 13, 15, 17, 19, 21, 23, 25, 27, 29, 31, 33, 35, 37, 39, 41] ---' );
  WriteLn;

  WriteLn('25, should be true');
  CheckResult('25 -> ', 25 in [1, 3, 5, 7, 9, 11, 13, 15, 17, 19, 21, 23, 25, 27, 29, 31, 33, 35, 37, 39, 41], True);
  WriteLn;

  WriteLn('26, should be false');
  CheckResult(' 26 -> ', 26 in [1, 3, 5, 7, 9, 11, 13, 15, 17, 19, 21, 23, 25, 27, 29, 31, 33, 35, 37, 39, 41], False);
  WriteLn;

  WriteLn('49, should be false');
  CheckResult('49 -> ', 49 in [1, 3, 5, 7, 9, 11, 13, 15, 17, 19, 21, 23, 25, 27, 29, 31, 33, 35, 37, 39, 41], False);
  WriteLn;

  WriteLn('256, should be false');
  CheckResult('256 -> ', 256 in [1, 3, 5, 7, 9, 11, 13, 15, 17, 19, 21, 23, 25, 27, 29, 31, 33, 35, 37, 39, 41], False);
  WriteLn;

  WriteLn('High(type), should be false, u64/s64 should cause range check at compile time');
  CheckResult(' u8 -> ', High(u8)  in [1, 3, 5, 7, 9, 11, 13, 15, 17, 19, 21, 23, 25, 27, 29, 31, 33, 35, 37, 39, 41], False);
  CheckResult(' s8 -> ', High(s8)  in [1, 3, 5, 7, 9, 11, 13, 15, 17, 19, 21, 23, 25, 27, 29, 31, 33, 35, 37, 39, 41], False);
  CheckResult('u16 -> ', High(u16) in [1, 3, 5, 7, 9, 11, 13, 15, 17, 19, 21, 23, 25, 27, 29, 31, 33, 35, 37, 39, 41], False);
  CheckResult('s16 -> ', High(s16) in [1, 3, 5, 7, 9, 11, 13, 15, 17, 19, 21, 23, 25, 27, 29, 31, 33, 35, 37, 39, 41], False);
  CheckResult('u32 -> ', High(u32) in [1, 3, 5, 7, 9, 11, 13, 15, 17, 19, 21, 23, 25, 27, 29, 31, 33, 35, 37, 39, 41], False);
  CheckResult('s32 -> ', High(s32) in [1, 3, 5, 7, 9, 11, 13, 15, 17, 19, 21, 23, 25, 27, 29, 31, 33, 35, 37, 39, 41], False);
  try
//    CheckResult('u64 -> ', High(u64) in [1, 3, 5, 7, 9, 11, 13, 15, 17, 19, 21, 23, 25, 27, 29, 31, 33, 35, 37, 39, 41], False);
    WriteLn('u64 -> Error: range check error while evaluating constants');
  except
    on E: Exception do
      WriteLn('u64 -> ', E.Classname,': ',E.Message);
  end;
  try
//    CheckResult('s64 -> ', High(s64) in [1, 3, 5, 7, 9, 11, 13, 15, 17, 19, 21, 23, 25, 27, 29, 31, 33, 35, 37, 39, 41], False);
    WriteLn('s64 -> Error: range check error while evaluating constants');
  except
    on E: Exception do
      WriteLn('s64 -> ', E.Classname,': ',E.Message);
  end;
  WriteLn;

  WriteLn('Low(type), all false, except s64 -> range check error at compile time');
  CheckResult('u8  -> ',  Low(u8) in [1, 3, 5, 7, 9, 11, 13, 15, 17, 19, 21, 23, 25, 27, 29, 31, 33, 35, 37, 39, 41], False);
  CheckResult('s8  -> ',  Low(s8) in [1, 3, 5, 7, 9, 11, 13, 15, 17, 19, 21, 23, 25, 27, 29, 31, 33, 35, 37, 39, 41], False);
  CheckResult('u16 -> ', Low(u16) in [1, 3, 5, 7, 9, 11, 13, 15, 17, 19, 21, 23, 25, 27, 29, 31, 33, 35, 37, 39, 41], False);
  CheckResult('s16 -> ', Low(s16) in [1, 3, 5, 7, 9, 11, 13, 15, 17, 19, 21, 23, 25, 27, 29, 31, 33, 35, 37, 39, 41], False);
  CheckResult('u32 -> ', Low(u32) in [1, 3, 5, 7, 9, 11, 13, 15, 17, 19, 21, 23, 25, 27, 29, 31, 33, 35, 37, 39, 41], False);
  CheckResult('s32 -> ', Low(s32) in [1, 3, 5, 7, 9, 11, 13, 15, 17, 19, 21, 23, 25, 27, 29, 31, 33, 35, 37, 39, 41], False);
  CheckResult('u64 -> ', Low(u64) in [1, 3, 5, 7, 9, 11, 13, 15, 17, 19, 21, 23, 25, 27, 29, 31, 33, 35, 37, 39, 41], False);

  try
//    CheckResult('s64 -> ', Low(s64) in [1, 3, 5, 7, 9, 11, 13, 15, 17, 19, 21, 23, 25, 27, 29, 31, 33, 35, 37, 39, 41], False);
    WriteLn('s64 -> Error: range check error while evaluating constants');
  except
    on E: Exception do
      WriteLn('s64 -> ', E.Classname,': ',E.Message);
  end;
  WriteLn;

  WriteLn('--- Variable against constant set [1, 3, 5, 7, 9, 11, 13, 15, 17, 19, 21, 23, 25, 27, 29] ---' );
  WriteLn;

  u8  := 25;
  s8  := 25;
  u16 := 25;
  s16 := 25;
  u32 := 25;
  s32 := 25;
  u64 := 25;
  s64 := 25;

  WriteLn('25, should be true');
  CheckResult(' u8 -> ',  u8 in [1, 3, 5, 7, 9, 11, 13, 15, 17, 19, 21, 23, 25, 27, 29], True);
  CheckResult(' s8 -> ',  s8 in [1, 3, 5, 7, 9, 11, 13, 15, 17, 19, 21, 23, 25, 27, 29], True);
  CheckResult('u16 -> ', u16 in [1, 3, 5, 7, 9, 11, 13, 15, 17, 19, 21, 23, 25, 27, 29], True);
  CheckResult('s16 -> ', s16 in [1, 3, 5, 7, 9, 11, 13, 15, 17, 19, 21, 23, 25, 27, 29], True);
  CheckResult('u32 -> ', u32 in [1, 3, 5, 7, 9, 11, 13, 15, 17, 19, 21, 23, 25, 27, 29], True);
  CheckResult('s32 -> ', s32 in [1, 3, 5, 7, 9, 11, 13, 15, 17, 19, 21, 23, 25, 27, 29], True);
  CheckResult('u64 -> ', u64 in [1, 3, 5, 7, 9, 11, 13, 15, 17, 19, 21, 23, 25, 27, 29], True);
  CheckResult('s64 -> ', s64 in [1, 3, 5, 7, 9, 11, 13, 15, 17, 19, 21, 23, 25, 27, 29], True);
  WriteLn;

  u8  := 26;
  s8  := 26;
  u16 := 26;
  s16 := 26;
  u32 := 26;
  s32 := 26;
  u64 := 26;
  s64 := 26;

  WriteLn('26, should be false');
  CheckResult(' u8 -> ',  u8 in [1, 3, 5, 7, 9, 11, 13, 15, 17, 19, 21, 23, 25, 27, 29], False);
  CheckResult(' s8 -> ',  s8 in [1, 3, 5, 7, 9, 11, 13, 15, 17, 19, 21, 23, 25, 27, 29], False);
  CheckResult('u16 -> ', u16 in [1, 3, 5, 7, 9, 11, 13, 15, 17, 19, 21, 23, 25, 27, 29], False);
  CheckResult('s16 -> ', s16 in [1, 3, 5, 7, 9, 11, 13, 15, 17, 19, 21, 23, 25, 27, 29], False);
  CheckResult('u32 -> ', u32 in [1, 3, 5, 7, 9, 11, 13, 15, 17, 19, 21, 23, 25, 27, 29], False);
  CheckResult('s32 -> ', s32 in [1, 3, 5, 7, 9, 11, 13, 15, 17, 19, 21, 23, 25, 27, 29], False);
  CheckResult('u64 -> ', u64 in [1, 3, 5, 7, 9, 11, 13, 15, 17, 19, 21, 23, 25, 27, 29], False);
  CheckResult('s64 -> ', s64 in [1, 3, 5, 7, 9, 11, 13, 15, 17, 19, 21, 23, 25, 27, 29], False);
  WriteLn;

  u8  := 30;
  s8  := 30;
  u16 := 30;
  s16 := 30;
  u32 := 30;
  s32 := 30;
  u64 := 30;
  s64 := 30;

  WriteLn('30, should be false');
  CheckResult(' u8 -> ',  u8 in [1, 3, 5, 7, 9, 11, 13, 15, 17, 19, 21, 23, 25, 27, 29], False);
  CheckResult(' s8 -> ',  s8 in [1, 3, 5, 7, 9, 11, 13, 15, 17, 19, 21, 23, 25, 27, 29], False);
  CheckResult('u16 -> ', u16 in [1, 3, 5, 7, 9, 11, 13, 15, 17, 19, 21, 23, 25, 27, 29], False);
  CheckResult('s16 -> ', s16 in [1, 3, 5, 7, 9, 11, 13, 15, 17, 19, 21, 23, 25, 27, 29], False);
  CheckResult('u32 -> ', u32 in [1, 3, 5, 7, 9, 11, 13, 15, 17, 19, 21, 23, 25, 27, 29], False);
  CheckResult('s32 -> ', s32 in [1, 3, 5, 7, 9, 11, 13, 15, 17, 19, 21, 23, 25, 27, 29], False);
  CheckResult('u64 -> ', u64 in [1, 3, 5, 7, 9, 11, 13, 15, 17, 19, 21, 23, 25, 27, 29], False);
  CheckResult('s64 -> ', s64 in [1, 3, 5, 7, 9, 11, 13, 15, 17, 19, 21, 23, 25, 27, 29], False);
  WriteLn;

//  u8  := 256;
//  s8  := 256;
  u16 := 256;
  s16 := 256;
  u32 := 256;
  s32 := 256;
  u64 := 256;
  s64 := 256;

  WriteLn('256, should be false');
//  CheckResult(' u8 -> ',  u8 in [1, 3, 5, 7, 9, 11, 13, 15, 17, 19, 21, 23, 25, 27, 29], False);
//  CheckResult(' s8 -> ',  s8 in [1, 3, 5, 7, 9, 11, 13, 15, 17, 19, 21, 23, 25, 27, 29], False);
  CheckResult('u16 -> ', u16 in [1, 3, 5, 7, 9, 11, 13, 15, 17, 19, 21, 23, 25, 27, 29], False);
  CheckResult('s16 -> ', s16 in [1, 3, 5, 7, 9, 11, 13, 15, 17, 19, 21, 23, 25, 27, 29], False);
  CheckResult('u32 -> ', u32 in [1, 3, 5, 7, 9, 11, 13, 15, 17, 19, 21, 23, 25, 27, 29], False);
  CheckResult('s32 -> ', s32 in [1, 3, 5, 7, 9, 11, 13, 15, 17, 19, 21, 23, 25, 27, 29], False);
  CheckResult('u64 -> ', u64 in [1, 3, 5, 7, 9, 11, 13, 15, 17, 19, 21, 23, 25, 27, 29], False);
  CheckResult('s64 -> ', s64 in [1, 3, 5, 7, 9, 11, 13, 15, 17, 19, 21, 23, 25, 27, 29], False);
  WriteLn;

  u8  := High(u8);
  s8  := High(s8);
  u16 := High(u16);
  s16 := High(s16);
  u32 := High(u32);
  s32 := High(s32);
  u64 := High(u64);
  s64 := High(s64);

  WriteLn('High(type), should be false, u64/s64 should cause range check');
  CheckResult(' u8 -> ',  u8 in [1, 3, 5, 7, 9, 11, 13, 15, 17, 19, 21, 23, 25, 27, 29], False);
  CheckResult(' s8 -> ',  s8 in [1, 3, 5, 7, 9, 11, 13, 15, 17, 19, 21, 23, 25, 27, 29], False);
  CheckResult('u16 -> ', u16 in [1, 3, 5, 7, 9, 11, 13, 15, 17, 19, 21, 23, 25, 27, 29], False);
  CheckResult('s16 -> ', s16 in [1, 3, 5, 7, 9, 11, 13, 15, 17, 19, 21, 23, 25, 27, 29], False);
  CheckResult('u32 -> ', u32 in [1, 3, 5, 7, 9, 11, 13, 15, 17, 19, 21, 23, 25, 27, 29], False);
  CheckResult('s32 -> ', s32 in [1, 3, 5, 7, 9, 11, 13, 15, 17, 19, 21, 23, 25, 27, 29], False);
  try
    CheckResult('u64 -> ', u64 in [1, 3, 5, 7, 9, 11, 13, 15, 17, 19, 21, 23, 25, 27, 29]);
  except
    on E: Exception do
      WriteLn('u64 -> ', E.Classname,': ',E.Message);
  end;
  try
    CheckResult('s64 -> ', s64 in [1, 3, 5, 7, 9, 11, 13, 15, 17, 19, 21, 23, 25, 27, 29]);
  except
    on E: Exception do
      WriteLn('s64 -> ', E.Classname,': ',E.Message);
  end;
  WriteLn;

  u8  := Low(u8);
  s8  := Low(s8);
  u16 := Low(u16);
  s16 := Low(s16);
  u32 := Low(u32);
  s32 := Low(s32);
  u64 := Low(u64);
  s64 := Low(s64);

  WriteLn('Low(type), all false, except s64 -> range check error');
  CheckResult('u8  -> ',  u8 in [1, 3, 5, 7, 9, 11, 13, 15, 17, 19, 21, 23, 25, 27, 29], False);
  CheckResult('s8  -> ',  s8 in [1, 3, 5, 7, 9, 11, 13, 15, 17, 19, 21, 23, 25, 27, 29], False);
  CheckResult('u16 -> ', u16 in [1, 3, 5, 7, 9, 11, 13, 15, 17, 19, 21, 23, 25, 27, 29], False);
  CheckResult('s16 -> ', s16 in [1, 3, 5, 7, 9, 11, 13, 15, 17, 19, 21, 23, 25, 27, 29], False);
  CheckResult('u32 -> ', u32 in [1, 3, 5, 7, 9, 11, 13, 15, 17, 19, 21, 23, 25, 27, 29], False);
  CheckResult('s32 -> ', s32 in [1, 3, 5, 7, 9, 11, 13, 15, 17, 19, 21, 23, 25, 27, 29], False);
  CheckResult('u64 -> ', u64 in [1, 3, 5, 7, 9, 11, 13, 15, 17, 19, 21, 23, 25, 27, 29], False);

  try
    CheckResult('s64 -> ', s64 in [1, 3, 5, 7, 9, 11, 13, 15, 17, 19, 21, 23, 25, 27, 29]);
  except
    on E: Exception do
      WriteLn('s64 -> ', E.Classname,': ',E.Message);
  end;
  WriteLn;

  WriteLn('--- constant value against constant set [1, 3, 5, 7, 9, 11, 13, 15, 17, 19, 21, 23, 25, 27, 29] ---' );
  WriteLn;

  WriteLn('25, should be true');
  CheckResult('25 -> ', 25 in [1, 3, 5, 7, 9, 11, 13, 15, 17, 19, 21, 23, 25, 27, 29], True);
  WriteLn;

  WriteLn('26, should be false');
  CheckResult(' 26 -> ', 26 in [1, 3, 5, 7, 9, 11, 13, 15, 17, 19, 21, 23, 25, 27, 29], False);
  WriteLn;

  WriteLn('30, should be false');
  CheckResult('30 -> ', 30 in [1, 3, 5, 7, 9, 11, 13, 15, 17, 19, 21, 23, 25, 27, 29], False);
  WriteLn;

  WriteLn('256, should be false');
  CheckResult('256 -> ', 256 in [1, 3, 5, 7, 9, 11, 13, 15, 17, 19, 21, 23, 25, 27, 29], False);
  WriteLn;

  WriteLn('High(type), should be false, u64/s64 should cause range check at compile time');
  CheckResult(' u8 -> ', High(u8)  in [1, 3, 5, 7, 9, 11, 13, 15, 17, 19, 21, 23, 25, 27, 29], False);
  CheckResult(' s8 -> ', High(s8)  in [1, 3, 5, 7, 9, 11, 13, 15, 17, 19, 21, 23, 25, 27, 29], False);
  CheckResult('u16 -> ', High(u16) in [1, 3, 5, 7, 9, 11, 13, 15, 17, 19, 21, 23, 25, 27, 29], False);
  CheckResult('s16 -> ', High(s16) in [1, 3, 5, 7, 9, 11, 13, 15, 17, 19, 21, 23, 25, 27, 29], False);
  CheckResult('u32 -> ', High(u32) in [1, 3, 5, 7, 9, 11, 13, 15, 17, 19, 21, 23, 25, 27, 29], False);
  CheckResult('s32 -> ', High(s32) in [1, 3, 5, 7, 9, 11, 13, 15, 17, 19, 21, 23, 25, 27, 29], False);
  try
//    CheckResult('u64 -> ', High(u64) in [1, 3, 5, 7, 9, 11, 13, 15, 17, 19, 21, 23, 25, 27, 29], False);
    WriteLn('u64 -> Error: range check error while evaluating constants');
  except
    on E: Exception do
      WriteLn('u64 -> ', E.Classname,': ',E.Message);
  end;
  try
//    CheckResult('s64 -> ', High(s64) in [1, 3, 5, 7, 9, 11, 13, 15, 17, 19, 21, 23, 25, 27, 29], False);
    WriteLn('s64 -> Error: range check error while evaluating constants');
  except
    on E: Exception do
      WriteLn('s64 -> ', E.Classname,': ',E.Message);
  end;
  WriteLn;

  WriteLn('Low(type), all false, except s64 -> range check error at compile time');
  CheckResult('u8  -> ',  Low(u8) in [1, 3, 5, 7, 9, 11, 13, 15, 17, 19, 21, 23, 25, 27, 29], False);
  CheckResult('s8  -> ',  Low(s8) in [1, 3, 5, 7, 9, 11, 13, 15, 17, 19, 21, 23, 25, 27, 29], False);
  CheckResult('u16 -> ', Low(u16) in [1, 3, 5, 7, 9, 11, 13, 15, 17, 19, 21, 23, 25, 27, 29], False);
  CheckResult('s16 -> ', Low(s16) in [1, 3, 5, 7, 9, 11, 13, 15, 17, 19, 21, 23, 25, 27, 29], False);
  CheckResult('u32 -> ', Low(u32) in [1, 3, 5, 7, 9, 11, 13, 15, 17, 19, 21, 23, 25, 27, 29], False);
  CheckResult('s32 -> ', Low(s32) in [1, 3, 5, 7, 9, 11, 13, 15, 17, 19, 21, 23, 25, 27, 29], False);
  CheckResult('u64 -> ', Low(u64) in [1, 3, 5, 7, 9, 11, 13, 15, 17, 19, 21, 23, 25, 27, 29], False);

  try
//    CheckResult('s64 -> ', Low(s64) in [1, 3, 5, 7, 9, 11, 13, 15, 17, 19, 21, 23, 25, 27, 29], False);
    WriteLn('s64 -> Error: range check error while evaluating constants');
  except
    on E: Exception do
      WriteLn('s64 -> ', E.Classname,': ',E.Message);
  end;
  WriteLn;

  if Error then begin
    WriteLn('* * * ERROR * * * ERROR * * * ERROR * * * ERROR * * * ERROR * * * ERROR * * *');
    Halt(1);
  end else
    Halt(0);
end.