| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911 | {$mode objfpc}{$h+}unit tctparser;interfaceuses  Classes, SysUtils, fpcunit, testutils, testregistry;  { TTestToString }  TTestToString= class(TTestCase)  private    fStream : TMemoryStream;    fPar : TParser;  protected    procedure SetUp; override;     procedure TearDown; override;   published    procedure Test1;    procedure Test2;    procedure Test3;    procedure Test4;    procedure Test5;    procedure Test6;    procedure Test7;    procedure Test8;    procedure Test9;    procedure Test10;    procedure Test11;    procedure Test12;    procedure Test13;    procedure Test14;    procedure Test15;    procedure Test16;    procedure Test17;  end;  { TTestTokenInt }  TTestTokenInt= class(TTestCase)  private    fStream : TMemoryStream;    fPar : TParser;  protected    procedure SetUp; override;     procedure TearDown; override;   published    procedure Test1;    procedure Test2;    procedure Test3;  end;  { TTestTokenFloat }  TTestTokenFloat= class(TTestCase)  private    fStream : TMemoryStream;    fPar : TParser;  protected    procedure SetUp; override;     procedure TearDown; override;   published    procedure Test1;    procedure Test2;    procedure Test3;    procedure Test4;    procedure Test5;    procedure Test6;  end;  { TTestSymbol }  TTestSymbol= class(TTestCase)  private    fStream : TMemoryStream;    fPar : TParser;  protected    procedure SetUp; override;     procedure TearDown; override;  published    procedure Test1;    procedure Test2;    procedure Test3;  end;   { TTestPositions }  TTestPositions= class(TTestCase)  private    fStream : TMemoryStream;    fPar : TParser;  protected    procedure SetUp; override;     procedure TearDown; override;   published    procedure Test1;    procedure Test2;  end;   { TTestBinary }  TTestBinary= class(TTestCase)  private    fStream : TMemoryStream;    fOutStr : TMemoryStream;    fPar : TParser;  protected    procedure SetUp; override;     procedure TearDown; override;   published    procedure Test1;    procedure Test2;  end; Implementation{ ---------------------------------------------------------------------    TTestToString  ---------------------------------------------------------------------}  procedure TTestToString.Test1;const  aStr = '- 10';begin  fStream.WriteBuffer(aStr[1],length(aStr));  fStream.Position:=0;  fPar:=TParser.Create(fStream);  try    try      fPar.CheckToken('-');    except      on e : EParserError do Fail('CheckToken failed');    end;    AssertEquals('-',fPar.TokenString);    fPar.NextToken;    try      fPar.CheckToken(toInteger);    except      on e : EParserError do Fail('CheckToken failed');    end;    AssertEquals('10',fPar.TokenString);  finally    fPar.Free;  end;end;procedure TTestToString.Test2;const  aStr = '-10';begin  fStream.WriteBuffer(aStr[1],length(aStr));  fStream.Position:=0;  fPar:=TParser.Create(fStream);  try    try      fPar.CheckToken(toInteger);    except      on e : EParserError do Fail('CheckToken failed');    end;    AssertEquals('-10',fPar.TokenString);  finally    fPar.Free;  end;end;procedure TTestToString.Test3;const  aStr = '$AFz';begin  fStream.WriteBuffer(aStr[1],length(aStr));  fStream.Position:=0;  fPar:=TParser.Create(fStream);  try    try      fPar.CheckToken(toInteger);    except      on e : EParserError do Fail('CheckToken failed');    end;    AssertEquals('$AF',fPar.TokenString);    fPar.NextToken;    try      fPar.CheckToken(toSymbol);    except      on e : EParserError do Fail('CheckToken failed');    end;    AssertEquals('z',fPar.TokenString);  finally    fPar.Free;  end;end;procedure TTestToString.Test4;const  aStr : string = '$';begin  fStream.WriteBuffer(aStr[1],length(aStr));  fStream.Position:=0;  try    fPar:=TParser.Create(fStream);  except    on e : EParserError do exit    else    begin      fPar.Free;      Fail('EParserError should be raised');    end;  end;  fPar.Free;  Fail('EParserError should be raised');end;procedure TTestToString.Test5;const  aStr = '1.';begin  fStream.WriteBuffer(aStr[1],length(aStr));  fStream.Position:=0;  fPar:=TParser.Create(fStream);  try    try      fPar.CheckToken(toFloat);    except      on e : EParserError do Fail('CheckToken failed');    end;    AssertEquals('1.',fPar.TokenString);  finally    fPar.Free;  end;end;procedure TTestToString.Test6;const  aStr = '1.0';begin  fStream.WriteBuffer(aStr[1],length(aStr));  fStream.Position:=0;  fPar:=TParser.Create(fStream);  try    try      fPar.CheckToken(toFloat);    except      on e : EParserError do Fail('CheckToken failed');    end;    AssertEquals('1.0',fPar.TokenString);  finally    fPar.Free;  end;end;procedure TTestToString.Test7;const  aStr = '1E';begin  fStream.WriteBuffer(aStr[1],length(aStr));  fStream.Position:=0;  try    fPar:=TParser.Create(fStream);  except    on e : EParserError do exit    else    begin      fPar.Free;      Fail('EParserError should be raised');    end;  end;  fPar.Free;  Fail('EParserError should be raised');end;procedure TTestToString.Test8;const  aStr = '1E+';begin  fStream.WriteBuffer(aStr[1],length(aStr));  fStream.Position:=0;  try    fPar:=TParser.Create(fStream);  except    on e : EParserError do exit    else    begin      fPar.Free;      Fail('EParserError should be raised');    end;  end;  fPar.Free;  Fail('EParserError should be raised');end;procedure TTestToString.Test9;const  aStr = '1.E+2';begin  fStream.WriteBuffer(aStr[1],length(aStr));  fStream.Position:=0;  fPar:=TParser.Create(fStream);  try    try      fPar.CheckToken(toFloat);    except      on e : EParserError do Fail('CheckToken failed');    end;    AssertEquals('1.E+2',fPar.TokenString);  finally    fPar.Free;  end;end;procedure TTestToString.Test10;const  aStr = '1.E+2a';begin  fStream.WriteBuffer(aStr[1],length(aStr));  fStream.Position:=0;  fPar:=TParser.Create(fStream);  try    try      fPar.CheckToken(toFloat);    except      on e : EParserError do Fail('CheckToken failed');    end;    AssertEquals('1.E+2',fPar.TokenString);    fPar.NextToken;    try      fPar.CheckToken(toSymbol);    except      on e : EParserError do Fail('CheckToken failed');    end;    AssertEquals('a',fPar.TokenString);  finally    fPar.Free;  end;end;procedure TTestToString.Test11;const  aStr = '12s';begin  fStream.WriteBuffer(aStr[1],length(aStr));  fStream.Position:=0;  fPar:=TParser.Create(fStream);  try    try      fPar.CheckToken(toFloat);    except      on e : EParserError do Fail('CheckToken failed');    end;    AssertEquals('12s',fPar.TokenString);  finally    fPar.Free;  end;end;procedure TTestToString.Test12;const  aStr = '''string'''; //'string'begin  fStream.WriteBuffer(aStr[1],length(aStr));  fStream.Position:=0;  fPar:=TParser.Create(fStream);  try    try      fPar.CheckToken(toString);    except      on e : EParserError do Fail('CheckToken failed');    end;    AssertEquals('string',fPar.TokenString);  finally    fPar.Free;  end;end;procedure TTestToString.Test13;const  aStr = '''can''''t'''; //'can''t'begin  fStream.WriteBuffer(aStr[1],length(aStr));  fStream.Position:=0;  fPar:=TParser.Create(fStream);  try    try      fPar.CheckToken(toString);    except      on e : EParserError do Fail('CheckToken failed');    end;    AssertEquals('can''t',fPar.TokenString);  finally    fPar.Free;  end;end;procedure TTestToString.Test14;const  aStr = '''c''#97#110''''''''#116#32''open file''';  //'c'#97#110''''#116#32'open file'begin  fStream.WriteBuffer(aStr[1],length(aStr));  fStream.Position:=0;  fPar:=TParser.Create(fStream);  try    try      fPar.CheckToken(toString);    except      on e : EParserError do Fail('CheckToken failed');    end;    AssertEquals('can''t open file',fPar.TokenString);  finally    fPar.Free;  end;end;procedure TTestToString.Test15;const  aStr = '''perch''#232';var ws : widestring;begin  fStream.WriteBuffer(aStr[1],length(aStr));  fStream.Position:=0;  ws:='perch'#232;  fPar:=TParser.Create(fStream);  try    try      fPar.CheckToken(toWString);    except      on e : EParserError do Fail('CheckToken failed');    end;    AssertEquals(ws,fPar.TokenWideString);  finally    fPar.Free;  end;end;procedure TTestToString.Test16;const  aStr = '''unterminated string'#10'blah''';begin  fStream.WriteBuffer(aStr[1],length(aStr));  fStream.Position:=0;  try    fPar:=TParser.Create(fStream);  except    on e : EParserError do exit    else    begin      fPar.Free;      Fail('EParserError should be raised');    end;  end;  fPar.Free;  Fail('EParserError should be raised');end;procedure TTestToString.Test17;const  aStr = 'first.second.third';begin  fStream.WriteBuffer(aStr[1],length(aStr));  fStream.Position:=0;  fPar:=TParser.Create(fStream);  try    try      fPar.CheckToken(toSymbol);    except      on e : EParserError do Fail('CheckToken failed');    end;    AssertEquals('first',fPar.TokenString);    fPar.NextToken;    try      fPar.CheckToken('.');    except      on e : EParserError do Fail('CheckToken failed');    end;    AssertEquals('.',fPar.TokenString);    fPar.NextToken;    try      fPar.CheckToken(toSymbol);    except      on e : EParserError do Fail('CheckToken failed');    end;    AssertEquals('second',fPar.TokenString);    fPar.NextToken;    try      fPar.CheckToken('.');    except      on e : EParserError do Fail('CheckToken failed');    end;    AssertEquals('.',fPar.TokenString);    fPar.NextToken;    try      fPar.CheckToken(toSymbol);    except      on e : EParserError do Fail('CheckToken failed');    end;    AssertEquals('third',fPar.TokenString);  finally    fPar.Free;  end;end;procedure TTestToString.SetUp;begin  fStream:=TMemoryStream.Create;end; procedure TTestToString.TearDown;begin  fStream.Free;end;{ ---------------------------------------------------------------------    TTestTokenInt  ---------------------------------------------------------------------}  procedure TTestTokenInt.Test1;const  aStr = '10';begin  fStream.WriteBuffer(aStr[1],length(aStr));  fStream.Position:=0;  fPar:=TParser.Create(fStream);  try    AssertEquals(toInteger,fPar.Token);    AssertEquals(10,fPar.TokenInt);  finally    fPar.Free;  end;end;procedure TTestTokenInt.Test2;const  aStr = '-10';begin  fStream.WriteBuffer(aStr[1],length(aStr));  fStream.Position:=0;  fPar:=TParser.Create(fStream);  try    AssertEquals(toInteger,fPar.Token);    AssertEquals(-10,fPar.TokenInt);  finally    fPar.Free;  end;end;procedure TTestTokenInt.Test3;const  aStr = '$AF';begin  fStream.WriteBuffer(aStr[1],length(aStr));  fStream.Position:=0;  fPar:=TParser.Create(fStream);  try    AssertEquals(toInteger,fPar.Token);    AssertEquals($AF,fPar.TokenInt);  finally    fPar.Free;  end;end;procedure TTestTokenInt.SetUp;begin  fStream:=TMemoryStream.Create;end;procedure TTestTokenInt.TearDown;begin  fStream.Free;end;{ ---------------------------------------------------------------------    TTestTokenFloat  ---------------------------------------------------------------------}  procedure TTestTokenFloat.Test1;const  aStr = '1.';begin  fStream.WriteBuffer(aStr[1],length(aStr));  fStream.Position:=0;  fPar:=TParser.Create(fStream);  try    AssertEquals(toFloat,fPar.Token);    AssertEquals(1.0,fPar.TokenFloat);    AssertEquals(#0,fPar.FloatType);  finally    fPar.Free;  end;end;procedure TTestTokenFloat.Test2;const  aStr = '1.0';begin  fStream.WriteBuffer(aStr[1],length(aStr));  fStream.Position:=0;  fPar:=TParser.Create(fStream);  try    AssertEquals(toFloat,fPar.Token);    AssertEquals(1.0,fPar.TokenFloat);    AssertEquals(#0,fPar.FloatType);  finally    fPar.Free;  end;end;procedure TTestTokenFloat.Test3;const  aStr = '1.E+2';begin  fStream.WriteBuffer(aStr[1],length(aStr));  fStream.Position:=0;  fPar:=TParser.Create(fStream);  try    AssertEquals(toFloat,fPar.Token);    AssertEquals(100.0,fPar.TokenFloat);    AssertEquals(#0,fPar.FloatType);  finally    fPar.Free;  end;end;procedure TTestTokenFloat.Test4;const  aStr = '12s';begin  fStream.WriteBuffer(aStr[1],length(aStr));  fStream.Position:=0;  fPar:=TParser.Create(fStream);  try    AssertEquals(toFloat,fPar.Token);    AssertEquals(12.0,fPar.TokenFloat);    AssertEquals('s',fPar.FloatType);  finally    fPar.Free;  end;end;procedure TTestTokenFloat.Test5;const  aStr = '12d';begin  fStream.WriteBuffer(aStr[1],length(aStr));  fStream.Position:=0;  fPar:=TParser.Create(fStream);  try    AssertEquals(toFloat,fPar.Token);    AssertEquals(12.0,fPar.TokenFloat);    AssertEquals('d',fPar.FloatType);  finally    fPar.Free;  end;end;procedure TTestTokenFloat.Test6;const  aStr = '12c';begin  fStream.WriteBuffer(aStr[1],length(aStr));  fStream.Position:=0;  fPar:=TParser.Create(fStream);  try    AssertEquals(toFloat,fPar.Token);    AssertEquals(12.0,fPar.TokenFloat);    AssertEquals('c',fPar.FloatType);  finally    fPar.Free;  end;end;procedure TTestTokenFloat.SetUp; begin  fStream:=TMemoryStream.Create;end;procedure TTestTokenFloat.TearDown; begin  fStream.Free;end;{ ---------------------------------------------------------------------    TTestSymbol  ---------------------------------------------------------------------}  procedure TTestSymbol.Test1;const  aStr = 'hello world';begin  fStream.WriteBuffer(aStr[1],length(aStr));  fStream.Position:=0;  fPar:=TParser.Create(fStream);  try    AssertTrue(fPar.TokenSymbolIs('HELLO'));    try      fPar.CheckTokenSymbol('HeLlO');    except      on e : EParserError do Fail('CheckTokenSymbol failed');    end;    AssertEquals('hello',fPar.TokenComponentIdent);    fPar.NextToken;    AssertTrue(fPar.TokenSymbolIs('world'));    try      fPar.CheckTokenSymbol('wOrLd');    except      on e : EParserError do Fail('CheckTokenSymbol failed');    end;    AssertEquals('world',fPar.TokenComponentIdent);  finally    fPar.Free;  end;end;procedure TTestSymbol.Test2;const  aStr = 'first.second.third';begin  fStream.WriteBuffer(aStr[1],length(aStr));  fStream.Position:=0;  fPar:=TParser.Create(fStream);  try    AssertTrue(fPar.TokenSymbolIs('first'));    try      fPar.CheckTokenSymbol('first');    except      on e : EParserError do Fail('CheckTokenSymbol failed');    end;    AssertEquals('first',fPar.TokenString);    AssertEquals('first.second.third',fPar.TokenComponentIdent);    AssertEquals('first.second.third',fPar.TokenString);  finally    fPar.Free;  end;end;procedure TTestSymbol.Test3;const  aStr = 'first.';begin  fStream.WriteBuffer(aStr[1],length(aStr));  fStream.Position:=0;  fPar:=TParser.Create(fStream);  try    AssertTrue(fPar.TokenSymbolIs('first'));    try      fPar.CheckTokenSymbol('first');    except      on e : EParserError do Fail('CheckTokenSymbol failed');    end;    AssertEquals('first',fPar.TokenString);    try      fPar.TokenComponentIdent;    except      on e : EParserError do exit      else        Fail('EParserError should be raised');    end;    Fail('EParserError should be raised');  finally    fPar.Free;  end;end;procedure TTestSymbol.SetUp; begin  fStream:=TMemoryStream.Create;end;procedure TTestSymbol.TearDown;begin  fStream.Free;end;{ ---------------------------------------------------------------------    TTestPositions  ---------------------------------------------------------------------}  procedure TTestPositions.Test1;const  aStr = 'this is'#10'a '#13'test.'#13#10'Another line';begin  fStream.WriteBuffer(aStr[1],length(aStr));  fStream.Position:=0;  fPar:=TParser.Create(fStream);  try    //this    AssertEquals(1,fPar.SourceLine);    AssertEquals(4,fPar.SourcePos);    //is    fPar.NextToken;    AssertEquals(1,fPar.SourceLine);    AssertEquals(7,fPar.SourcePos);    //a    fPar.NextToken;    AssertEquals(2,fPar.SourceLine);    AssertEquals(9,fPar.SourcePos);    //test    fPar.NextToken;    AssertEquals(3,fPar.SourceLine);    AssertEquals(15,fPar.SourcePos);    //.    fPar.NextToken;    AssertEquals(3,fPar.SourceLine);    AssertEquals(16,fPar.SourcePos);    //Another    fPar.NextToken;    AssertEquals(4,fPar.SourceLine);    AssertEquals(25,fPar.SourcePos);    //line    fPar.NextToken;    AssertEquals(4,fPar.SourceLine);    AssertEquals(30,fPar.SourcePos);    //eof    fPar.NextToken;    AssertEquals(4,fPar.SourceLine);    AssertEquals(30,fPar.SourcePos);    AssertEquals(toEOF,fPar.Token);  finally    fPar.Free;  end;end;procedure TTestPositions.Test2;const  aStr = 'this is a test';begin  fStream.WriteBuffer(aStr[1],length(aStr));  fStream.Position:=0;  fPar:=TParser.Create(fStream);  try    //this    fPar.NextToken;    //is  finally    fPar.Free;  end;  AssertEquals(7,fStream.Position);end;procedure TTestPositions.SetUp; begin  fStream:=TMemoryStream.Create;end;procedure TTestPositions.TearDown; begin  fStream.Free;end;{ ---------------------------------------------------------------------    TTestBinary  ---------------------------------------------------------------------}  procedure TTestBinary.Test1;const  aStr = '{ 1234 56'+#13#10'789A somethingelse';var buf : array[0..4] of byte = ($12,$34,$56,$78,$9A);begin  fStream.WriteBuffer(aStr[1],length(aStr));  fStream.Position:=0;  fOutStr.Position:=0;  fPar:=TParser.Create(fStream);  try    fPar.HexToBinary(fOutStr);    AssertEquals(5,fOutStr.Size);    AssertTrue(CompareMem(@buf[0],fOutStr.Memory,5));    AssertEquals(16,fPar.SourcePos);  finally    fPar.Free;  end;end;procedure TTestBinary.Test2;const  aStr = '{ 123z';begin  fStream.WriteBuffer(aStr[1],length(aStr));  fStream.Position:=0;  fOutStr.Position:=0;  fPar:=TParser.Create(fStream);  try    try      fPar.HexToBinary(fOutStr);    except      on e : EParserError do exit      else Fail('EParserError should be raised');    end;    Fail('EParserError should be raised');  finally    fPar.Free;  end;end;procedure TTestBinary.SetUp; begin  fStream:=TMemoryStream.Create;  fOutStr:=TMemoryStream.Create;end;procedure TTestBinary.TearDown; begin  fStream.Free;  fOutStr.Free;end; initialization  RegisterTests([TTestToString,TTestTokenInt,TTestTokenFloat,TTestSymbol,TTestBinary]);end.
 |