tcwebidl2wasmjob.pas 36 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095109610971098109911001101110211031104110511061107110811091110111111121113111411151116111711181119112011211122112311241125112611271128112911301131113211331134113511361137113811391140114111421143114411451146114711481149115011511152115311541155115611571158115911601161116211631164116511661167116811691170117111721173117411751176117711781179118011811182118311841185118611871188118911901191119211931194119511961197119811991200120112021203120412051206120712081209121012111212121312141215121612171218121912201221122212231224122512261227122812291230123112321233123412351236123712381239124012411242124312441245124612471248124912501251125212531254125512561257125812591260126112621263126412651266126712681269127012711272127312741275127612771278127912801281128212831284128512861287128812891290129112921293129412951296129712981299130013011302130313041305130613071308130913101311131213131314131513161317131813191320132113221323132413251326132713281329133013311332133313341335133613371338133913401341134213431344134513461347134813491350135113521353135413551356135713581359136013611362136313641365136613671368136913701371
  1. unit tcwebidl2wasmjob;
  2. {$mode ObjFPC}{$H+}
  3. interface
  4. uses
  5. Classes, SysUtils, fpcunit, testregistry, webidlscanner, webidltowasmjob, pascodegen;
  6. type
  7. { TCustomTestWebIDL2WasmJob }
  8. TCustomTestWebIDL2WasmJob = Class(TTestCase)
  9. private
  10. FHeaderSrc: TIDLString;
  11. FWebIDLToPas: TWebIDLToPasWasmJob;
  12. procedure OnLog(Sender: TObject; LogType: TCodegenLogType; const Msg: String
  13. );
  14. protected
  15. procedure Setup; override;
  16. procedure TearDown; override;
  17. public
  18. procedure TestWebIDL(const WebIDLSrc, ExpectedPascalSrc: array of string); virtual;
  19. procedure CheckDiff(Msg, Expected, Actual: string); virtual;
  20. property WebIDLToPas: TWebIDLToPasWasmJob read FWebIDLToPas;
  21. property HeaderSrc: TIDLString read FHeaderSrc write FHeaderSrc;
  22. end;
  23. { TTestWebIDL2WasmJob }
  24. TTestWebIDL2WasmJob = Class(TCustomTestWebIDL2WasmJob)
  25. published
  26. procedure TestWJ_Empty;
  27. // typedefs
  28. procedure TestWJ_Typedef_Boolean;
  29. procedure TestWJ_Typedef_Sequence;
  30. procedure TestWJ_Typedef_Aliased;
  31. // attributes
  32. procedure TestWJ_IntfAttribute_Boolean;
  33. procedure TestWJ_IntfStringifier;
  34. procedure TestWJ_IntfAttribute_ArrayBuffer;
  35. procedure TestWJ_IntfAttribute_ArrayBufferView;
  36. // todo procedure TestWJ_IntfAttribute_Any;
  37. // functions
  38. procedure TestWJ_IntfFunction_Void;
  39. procedure TestWJ_IntfFunction_SetEventHandler;
  40. procedure TestWJ_IntfFunction_Promise;
  41. procedure TestWJ_IntfFunction_ArgAny;
  42. procedure TestWJ_IntfFunction_EnumResult;
  43. procedure TestWJ_IntfFunction_SequenceArg;
  44. procedure TestWJ_IntfFunction_2SequenceArg;
  45. procedure TestWJ_IntfFunction_Constructor;
  46. procedure TestWJ_IntfFunction_ArrayBufferArg;
  47. procedure TestWJ_IntfFunction_ArrayBufferViewArg;
  48. procedure TestWJ_IntfFunction_SequenceResult;
  49. procedure TestWJ_IntfFunction_GlobalSequenceResult;
  50. // Namespace attribute
  51. procedure TestWJ_NamespaceAttribute_Boolean;
  52. // maplike
  53. procedure TestWJ_MaplikeInterface;
  54. end;
  55. function LinesToStr(Args: array of const): TIDLString;
  56. function CheckSrcDiff(Expected, Actual: string; out Msg: string): boolean;
  57. implementation
  58. function LinesToStr(Args: array of const): TIDLString;
  59. var
  60. s,a: TIDLString;
  61. U : UnicodeString;
  62. i: Integer;
  63. begin
  64. s:='';
  65. for i:=Low(Args) to High(Args) do
  66. begin
  67. case Args[i].VType of
  68. vtChar: A:=Args[i].VChar;
  69. vtString: A:=Args[i].VString^;
  70. vtPChar: A:=Args[i].VPChar;
  71. vtWideChar: begin
  72. U:=Args[i].VWideChar;
  73. A:=U;
  74. end;
  75. vtPWideChar: begin
  76. U:=Args[i].VPWideChar;
  77. A:=U;
  78. end;
  79. vtAnsiString: begin
  80. A:=AnsiString(Args[i].VAnsiString);
  81. end;
  82. vtWidestring: begin
  83. U:=WideString(Args[i].VWideString);
  84. A:=U;
  85. end;
  86. vtUnicodeString: begin
  87. U:=UnicodeString(Args[i].VUnicodeString);
  88. A:=U;
  89. end;
  90. end;
  91. S:=S+A+LineEnding;
  92. end;
  93. // Writeln('LinesToStr : ',S);
  94. Result:=s;
  95. end;
  96. function CheckSrcDiff(Expected, Actual: string; out Msg: string): boolean;
  97. // search diff, ignore changes in spaces
  98. const
  99. SpaceChars = [#9,#10,#13,' '];
  100. var
  101. ExpectedP, ActualP: PChar;
  102. function FindLineEnd(p: PChar): PChar;
  103. begin
  104. Result:=p;
  105. while not (Result^ in [#0,#10,#13]) do inc(Result);
  106. end;
  107. function FindLineStart(p, MinP: PChar): PChar;
  108. begin
  109. while (p>MinP) and not (p[-1] in [#10,#13]) do dec(p);
  110. Result:=p;
  111. end;
  112. procedure SkipLineEnd(var p: PChar);
  113. begin
  114. if p^ in [#10,#13] then
  115. begin
  116. if (p[1] in [#10,#13]) and (p^<>p[1]) then
  117. inc(p,2)
  118. else
  119. inc(p);
  120. end;
  121. end;
  122. function HasSpecialChar(s: string): boolean;
  123. var
  124. i: Integer;
  125. begin
  126. for i:=1 to length(s) do
  127. if s[i] in [#0..#31,#127..#255] then
  128. exit(true);
  129. Result:=false;
  130. end;
  131. function HashSpecialChars(s: string): string;
  132. var
  133. i: Integer;
  134. begin
  135. Result:='';
  136. for i:=1 to length(s) do
  137. if s[i] in [#0..#31,#127..#255] then
  138. Result:=Result+'#'+hexstr(ord(s[i]),2)
  139. else
  140. Result:=Result+s[i];
  141. end;
  142. procedure DiffFound;
  143. var
  144. ActLineStartP, ActLineEndP, p, StartPos: PChar;
  145. ExpLine, ActLine: String;
  146. i, LineNo, DiffLineNo: Integer;
  147. begin
  148. writeln('Diff found "',Msg,'". Lines:');
  149. // write correct lines
  150. p:=PChar(Expected);
  151. LineNo:=0;
  152. DiffLineNo:=0;
  153. repeat
  154. StartPos:=p;
  155. while not (p^ in [#0,#10,#13]) do inc(p);
  156. ExpLine:=copy(Expected,StartPos-PChar(Expected)+1,p-StartPos);
  157. SkipLineEnd(p);
  158. inc(LineNo);
  159. if (p<=ExpectedP) and (p^<>#0) then
  160. begin
  161. writeln('= ',ExpLine);
  162. end else begin
  163. // diff line
  164. if DiffLineNo=0 then DiffLineNo:=LineNo;
  165. // write actual line
  166. ActLineStartP:=FindLineStart(ActualP,PChar(Actual));
  167. ActLineEndP:=FindLineEnd(ActualP);
  168. ActLine:=copy(Actual,ActLineStartP-PChar(Actual)+1,ActLineEndP-ActLineStartP);
  169. writeln('- ',ActLine);
  170. if HasSpecialChar(ActLine) then
  171. writeln('- ',HashSpecialChars(ActLine));
  172. // write expected line
  173. writeln('+ ',ExpLine);
  174. if HasSpecialChar(ExpLine) then
  175. writeln('- ',HashSpecialChars(ExpLine));
  176. // write empty line with pointer ^
  177. for i:=1 to 2+ExpectedP-StartPos do write(' ');
  178. writeln('^');
  179. Msg:='expected "'+ExpLine+'", but got "'+ActLine+'".';
  180. CheckSrcDiff:=false;
  181. // write up to ten following actual lines to get some context
  182. for i:=1 to 10 do begin
  183. ActLineStartP:=ActLineEndP;
  184. SkipLineEnd(ActLineStartP);
  185. if ActLineStartP^=#0 then break;
  186. ActLineEndP:=FindLineEnd(ActLineStartP);
  187. ActLine:=copy(Actual,ActLineStartP-PChar(Actual)+1,ActLineEndP-ActLineStartP);
  188. writeln('~ ',ActLine);
  189. end;
  190. exit;
  191. end;
  192. until p^=#0;
  193. // internal error:
  194. writeln('DiffFound Actual:-----------------------');
  195. writeln(Actual);
  196. writeln('DiffFound Expected:---------------------');
  197. writeln(Expected);
  198. writeln('DiffFound ------------------------------');
  199. Msg:='diff found, but lines are the same, internal error';
  200. CheckSrcDiff:=false;
  201. end;
  202. var
  203. IsSpaceNeeded: Boolean;
  204. LastChar, Quote: Char;
  205. begin
  206. Result:=true;
  207. Msg:='';
  208. if Expected='' then Expected:=' ';
  209. if Actual='' then Actual:=' ';
  210. ExpectedP:=PChar(Expected);
  211. ActualP:=PChar(Actual);
  212. repeat
  213. //writeln('TTestModule.CheckDiff Exp="',ExpectedP^,'" Act="',ActualP^,'"');
  214. case ExpectedP^ of
  215. #0:
  216. begin
  217. // check that rest of Actual has only spaces
  218. while ActualP^ in SpaceChars do inc(ActualP);
  219. if ActualP^<>#0 then
  220. begin
  221. DiffFound;
  222. exit;
  223. end;
  224. exit(true);
  225. end;
  226. ' ',#9,#10,#13:
  227. begin
  228. // skip space in Expected
  229. IsSpaceNeeded:=false;
  230. if ExpectedP>PChar(Expected) then
  231. LastChar:=ExpectedP[-1]
  232. else
  233. LastChar:=#0;
  234. while ExpectedP^ in SpaceChars do inc(ExpectedP);
  235. if (LastChar in ['a'..'z','A'..'Z','0'..'9','_','$'])
  236. and (ExpectedP^ in ['a'..'z','A'..'Z','0'..'9','_','$']) then
  237. IsSpaceNeeded:=true;
  238. if IsSpaceNeeded and (not (ActualP^ in SpaceChars)) then
  239. begin
  240. DiffFound;
  241. exit;
  242. end;
  243. while ActualP^ in SpaceChars do inc(ActualP);
  244. end;
  245. '''','"':
  246. begin
  247. while ActualP^ in SpaceChars do inc(ActualP);
  248. if ExpectedP^<>ActualP^ then
  249. begin
  250. DiffFound;
  251. exit;
  252. end;
  253. Quote:=ExpectedP^;
  254. repeat
  255. inc(ExpectedP);
  256. inc(ActualP);
  257. if ExpectedP^<>ActualP^ then
  258. begin
  259. DiffFound;
  260. exit;
  261. end;
  262. if (ExpectedP^ in [#0,#10,#13]) then
  263. break
  264. else if (ExpectedP^=Quote) then
  265. begin
  266. inc(ExpectedP);
  267. inc(ActualP);
  268. break;
  269. end;
  270. until false;
  271. end;
  272. else
  273. while ActualP^ in SpaceChars do inc(ActualP);
  274. if ExpectedP^<>ActualP^ then
  275. begin
  276. DiffFound;
  277. exit;
  278. end;
  279. inc(ExpectedP);
  280. inc(ActualP);
  281. end;
  282. until false;
  283. end;
  284. { TCustomTestWebIDL2WasmJob }
  285. procedure TCustomTestWebIDL2WasmJob.OnLog(Sender: TObject;
  286. LogType: TCodegenLogType; const Msg: String);
  287. begin
  288. if LogType=cltInfo then ;
  289. if Sender=nil then ;
  290. writeln('TCustomTestWebIDL2WasmJob.OnLog ',Msg);
  291. end;
  292. procedure TCustomTestWebIDL2WasmJob.Setup;
  293. begin
  294. inherited Setup;
  295. FWebIDLToPas:=TWebIDLToPasWasmJob.Create(nil);
  296. WebIDLToPas.OnLog:=@OnLog;
  297. WebIDLToPas.InputFileName:='test1.webidl';
  298. WebIDLToPas.OutputFileName:='test1.pas';
  299. WebIDLToPas.OutputStream:=TMemoryStream.Create;
  300. HeaderSrc:=LinesToStr([
  301. 'Unit test1;',
  302. '',
  303. '{$MODE ObjFPC}',
  304. '{$H+}',
  305. 'interface',
  306. '',
  307. 'uses SysUtils, JOB_JS;',
  308. '']);
  309. end;
  310. procedure TCustomTestWebIDL2WasmJob.TearDown;
  311. begin
  312. WebIDLToPas.InputStream.Free;
  313. WebIDLToPas.InputStream:=nil;
  314. WebIDLToPas.OutputStream.Free;
  315. WebIDLToPas.OutputStream:=nil;
  316. FreeAndNil(FWebIDLToPas);
  317. inherited TearDown;
  318. end;
  319. procedure TCustomTestWebIDL2WasmJob.TestWebIDL(const WebIDLSrc,
  320. ExpectedPascalSrc: array of string);
  321. var
  322. i: Integer;
  323. Line, ExpectedSrc, InputSrc, OutputSrc: String;
  324. InputMS: TMemoryStream;
  325. begin
  326. {$IFDEF VerboseWebidl2WasmJob}
  327. writeln('TCustomTestWebIDL2WasmJob.TestWebIDL WebIDL:----------------------');
  328. {$ENDIF}
  329. InputSrc:='';
  330. for i:=0 to high(WebIDLSrc) do
  331. begin
  332. Line:=WebIDLSrc[i]+sLineBreak;
  333. InputSrc:=InputSrc+Line;
  334. {$IFDEF VerboseWebidl2WasmJob}
  335. write(Line);
  336. {$ENDIF}
  337. end;
  338. WebIDLToPas.InputStream:=TStringStream.Create(InputSrc);
  339. {$IFDEF VerboseWebidl2WasmJob}
  340. writeln('TCustomTestWebIDL2WasmJob.TestWebIDL ExpectedPascal: BEGIN--------');
  341. {$ENDIF}
  342. ExpectedSrc:=HeaderSrc;
  343. for i:=0 to high(ExpectedPascalSrc) do
  344. ExpectedSrc:=ExpectedSrc+ExpectedPascalSrc[i]+sLineBreak;
  345. {$IFDEF VerboseWebidl2WasmJob}
  346. writeln(ExpectedSrc);
  347. writeln('TCustomTestWebIDL2WasmJob.TestWebIDL ExpectedPascal END-----------');
  348. {$ENDIF}
  349. WebIDLToPas.Execute;
  350. OutputSrc:=WebIDLToPas.Source.Text;
  351. {$IFDEF VerboseWebidl2WasmJob}
  352. writeln('TCustomTestWebIDL2WasmJob.TestWebIDL ActualPascal: BEGIN----------');
  353. writeln(OutputSrc);
  354. writeln('TCustomTestWebIDL2WasmJob.TestWebIDL ActualPascal: END------------');
  355. {$ENDIF}
  356. CheckDiff('TCustomTestWebIDL2WasmJob.TestWebIDL',ExpectedSrc,OutputSrc);
  357. end;
  358. procedure TCustomTestWebIDL2WasmJob.CheckDiff(Msg, Expected, Actual: string);
  359. // search diff, ignore changes in spaces
  360. var
  361. s: string;
  362. begin
  363. if CheckSrcDiff(Expected,Actual,s) then exit;
  364. Fail(Msg+': '+s);
  365. end;
  366. { TTestWebIDL2WasmJob }
  367. procedure TTestWebIDL2WasmJob.TestWJ_Empty;
  368. begin
  369. TestWebIDL([
  370. ''],
  371. ['Type',
  372. ' // Forward class definitions',
  373. 'implementation',
  374. 'end.',
  375. '']);
  376. end;
  377. procedure TTestWebIDL2WasmJob.TestWJ_Typedef_Boolean;
  378. begin
  379. TestWebIDL([
  380. 'typedef boolean PerformanceEntry;',
  381. ''],
  382. ['Type',
  383. ' // Forward class definitions',
  384. ' TPerformanceEntry = Boolean;',
  385. 'implementation',
  386. 'end.',
  387. '']);
  388. end;
  389. procedure TTestWebIDL2WasmJob.TestWJ_Typedef_Sequence;
  390. begin
  391. TestWebIDL([
  392. 'typedef boolean PerformanceEntry;',
  393. 'typedef sequence <PerformanceEntry> PerformanceEntryList;',
  394. ''],
  395. ['Type',
  396. ' // Forward class definitions',
  397. ' TPerformanceEntry = Boolean;',
  398. ' TPerformanceEntryList = IJSArray; // array of TPerformanceEntry',
  399. 'implementation',
  400. 'end.',
  401. '']);
  402. end;
  403. procedure TTestWebIDL2WasmJob.TestWJ_Typedef_Aliased;
  404. begin
  405. WebIDLToPas.TypeAliases.Add('Float32List=IJSFloat32Array');
  406. TestWebIDL([
  407. ' typedef ([AllowShared] Float32Array or sequence<GLfloat>) Float32List;',
  408. ''],
  409. ['',
  410. 'Type',
  411. ' // Forward class definitions',
  412. 'implementation',
  413. '',
  414. 'end.',
  415. ''
  416. ]);
  417. end;
  418. procedure TTestWebIDL2WasmJob.TestWJ_IntfAttribute_Boolean;
  419. begin
  420. TestWebIDL([
  421. 'interface Attr {',
  422. ' attribute boolean aBoolean;',
  423. '};',
  424. ''],
  425. ['Type',
  426. ' // Forward class definitions',
  427. ' IJSAttr = interface;',
  428. ' TJSAttr = class;',
  429. ' { --------------------------------------------------------------------',
  430. ' TJSAttr',
  431. ' --------------------------------------------------------------------}',
  432. '',
  433. ' IJSAttr = interface(IJSObject)',
  434. ' [''{AA94F48A-7955-3EBA-B086-85B24440AF2A}'']',
  435. ' function _GetaBoolean: Boolean;',
  436. ' procedure _SetaBoolean(const aValue: Boolean);',
  437. ' property aBoolean: Boolean read _GetaBoolean write _SetaBoolean;',
  438. ' end;',
  439. '',
  440. ' TJSAttr = class(TJSObject,IJSAttr)',
  441. ' Private',
  442. ' function _GetaBoolean: Boolean;',
  443. ' procedure _SetaBoolean(const aValue: Boolean);',
  444. ' Public',
  445. ' class function Cast(const Intf: IJSObject): IJSAttr;',
  446. ' property aBoolean: Boolean read _GetaBoolean write _SetaBoolean;',
  447. ' end;',
  448. '',
  449. 'implementation',
  450. '',
  451. 'function TJSAttr._GetaBoolean: Boolean;',
  452. 'begin',
  453. ' Result:=ReadJSPropertyBoolean(''aBoolean'');',
  454. 'end;',
  455. '',
  456. 'procedure TJSAttr._SetaBoolean(const aValue: Boolean);',
  457. 'begin',
  458. ' WriteJSPropertyBoolean(''aBoolean'',aValue);',
  459. 'end;',
  460. '',
  461. 'class function TJSAttr.Cast(const Intf: IJSObject): IJSAttr;',
  462. 'begin',
  463. ' Result:=TJSAttr.JOBCast(Intf);',
  464. 'end;',
  465. '',
  466. 'end.',
  467. '']);
  468. end;
  469. procedure TTestWebIDL2WasmJob.TestWJ_IntfStringifier;
  470. begin
  471. TestWebIDL([
  472. 'interface Attr {',
  473. ' stringifier;',
  474. '};',
  475. ''],
  476. ['Type',
  477. ' // Forward class definitions',
  478. ' IJSAttr = interface;',
  479. ' TJSAttr = class;',
  480. ' { --------------------------------------------------------------------',
  481. ' TJSAttr',
  482. ' --------------------------------------------------------------------}',
  483. '',
  484. ' IJSAttr = interface(IJSObject)',
  485. ' [''{AA94F45E-60F0-381A-A2A6-208CA4B2AF2A}'']',
  486. ' end;',
  487. '',
  488. ' TJSAttr = class(TJSObject,IJSAttr)',
  489. ' Private',
  490. ' Public',
  491. ' class function Cast(const Intf: IJSObject): IJSAttr;',
  492. ' end;',
  493. '',
  494. 'implementation',
  495. '',
  496. 'class function TJSAttr.Cast(const Intf: IJSObject): IJSAttr;',
  497. 'begin',
  498. ' Result:=TJSAttr.JOBCast(Intf);',
  499. 'end;',
  500. '',
  501. 'end.',
  502. '']);
  503. end;
  504. procedure TTestWebIDL2WasmJob.TestWJ_IntfAttribute_ArrayBuffer;
  505. begin
  506. TestWebIDL([
  507. 'interface Attr {',
  508. ' [SameObject, Throws] readonly attribute ArrayBuffer signature;',
  509. '};',
  510. ''],
  511. [
  512. 'Type',
  513. ' // Forward class definitions',
  514. ' IJSAttr = interface;',
  515. ' TJSAttr = class;',
  516. ' { --------------------------------------------------------------------',
  517. ' TJSAttr',
  518. ' --------------------------------------------------------------------}',
  519. '',
  520. ' IJSAttr = interface(IJSObject)',
  521. ' [''{2D39068A-1305-3879-B4DC-37563664D5F5}'']',
  522. ' function _Getsignature: IJSArrayBuffer;',
  523. ' property signature: IJSArrayBuffer read _Getsignature;',
  524. ' end;',
  525. '',
  526. ' TJSAttr = class(TJSObject,IJSAttr)',
  527. ' Private',
  528. ' function _Getsignature: IJSArrayBuffer;',
  529. ' Public',
  530. ' class function Cast(const Intf: IJSObject): IJSAttr;',
  531. ' property signature: IJSArrayBuffer read _Getsignature;',
  532. ' end;',
  533. '',
  534. 'implementation',
  535. '',
  536. 'function TJSAttr._Getsignature: IJSArrayBuffer;',
  537. 'begin',
  538. ' Result:=ReadJSPropertyObject(''signature'',TJSArrayBuffer) as IJSArrayBuffer;',
  539. 'end;',
  540. '',
  541. 'class function TJSAttr.Cast(const Intf: IJSObject): IJSAttr;',
  542. 'begin',
  543. ' Result:=TJSAttr.JOBCast(Intf);',
  544. 'end;',
  545. '',
  546. 'end.',
  547. ''
  548. ]);
  549. end;
  550. procedure TTestWebIDL2WasmJob.TestWJ_IntfAttribute_ArrayBufferView;
  551. begin
  552. TestWebIDL([
  553. 'interface Attr {',
  554. ' [SameObject, Throws] readonly attribute ArrayBufferView signature;',
  555. '};',
  556. ''],
  557. [
  558. 'Type',
  559. ' // Forward class definitions',
  560. ' IJSAttr = interface;',
  561. ' TJSAttr = class;',
  562. ' { --------------------------------------------------------------------',
  563. ' TJSAttr',
  564. ' --------------------------------------------------------------------}',
  565. '',
  566. ' IJSAttr = interface(IJSObject)',
  567. ' [''{2D390654-2475-3879-B4DC-37563664D5F5}'']',
  568. ' function _Getsignature: IJSArrayBufferView;',
  569. ' property signature: IJSArrayBufferView read _Getsignature;',
  570. ' end;',
  571. '',
  572. ' TJSAttr = class(TJSObject,IJSAttr)',
  573. ' Private',
  574. ' function _Getsignature: IJSArrayBufferView;',
  575. ' Public',
  576. ' class function Cast(const Intf: IJSObject): IJSAttr;',
  577. ' property signature: IJSArrayBufferView read _Getsignature;',
  578. ' end;',
  579. '',
  580. 'implementation',
  581. '',
  582. 'function TJSAttr._Getsignature: IJSArrayBufferView;',
  583. 'begin',
  584. ' Result:=ReadJSPropertyObject(''signature'',TJSArrayBufferView) as IJSArrayBufferView;',
  585. 'end;',
  586. '',
  587. 'class function TJSAttr.Cast(const Intf: IJSObject): IJSAttr;',
  588. 'begin',
  589. ' Result:=TJSAttr.JOBCast(Intf);',
  590. 'end;',
  591. '',
  592. 'end.',
  593. ''
  594. ]);
  595. end;
  596. procedure TTestWebIDL2WasmJob.TestWJ_IntfFunction_Void;
  597. begin
  598. TestWebIDL([
  599. 'interface Attr {',
  600. ' void append(Attr node);',
  601. '};',
  602. ''],
  603. ['Type',
  604. ' // Forward class definitions',
  605. ' IJSAttr = interface;',
  606. ' TJSAttr = class;',
  607. ' { --------------------------------------------------------------------',
  608. ' TJSAttr',
  609. ' --------------------------------------------------------------------}',
  610. '',
  611. ' IJSAttr = interface(IJSObject)',
  612. ' [''{AA94F48A-84D7-3FAA-A2A6-208CA4B2AF2A}'']',
  613. ' procedure append(aNode: IJSAttr);',
  614. ' end;',
  615. '',
  616. ' TJSAttr = class(TJSObject,IJSAttr)',
  617. ' Private',
  618. ' Public',
  619. ' procedure append(aNode: IJSAttr);',
  620. ' class function Cast(const Intf: IJSObject): IJSAttr;',
  621. ' end;',
  622. '',
  623. 'implementation',
  624. '',
  625. 'procedure TJSAttr.append(aNode: IJSAttr);',
  626. 'begin',
  627. ' InvokeJSNoResult(''append'',[aNode]);',
  628. 'end;',
  629. '',
  630. 'class function TJSAttr.Cast(const Intf: IJSObject): IJSAttr;',
  631. 'begin',
  632. ' Result:=TJSAttr.JOBCast(Intf);',
  633. 'end;',
  634. '',
  635. 'end.',
  636. '']);
  637. end;
  638. procedure TTestWebIDL2WasmJob.TestWJ_IntfFunction_SetEventHandler;
  639. begin
  640. TestWebIDL([
  641. '[LegacyTreatNonObjectAsNull]',
  642. 'callback EventHandlerNonNull = any (long event);',
  643. 'typedef EventHandlerNonNull? EventHandler;',
  644. '',
  645. 'interface Attr {',
  646. ' void setEventHandler([TreatNonCallableAsNull] EventHandler handler);',
  647. '};',
  648. ''],
  649. ['Type',
  650. ' // Forward class definitions',
  651. ' IJSAttr = interface;',
  652. ' TJSAttr = class;',
  653. ' TEventHandlerNonNull = function (event: Integer): Variant of object;',
  654. ' TEventHandler = TEventHandlerNonNull;',
  655. '',
  656. ' { --------------------------------------------------------------------',
  657. ' TJSAttr',
  658. ' --------------------------------------------------------------------}',
  659. '',
  660. ' IJSAttr = interface(IJSObject)',
  661. ' [''{AA94F48A-121D-33BC-96FE-420246F2AF2A}'']',
  662. ' procedure setEventHandler(const aHandler: TEventHandler);',
  663. ' end;',
  664. '',
  665. ' TJSAttr = class(TJSObject,IJSAttr)',
  666. ' Private',
  667. ' Public',
  668. ' procedure setEventHandler(const aHandler: TEventHandler);',
  669. ' class function Cast(const Intf: IJSObject): IJSAttr;',
  670. ' end;',
  671. '',
  672. 'implementation',
  673. '',
  674. 'function JOBCallTEventHandlerNonNull(const aMethod: TMethod; var H: TJOBCallbackHelper): PByte;',
  675. 'var',
  676. ' event: Integer;',
  677. 'begin',
  678. ' event:=H.GetLongInt;',
  679. ' Result:=H.AllocVariant(TEventHandlerNonNull(aMethod)(event));',
  680. 'end;',
  681. '',
  682. 'procedure TJSAttr.setEventHandler(const aHandler: TEventHandler);',
  683. 'var',
  684. ' m: TJOB_Method;',
  685. 'begin',
  686. ' m:=TJOB_Method.Create(TMethod(aHandler),@JOBCallTEventHandlerNonNull);',
  687. ' try',
  688. ' InvokeJSNoResult(''setEventHandler'',[m]);',
  689. ' finally',
  690. ' m.free;',
  691. ' end;',
  692. 'end;',
  693. '',
  694. 'class function TJSAttr.Cast(const Intf: IJSObject): IJSAttr;',
  695. 'begin',
  696. ' Result:=TJSAttr.JOBCast(Intf);',
  697. 'end;',
  698. '',
  699. 'end.',
  700. '']);
  701. end;
  702. procedure TTestWebIDL2WasmJob.TestWJ_IntfFunction_Promise;
  703. begin
  704. // Promise<void> exitFullscreen();
  705. TestWebIDL([
  706. 'interface Attr {',
  707. ' Promise<void> exitFullscreen();',
  708. ' Promise<any> addCertException(boolean isTemporary);',
  709. ' Promise<Attr> fly();',
  710. '};',
  711. ''],
  712. ['Type',
  713. ' // Forward class definitions',
  714. ' IJSAttr = interface;',
  715. ' TJSAttr = class;',
  716. ' { --------------------------------------------------------------------',
  717. ' TJSAttr',
  718. ' --------------------------------------------------------------------}',
  719. '',
  720. ' IJSAttr = interface(IJSObject)',
  721. ' [''{74BB0007-0E0F-3C5D-B270-B1C656002861}'']',
  722. ' function exitFullscreen: IJSPromise; // Promise<void>',
  723. ' function addCertException(aIsTemporary: Boolean): IJSPromise; // Promise<any>',
  724. ' function fly: IJSPromise; // Promise<Attr>',
  725. ' end;',
  726. '',
  727. ' TJSAttr = class(TJSObject,IJSAttr)',
  728. ' Private',
  729. ' Public',
  730. ' function exitFullscreen: IJSPromise; // Promise<void>',
  731. ' function addCertException(aIsTemporary: Boolean): IJSPromise; // Promise<any>',
  732. ' function fly: IJSPromise; // Promise<Attr>',
  733. ' class function Cast(const Intf: IJSObject): IJSAttr;',
  734. ' end;',
  735. '',
  736. 'implementation',
  737. '',
  738. 'function TJSAttr.exitFullscreen: IJSPromise; // Promise<void>',
  739. 'begin',
  740. ' Result:=InvokeJSObjectResult(''exitFullscreen'',[],TJSPromise) as IJSPromise;',
  741. 'end;',
  742. '',
  743. 'function TJSAttr.addCertException(aIsTemporary: Boolean): IJSPromise; // Promise<any>',
  744. 'begin',
  745. ' Result:=InvokeJSObjectResult(''addCertException'',[aIsTemporary],TJSPromise) as IJSPromise;',
  746. 'end;',
  747. '',
  748. 'function TJSAttr.fly: IJSPromise; // Promise<Attr>',
  749. 'begin',
  750. ' Result:=InvokeJSObjectResult(''fly'',[],TJSPromise) as IJSPromise;',
  751. 'end;',
  752. '',
  753. 'class function TJSAttr.Cast(const Intf: IJSObject): IJSAttr;',
  754. 'begin',
  755. ' Result:=TJSAttr.JOBCast(Intf);',
  756. 'end;',
  757. '',
  758. 'end.',
  759. '']);
  760. end;
  761. procedure TTestWebIDL2WasmJob.TestWJ_IntfFunction_ArgAny;
  762. begin
  763. TestWebIDL([
  764. 'interface Attr {',
  765. ' void append(any node);',
  766. '};',
  767. ''],
  768. ['Type',
  769. ' // Forward class definitions',
  770. ' IJSAttr = interface;',
  771. ' TJSAttr = class;',
  772. ' { --------------------------------------------------------------------',
  773. ' TJSAttr',
  774. ' --------------------------------------------------------------------}',
  775. '',
  776. ' IJSAttr = interface(IJSObject)',
  777. ' [''{AA94F48A-84D7-3FAA-A2A6-208CA4B2AF2A}'']',
  778. ' procedure append(const aNode: Variant);',
  779. ' end;',
  780. '',
  781. ' TJSAttr = class(TJSObject,IJSAttr)',
  782. ' Private',
  783. ' Public',
  784. ' procedure append(const aNode: Variant);',
  785. ' class function Cast(const Intf: IJSObject): IJSAttr;',
  786. ' end;',
  787. '',
  788. 'implementation',
  789. '',
  790. 'procedure TJSAttr.append(const aNode: Variant);',
  791. 'begin',
  792. ' InvokeJSNoResult(''append'',[aNode]);',
  793. 'end;',
  794. '',
  795. 'class function TJSAttr.Cast(const Intf: IJSObject): IJSAttr;',
  796. 'begin',
  797. ' Result:=TJSAttr.JOBCast(Intf);',
  798. 'end;',
  799. '',
  800. 'end.',
  801. '']);
  802. end;
  803. procedure TTestWebIDL2WasmJob.TestWJ_IntfFunction_EnumResult;
  804. begin
  805. TestWebIDL([
  806. 'enum E { ',
  807. ' "allowed", ',
  808. ' "disallowed" ',
  809. '}; ',
  810. 'interface IE { ',
  811. ' E get(long a); ',
  812. '};'
  813. ],[
  814. 'Type',
  815. ' // Forward class definitions',
  816. ' IJSIE = interface;',
  817. ' TJSIE = class;',
  818. ' TE = UnicodeString;',
  819. ' { --------------------------------------------------------------------',
  820. ' TJSIE',
  821. ' --------------------------------------------------------------------}',
  822. ' IJSIE = interface(IJSObject)',
  823. ' [''{04D06E4C-6063-3E89-A483-3296C9C8AA41}'']',
  824. ' function get(a: Integer) : TE;',
  825. ' end;',
  826. '',
  827. ' TJSIE = class(TJSObject,IJSIE)',
  828. ' Private',
  829. ' Public',
  830. ' function get(a: Integer) : TE;',
  831. ' class function Cast(const Intf: IJSObject): IJSIE;',
  832. ' end;',
  833. '',
  834. 'implementation',
  835. '',
  836. 'function TJSIE.get(a: Integer) : TE;',
  837. 'begin',
  838. ' Result:=InvokeJSUnicodeStringResult(''get'',[a]);',
  839. 'end;',
  840. '',
  841. 'class function TJSIE.Cast(const Intf: IJSObject): IJSIE;',
  842. 'begin',
  843. ' Result:=TJSIE.JOBCast(Intf);',
  844. 'end;',
  845. '',
  846. 'end.'
  847. ]);
  848. end;
  849. procedure TTestWebIDL2WasmJob.TestWJ_IntfFunction_SequenceArg;
  850. begin
  851. TestWebIDL([
  852. 'interface Attr {',
  853. ' boolean vibrate(sequence<long> pattern);',
  854. '};',
  855. ''],
  856. [
  857. 'Type',
  858. '',
  859. ' // Forward class definitions',
  860. ' IJSAttr = interface;',
  861. ' TJSAttr = class;',
  862. '',
  863. ' { --------------------------------------------------------------------',
  864. ' TJSAttr',
  865. ' --------------------------------------------------------------------}',
  866. '',
  867. ' TIntegerDynArray = IJSArray; // array of Integer',
  868. '',
  869. ' IJSAttr = interface(IJSObject)',
  870. ' [''{AA94F48A-2BFB-3877-82A6-208CA4B2AF2A}'']',
  871. ' function vibrate(const aPattern: TIntegerDynArray): Boolean;',
  872. ' end;',
  873. '',
  874. ' TJSAttr = class(TJSObject,IJSAttr)',
  875. ' Private',
  876. ' Public',
  877. ' function vibrate(const aPattern: TIntegerDynArray): Boolean;',
  878. ' class function Cast(const Intf: IJSObject): IJSAttr;',
  879. ' end;',
  880. '',
  881. 'implementation',
  882. '',
  883. 'function TJSAttr.vibrate(const aPattern: TIntegerDynArray): Boolean;',
  884. 'begin',
  885. ' Result:=InvokeJSBooleanResult(''vibrate'',[aPattern]);',
  886. 'end;',
  887. '',
  888. 'class function TJSAttr.Cast(const Intf: IJSObject): IJSAttr;',
  889. 'begin',
  890. ' Result:=TJSAttr.JOBCast(Intf);',
  891. 'end;',
  892. '',
  893. 'end.'
  894. ]);
  895. end;
  896. procedure TTestWebIDL2WasmJob.TestWJ_IntfFunction_2SequenceArg;
  897. begin
  898. TestWebIDL([
  899. 'interface Attr {',
  900. ' boolean vibrate(sequence<long> pattern);',
  901. ' boolean beep(sequence<long> pattern);',
  902. '};',
  903. ''],
  904. [
  905. 'Type',
  906. '',
  907. ' // Forward class definitions',
  908. ' IJSAttr = interface;',
  909. ' TJSAttr = class;',
  910. '',
  911. ' { --------------------------------------------------------------------',
  912. ' TJSAttr',
  913. ' --------------------------------------------------------------------}',
  914. '',
  915. ' TIntegerDynArray = IJSArray; // array of Integer',
  916. '',
  917. ' IJSAttr = interface(IJSObject)',
  918. ' [''{AA94F48A-8A01-3EFF-A44E-4EDCA4B2AF2A}'']',
  919. ' function vibrate(const aPattern: TIntegerDynArray): Boolean;',
  920. ' function beep(const aPattern: TIntegerDynArray): Boolean;',
  921. ' end;',
  922. '',
  923. ' TJSAttr = class(TJSObject,IJSAttr)',
  924. ' Private',
  925. ' Public',
  926. ' function vibrate(const aPattern: TIntegerDynArray): Boolean;',
  927. ' function beep(const aPattern: TIntegerDynArray): Boolean;',
  928. ' class function Cast(const Intf: IJSObject): IJSAttr;',
  929. ' end;',
  930. '',
  931. 'implementation',
  932. '',
  933. 'function TJSAttr.vibrate(const aPattern: TIntegerDynArray): Boolean;',
  934. 'begin',
  935. ' Result:=InvokeJSBooleanResult(''vibrate'',[aPattern]);',
  936. 'end;',
  937. '',
  938. 'function TJSAttr.beep(const aPattern: TIntegerDynArray): Boolean;',
  939. 'begin',
  940. ' Result:=InvokeJSBooleanResult(''beep'',[aPattern]);',
  941. 'end;',
  942. '',
  943. 'class function TJSAttr.Cast(const Intf: IJSObject): IJSAttr;',
  944. 'begin',
  945. ' Result:=TJSAttr.JOBCast(Intf);',
  946. 'end;',
  947. '',
  948. 'end.'
  949. ]);
  950. end;
  951. procedure TTestWebIDL2WasmJob.TestWJ_IntfFunction_Constructor;
  952. begin
  953. TestWebIDL([
  954. 'interface Attr {',
  955. ' constructor(long options); ',
  956. '};'
  957. ],
  958. ['Type',
  959. ' // Forward class definitions',
  960. ' IJSAttr = interface;',
  961. ' TJSAttr = class;',
  962. ' { --------------------------------------------------------------------',
  963. ' TJSAttr',
  964. ' --------------------------------------------------------------------}',
  965. '',
  966. ' IJSAttr = interface(IJSObject)',
  967. ' [''{AA94F48A-EA1E-381A-A2A6-208CA4B2AF2A}'']',
  968. ' end;',
  969. '',
  970. ' TJSAttr = class(TJSObject,IJSAttr)',
  971. ' Private',
  972. ' Public',
  973. ' class function Create(aOptions : Integer) : TJSAttr;',
  974. ' class function Cast(const Intf: IJSObject): IJSAttr;',
  975. ' end;',
  976. '',
  977. 'implementation',
  978. '',
  979. 'class function TJSAttr.Create(aOptions: Integer) : TJSAttr;',
  980. 'begin',
  981. ' Result:=InvokeJSObjectResult(''Attr'',[aOptions],TJSAttr) as TJSAttr;',
  982. 'end;',
  983. '',
  984. 'class function TJSAttr.Cast(const Intf: IJSObject): IJSAttr;',
  985. 'begin',
  986. ' Result:=TJSAttr.JOBCast(Intf);',
  987. 'end;',
  988. '',
  989. 'end.',
  990. '']);
  991. end;
  992. procedure TTestWebIDL2WasmJob.TestWJ_IntfFunction_ArrayBufferArg;
  993. begin
  994. TestWebIDL([
  995. 'interface Attr {',
  996. ' undefined appendBuffer(ArrayBuffer data);',
  997. '};'
  998. ],[
  999. 'Type',
  1000. ' // Forward class definitions',
  1001. ' IJSAttr = interface;',
  1002. ' TJSAttr = class;',
  1003. ' { --------------------------------------------------------------------',
  1004. ' TJSAttr',
  1005. ' --------------------------------------------------------------------}',
  1006. '',
  1007. ' IJSAttr = interface(IJSObject)',
  1008. ' [''{AA94F48A-84D7-3FB2-97EF-71ACA4B2AF2A}'']',
  1009. ' procedure appendBuffer(aData: IJSArrayBuffer);',
  1010. ' end;',
  1011. '',
  1012. ' TJSAttr = class(TJSObject,IJSAttr)',
  1013. ' Private',
  1014. ' Public',
  1015. ' procedure appendBuffer(aData: IJSArrayBuffer);',
  1016. ' class function Cast(const Intf: IJSObject): IJSAttr;',
  1017. ' end;',
  1018. '',
  1019. 'implementation',
  1020. '',
  1021. 'procedure TJSAttr.appendBuffer(aData: IJSArrayBuffer);',
  1022. 'begin',
  1023. ' InvokeJSNoResult(''appendBuffer'',[aData]);',
  1024. 'end;',
  1025. '',
  1026. 'class function TJSAttr.Cast(const Intf: IJSObject): IJSAttr;',
  1027. 'begin',
  1028. ' Result:=TJSAttr.JOBCast(Intf);',
  1029. 'end;',
  1030. '',
  1031. 'end.',
  1032. '' ]);
  1033. end;
  1034. procedure TTestWebIDL2WasmJob.TestWJ_IntfFunction_ArrayBufferViewArg;
  1035. begin
  1036. TestWebIDL([
  1037. 'interface Attr {',
  1038. ' undefined appendBuffer(ArrayBufferView data);',
  1039. '};'
  1040. ],[
  1041. 'Type',
  1042. ' // Forward class definitions',
  1043. ' IJSAttr = interface;',
  1044. ' TJSAttr = class;',
  1045. ' { --------------------------------------------------------------------',
  1046. ' TJSAttr',
  1047. ' --------------------------------------------------------------------}',
  1048. '',
  1049. ' IJSAttr = interface(IJSObject)',
  1050. ' [''{AA94F48A-84D7-3FB2-97EF-71ACA4B2AF2A}'']',
  1051. ' procedure appendBuffer(aData: IJSArrayBufferView);',
  1052. ' end;',
  1053. '',
  1054. ' TJSAttr = class(TJSObject,IJSAttr)',
  1055. ' Private',
  1056. ' Public',
  1057. ' procedure appendBuffer(aData: IJSArrayBufferView);',
  1058. ' class function Cast(const Intf: IJSObject): IJSAttr;',
  1059. ' end;',
  1060. '',
  1061. 'implementation',
  1062. '',
  1063. 'procedure TJSAttr.appendBuffer(aData: IJSArrayBufferView);',
  1064. 'begin',
  1065. ' InvokeJSNoResult(''appendBuffer'',[aData]);',
  1066. 'end;',
  1067. '',
  1068. 'class function TJSAttr.Cast(const Intf: IJSObject): IJSAttr;',
  1069. 'begin',
  1070. ' Result:=TJSAttr.JOBCast(Intf);',
  1071. 'end;',
  1072. '',
  1073. 'end.',
  1074. '' ]);
  1075. end;
  1076. procedure TTestWebIDL2WasmJob.TestWJ_IntfFunction_SequenceResult;
  1077. begin
  1078. TestWebIDL([
  1079. 'interface Attr {',
  1080. ' sequence<long> vibrate();',
  1081. '};',
  1082. ''],
  1083. [
  1084. 'Type',
  1085. '',
  1086. ' // Forward class definitions',
  1087. ' IJSAttr = interface;',
  1088. ' TJSAttr = class;',
  1089. '',
  1090. ' { --------------------------------------------------------------------',
  1091. ' TJSAttr',
  1092. ' --------------------------------------------------------------------}',
  1093. '',
  1094. ' TIntegerDynArray = IJSArray; // array of Integer',
  1095. '',
  1096. ' IJSAttr = interface(IJSObject)',
  1097. ' [''{AA94F48A-2BFB-3877-82A6-208CA4B2AF2A}'']',
  1098. ' function vibrate: TIntegerDynArray;',
  1099. ' end;',
  1100. '',
  1101. ' TJSAttr = class(TJSObject,IJSAttr)',
  1102. ' Private',
  1103. ' Public',
  1104. ' function vibrate: TIntegerDynArray;',
  1105. ' class function Cast(const Intf: IJSObject): IJSAttr;',
  1106. ' end;',
  1107. '',
  1108. 'implementation',
  1109. '',
  1110. 'function TJSAttr.vibrate: TIntegerDynArray;',
  1111. 'begin',
  1112. ' Result:=InvokeJSObjectResult(''vibrate'',[],TJSArray) as TIntegerDynArray;',
  1113. 'end;',
  1114. '',
  1115. 'class function TJSAttr.Cast(const Intf: IJSObject): IJSAttr;',
  1116. 'begin',
  1117. ' Result:=TJSAttr.JOBCast(Intf);',
  1118. 'end;',
  1119. '',
  1120. 'end.'
  1121. ]);
  1122. end;
  1123. procedure TTestWebIDL2WasmJob.TestWJ_IntfFunction_GlobalSequenceResult;
  1124. begin
  1125. TestWebIDL([
  1126. 'typedef sequence <long> LongSeq;',
  1127. 'interface Attr {',
  1128. ' LongSeq vibrate();',
  1129. '};',
  1130. ''],
  1131. [
  1132. 'Type',
  1133. '',
  1134. ' // Forward class definitions',
  1135. ' IJSAttr = interface;',
  1136. ' TJSAttr = class;',
  1137. ' TIntegerDynArray = IJSArray; // array of Integer',
  1138. '',
  1139. ' { --------------------------------------------------------------------',
  1140. ' TJSAttr',
  1141. ' --------------------------------------------------------------------}',
  1142. '',
  1143. ' IJSAttr = interface(IJSObject)',
  1144. ' [''{AA94F48A-2BFB-3877-82A6-208CA4B2AF2A}'']',
  1145. ' function vibrate: TIntegerDynArray;',
  1146. ' end;',
  1147. '',
  1148. ' TJSAttr = class(TJSObject,IJSAttr)',
  1149. ' Private',
  1150. ' Public',
  1151. ' function vibrate: TIntegerDynArray;',
  1152. ' class function Cast(const Intf: IJSObject): IJSAttr;',
  1153. ' end;',
  1154. '',
  1155. 'implementation',
  1156. '',
  1157. 'function TJSAttr.vibrate: TIntegerDynArray;',
  1158. 'begin',
  1159. ' Result:=InvokeJSObjectResult(''vibrate'',[],TJSArray) as TIntegerDynArray;',
  1160. 'end;',
  1161. '',
  1162. 'class function TJSAttr.Cast(const Intf: IJSObject): IJSAttr;',
  1163. 'begin',
  1164. ' Result:=TJSAttr.JOBCast(Intf);',
  1165. 'end;',
  1166. '',
  1167. 'end.'
  1168. ]);
  1169. end;
  1170. procedure TTestWebIDL2WasmJob.TestWJ_NamespaceAttribute_Boolean;
  1171. begin
  1172. TestWebIDL([
  1173. 'namespace Attr {',
  1174. ' readonly attribute boolean aBoolean;',
  1175. '};',
  1176. ''],
  1177. ['Type',
  1178. ' // Forward class definitions',
  1179. ' IJSAttr = interface;',
  1180. ' TJSAttr = class;',
  1181. ' { --------------------------------------------------------------------',
  1182. ' TJSAttr',
  1183. ' --------------------------------------------------------------------}',
  1184. '',
  1185. ' IJSAttr = interface(IJSObject)',
  1186. ' [''{AA94F48A-7955-3EBA-B086-85B24440AF2A}'']',
  1187. ' function _GetaBoolean: Boolean;',
  1188. ' property aBoolean: Boolean read _GetaBoolean;',
  1189. ' end;',
  1190. '',
  1191. ' TJSAttr = class(TJSObject,IJSAttr)',
  1192. ' Private',
  1193. ' function _GetaBoolean: Boolean;',
  1194. ' Public',
  1195. ' class function Cast(const Intf: IJSObject): IJSAttr;',
  1196. ' property aBoolean: Boolean read _GetaBoolean;',
  1197. ' end;',
  1198. '',
  1199. 'var ',
  1200. ' Attr : IJSAttr;',
  1201. '',
  1202. 'implementation',
  1203. '',
  1204. 'function TJSAttr._GetaBoolean: Boolean;',
  1205. 'begin',
  1206. ' Result:=ReadJSPropertyBoolean(''aBoolean'');',
  1207. 'end;',
  1208. '',
  1209. 'class function TJSAttr.Cast(const Intf: IJSObject): IJSAttr;',
  1210. 'begin',
  1211. ' Result:=TJSAttr.JOBCast(Intf);',
  1212. 'end;',
  1213. '',
  1214. 'initialization',
  1215. ' Attr:=TJSAttr.JOBCreateGlobal(''Attr'');',
  1216. '',
  1217. 'finalization',
  1218. ' Attr:=Nil;',
  1219. '',
  1220. 'end.',
  1221. '']);
  1222. end;
  1223. procedure TTestWebIDL2WasmJob.TestWJ_MaplikeInterface;
  1224. begin
  1225. TestWebIDL([
  1226. ' interface PM {',
  1227. ' readonly maplike<DOMString, boolean>;',
  1228. ' };'
  1229. ],[
  1230. 'Type',
  1231. ' // Forward class definitions',
  1232. ' IJSPM = interface;',
  1233. ' TJSPM = class;',
  1234. ' { --------------------------------------------------------------------',
  1235. ' TJSPM',
  1236. ' --------------------------------------------------------------------}',
  1237. '',
  1238. ' IJSPM = interface(IJSObject)',
  1239. ' [''{04D12607-C063-3E89-A483-3296C9C8AA41}'']',
  1240. ' function _Getsize: LongInt;',
  1241. ' function get(key: UnicodeString) : Boolean;',
  1242. ' function has(key: UnicodeString) : Boolean;',
  1243. ' function entries : IJSIterator;',
  1244. ' function keys : IJSIterator;',
  1245. ' function values : IJSIterator;',
  1246. ' property size : LongInt read _Getsize;',
  1247. ' end;',
  1248. '',
  1249. ' TJSPM = class(TJSObject,IJSPM)',
  1250. ' Private',
  1251. ' function _Getsize: LongInt;',
  1252. ' Public',
  1253. ' function get(key: UnicodeString) : Boolean;',
  1254. ' function has(key: UnicodeString) : Boolean;',
  1255. ' function entries : IJSIterator;',
  1256. ' function keys : IJSIterator;',
  1257. ' function values : IJSIterator;',
  1258. ' class function Cast(const Intf: IJSObject): IJSPM;',
  1259. ' property size : LongInt read _Getsize;',
  1260. ' end;',
  1261. '',
  1262. 'implementation',
  1263. '',
  1264. 'function TJSPM._Getsize: LongInt;',
  1265. 'begin',
  1266. ' Result:=ReadJSPropertyLongInt(''size'');',
  1267. 'end;',
  1268. '',
  1269. 'function TJSPM.get(key: UnicodeString) : Boolean;',
  1270. 'begin',
  1271. ' Result:=InvokeJSBooleanResult(''get'',[key]);',
  1272. 'end;',
  1273. '',
  1274. 'function TJSPM.has(key: UnicodeString) : Boolean;',
  1275. 'begin',
  1276. ' Result:=InvokeJSBooleanResult(''has'',[key]);',
  1277. 'end;',
  1278. '',
  1279. 'function TJSPM.entries : IJSIterator;',
  1280. 'begin',
  1281. ' Result:=InvokeJSObjectResult(''entries'',[],TJSIterator) as IJSIterator;',
  1282. 'end;',
  1283. '',
  1284. 'function TJSPM.keys : IJSIterator;',
  1285. 'begin',
  1286. ' Result:=InvokeJSObjectResult(''keys'',[],TJSIterator) as IJSIterator;',
  1287. 'end;',
  1288. '',
  1289. 'function TJSPM.values : IJSIterator;',
  1290. 'begin',
  1291. ' Result:=InvokeJSObjectResult(''values'',[],TJSIterator) as IJSIterator;',
  1292. 'end;',
  1293. '',
  1294. 'class function TJSPM.Cast(const Intf: IJSObject): IJSPM;',
  1295. 'begin',
  1296. ' Result:=TJSPM.JOBCast(Intf);',
  1297. 'end;',
  1298. '',
  1299. 'end.',
  1300. ''
  1301. ]);
  1302. end;
  1303. initialization
  1304. RegisterTests([TTestWebIDL2Wasmjob]);
  1305. end.