mirror of
https://gitlab.com/freepascal.org/fpc/source.git
synced 2025-05-02 09:13:43 +02:00
578 lines
12 KiB
ObjectPascal
578 lines
12 KiB
ObjectPascal
unit tcidlscanner;
|
|
|
|
{$mode objfpc}{$H+}
|
|
|
|
interface
|
|
|
|
uses
|
|
Classes, SysUtils, fpcunit, testutils, testregistry, webidlscanner;
|
|
|
|
type
|
|
|
|
{ TTestScanner }
|
|
|
|
TTestScanner= class(TTestCase)
|
|
private
|
|
FScanner: TWebIDLScanner;
|
|
FVersion: TWEbIDLversion;
|
|
procedure SetVersion(AValue: TWEbIDLversion);
|
|
protected
|
|
procedure Init(Const aSource : string);
|
|
Class Procedure AssertEquals(Msg : String; AExpected,AActual : TIDLToken); overload;
|
|
Procedure TestSingle(Const aSource : String; AToken : TIDLToken);
|
|
Procedure TestMulti(Const aSource : String; AToken : Array of TIDLToken);
|
|
Procedure TestSingle(Const aSource : String; AToken : TIDLToken; AValue : String);
|
|
Procedure TestMulti(Const aSource : String; AToken : Array of TIDLToken; AValues : Array of String);
|
|
procedure SetUp; override;
|
|
procedure TearDown; override;
|
|
Property Scanner : TWebIDLScanner Read FScanner;
|
|
Property Version : TWEbIDLversion Read FVersion Write SetVersion;
|
|
published
|
|
procedure TestHookUp;
|
|
Procedure TestComment;
|
|
Procedure TestWhitespace;
|
|
Procedure TestString;
|
|
Procedure TestNumberInteger;
|
|
Procedure TestNumberFloat;
|
|
Procedure TestNumberHex;
|
|
Procedure TestNumberHex2;
|
|
// Simple (one-character) tokens
|
|
Procedure TestComma; // ','
|
|
Procedure TestColon; // ':'
|
|
Procedure TestBracketOpen; // '('
|
|
Procedure TestBracketClose; // ')'
|
|
Procedure TestCurlyBraceOpen; // '{'
|
|
Procedure TestCurlyBraceClose; // '}'
|
|
Procedure TestSquaredBraceOpen; // '['
|
|
Procedure TestSquaredBraceClose; // ']'
|
|
Procedure TestIdentifier; // Any identifier
|
|
Procedure TestDot; // '.',
|
|
Procedure TestSemicolon;// ';',
|
|
Procedure TestLess;// '<',
|
|
Procedure TestEqual;// '=',
|
|
Procedure TestLarger;// '=',
|
|
Procedure TestQuestionMark;// '?',
|
|
Procedure TestMinus;// '-',
|
|
Procedure TestOther;// 'other',
|
|
Procedure Testshort;// 'other',
|
|
|
|
Procedure TestTrue;
|
|
Procedure TestFalse;
|
|
Procedure TestNull;
|
|
Procedure TestAny;
|
|
Procedure TestAttribute;
|
|
Procedure TestCallback;
|
|
Procedure TestConst;
|
|
Procedure TestDeleter;
|
|
Procedure TestDictionary;
|
|
Procedure TestEllipsis;
|
|
Procedure TestEnum;
|
|
Procedure TestGetter;
|
|
Procedure TestImplements;
|
|
Procedure TestMapLike;
|
|
Procedure TestSetLike;
|
|
Procedure TestRecord;
|
|
Procedure TestInfinity;
|
|
Procedure TestInherit;
|
|
Procedure TestInterface;
|
|
Procedure TestIterable;
|
|
Procedure TestLegacyCaller;
|
|
Procedure TestNan;
|
|
Procedure TestNegInfinity;
|
|
Procedure TestOptional;
|
|
Procedure TestOr;
|
|
Procedure TestPartial;
|
|
Procedure TestReadOnly;
|
|
Procedure TestRequired;
|
|
Procedure TestSetter;
|
|
Procedure TestStatic;
|
|
Procedure TestStringifier;
|
|
Procedure TestTypedef;
|
|
Procedure TestUnrestricted;
|
|
Procedure TestPromise;
|
|
Procedure TestByteString;
|
|
Procedure TestDOMString;
|
|
Procedure TestUSVString;
|
|
Procedure Testboolean;
|
|
Procedure Testbyte;
|
|
Procedure Testdouble;
|
|
Procedure Testfloat;
|
|
Procedure Testlong;
|
|
Procedure Testobject;
|
|
Procedure Testoctet;
|
|
Procedure Testunsigned;
|
|
Procedure Testvoid;
|
|
end;
|
|
|
|
implementation
|
|
|
|
uses typinfo;
|
|
|
|
procedure TTestScanner.TestHookUp;
|
|
begin
|
|
Init('');
|
|
AssertNotNull('Have scanner',Scanner);
|
|
end;
|
|
|
|
procedure TTestScanner.TestComment;
|
|
begin
|
|
TestSingle('// me',tkComment);
|
|
end;
|
|
|
|
procedure TTestScanner.TestWhitespace;
|
|
begin
|
|
TestSingle('',tkWhitespace);
|
|
end;
|
|
|
|
procedure TTestScanner.TestString;
|
|
begin
|
|
TestSingle('"abcd"',webidlscanner.tkString,'abcd');
|
|
end;
|
|
|
|
procedure TTestScanner.TestNumberInteger;
|
|
begin
|
|
TestSingle('123',tkNumberInteger,'123');
|
|
end;
|
|
|
|
procedure TTestScanner.TestNumberFloat;
|
|
begin
|
|
TestSingle('1.23',tkNumberFloat,'1.23');
|
|
end;
|
|
|
|
procedure TTestScanner.TestNumberHex;
|
|
begin
|
|
TestSingle('0xABCDEF',tkNumberInteger,'0xABCDEF');
|
|
end;
|
|
|
|
procedure TTestScanner.TestNumberHex2;
|
|
begin
|
|
// E is special
|
|
TestSingle('0xABCDE',tkNumberInteger,'0xABCDE');
|
|
end;
|
|
|
|
procedure TTestScanner.TestComma;
|
|
begin
|
|
TestSingle(',',tkComma);
|
|
end;
|
|
|
|
procedure TTestScanner.TestColon;
|
|
begin
|
|
TestSingle(':',tkColon);
|
|
end;
|
|
|
|
procedure TTestScanner.TestBracketOpen;
|
|
begin
|
|
TestSingle('(',tkBracketOpen);
|
|
end;
|
|
|
|
procedure TTestScanner.TestBracketClose;
|
|
begin
|
|
TestSingle(')',tkBracketClose);
|
|
end;
|
|
|
|
procedure TTestScanner.TestCurlyBraceOpen;
|
|
begin
|
|
TestSingle('{',tkCurlyBraceOpen);
|
|
end;
|
|
|
|
procedure TTestScanner.TestCurlyBraceClose;
|
|
begin
|
|
TestSingle('}',tkCurlyBraceClose);
|
|
end;
|
|
|
|
procedure TTestScanner.TestSquaredBraceOpen;
|
|
begin
|
|
TestSingle('[',tkSquaredBraceOpen);
|
|
end;
|
|
|
|
procedure TTestScanner.TestSquaredBraceClose;
|
|
begin
|
|
TestSingle(']',tkSquaredBraceClose);
|
|
end;
|
|
|
|
procedure TTestScanner.TestIdentifier;
|
|
begin
|
|
TestSingle('A',tkIdentifier,'A');
|
|
end;
|
|
|
|
procedure TTestScanner.TestDot;
|
|
begin
|
|
TestSingle('.',tkDot);
|
|
end;
|
|
|
|
procedure TTestScanner.TestSemicolon;
|
|
begin
|
|
TestSingle(';',tkSemiColon);
|
|
end;
|
|
|
|
procedure TTestScanner.TestLess;
|
|
begin
|
|
TestSingle('<',tkLess);
|
|
end;
|
|
|
|
procedure TTestScanner.TestEqual;
|
|
begin
|
|
TestSingle('=',tkEqual);
|
|
end;
|
|
|
|
procedure TTestScanner.TestLarger;
|
|
begin
|
|
TestSingle('>',tkLarger);
|
|
end;
|
|
|
|
procedure TTestScanner.TestQuestionMark;
|
|
begin
|
|
TestSingle('?',tkQuestionMark);
|
|
end;
|
|
|
|
procedure TTestScanner.TestMinus;
|
|
begin
|
|
TestSingle('-',tkMinus);
|
|
end;
|
|
|
|
procedure TTestScanner.TestOther;
|
|
begin
|
|
TestSingle('other',tkOther);
|
|
end;
|
|
|
|
procedure TTestScanner.Testshort;
|
|
begin
|
|
TestSingle('short',tkShort);
|
|
end;
|
|
|
|
procedure TTestScanner.TestTrue;
|
|
begin
|
|
TestSingle('true',tkTrue);
|
|
end;
|
|
|
|
procedure TTestScanner.TestFalse;
|
|
begin
|
|
TestSingle('false',tkFalse);
|
|
end;
|
|
|
|
procedure TTestScanner.TestNull;
|
|
begin
|
|
TestSingle('null',tkNull);
|
|
end;
|
|
|
|
procedure TTestScanner.TestAny;
|
|
begin
|
|
TestSingle('any',webidlscanner.tkAny);
|
|
end;
|
|
|
|
procedure TTestScanner.TestAttribute;
|
|
begin
|
|
TestSingle('attribute',tkAttribute);
|
|
end;
|
|
|
|
procedure TTestScanner.TestCallback;
|
|
begin
|
|
TestSingle('callback',tkCallBack);
|
|
end;
|
|
|
|
procedure TTestScanner.TestConst;
|
|
begin
|
|
TestSingle('const',tkConst);
|
|
end;
|
|
|
|
procedure TTestScanner.TestDeleter;
|
|
begin
|
|
TestSingle('deleter',tkDeleter);
|
|
end;
|
|
|
|
procedure TTestScanner.TestDictionary;
|
|
begin
|
|
TestSingle('dictionary',tkDictionary);
|
|
end;
|
|
|
|
procedure TTestScanner.TestEllipsis;
|
|
begin
|
|
TestSingle('ellipsis',tkellipsis);
|
|
end;
|
|
|
|
procedure TTestScanner.TestEnum;
|
|
begin
|
|
TestSingle('enum',tkenum);
|
|
end;
|
|
|
|
procedure TTestScanner.TestGetter;
|
|
begin
|
|
TestSingle('getter',tkgetter);
|
|
end;
|
|
|
|
procedure TTestScanner.TestImplements;
|
|
begin
|
|
TestSingle('implements',tkimplements);
|
|
Version:=v2;
|
|
TestSingle('implements',tkIdentifier);
|
|
end;
|
|
|
|
procedure TTestScanner.TestMapLike;
|
|
begin
|
|
Version:=v2;
|
|
TestSingle('maplike',tkmaplike);
|
|
Version:=v1;
|
|
TestSingle('maplike',tkIdentifier);
|
|
end;
|
|
|
|
procedure TTestScanner.TestSetLike;
|
|
begin
|
|
Version:=v2;
|
|
TestSingle('setlike',tkSetlike);
|
|
Version:=v1;
|
|
TestSingle('setlike',tkIdentifier);
|
|
end;
|
|
|
|
procedure TTestScanner.TestRecord;
|
|
begin
|
|
Version:=v2;
|
|
TestSingle('record',webidlscanner.tkRecord);
|
|
Version:=v1;
|
|
TestSingle('record',tkIdentifier);
|
|
end;
|
|
|
|
procedure TTestScanner.TestInfinity;
|
|
begin
|
|
TestSingle('Infinity',tkinfinity);
|
|
end;
|
|
|
|
procedure TTestScanner.TestInherit;
|
|
begin
|
|
TestSingle('inherit',tkinherit);
|
|
end;
|
|
|
|
procedure TTestScanner.TestInterface;
|
|
begin
|
|
TestSingle('interface',webidlscanner.tkinterface);
|
|
end;
|
|
|
|
procedure TTestScanner.TestIterable;
|
|
begin
|
|
TestSingle('iterable',tkiterable);
|
|
end;
|
|
|
|
procedure TTestScanner.TestLegacyCaller;
|
|
begin
|
|
TestSingle('legacycaller',tklegacycaller);
|
|
end;
|
|
|
|
procedure TTestScanner.TestNan;
|
|
begin
|
|
TestSingle('NaN',tkNan);
|
|
end;
|
|
|
|
procedure TTestScanner.TestNegInfinity;
|
|
begin
|
|
TestSingle('-Infinity',tkneginfinity);
|
|
end;
|
|
|
|
procedure TTestScanner.TestOptional;
|
|
begin
|
|
TestSingle('optional',tkoptional);
|
|
end;
|
|
|
|
procedure TTestScanner.TestOr;
|
|
begin
|
|
TestSingle('or',tkOR);
|
|
end;
|
|
|
|
procedure TTestScanner.TestPartial;
|
|
begin
|
|
TestSingle('partial',tkPartial);
|
|
end;
|
|
|
|
procedure TTestScanner.TestReadOnly;
|
|
begin
|
|
TestSingle('readonly',tkreadonly);
|
|
end;
|
|
|
|
procedure TTestScanner.TestRequired;
|
|
begin
|
|
TestSingle('required',tkrequired);
|
|
end;
|
|
|
|
procedure TTestScanner.TestSetter;
|
|
begin
|
|
TestSingle('setter',tksetter);
|
|
end;
|
|
|
|
procedure TTestScanner.TestStatic;
|
|
begin
|
|
TestSingle('static',tkstatic);
|
|
end;
|
|
|
|
procedure TTestScanner.TestStringifier;
|
|
begin
|
|
TestSingle('stringifier',tkstringifier);
|
|
end;
|
|
|
|
procedure TTestScanner.TestTypedef;
|
|
begin
|
|
TestSingle('typedef',tktypeDef);
|
|
end;
|
|
|
|
procedure TTestScanner.TestUnrestricted;
|
|
begin
|
|
TestSingle('unrestricted',tkunrestricted);
|
|
end;
|
|
|
|
procedure TTestScanner.TestPromise;
|
|
begin
|
|
TestSingle('Promise',tkpromise);
|
|
end;
|
|
|
|
procedure TTestScanner.TestByteString;
|
|
begin
|
|
TestSingle('ByteString',tkBytestring);
|
|
end;
|
|
|
|
procedure TTestScanner.TestDOMString;
|
|
begin
|
|
TestSingle('DOMString',tkDOMstring);
|
|
end;
|
|
|
|
procedure TTestScanner.TestUSVString;
|
|
begin
|
|
TestSingle('USVString',tkUSVString);
|
|
end;
|
|
|
|
procedure TTestScanner.Testboolean;
|
|
begin
|
|
TestSingle('boolean',tkBoolean);
|
|
end;
|
|
|
|
procedure TTestScanner.Testbyte;
|
|
begin
|
|
TestSingle('byte',tkByte);
|
|
end;
|
|
|
|
procedure TTestScanner.Testdouble;
|
|
begin
|
|
TestSingle('double',webidlscanner.tkDouble);
|
|
end;
|
|
|
|
procedure TTestScanner.Testfloat;
|
|
begin
|
|
TestSingle('float',webidlscanner.tkfloat);
|
|
end;
|
|
|
|
procedure TTestScanner.Testlong;
|
|
begin
|
|
TestSingle('long',tklong);
|
|
end;
|
|
|
|
procedure TTestScanner.Testobject;
|
|
begin
|
|
TestSingle('object',webidlscanner.tkObject);
|
|
end;
|
|
|
|
procedure TTestScanner.Testoctet;
|
|
begin
|
|
TestSingle('octet',tkOctet);
|
|
end;
|
|
|
|
procedure TTestScanner.Testunsigned;
|
|
begin
|
|
TestSingle('unsigned',tkUnsigned);
|
|
end;
|
|
|
|
procedure TTestScanner.Testvoid;
|
|
begin
|
|
TestSingle('void',tkVoid);
|
|
end;
|
|
|
|
procedure TTestScanner.SetVersion(AValue: TWEbIDLversion);
|
|
begin
|
|
if FVersion=AValue then Exit;
|
|
FVersion:=AValue;
|
|
if Assigned(FScanner) then
|
|
FScanner.Version:=FVersion;
|
|
end;
|
|
|
|
procedure TTestScanner.Init(const aSource: string);
|
|
begin
|
|
FreeAndNil(FScanner);
|
|
FScanner:=TWebIDLScanner.Create(aSource);
|
|
FScanner.Version:=FVersion;
|
|
end;
|
|
|
|
class procedure TTestScanner.AssertEquals(Msg: String; AExpected,AActual: TIDLToken);
|
|
begin
|
|
AssertEQuals(Msg,GetEnumName(TypeInfo(TIDLToken),Ord(AExpected)),GetEnumName(TypeInfo(TIDLToken),Ord(AActual)));
|
|
end;
|
|
|
|
procedure TTestScanner.TestSingle(const aSource: String; AToken: TIDLToken);
|
|
begin
|
|
TestMulti(aSource,[aToken]);
|
|
end;
|
|
|
|
procedure TTestScanner.TestMulti(const aSource: String;
|
|
AToken: array of TIDLToken);
|
|
|
|
Var
|
|
I : Integer;
|
|
t : TIDLToken;
|
|
|
|
begin
|
|
Init(ASource);
|
|
I:=0;
|
|
Repeat
|
|
t:=Scanner.FetchToken;
|
|
If T<>tkEOF then
|
|
begin
|
|
If I>High(AToken) then
|
|
Fail(Format('"%s": Too many tokens in source (got: %d, expected: %d)',[aSource,I+1,High(aToken)+1]));
|
|
AssertEquals('"'+ASource+'": token '+IntToStr(I),AToken[I],T);
|
|
Inc(I);
|
|
end
|
|
Until (t=tkEOF);
|
|
If I<High(AToken) then
|
|
Fail('"'+ASource+'": Too little tokens in source');
|
|
end;
|
|
|
|
procedure TTestScanner.TestSingle(const aSource: String; AToken: TIDLToken;
|
|
AValue: String);
|
|
begin
|
|
TestMulti(aSource,[aToken],[aValue]);
|
|
end;
|
|
|
|
procedure TTestScanner.TestMulti(const aSource: String;
|
|
AToken: array of TIDLToken; AValues: array of String);
|
|
Var
|
|
I : Integer;
|
|
t : TIDLToken;
|
|
|
|
begin
|
|
Init(ASource);
|
|
I:=0;
|
|
Repeat
|
|
t:=Scanner.FetchToken;
|
|
If T<>tkEOF then
|
|
begin
|
|
If I>High(AToken) then
|
|
Fail(Format('"%s": Too many tokens in source (got: %d, expected: %d)',[aSource,I+1,High(aToken)+1]));
|
|
AssertEquals('"'+ASource+'": token '+IntToStr(I),AToken[I],T);
|
|
AssertEquals('"'+ASource+'": String '+IntToStr(I),AValues[I],FScanner.CurTokenString);
|
|
Inc(I);
|
|
end
|
|
Until (t=tkEOF);
|
|
If I<High(AToken) then
|
|
Fail('"'+ASource+'": Too little tokens in source');
|
|
end;
|
|
|
|
procedure TTestScanner.SetUp;
|
|
begin
|
|
Version:=v1;
|
|
end;
|
|
|
|
procedure TTestScanner.TearDown;
|
|
begin
|
|
FreeAndNil(FScanner);
|
|
end;
|
|
|
|
initialization
|
|
|
|
RegisterTest(TTestScanner);
|
|
end.
|
|
|