utcwitscanner.pp 9.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466
  1. {
  2. This file is part of the Free Component Library (FCL)
  3. Copyright (c) 2025 Michael Van Canneyt ([email protected])
  4. Test WIT scanner
  5. See the file COPYING.FPC, included in this distribution,
  6. for details about the copyright.
  7. This program is distributed in the hope that it will be useful,
  8. but WITHOUT ANY WARRANTY; without even the implied warranty of
  9. MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
  10. **********************************************************************}
  11. unit utcwitscanner;
  12. interface
  13. uses
  14. TestUtils, FPCUnit, Classes, SysUtils, testregistry, streamex, WIT.Scanner;
  15. type
  16. { TWITScannerTests }
  17. TWITScannerTests = class(TTestCase)
  18. Private
  19. FToken: TToken;
  20. protected
  21. Procedure TestToken(aSource: string; aToken: TTokenType);
  22. public
  23. Procedure SetUp; override;
  24. class procedure AssertEquals(Msg : string; aExpected,aActual : TTokenType); overload;
  25. published
  26. procedure TestUnknown;
  27. procedure TestWhitespace;
  28. procedure TestEOF;
  29. procedure TestOpenRoundBrace;
  30. procedure TestCloseRoundBrace;
  31. procedure TestOpenCurlyBrace;
  32. procedure TestCloseCurlyBrace;
  33. procedure TestOpenSquareBrace;
  34. procedure TestCloseSquareBrace;
  35. procedure TestColon;
  36. procedure TestSemicolon;
  37. procedure TestComma;
  38. procedure TestEqual;
  39. procedure TestDot;
  40. procedure TestPlus;
  41. procedure TestMinus;
  42. procedure TestStar;
  43. procedure TestDiv;
  44. procedure TestLessThan;
  45. procedure TestGreaterThan;
  46. procedure TestAt;
  47. procedure TestArrow;
  48. procedure TestNumber;
  49. procedure TestString;
  50. procedure TestInterface;
  51. procedure TestRecord;
  52. procedure TestFlags;
  53. procedure TestEnum;
  54. procedure TestType;
  55. procedure TestResource;
  56. procedure TestImport;
  57. procedure TestExport;
  58. procedure TestUse;
  59. procedure TestWorld;
  60. procedure TestPackage;
  61. procedure TestAs;
  62. procedure TestAsync;
  63. procedure TestBool;
  64. procedure TestBorrow;
  65. procedure TestChar;
  66. procedure TestConstructor;
  67. procedure TestFrom;
  68. procedure TestFunc;
  69. procedure TestFuture;
  70. procedure TestInclude;
  71. procedure TestList;
  72. procedure TestOption;
  73. procedure TestOwn;
  74. procedure TestResult;
  75. procedure TestStatic;
  76. procedure TestStream;
  77. procedure TestStringKW;
  78. procedure TestTuple;
  79. procedure TestVariant;
  80. procedure TestWith;
  81. procedure TestIdentifier;
  82. procedure TestIdentifierEscapedKeyword;
  83. procedure TestIdentifierDash;
  84. Procedure TestSingleComment;
  85. Procedure TestMultiComment;
  86. Procedure TestMultiComment2;
  87. Procedure TestMultiCommentNested;
  88. end;
  89. implementation
  90. uses TypInfo;
  91. { TWITScannerTests }
  92. procedure TWITScannerTests.TestToken(aSource: string; aToken: TTokenType);
  93. var
  94. Scanner: TWITScanner;
  95. Reader: TTextReader;
  96. lToken : TToken;
  97. begin
  98. Reader := TStringReader.Create(aSource);
  99. try
  100. Scanner := TWITScanner.Create(Reader);
  101. try
  102. Reader:=nil;
  103. FToken := Scanner.GetToken;
  104. AssertEquals('Token type mismatch', aToken, FToken.TokenType);
  105. if FToken.TokenType<>ttEOF then
  106. begin
  107. LToken := Scanner.GetToken;
  108. AssertEquals('EOF reached',ttEOF,lToken.TokenType);
  109. end;
  110. finally
  111. Scanner.Free;
  112. end;
  113. finally
  114. Reader.Free;
  115. end;
  116. end;
  117. procedure TWITScannerTests.SetUp;
  118. begin
  119. inherited SetUp;
  120. FToken:=Default(TToken);
  121. end;
  122. class procedure TWITScannerTests.AssertEquals(Msg: string; aExpected,
  123. aActual: TTokenType);
  124. begin
  125. AssertEquals(Msg,GetEnumName(TypeInfo(TTokenType),ord(aExpected)),
  126. GetEnumName(TypeInfo(TTokenType),ord(aActual)));
  127. end;
  128. procedure TWITScannerTests.TestUnknown;
  129. begin
  130. TestToken('?', ttUnknown);
  131. end;
  132. procedure TWITScannerTests.TestWhitespace;
  133. begin
  134. TestToken(' ', ttWhitespace);
  135. end;
  136. procedure TWITScannerTests.TestEOF;
  137. begin
  138. TestToken('', ttEOF);
  139. end;
  140. procedure TWITScannerTests.TestOpenRoundBrace;
  141. begin
  142. TestToken('(', ttOpenRoundBrace);
  143. end;
  144. procedure TWITScannerTests.TestCloseRoundBrace;
  145. begin
  146. TestToken(')', ttCloseRoundBrace);
  147. end;
  148. procedure TWITScannerTests.TestOpenCurlyBrace;
  149. begin
  150. TestToken('{', ttOpenCurlyBrace);
  151. end;
  152. procedure TWITScannerTests.TestCloseCurlyBrace;
  153. begin
  154. TestToken('}', ttCloseCurlyBrace);
  155. end;
  156. procedure TWITScannerTests.TestOpenSquareBrace;
  157. begin
  158. TestToken('[', ttOpenSquareBrace);
  159. end;
  160. procedure TWITScannerTests.TestCloseSquareBrace;
  161. begin
  162. TestToken(']', ttCLoseSquareBrace);
  163. end;
  164. procedure TWITScannerTests.TestColon;
  165. begin
  166. TestToken(':', ttColon);
  167. end;
  168. procedure TWITScannerTests.TestSemicolon;
  169. begin
  170. TestToken(';', ttSemicolon);
  171. end;
  172. procedure TWITScannerTests.TestComma;
  173. begin
  174. TestToken(',', ttComma);
  175. end;
  176. procedure TWITScannerTests.TestEqual;
  177. begin
  178. TestToken('=', ttEqual);
  179. end;
  180. procedure TWITScannerTests.TestDot;
  181. begin
  182. TestToken('.', ttDot);
  183. end;
  184. procedure TWITScannerTests.TestPlus;
  185. begin
  186. TestToken('+', ttPlus);
  187. end;
  188. procedure TWITScannerTests.TestMinus;
  189. begin
  190. TestToken('-', ttMinus);
  191. end;
  192. procedure TWITScannerTests.TestStar;
  193. begin
  194. TestToken('*', ttStar);
  195. end;
  196. procedure TWITScannerTests.TestDiv;
  197. begin
  198. TestToken('/', ttDiv);
  199. end;
  200. procedure TWITScannerTests.TestLessThan;
  201. begin
  202. TestToken('<', ttLessThan);
  203. end;
  204. procedure TWITScannerTests.TestGreaterThan;
  205. begin
  206. TestToken('>', ttGreaterThan);
  207. end;
  208. procedure TWITScannerTests.TestAt;
  209. begin
  210. TestToken('@', ttAt);
  211. end;
  212. procedure TWITScannerTests.TestArrow;
  213. begin
  214. TestToken('->', ttArrow);
  215. end;
  216. procedure TWITScannerTests.TestNumber;
  217. begin
  218. TestToken('123', ttNumber);
  219. end;
  220. procedure TWITScannerTests.TestString;
  221. begin
  222. TestToken('"test"', ttStringLiteral);
  223. end;
  224. procedure TWITScannerTests.TestInterface;
  225. begin
  226. TestToken('interface', ttInterface);
  227. end;
  228. procedure TWITScannerTests.TestRecord;
  229. begin
  230. TestToken('record', ttRecord);
  231. end;
  232. procedure TWITScannerTests.TestFlags;
  233. begin
  234. TestToken('flags', ttFlags);
  235. end;
  236. procedure TWITScannerTests.TestEnum;
  237. begin
  238. TestToken('enum', ttEnum);
  239. end;
  240. procedure TWITScannerTests.TestType;
  241. begin
  242. TestToken('type', ttType);
  243. end;
  244. procedure TWITScannerTests.TestResource;
  245. begin
  246. TestToken('resource', ttResource);
  247. end;
  248. procedure TWITScannerTests.TestImport;
  249. begin
  250. TestToken('import', ttImport);
  251. end;
  252. procedure TWITScannerTests.TestExport;
  253. begin
  254. TestToken('export', ttExport);
  255. end;
  256. procedure TWITScannerTests.TestUse;
  257. begin
  258. TestToken('use', ttUse);
  259. end;
  260. procedure TWITScannerTests.TestWorld;
  261. begin
  262. TestToken('world', ttWorld);
  263. end;
  264. procedure TWITScannerTests.TestPackage;
  265. begin
  266. TestToken('package', ttPackage);
  267. end;
  268. procedure TWITScannerTests.TestAs;
  269. begin
  270. TestToken('as', ttAs);
  271. end;
  272. procedure TWITScannerTests.TestAsync;
  273. begin
  274. TestToken('async', ttAsync);
  275. end;
  276. procedure TWITScannerTests.TestBool;
  277. begin
  278. TestToken('bool', ttBool);
  279. end;
  280. procedure TWITScannerTests.TestBorrow;
  281. begin
  282. TestToken('borrow', ttBorrow);
  283. end;
  284. procedure TWITScannerTests.TestChar;
  285. begin
  286. TestToken('char', ttChar);
  287. end;
  288. procedure TWITScannerTests.TestConstructor;
  289. begin
  290. TestToken('constructor', ttConstructor);
  291. end;
  292. procedure TWITScannerTests.TestFrom;
  293. begin
  294. TestToken('from', ttFrom);
  295. end;
  296. procedure TWITScannerTests.TestFunc;
  297. begin
  298. TestToken('func', ttFunc);
  299. end;
  300. procedure TWITScannerTests.TestFuture;
  301. begin
  302. TestToken('future', ttFuture);
  303. end;
  304. procedure TWITScannerTests.TestInclude;
  305. begin
  306. TestToken('include', ttInclude);
  307. end;
  308. procedure TWITScannerTests.TestList;
  309. begin
  310. TestToken('list', ttList);
  311. end;
  312. procedure TWITScannerTests.TestOption;
  313. begin
  314. TestToken('option', ttOption);
  315. end;
  316. procedure TWITScannerTests.TestOwn;
  317. begin
  318. TestToken('own', ttOwn);
  319. end;
  320. procedure TWITScannerTests.TestResult;
  321. begin
  322. TestToken('result', ttResult);
  323. end;
  324. procedure TWITScannerTests.TestStatic;
  325. begin
  326. TestToken('static', ttStatic);
  327. end;
  328. procedure TWITScannerTests.TestStream;
  329. begin
  330. TestToken('stream', ttStream);
  331. end;
  332. procedure TWITScannerTests.TestStringKW;
  333. begin
  334. TestToken('string', ttStringType);
  335. end;
  336. procedure TWITScannerTests.TestTuple;
  337. begin
  338. TestToken('tuple', ttTuple);
  339. end;
  340. procedure TWITScannerTests.TestVariant;
  341. begin
  342. TestToken('variant', ttVariant);
  343. end;
  344. procedure TWITScannerTests.TestWith;
  345. begin
  346. TestToken('with', ttWith);
  347. end;
  348. procedure TWITScannerTests.TestIdentifier;
  349. begin
  350. TestToken('myIdentifier', ttIdentifier);
  351. end;
  352. procedure TWITScannerTests.TestIdentifierEscapedKeyword;
  353. begin
  354. TestToken('%with', ttIdentifier);
  355. AssertEquals('Escape not part of token','with',FToken.Value);
  356. end;
  357. procedure TWITScannerTests.TestIdentifierDash;
  358. begin
  359. TestToken('ali-baba', ttIdentifier);
  360. AssertEquals('dash part of token','ali-baba',FToken.Value);
  361. end;
  362. procedure TWITScannerTests.TestSingleComment;
  363. begin
  364. TestToken('// A comment', ttComment);
  365. AssertEquals('Comment',' A comment',FToken.Value);
  366. end;
  367. procedure TWITScannerTests.TestMultiComment;
  368. begin
  369. TestToken('/* A comment*/', ttComment);
  370. AssertEquals('Comment',' A comment',FToken.Value);
  371. end;
  372. procedure TWITScannerTests.TestMultiComment2;
  373. begin
  374. TestToken('/* A'#10'comment*/', ttComment);
  375. AssertEquals('Comment',' A'#10'comment',FToken.Value);
  376. end;
  377. procedure TWITScannerTests.TestMultiCommentNested;
  378. begin
  379. TestToken('/* A /* second */ comment*/', ttComment);
  380. AssertEquals('Comment',' A /* second */ comment',FToken.Value);
  381. end;
  382. initialization
  383. RegisterTest(TWITScannerTests);
  384. end.