program tczstreamseek;
{$MODE OBJFPC}
{$ASSERTIONS ON}

uses
  classes,
  zstream;

const
  val: Uint32 = $123456;
  wasError: boolean = False;
var
  data: TMemoryStream;
  comprStream: TCompressionStream;
  decomprStream: TDecompressionStream;
begin
  data := TMemoryStream.Create();

  comprStream := TCompressionStream.Create(clMax, data);
  comprStream.WriteDWord(val);
  comprStream.Free;

  data.Seek(0, soFromBeginning);

  decomprStream := TDecompressionStream.Create(data);
  Assert(decomprStream.ReadDWord() = val);
  Assert(decomprStream.Position = SizeOf(val));

  decomprStream.Seek(0, soFromBeginning);
  Assert(decomprStream.Position = 0);
  Assert(decomprStream.ReadDWord() = val);

  decomprStream.Seek(-SizeOf(val), soFromCurrent);
  Assert(decomprStream.Position = 0);
  Assert(decomprStream.ReadDWord() = val);

  wasError := False;
  decomprStream.Seek(0, soFromBeginning);
  try
    decomprStream.Seek(-SizeOf(val), soFromCurrent);
  except
    on EDecompressionError do
      wasError := True;
  end;
  assert(wasError);

  decomprStream.Seek(SizeOf(val), soFromBeginning);
  Assert(decomprStream.Position = SizeOf(val));

  wasError := False;
  try
    decomprStream.Seek(40, soFromBeginning);
  except
    on EDecompressionError do
      wasError := True;
  end;
  assert(wasError);
  writeln('All OK');
end.
