tcidlscanner.pp 12 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577
  1. unit tcidlscanner;
  2. {$mode objfpc}{$H+}
  3. interface
  4. uses
  5. Classes, SysUtils, fpcunit, testutils, testregistry, webidlscanner;
  6. type
  7. { TTestScanner }
  8. TTestScanner= class(TTestCase)
  9. private
  10. FScanner: TWebIDLScanner;
  11. FVersion: TWEbIDLversion;
  12. procedure SetVersion(AValue: TWEbIDLversion);
  13. protected
  14. procedure Init(Const aSource : string);
  15. Class Procedure AssertEquals(Msg : String; AExpected,AActual : TIDLToken); overload;
  16. Procedure TestSingle(Const aSource : String; AToken : TIDLToken);
  17. Procedure TestMulti(Const aSource : String; AToken : Array of TIDLToken);
  18. Procedure TestSingle(Const aSource : String; AToken : TIDLToken; AValue : String);
  19. Procedure TestMulti(Const aSource : String; AToken : Array of TIDLToken; AValues : Array of String);
  20. procedure SetUp; override;
  21. procedure TearDown; override;
  22. Property Scanner : TWebIDLScanner Read FScanner;
  23. Property Version : TWEbIDLversion Read FVersion Write SetVersion;
  24. published
  25. procedure TestHookUp;
  26. Procedure TestComment;
  27. Procedure TestWhitespace;
  28. Procedure TestString;
  29. Procedure TestNumberInteger;
  30. Procedure TestNumberFloat;
  31. Procedure TestNumberHex;
  32. Procedure TestNumberHex2;
  33. // Simple (one-character) tokens
  34. Procedure TestComma; // ','
  35. Procedure TestColon; // ':'
  36. Procedure TestBracketOpen; // '('
  37. Procedure TestBracketClose; // ')'
  38. Procedure TestCurlyBraceOpen; // '{'
  39. Procedure TestCurlyBraceClose; // '}'
  40. Procedure TestSquaredBraceOpen; // '['
  41. Procedure TestSquaredBraceClose; // ']'
  42. Procedure TestIdentifier; // Any identifier
  43. Procedure TestDot; // '.',
  44. Procedure TestSemicolon;// ';',
  45. Procedure TestLess;// '<',
  46. Procedure TestEqual;// '=',
  47. Procedure TestLarger;// '=',
  48. Procedure TestQuestionMark;// '?',
  49. Procedure TestMinus;// '-',
  50. Procedure TestOther;// 'other',
  51. Procedure Testshort;// 'other',
  52. Procedure TestTrue;
  53. Procedure TestFalse;
  54. Procedure TestNull;
  55. Procedure TestAny;
  56. Procedure TestAttribute;
  57. Procedure TestCallback;
  58. Procedure TestConst;
  59. Procedure TestDeleter;
  60. Procedure TestDictionary;
  61. Procedure TestEllipsis;
  62. Procedure TestEnum;
  63. Procedure TestGetter;
  64. Procedure TestImplements;
  65. Procedure TestMapLike;
  66. Procedure TestSetLike;
  67. Procedure TestRecord;
  68. Procedure TestInfinity;
  69. Procedure TestInherit;
  70. Procedure TestInterface;
  71. Procedure TestIterable;
  72. Procedure TestLegacyCaller;
  73. Procedure TestNan;
  74. Procedure TestNegInfinity;
  75. Procedure TestOptional;
  76. Procedure TestOr;
  77. Procedure TestPartial;
  78. Procedure TestReadOnly;
  79. Procedure TestRequired;
  80. Procedure TestSetter;
  81. Procedure TestStatic;
  82. Procedure TestStringifier;
  83. Procedure TestTypedef;
  84. Procedure TestUnrestricted;
  85. Procedure TestPromise;
  86. Procedure TestByteString;
  87. Procedure TestDOMString;
  88. Procedure TestUSVString;
  89. Procedure Testboolean;
  90. Procedure Testbyte;
  91. Procedure Testdouble;
  92. Procedure Testfloat;
  93. Procedure Testlong;
  94. Procedure Testobject;
  95. Procedure Testoctet;
  96. Procedure Testunsigned;
  97. Procedure Testvoid;
  98. end;
  99. implementation
  100. uses typinfo;
  101. procedure TTestScanner.TestHookUp;
  102. begin
  103. Init('');
  104. AssertNotNull('Have scanner',Scanner);
  105. end;
  106. procedure TTestScanner.TestComment;
  107. begin
  108. TestSingle('// me',tkComment);
  109. end;
  110. procedure TTestScanner.TestWhitespace;
  111. begin
  112. TestSingle('',tkWhitespace);
  113. end;
  114. procedure TTestScanner.TestString;
  115. begin
  116. TestSingle('"abcd"',webidlscanner.tkString,'abcd');
  117. end;
  118. procedure TTestScanner.TestNumberInteger;
  119. begin
  120. TestSingle('123',tkNumberInteger,'123');
  121. end;
  122. procedure TTestScanner.TestNumberFloat;
  123. begin
  124. TestSingle('1.23',tkNumberFloat,'1.23');
  125. end;
  126. procedure TTestScanner.TestNumberHex;
  127. begin
  128. TestSingle('0xABCDEF',tkNumberInteger,'0xABCDEF');
  129. end;
  130. procedure TTestScanner.TestNumberHex2;
  131. begin
  132. // E is special
  133. TestSingle('0xABCDE',tkNumberInteger,'0xABCDE');
  134. end;
  135. procedure TTestScanner.TestComma;
  136. begin
  137. TestSingle(',',tkComma);
  138. end;
  139. procedure TTestScanner.TestColon;
  140. begin
  141. TestSingle(':',tkColon);
  142. end;
  143. procedure TTestScanner.TestBracketOpen;
  144. begin
  145. TestSingle('(',tkBracketOpen);
  146. end;
  147. procedure TTestScanner.TestBracketClose;
  148. begin
  149. TestSingle(')',tkBracketClose);
  150. end;
  151. procedure TTestScanner.TestCurlyBraceOpen;
  152. begin
  153. TestSingle('{',tkCurlyBraceOpen);
  154. end;
  155. procedure TTestScanner.TestCurlyBraceClose;
  156. begin
  157. TestSingle('}',tkCurlyBraceClose);
  158. end;
  159. procedure TTestScanner.TestSquaredBraceOpen;
  160. begin
  161. TestSingle('[',tkSquaredBraceOpen);
  162. end;
  163. procedure TTestScanner.TestSquaredBraceClose;
  164. begin
  165. TestSingle(']',tkSquaredBraceClose);
  166. end;
  167. procedure TTestScanner.TestIdentifier;
  168. begin
  169. TestSingle('A',tkIdentifier,'A');
  170. end;
  171. procedure TTestScanner.TestDot;
  172. begin
  173. TestSingle('.',tkDot);
  174. end;
  175. procedure TTestScanner.TestSemicolon;
  176. begin
  177. TestSingle(';',tkSemiColon);
  178. end;
  179. procedure TTestScanner.TestLess;
  180. begin
  181. TestSingle('<',tkLess);
  182. end;
  183. procedure TTestScanner.TestEqual;
  184. begin
  185. TestSingle('=',tkEqual);
  186. end;
  187. procedure TTestScanner.TestLarger;
  188. begin
  189. TestSingle('>',tkLarger);
  190. end;
  191. procedure TTestScanner.TestQuestionMark;
  192. begin
  193. TestSingle('?',tkQuestionMark);
  194. end;
  195. procedure TTestScanner.TestMinus;
  196. begin
  197. TestSingle('-',tkMinus);
  198. end;
  199. procedure TTestScanner.TestOther;
  200. begin
  201. TestSingle('other',tkOther);
  202. end;
  203. procedure TTestScanner.Testshort;
  204. begin
  205. TestSingle('short',tkShort);
  206. end;
  207. procedure TTestScanner.TestTrue;
  208. begin
  209. TestSingle('true',tkTrue);
  210. end;
  211. procedure TTestScanner.TestFalse;
  212. begin
  213. TestSingle('false',tkFalse);
  214. end;
  215. procedure TTestScanner.TestNull;
  216. begin
  217. TestSingle('null',tkNull);
  218. end;
  219. procedure TTestScanner.TestAny;
  220. begin
  221. TestSingle('any',webidlscanner.tkAny);
  222. end;
  223. procedure TTestScanner.TestAttribute;
  224. begin
  225. TestSingle('attribute',tkAttribute);
  226. end;
  227. procedure TTestScanner.TestCallback;
  228. begin
  229. TestSingle('callback',tkCallBack);
  230. end;
  231. procedure TTestScanner.TestConst;
  232. begin
  233. TestSingle('const',tkConst);
  234. end;
  235. procedure TTestScanner.TestDeleter;
  236. begin
  237. TestSingle('deleter',tkDeleter);
  238. end;
  239. procedure TTestScanner.TestDictionary;
  240. begin
  241. TestSingle('dictionary',tkDictionary);
  242. end;
  243. procedure TTestScanner.TestEllipsis;
  244. begin
  245. TestSingle('ellipsis',tkellipsis);
  246. end;
  247. procedure TTestScanner.TestEnum;
  248. begin
  249. TestSingle('enum',tkenum);
  250. end;
  251. procedure TTestScanner.TestGetter;
  252. begin
  253. TestSingle('getter',tkgetter);
  254. end;
  255. procedure TTestScanner.TestImplements;
  256. begin
  257. TestSingle('implements',tkimplements);
  258. Version:=v2;
  259. TestSingle('implements',tkIdentifier);
  260. end;
  261. procedure TTestScanner.TestMapLike;
  262. begin
  263. Version:=v2;
  264. TestSingle('maplike',tkmaplike);
  265. Version:=v1;
  266. TestSingle('maplike',tkIdentifier);
  267. end;
  268. procedure TTestScanner.TestSetLike;
  269. begin
  270. Version:=v2;
  271. TestSingle('setlike',tkSetlike);
  272. Version:=v1;
  273. TestSingle('setlike',tkIdentifier);
  274. end;
  275. procedure TTestScanner.TestRecord;
  276. begin
  277. Version:=v2;
  278. TestSingle('record',webidlscanner.tkRecord);
  279. Version:=v1;
  280. TestSingle('record',tkIdentifier);
  281. end;
  282. procedure TTestScanner.TestInfinity;
  283. begin
  284. TestSingle('Infinity',tkinfinity);
  285. end;
  286. procedure TTestScanner.TestInherit;
  287. begin
  288. TestSingle('inherit',tkinherit);
  289. end;
  290. procedure TTestScanner.TestInterface;
  291. begin
  292. TestSingle('interface',webidlscanner.tkinterface);
  293. end;
  294. procedure TTestScanner.TestIterable;
  295. begin
  296. TestSingle('iterable',tkiterable);
  297. end;
  298. procedure TTestScanner.TestLegacyCaller;
  299. begin
  300. TestSingle('legacycaller',tklegacycaller);
  301. end;
  302. procedure TTestScanner.TestNan;
  303. begin
  304. TestSingle('NaN',tkNan);
  305. end;
  306. procedure TTestScanner.TestNegInfinity;
  307. begin
  308. TestSingle('-Infinity',tkneginfinity);
  309. end;
  310. procedure TTestScanner.TestOptional;
  311. begin
  312. TestSingle('optional',tkoptional);
  313. end;
  314. procedure TTestScanner.TestOr;
  315. begin
  316. TestSingle('or',tkOR);
  317. end;
  318. procedure TTestScanner.TestPartial;
  319. begin
  320. TestSingle('partial',tkPartial);
  321. end;
  322. procedure TTestScanner.TestReadOnly;
  323. begin
  324. TestSingle('readonly',tkreadonly);
  325. end;
  326. procedure TTestScanner.TestRequired;
  327. begin
  328. TestSingle('required',tkrequired);
  329. end;
  330. procedure TTestScanner.TestSetter;
  331. begin
  332. TestSingle('setter',tksetter);
  333. end;
  334. procedure TTestScanner.TestStatic;
  335. begin
  336. TestSingle('static',tkstatic);
  337. end;
  338. procedure TTestScanner.TestStringifier;
  339. begin
  340. TestSingle('stringifier',tkstringifier);
  341. end;
  342. procedure TTestScanner.TestTypedef;
  343. begin
  344. TestSingle('typedef',tktypeDef);
  345. end;
  346. procedure TTestScanner.TestUnrestricted;
  347. begin
  348. TestSingle('unrestricted',tkunrestricted);
  349. end;
  350. procedure TTestScanner.TestPromise;
  351. begin
  352. TestSingle('Promise',tkpromise);
  353. end;
  354. procedure TTestScanner.TestByteString;
  355. begin
  356. TestSingle('ByteString',tkBytestring);
  357. end;
  358. procedure TTestScanner.TestDOMString;
  359. begin
  360. TestSingle('DOMString',tkDOMstring);
  361. end;
  362. procedure TTestScanner.TestUSVString;
  363. begin
  364. TestSingle('USVString',tkUSVString);
  365. end;
  366. procedure TTestScanner.Testboolean;
  367. begin
  368. TestSingle('boolean',tkBoolean);
  369. end;
  370. procedure TTestScanner.Testbyte;
  371. begin
  372. TestSingle('byte',tkByte);
  373. end;
  374. procedure TTestScanner.Testdouble;
  375. begin
  376. TestSingle('double',webidlscanner.tkDouble);
  377. end;
  378. procedure TTestScanner.Testfloat;
  379. begin
  380. TestSingle('float',webidlscanner.tkfloat);
  381. end;
  382. procedure TTestScanner.Testlong;
  383. begin
  384. TestSingle('long',tklong);
  385. end;
  386. procedure TTestScanner.Testobject;
  387. begin
  388. TestSingle('object',webidlscanner.tkObject);
  389. end;
  390. procedure TTestScanner.Testoctet;
  391. begin
  392. TestSingle('octet',tkOctet);
  393. end;
  394. procedure TTestScanner.Testunsigned;
  395. begin
  396. TestSingle('unsigned',tkUnsigned);
  397. end;
  398. procedure TTestScanner.Testvoid;
  399. begin
  400. TestSingle('void',tkVoid);
  401. end;
  402. procedure TTestScanner.SetVersion(AValue: TWEbIDLversion);
  403. begin
  404. if FVersion=AValue then Exit;
  405. FVersion:=AValue;
  406. if Assigned(FScanner) then
  407. FScanner.Version:=FVersion;
  408. end;
  409. procedure TTestScanner.Init(const aSource: string);
  410. begin
  411. FreeAndNil(FScanner);
  412. FScanner:=TWebIDLScanner.Create(aSource);
  413. FScanner.Version:=FVersion;
  414. end;
  415. class procedure TTestScanner.AssertEquals(Msg: String; AExpected,AActual: TIDLToken);
  416. begin
  417. AssertEQuals(Msg,GetEnumName(TypeInfo(TIDLToken),Ord(AExpected)),GetEnumName(TypeInfo(TIDLToken),Ord(AActual)));
  418. end;
  419. procedure TTestScanner.TestSingle(const aSource: String; AToken: TIDLToken);
  420. begin
  421. TestMulti(aSource,[aToken]);
  422. end;
  423. procedure TTestScanner.TestMulti(const aSource: String;
  424. AToken: array of TIDLToken);
  425. Var
  426. I : Integer;
  427. t : TIDLToken;
  428. begin
  429. Init(ASource);
  430. I:=0;
  431. Repeat
  432. t:=Scanner.FetchToken;
  433. If T<>tkEOF then
  434. begin
  435. If I>High(AToken) then
  436. Fail(Format('"%s": Too many tokens in source (got: %d, expected: %d)',[aSource,I+1,High(aToken)+1]));
  437. AssertEquals('"'+ASource+'": token '+IntToStr(I),AToken[I],T);
  438. Inc(I);
  439. end
  440. Until (t=tkEOF);
  441. If I<High(AToken) then
  442. Fail('"'+ASource+'": Too little tokens in source');
  443. end;
  444. procedure TTestScanner.TestSingle(const aSource: String; AToken: TIDLToken;
  445. AValue: String);
  446. begin
  447. TestMulti(aSource,[aToken],[aValue]);
  448. end;
  449. procedure TTestScanner.TestMulti(const aSource: String;
  450. AToken: array of TIDLToken; AValues: array of String);
  451. Var
  452. I : Integer;
  453. t : TIDLToken;
  454. begin
  455. Init(ASource);
  456. I:=0;
  457. Repeat
  458. t:=Scanner.FetchToken;
  459. If T<>tkEOF then
  460. begin
  461. If I>High(AToken) then
  462. Fail(Format('"%s": Too many tokens in source (got: %d, expected: %d)',[aSource,I+1,High(aToken)+1]));
  463. AssertEquals('"'+ASource+'": token '+IntToStr(I),AToken[I],T);
  464. AssertEquals('"'+ASource+'": String '+IntToStr(I),AValues[I],FScanner.CurTokenString);
  465. Inc(I);
  466. end
  467. Until (t=tkEOF);
  468. If I<High(AToken) then
  469. Fail('"'+ASource+'": Too little tokens in source');
  470. end;
  471. procedure TTestScanner.SetUp;
  472. begin
  473. Version:=v1;
  474. end;
  475. procedure TTestScanner.TearDown;
  476. begin
  477. FreeAndNil(FScanner);
  478. end;
  479. initialization
  480. RegisterTest(TTestScanner);
  481. end.