utcwitmodel.pp 16 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509
  1. {
  2. This file is part of the Free Component Library (FCL)
  3. Copyright (c) 2025 Michael Van Canneyt ([email protected])
  4. Test WIT model classes - mainly .ToString functionality.
  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 utcwitmodel;
  12. {$mode ObjFPC}{$H+}
  13. interface
  14. uses
  15. fpcunit, testregistry, Classes, SysUtils, WIT.Model;
  16. Type
  17. { TTestWITModel }
  18. TTestWITModel = class (TTestCase)
  19. private
  20. FEl: TWITBaseElement;
  21. Public
  22. Procedure SetUp; override;
  23. Procedure TearDown; override;
  24. // This will be freed at the end...
  25. property Element : TWITBaseElement Read FEl Write FEl;
  26. Published
  27. Procedure TestPackageToString;
  28. procedure TestUseToString;
  29. procedure TestFunctionTypeToString;
  30. procedure TestFunctionToString;
  31. Procedure TestWITTypeToString;
  32. Procedure TestTypeDefToString;
  33. Procedure TestListTypeToString;
  34. Procedure TestTupleTypeToString;
  35. Procedure TestOptionTypeToString;
  36. Procedure TestResultTypeToString;
  37. Procedure TestHandleTypeToString;
  38. Procedure TestFutureTypeToString;
  39. Procedure TestStreamTypeToString;
  40. procedure TestRecordFieldToString;
  41. Procedure TestRecordToString;
  42. Procedure TestEnumToString;
  43. Procedure TestFlagsToString;
  44. Procedure TestVariantToString;
  45. Procedure TestResourceToString;
  46. Procedure TestInterfaceToString;
  47. procedure TestExchangeIdentifier;
  48. Procedure TestIncludeToString;
  49. Procedure TestWorldToString;
  50. end;
  51. implementation
  52. { TTestWITModel }
  53. procedure TTestWITModel.SetUp;
  54. begin
  55. Inherited;
  56. FreeAndNil(FEl);
  57. end;
  58. procedure TTestWITModel.TearDown;
  59. begin
  60. FreeAndNil(FEl);
  61. Inherited;
  62. end;
  63. procedure TTestWITModel.TestPackageToString;
  64. var
  65. lPackage : TWITPackage;
  66. begin
  67. lPackage:=TWITPackage.Create;
  68. Element:=lPackage;
  69. lPackage.PackageName:='a';
  70. AssertEquals('Name','package a;',Element.ToString);
  71. lPackage.Namespace:='b';
  72. AssertEquals('NameSpace+Name','package b:a;',Element.ToString);
  73. lPackage.Version:='1.1.1';
  74. AssertEquals('NameSpace+Name+version','package b:[email protected];',Element.ToString);
  75. lPackage.Worlds.Add(TWITWorld.Create('d'));
  76. AssertEquals('world','package b:[email protected];'+sLineBreak+'world d {}'+sLineBreak,Element.ToString);
  77. lPackage.IsNested:=True;
  78. AssertEquals('world nested','package b:[email protected] {'+sLineBreak+'world d {}'+sLineBreak+'}'+sLineBreak,Element.ToString);
  79. lPackage.Worlds.Clear;
  80. AssertEquals('nested','package b:[email protected] {'+sLineBreak+'}'+sLineBreak,Element.ToString);
  81. end;
  82. procedure TTestWITModel.TestUseToString;
  83. var
  84. lUse : TWITTopLevelUse;
  85. begin
  86. lUse:=TWITTopLevelUse.Create;
  87. Element:=lUse;
  88. lUse.Path.PackageName:='a';
  89. AssertEquals('Name','use a;',Element.ToString);
  90. lUse.Path.Version:='1.1.1';
  91. AssertEquals('Name@ver','use [email protected];',Element.ToString);
  92. lUse.Path.Namespaces.Add('b');
  93. AssertEquals('Namespace:Name@ver','use b:[email protected];',Element.ToString);
  94. lUse.Path.Namespaces.Add('c');
  95. AssertEquals('double namespace','use b:c:[email protected];',Element.ToString);
  96. lUse.Rename:='d';
  97. AssertEquals('alias','use b:c:[email protected] as d;',Element.ToString);
  98. end;
  99. procedure TTestWITModel.TestInterfaceToString;
  100. var
  101. lIntf : TWITInterface;
  102. lUse : TWITUse;
  103. begin
  104. lIntf:=TWITInterface.Create('a');
  105. Element:=lIntf;
  106. AssertEquals('Name','interface a {}',Element.ToString);
  107. lIntf.AddType(TWITTypeDef.Create('b',TWitType.Create(wtu8)));
  108. AssertEquals('Type', 'interface a {'+sLinebreak
  109. +' type b = u8;'+sLinebreak
  110. +'}',Element.ToString);
  111. lIntf.AddType(TWITTypeDef.Create('c',TWitType.Create(wtu32)));
  112. AssertEquals('Two Types', 'interface a {'+sLinebreak
  113. +' type b = u8;'+sLinebreak
  114. +' type c = u32;'+sLinebreak
  115. +'}',Element.ToString);
  116. lIntf.AddFunction(TWITFunction.Create('d',TWitFunctionType.Create));
  117. AssertEquals('Type & func', 'interface a {'+sLinebreak
  118. +' type b = u8;'+sLinebreak
  119. +' type c = u32;'+sLinebreak
  120. +' d : func();'+sLinebreak
  121. +'}',Element.ToString);
  122. lUse:=TWITUse.Create;
  123. lUse.Path.PackageName:='e';
  124. LUse.AddItem('f');
  125. lIntf.AddUses(lUse);
  126. AssertEquals('Use, types and func', 'interface a {'+sLinebreak
  127. +' use e.{f};'+sLinebreak
  128. +' type b = u8;'+sLinebreak
  129. +' type c = u32;'+sLinebreak
  130. +' d : func();'+sLinebreak
  131. +'}',Element.ToString);
  132. end;
  133. procedure TTestWITModel.TestExchangeIdentifier;
  134. var
  135. lEx : TWITExchangeIdentifier;
  136. begin
  137. lEx:=TWITExchangeIdentifier.Create(xtImport,'a');
  138. Element:=lEx;
  139. AssertEquals('Import simple path','import a;',Element.ToString);
  140. lEx.Free;
  141. lEx:=TWITExchangeIdentifier.Create(xtExport,'a');
  142. Element:=lEx;
  143. AssertEquals('Export simple path','export a;',Element.ToString)
  144. end;
  145. procedure TTestWITModel.TestIncludeToString;
  146. var
  147. lInc : TWITInclude;
  148. lItm : TWitIncludeItem;
  149. begin
  150. lInc:=TWITInclude.Create;
  151. linc.Path.Identifier:='a';
  152. Element:=lInc;
  153. AssertEquals('Include simple path','include a;',Element.ToString);
  154. LItm:=TWitIncludeItem.Create('b');
  155. lInc.Items.Add(LItm);
  156. AssertEquals('Include item path','include a with {b}',Element.ToString)
  157. end;
  158. procedure TTestWITModel.TestWorldToString;
  159. var
  160. lWorld : TWITWorld;
  161. lUse : TWITUse;
  162. lInclude : TWITInclude;
  163. begin
  164. lWorld:=TWITWorld.Create('a');
  165. Element:=lWorld;
  166. AssertEquals('Name','world a {}',Element.ToString);
  167. lWorld.AddImport(TWITExchangeIdentifier.Create(xtImport,'b'));
  168. AssertEquals('Import', 'world a {'+sLinebreak
  169. +' import b;'+sLinebreak
  170. +'}',Element.ToString);
  171. lWorld.AddExport(TWITExchangeIdentifier.Create(xtExport,'c'));
  172. AssertEquals('Import/export', 'world a {'+sLinebreak
  173. +' import b;'+sLinebreak
  174. +' export c;'+sLinebreak
  175. +'}',Element.ToString);
  176. lWorld.AddTypeDef(TWITTypeDef.Create('d',TWitType.Create(wtU8)));
  177. AssertEquals('Type, Import, Export', 'world a {'+sLinebreak
  178. +' type d = u8;'+sLinebreak
  179. +' import b;'+sLinebreak
  180. +' export c;'+sLinebreak
  181. +'}',Element.ToString);
  182. lUse:=TWITUse.Create;
  183. lUse.Path.PackageName:='e';
  184. lUse.AddItem('f','g');
  185. lWorld.AddUses(lUse);
  186. AssertEquals('Use, Type, Import, Export', 'world a {'+sLinebreak
  187. +' use e.{f as g};'+sLinebreak
  188. +' type d = u8;'+sLinebreak
  189. +' import b;'+sLinebreak
  190. +' export c;'+sLinebreak
  191. +'}',Element.ToString);
  192. lInclude:=TWITInclude.Create;
  193. lInclude.Path.PackageName:='h';
  194. lWorld.AddINclude(lInclude);
  195. AssertEquals('include, Use, Type, Import, Export', 'world a {'+sLinebreak
  196. +' include h;'+sLinebreak
  197. +' use e.{f as g};'+sLinebreak
  198. +' type d = u8;'+sLinebreak
  199. +' import b;'+sLinebreak
  200. +' export c;'+sLinebreak
  201. +'}',Element.ToString);
  202. end;
  203. procedure TTestWITModel.TestFunctionTypeToString;
  204. var
  205. lFunc : TWITFunctionType;
  206. begin
  207. lFunc:=TWITFunctionType.Create;
  208. Element:=LFunc;
  209. AssertEquals('Empty','func()',Element.ToString);
  210. lFunc.Flags:=[ffConstructor];
  211. AssertEquals('constructor','constructor()',Element.ToString);
  212. lFunc.Flags:=[ffAsync];
  213. AssertEquals('Async','async func()',Element.ToString);
  214. lFunc.Flags:=[ffstatic];
  215. AssertEquals('Static','static func()',Element.ToString);
  216. lFunc.Flags:=[];
  217. lFunc.ResultType:=TWitType.Create(wts8);
  218. AssertEquals('Res','func() -> s8',Element.ToString);
  219. lFunc.Parameters.Add(TWitFuncParam.Create('b',TWITType.Create(wtu8)));
  220. AssertEquals('Res','func(b: u8) -> s8',Element.ToString);
  221. lFunc.Parameters.Add(TWitFuncParam.Create('c',TWITType.Create(wtu32)));
  222. AssertEquals('Res','func(b: u8, c: u32) -> s8',Element.ToString);
  223. end;
  224. procedure TTestWITModel.TestFunctionToString;
  225. var
  226. lFuncTyp : TWITFunctionType;
  227. lFunc : TWITFunction;
  228. begin
  229. lFuncTyp:=TWITFunctionType.Create;
  230. lFunc:=TWITFunction.Create('a',lFuncTyp);
  231. Element:=LFunc;
  232. AssertEquals('Empty','a : func();',Element.ToString);
  233. end;
  234. procedure TTestWITModel.TestWITTypeToString;
  235. var
  236. lType : TWITType;
  237. begin
  238. lType:=TWITType.Create(wtu32);
  239. Element:=lType;
  240. AssertEquals('Type','u32',lType.ToString);
  241. end;
  242. procedure TTestWITModel.TestTypeDefToString;
  243. var
  244. lType : TWITTypeDef;
  245. begin
  246. lType:=TWITTypeDef.Create('a',TWITType.Create(wtu32));
  247. Element:=lType;
  248. AssertEquals('Type','type a = u32;',lType.ToString);
  249. end;
  250. procedure TTestWITModel.TestListTypeToString;
  251. var
  252. lType : TWITListType;
  253. begin
  254. lType:=TWITListType.Create(TWITType.Create(wtu32));
  255. Element:=lType;
  256. AssertEquals('List type','list<u32>',lType.ToString);
  257. lType.ItemCount:=3;
  258. AssertEquals('List type','list<u32,3>',lType.ToString);
  259. end;
  260. procedure TTestWITModel.TestTupleTypeToString;
  261. var
  262. lType : TWITTupleType;
  263. begin
  264. lType:=TWITTupleType.Create;
  265. lType.AddItem(TWITType.Create(wtu32));
  266. Element:=lType;
  267. AssertEquals('Tuple type','tuple<u32>',lType.ToString);
  268. lType.AddItem(TWITType.Create(wtu8));
  269. AssertEquals('Tuple type 2','tuple<u32,u8>',lType.ToString);
  270. end;
  271. procedure TTestWITModel.TestOptionTypeToString;
  272. var
  273. lType : TWITOptionType;
  274. begin
  275. lType:=TWITOptionType.Create(TWITType.Create(wtu32));
  276. Element:=lType;
  277. AssertEquals('Option type','option<u32>',lType.ToString);
  278. end;
  279. procedure TTestWITModel.TestResultTypeToString;
  280. var
  281. lType : TWITResultType;
  282. begin
  283. lType:=TWITResultType.Create(TWITType.Create(wtu32),TWITType.Create(wtString));
  284. Element:=lType;
  285. AssertEquals('Result type','result<u32,string>',lType.ToString);
  286. end;
  287. procedure TTestWITModel.TestHandleTypeToString;
  288. var
  289. lType : TWITHandleType;
  290. begin
  291. lType:=TWITHandleType.Create('a',true);
  292. Element:=lType;
  293. AssertEquals('Handle type','borrow<a>',lType.ToString);
  294. lType.Free;
  295. lType:=TWITHandleType.Create('a',False);
  296. Element:=lType;
  297. AssertEquals('Handle type','own<a>',lType.ToString);
  298. end;
  299. procedure TTestWITModel.TestFutureTypeToString;
  300. var
  301. lType : TWITFutureType;
  302. begin
  303. lType:=TWITFutureType.Create(TWITType.Create(wtu32));
  304. Element:=lType;
  305. AssertEquals('future type','future<u32>',lType.ToString);
  306. end;
  307. procedure TTestWITModel.TestStreamTypeToString;
  308. var
  309. lType : TWITStreamType;
  310. begin
  311. lType:=TWITStreamType.Create(TWITType.Create(wtu32));
  312. Element:=lType;
  313. AssertEquals('Stream type','stream<u32>',lType.ToString);
  314. end;
  315. procedure TTestWITModel.TestRecordFieldToString;
  316. var
  317. lField : TWITRecordField;
  318. begin
  319. lField:=TWITRecordField.Create('fld',TWITType.Create(wtU64));
  320. Element:=lField;
  321. AssertEquals('Field','fld : u64',lField.ToString)
  322. end;
  323. procedure TTestWITModel.TestRecordToString;
  324. var
  325. lRecord : TWITRecordType;
  326. begin
  327. lRecord:=TWITRecordType.Create;
  328. Element:=lRecord;
  329. AssertEquals('Empty','record {}',lRecord.ToString);
  330. lRecord.AddField(TWITRecordField.Create('fld',TWITType.Create(wtU64)));
  331. AssertEquals('One field','record {'+sLineBreak
  332. +' fld : u64'+sLineBreak
  333. +'}',lRecord.ToString);
  334. lRecord.AddField(TWITRecordField.Create('fld2',TWITType.Create(wtString)));
  335. AssertEquals('Two fields','record {'+sLineBreak
  336. +' fld : u64,'+sLineBreak
  337. +' fld2 : string'+sLineBreak
  338. +'}',lRecord.ToString);
  339. Element:=TWITTypeDef.Create('a',lRecord);
  340. AssertEquals('Typedef','record a {'+sLineBreak
  341. +' fld : u64,'+sLineBreak
  342. +' fld2 : string'+sLineBreak
  343. +'}',Element.ToString);
  344. end;
  345. procedure TTestWITModel.TestEnumToString;
  346. var
  347. lEnum : TWITEnumType;
  348. begin
  349. lEnum:=TWITEnumType.Create;
  350. Element:=lEnum;
  351. AssertEquals('Empty','enum {}',lEnum.ToString);
  352. lEnum.AddCase('one');
  353. AssertEquals('One case','enum {'+sLineBreak
  354. +' one'+sLineBreak
  355. +'}',lEnum.ToString);
  356. lEnum.AddCase('two');
  357. AssertEquals('Two cases','enum {'+sLineBreak
  358. +' one,'+sLineBreak
  359. +' two'+sLineBreak
  360. +'}',lEnum.ToString);
  361. Element:=TWITTypeDef.Create('a',lEnum);
  362. AssertEquals('Typedef','enum a {'+sLineBreak
  363. +' one,'+sLineBreak
  364. +' two'+sLineBreak
  365. +'}',Element.ToString);
  366. end;
  367. procedure TTestWITModel.TestFlagsToString;
  368. var
  369. lFlags : TWITFlagsType;
  370. begin
  371. lFlags:=TWITFlagsType.Create;
  372. Element:=lFlags;
  373. AssertEquals('Empty','flags {}',lFlags.ToString);
  374. lFlags.AddFlag('one');
  375. AssertEquals('One flag','flags {'+sLineBreak
  376. +' one'+sLineBreak
  377. +'}',lFlags.ToString);
  378. lFlags.AddFlag('two');
  379. AssertEquals('Two cases','flags {'+sLineBreak
  380. +' one,'+sLineBreak
  381. +' two'+sLineBreak
  382. +'}',lFlags.ToString);
  383. Element:=TWITTypeDef.Create('a',lFlags);
  384. AssertEquals('Typedef','flags a {'+sLineBreak
  385. +' one,'+sLineBreak
  386. +' two'+sLineBreak
  387. +'}',Element.ToString);
  388. end;
  389. procedure TTestWITModel.TestVariantToString;
  390. var
  391. lVar : TWITVariantType;
  392. begin
  393. lVar:=TWITVariantType.Create;
  394. Element:=lVar;
  395. AssertEquals('Empty','variant {}',Element.ToString);
  396. lVar.AddCase(TWitVariantCase.Create('one'));
  397. AssertEquals('One flag','variant {'+sLineBreak
  398. +' one'+sLineBreak
  399. +'}',Element.ToString);
  400. lVar.AddCase(TWitVariantCase.Create('two'));
  401. AssertEquals('Two cases','variant {'+sLineBreak
  402. +' one,'+sLineBreak
  403. +' two'+sLineBreak
  404. +'}',Element.ToString);
  405. lVar.AddCase(TWitVariantCase.Create('three',TWitType.Create(wtu8)));
  406. AssertEquals('Two cases','variant {'+sLineBreak
  407. +' one,'+sLineBreak
  408. +' two,'+sLineBreak
  409. +' three(u8)'+sLineBreak
  410. +'}',Element.ToString);
  411. Element:=TWITTypeDef.Create('a',lVar);
  412. AssertEquals('Typedef','variant a {'+sLineBreak
  413. +' one,'+sLineBreak
  414. +' two,'+sLineBreak
  415. +' three(u8)'+sLineBreak
  416. +'}',Element.ToString);
  417. end;
  418. procedure TTestWITModel.TestResourceToString;
  419. var
  420. lRes : TWITResourceType;
  421. lFunc : TWITFunction;
  422. lFuncType : TWITFunctionType;
  423. begin
  424. lRes:=TWITResourceType.Create('a');
  425. Element:=lRes;
  426. AssertEquals('empty','resource a;',Element.ToString);
  427. lFuncType:=TWITFunctionType.Create;
  428. lFuncType.Flags:=[ffConstructor];
  429. lFunc:=TWITFunction.Create('constructor',lFuncType);
  430. lRes.Functions.Add(lFunc);
  431. AssertEquals('empty','resource a {'+sLineBreak
  432. +' constructor();'+sLineBreak
  433. +'}',Element.ToString);
  434. lFuncType:=TWITFunctionType.Create;
  435. lFuncType.ResultType:=TWitType.Create(wtU8);
  436. lFunc:=TWITFunction.Create('b',lFuncType);
  437. lRes.Functions.Add(lFunc);
  438. AssertEquals('empty','resource a {'+sLineBreak
  439. +' constructor();'+sLineBreak
  440. +' b : func() -> u8;'+sLineBreak
  441. +'}',Element.ToString);
  442. end;
  443. initialization
  444. RegisterTest(TTestWITModel);
  445. end.