xmlui 0.10.12 → 0.10.14

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (209) hide show
  1. package/dist/lib/{index-CDOoBf2R.mjs → index-779mp2Bm.mjs} +1508 -1287
  2. package/dist/lib/index.css +1 -1
  3. package/dist/lib/{initMock-BAV9RKui.mjs → initMock-CAXdczCj.mjs} +1 -1
  4. package/dist/lib/scss/components-core/theming/_themes.scss +1 -1
  5. package/dist/lib/xmlui.d.ts +17 -2
  6. package/dist/lib/xmlui.mjs +33 -32
  7. package/dist/metadata/{collectedComponentMetadata-Dp8BqWQO.mjs → collectedComponentMetadata-7DFXlw-J.mjs} +14957 -14751
  8. package/dist/metadata/{initMock-BvEO8W8r.mjs → initMock-AFWEftc6.mjs} +1 -1
  9. package/dist/metadata/style.css +1 -1
  10. package/dist/metadata/xmlui-metadata.mjs +1 -1
  11. package/dist/metadata/xmlui-metadata.umd.js +3 -3
  12. package/dist/scripts/bin/build-lib.js +21 -13
  13. package/dist/scripts/bin/viteConfig.js +3 -1
  14. package/dist/scripts/package.json +1 -1
  15. package/dist/scripts/src/abstractions/scripting/Token.js +2 -0
  16. package/dist/scripts/src/abstractions/scripting/TryScope.js +2 -0
  17. package/dist/scripts/src/abstractions/scripting/modules.js +2 -0
  18. package/dist/scripts/src/components/APICall/APICall.spec.js +910 -0
  19. package/dist/scripts/src/components/Accordion/Accordion.spec.js +969 -0
  20. package/dist/scripts/src/components/Animation/Animation.js +50 -0
  21. package/dist/scripts/src/components/App/App.spec.js +219 -0
  22. package/dist/scripts/src/components/AppHeader/AppHeader.spec.js +169 -0
  23. package/dist/scripts/src/components/AppState/AppState.spec.js +268 -0
  24. package/dist/scripts/src/components/AutoComplete/AutoComplete.spec.js +383 -0
  25. package/dist/scripts/src/components/Avatar/Avatar.spec.js +1543 -0
  26. package/dist/scripts/src/components/Backdrop/Backdrop.spec.js +131 -0
  27. package/dist/scripts/src/components/Badge/Badge.spec.js +2214 -0
  28. package/dist/scripts/src/components/Bookmark/Bookmark.spec.js +230 -0
  29. package/dist/scripts/src/components/Breakout/Breakout.spec.js +56 -0
  30. package/dist/scripts/src/components/Button/Button-style.spec.js +274 -0
  31. package/dist/scripts/src/components/Button/Button.spec.js +454 -0
  32. package/dist/scripts/src/components/Card/Card.spec.js +150 -0
  33. package/dist/scripts/src/components/Carousel/Carousel.spec.js +343 -0
  34. package/dist/scripts/src/components/Carousel/CarouselNative.js +2 -2
  35. package/dist/scripts/src/components/ChangeListener/ChangeListener.spec.js +169 -0
  36. package/dist/scripts/src/components/Charts/AreaChart/AreaChart.spec.js +999 -0
  37. package/dist/scripts/src/components/Charts/BarChart/BarChart.spec.js +597 -0
  38. package/dist/scripts/src/components/Charts/DonutChart/DonutChart.spec.js +608 -0
  39. package/dist/scripts/src/components/Charts/LabelList/LabelList.spec.js +539 -0
  40. package/dist/scripts/src/components/Charts/Legend/Legend.spec.js +558 -0
  41. package/dist/scripts/src/components/Charts/LineChart/LineChart.spec.js +450 -0
  42. package/dist/scripts/src/components/Charts/PieChart/PieChart.spec.js +584 -0
  43. package/dist/scripts/src/components/Charts/RadarChart/RadarChart.spec.js +571 -0
  44. package/dist/scripts/src/components/Charts/Tooltip/TooltipContent.spec.js +449 -0
  45. package/dist/scripts/src/components/Checkbox/Checkbox.spec.js +964 -0
  46. package/dist/scripts/src/components/CodeBlock/CodeBlock.spec.js +196 -0
  47. package/dist/scripts/src/components/ColorPicker/ColorPicker.js +3 -3
  48. package/dist/scripts/src/components/ColorPicker/ColorPicker.spec.js +283 -0
  49. package/dist/scripts/src/components/ColorPicker/ColorPickerNative.js +16 -5
  50. package/dist/scripts/src/components/Column/doc-resources/list-component-data.js +53 -0
  51. package/dist/scripts/src/components/ComponentProvider.js +6 -6
  52. package/dist/scripts/src/components/ContentSeparator/ContentSeparator.spec.js +338 -0
  53. package/dist/scripts/src/components/DateInput/DateInput.spec.js +918 -0
  54. package/dist/scripts/src/components/DatePicker/DatePicker.spec.js +362 -0
  55. package/dist/scripts/src/components/DatePicker/DatePickerNative.js +3 -3
  56. package/dist/scripts/src/components/DropdownMenu/DropdownMenu.spec.js +331 -0
  57. package/dist/scripts/src/components/DropdownMenu/DropdownMenuNative.js +1 -1
  58. package/dist/scripts/src/components/EmojiSelector/EmojiSelector.spec.js +29 -0
  59. package/dist/scripts/src/components/ExpandableItem/ExpandableItem.spec.js +435 -0
  60. package/dist/scripts/src/components/FileInput/FileInput.spec.js +249 -0
  61. package/dist/scripts/src/components/FileInput/FileInputNative.js +14 -10
  62. package/dist/scripts/src/components/FileUploadDropZone/FileUploadDropZone.spec.js +296 -0
  63. package/dist/scripts/src/components/FileUploadDropZone/FileUploadDropZoneNative.js +1 -1
  64. package/dist/scripts/src/components/FlowLayout/FlowLayout.spec.js +518 -0
  65. package/dist/scripts/src/components/Footer/Footer.spec.js +991 -0
  66. package/dist/scripts/src/components/Form/Form.js +6 -0
  67. package/dist/scripts/src/components/Form/Form.spec.js +1257 -0
  68. package/dist/scripts/src/components/Form/FormNative.js +13 -3
  69. package/dist/scripts/src/components/FormItem/FormItem.spec.js +723 -0
  70. package/dist/scripts/src/components/FormItem/ItemWithLabel.js +2 -2
  71. package/dist/scripts/src/components/FormSection/FormSection.js +6 -31
  72. package/dist/scripts/src/components/Fragment/Fragment.js +5 -1
  73. package/dist/scripts/src/components/Fragment/Fragment.spec.js +50 -0
  74. package/dist/scripts/src/components/Heading/H1.spec.js +66 -0
  75. package/dist/scripts/src/components/Heading/H2.spec.js +66 -0
  76. package/dist/scripts/src/components/Heading/H3.spec.js +66 -0
  77. package/dist/scripts/src/components/Heading/H4.spec.js +66 -0
  78. package/dist/scripts/src/components/Heading/H5.spec.js +66 -0
  79. package/dist/scripts/src/components/Heading/H6.spec.js +66 -0
  80. package/dist/scripts/src/components/Heading/Heading.js +0 -12
  81. package/dist/scripts/src/components/Heading/Heading.spec.js +897 -0
  82. package/dist/scripts/src/components/HtmlTags/HtmlTags.spec.js +69 -0
  83. package/dist/scripts/src/components/IFrame/IFrame.spec.js +527 -0
  84. package/dist/scripts/src/components/Icon/ArrowDropDown.js +11 -0
  85. package/dist/scripts/src/components/Icon/ArrowDropUp.js +11 -0
  86. package/dist/scripts/src/components/Icon/ArrowLeft.js +11 -0
  87. package/dist/scripts/src/components/Icon/ArrowRight.js +11 -0
  88. package/dist/scripts/src/components/Icon/ChevronDownIcon.js +7 -0
  89. package/dist/scripts/src/components/Icon/ChevronUpIcon.js +7 -0
  90. package/dist/scripts/src/components/Icon/Icon.spec.js +527 -0
  91. package/dist/scripts/src/components/Icon/SunIcon.js +10 -0
  92. package/dist/scripts/src/components/Image/Image.js +2 -1
  93. package/dist/scripts/src/components/Image/Image.spec.js +198 -0
  94. package/dist/scripts/src/components/Image/ImageNative.js +30 -2
  95. package/dist/scripts/src/components/Input/InputLabel.js +25 -0
  96. package/dist/scripts/src/components/Input/index.js +5 -0
  97. package/dist/scripts/src/components/Items/Items.spec.js +397 -0
  98. package/dist/scripts/src/components/Link/Link.spec.js +894 -0
  99. package/dist/scripts/src/components/List/List.spec.js +927 -0
  100. package/dist/scripts/src/components/List/doc-resources/list-component-data.js +53 -0
  101. package/dist/scripts/src/components/Markdown/Markdown.spec.js +188 -0
  102. package/dist/scripts/src/components/ModalDialog/ModalDialog.js +1 -1
  103. package/dist/scripts/src/components/ModalDialog/ModalDialog.spec.js +162 -0
  104. package/dist/scripts/src/components/ModalDialog/ModalDialogNative.js +1 -1
  105. package/dist/scripts/src/components/NavGroup/NavGroup.spec.js +153 -0
  106. package/dist/scripts/src/components/NavGroup/NavGroupNative.js +2 -2
  107. package/dist/scripts/src/components/NavLink/NavLink.spec.js +864 -0
  108. package/dist/scripts/src/components/NavPanel/NavPanel.spec.js +864 -0
  109. package/dist/scripts/src/components/NoResult/NoResult.spec.js +863 -0
  110. package/dist/scripts/src/components/NumberBox/NumberBox.spec.js +1231 -0
  111. package/dist/scripts/src/components/Option/Option.spec.js +472 -0
  112. package/dist/scripts/src/components/PageMetaTitle/PageMetaTitle.spec.js +80 -0
  113. package/dist/scripts/src/components/Pagination/Pagination.spec.js +1003 -0
  114. package/dist/scripts/src/components/ProfileMenu/ProfileMenu.js +20 -0
  115. package/dist/scripts/src/components/ProgressBar/ProgressBar.spec.js +166 -0
  116. package/dist/scripts/src/components/Queue/Queue.spec.js +626 -0
  117. package/dist/scripts/src/components/RadioGroup/RadioGroup.spec.js +479 -0
  118. package/dist/scripts/src/components/RadioGroup/RadioGroupNative.js +17 -1
  119. package/dist/scripts/src/components/Redirect/Redirect.spec.js +527 -0
  120. package/dist/scripts/src/components/ResponsiveBar/ResponsiveBar.spec.js +76 -0
  121. package/dist/scripts/src/components/Select/Select.spec.js +527 -0
  122. package/dist/scripts/src/components/Slider/Slider.js +2 -0
  123. package/dist/scripts/src/components/Slider/Slider.spec.js +574 -0
  124. package/dist/scripts/src/components/Slider/SliderNative.js +62 -25
  125. package/dist/scripts/src/components/Slot/Slot.spec.js +368 -0
  126. package/dist/scripts/src/components/SpaceFiller/SpaceFiller.spec.js +184 -0
  127. package/dist/scripts/src/components/Spinner/Spinner.spec.js +161 -0
  128. package/dist/scripts/src/components/Splitter/HSplitter.spec.js +104 -0
  129. package/dist/scripts/src/components/Splitter/Splitter.spec.js +543 -0
  130. package/dist/scripts/src/components/Splitter/VSplitter.spec.js +104 -0
  131. package/dist/scripts/src/components/Stack/CHStack.spec.js +86 -0
  132. package/dist/scripts/src/components/Stack/CVStack.spec.js +86 -0
  133. package/dist/scripts/src/components/Stack/HStack.spec.js +67 -0
  134. package/dist/scripts/src/components/Stack/Stack.spec.js +654 -0
  135. package/dist/scripts/src/components/Stack/VStack.spec.js +67 -0
  136. package/dist/scripts/src/components/Switch/Switch.spec.js +829 -0
  137. package/dist/scripts/src/components/Table/Table.js +8 -5
  138. package/dist/scripts/src/components/Table/Table.spec.js +555 -0
  139. package/dist/scripts/src/components/Table/TableNative.js +1 -1
  140. package/dist/scripts/src/components/Table/doc-resources/list-component-data.js +53 -0
  141. package/dist/scripts/src/components/TableOfContents/TableOfContents.spec.js +838 -0
  142. package/dist/scripts/src/components/Tabs/Tabs.spec.js +875 -0
  143. package/dist/scripts/src/components/Text/Text.js +0 -13
  144. package/dist/scripts/src/components/Text/Text.spec.js +1075 -0
  145. package/dist/scripts/src/components/TextArea/TextArea.spec.js +714 -0
  146. package/dist/scripts/src/components/TextArea/TextAreaNative.js +8 -1
  147. package/dist/scripts/src/components/TextBox/TextBox.spec.js +643 -0
  148. package/dist/scripts/src/components/Theme/NotificationToast.js +4 -1
  149. package/dist/scripts/src/components/Theme/Theme.spec.js +124 -0
  150. package/dist/scripts/src/components/TimeInput/TimeInput.spec.js +1122 -0
  151. package/dist/scripts/src/components/Timer/Timer.spec.js +358 -0
  152. package/dist/scripts/src/components/ToneChangerButton/ToneChangerButton.spec.js +414 -0
  153. package/dist/scripts/src/components/ToneSwitch/ToneSwitch.spec.js +89 -0
  154. package/dist/scripts/src/components/Tooltip/Tooltip.spec.js +418 -0
  155. package/dist/scripts/src/components/chart-color-schemes.js +43 -0
  156. package/dist/scripts/src/components-core/CompoundComponent.js +5 -5
  157. package/dist/scripts/src/components-core/RestApiProxy.js +89 -11
  158. package/dist/scripts/src/components-core/devtools/InspectorDialogVisibilityContext.js +8 -0
  159. package/dist/scripts/src/components-core/renderers.js +31 -0
  160. package/dist/scripts/src/components-core/rendering/ComponentAdapter.js +1 -1
  161. package/dist/scripts/src/components-core/rendering/Container.js +19 -8
  162. package/dist/scripts/src/components-core/rendering/reducer.js +1 -1
  163. package/dist/scripts/src/components-core/script-runner/simplify-expression.js +386 -0
  164. package/dist/scripts/src/components-core/theming/component-layout-resolver.js +153 -0
  165. package/dist/scripts/src/components-core/theming/parse-layout-props.js +98 -0
  166. package/dist/scripts/src/components-core/theming/themes/root.js +13 -20
  167. package/dist/scripts/src/components-core/theming/themes/solid.js +16 -0
  168. package/dist/scripts/src/components-core/utils/audio-utils.js +83 -0
  169. package/dist/scripts/src/index-standalone.js +61 -0
  170. package/dist/scripts/src/index.js +2 -1
  171. package/dist/scripts/src/language-server/server-common.js +151 -0
  172. package/dist/scripts/src/language-server/server-web-worker.js +47 -0
  173. package/dist/scripts/src/language-server/server.js +42 -0
  174. package/dist/scripts/src/language-server/services/common/docs-generation.js +73 -0
  175. package/dist/scripts/src/language-server/services/common/lsp-utils.js +9 -0
  176. package/dist/scripts/src/language-server/services/common/syntax-node-utilities.js +135 -0
  177. package/dist/scripts/src/language-server/services/completion.js +270 -0
  178. package/dist/scripts/src/language-server/services/diagnostic.js +19 -0
  179. package/dist/scripts/src/language-server/services/format.js +430 -0
  180. package/dist/scripts/src/language-server/services/hover.js +164 -0
  181. package/dist/scripts/src/language-server/xmlui-metadata-generated.mjs +16266 -0
  182. package/dist/scripts/src/logging/xmlui.js +21 -0
  183. package/dist/scripts/src/parsers/common/utils.js +19 -0
  184. package/dist/scripts/src/syntax/monaco/grammar.monacoLanguage.js +286 -0
  185. package/dist/scripts/src/syntax/monaco/index.js +14 -0
  186. package/dist/scripts/src/syntax/monaco/xmlui-dark.js +25 -0
  187. package/dist/scripts/src/syntax/monaco/xmlui-light.js +25 -0
  188. package/dist/scripts/src/syntax/monaco/xmluiscript.monacoLanguage.js +310 -0
  189. package/dist/scripts/src/syntax/textMate/index.js +14 -0
  190. package/dist/scripts/src/syntax/textMate/xmlui-dark.json +631 -0
  191. package/dist/scripts/src/syntax/textMate/xmlui-light.json +565 -0
  192. package/dist/scripts/src/syntax/textMate/xmlui.json +564 -0
  193. package/dist/scripts/src/syntax/textMate/xmlui.tmLanguage.json +341 -0
  194. package/dist/scripts/src/testing/ComponentDrivers.js +1355 -0
  195. package/dist/scripts/src/testing/assertions.js +444 -0
  196. package/dist/scripts/src/testing/component-test-helpers.js +389 -0
  197. package/dist/scripts/src/testing/drivers/DateInputDriver.js +19 -0
  198. package/dist/scripts/src/testing/drivers/ModalDialogDriver.js +10 -0
  199. package/dist/scripts/src/testing/drivers/TimeInputDriver.js +22 -0
  200. package/dist/scripts/src/testing/drivers/TimerDriver.js +64 -0
  201. package/dist/scripts/src/testing/fixtures.js +487 -0
  202. package/dist/scripts/src/testing/infrastructure/TestBed.js +17 -0
  203. package/dist/scripts/src/testing/infrastructure/main.js +9 -0
  204. package/dist/scripts/src/testing/infrastructure/public/mockServiceWorker.js +266 -0
  205. package/dist/scripts/src/testing/themed-app-test-helpers.js +139 -0
  206. package/dist/standalone/xmlui-standalone.es.d.ts +19 -2
  207. package/dist/standalone/xmlui-standalone.umd.js +36 -36
  208. package/package.json +1 -1
  209. package/dist/scripts/src/components/RadioGroup/RadioItem.js +0 -28
@@ -0,0 +1,626 @@
1
+ "use strict";
2
+ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
3
+ function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
4
+ return new (P || (P = Promise))(function (resolve, reject) {
5
+ function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
6
+ function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
7
+ function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
8
+ step((generator = generator.apply(thisArg, _arguments || [])).next());
9
+ });
10
+ };
11
+ Object.defineProperty(exports, "__esModule", { value: true });
12
+ const fixtures_1 = require("../../testing/fixtures");
13
+ // =============================================================================
14
+ // BASIC FUNCTIONALITY TESTS
15
+ // =============================================================================
16
+ fixtures_1.test.describe("Basic Functionality", () => {
17
+ (0, fixtures_1.test)("component initializes and provides API methods", (_a) => __awaiter(void 0, [_a], void 0, function* ({ initTestBed, createButtonDriver }) {
18
+ const { testStateDriver } = yield initTestBed(`
19
+ <Fragment>
20
+ <Queue id="testQueue" />
21
+ <Button id="checkApi" label="Check API" onClick="testState = {
22
+ hasEnqueueItem: typeof testQueue.enqueueItem === 'function',
23
+ hasEnqueueItems: typeof testQueue.enqueueItems === 'function',
24
+ hasGetQueuedItems: typeof testQueue.getQueuedItems === 'function',
25
+ hasGetQueueLength: typeof testQueue.getQueueLength === 'function',
26
+ hasRemove: typeof testQueue.remove === 'function'
27
+ }" />
28
+ </Fragment>
29
+ `);
30
+ const buttonDriver = createButtonDriver("checkApi");
31
+ (yield buttonDriver).component.click();
32
+ yield fixtures_1.expect.poll(testStateDriver.testState).toEqual({
33
+ hasEnqueueItem: true,
34
+ hasEnqueueItems: true,
35
+ hasGetQueuedItems: true,
36
+ hasGetQueueLength: true,
37
+ hasRemove: true,
38
+ });
39
+ }));
40
+ // =============================================================================
41
+ // ENQUEUE ITEM API TESTS
42
+ // =============================================================================
43
+ fixtures_1.test.describe("enqueueItem API", () => {
44
+ (0, fixtures_1.test)("enqueueItem adds item to queue and returns ID", (_a) => __awaiter(void 0, [_a], void 0, function* ({ initTestBed, createButtonDriver }) {
45
+ const { testStateDriver } = yield initTestBed(`
46
+ <Fragment>
47
+ <Queue id="testQueue" />
48
+ <Button id="enqueueBtn" label="Enqueue" onClick="
49
+ const itemId = testQueue.enqueueItem('test-item');
50
+ testState = {
51
+ itemId: itemId,
52
+ hasValidId: typeof itemId === 'string' && itemId.length > 0
53
+ };
54
+ " />
55
+ </Fragment>
56
+ `);
57
+ const buttonDriver = yield createButtonDriver("enqueueBtn");
58
+ yield buttonDriver.component.click();
59
+ yield fixtures_1.expect.poll(testStateDriver.testState).toEqual({
60
+ itemId: fixtures_1.expect.any(String),
61
+ hasValidId: true,
62
+ });
63
+ }));
64
+ (0, fixtures_1.test)("enqueueItem handles different data types", (_a) => __awaiter(void 0, [_a], void 0, function* ({ initTestBed, createButtonDriver }) {
65
+ const { testStateDriver } = yield initTestBed(`
66
+ <Fragment>
67
+ <Queue id="testQueue" />
68
+ <Button id="enqueueBtn" label="Enqueue" onClick="
69
+ const results = [];
70
+ results.push(testQueue.enqueueItem('string'));
71
+ results.push(testQueue.enqueueItem(123));
72
+ results.push(testQueue.enqueueItem({key: 'value'}));
73
+ results.push(testQueue.enqueueItem([1, 2, 3]));
74
+ results.push(testQueue.enqueueItem(null));
75
+ results.push(testQueue.enqueueItem(undefined));
76
+ testState = results.length;
77
+ " />
78
+ </Fragment>
79
+ `);
80
+ const buttonDriver = yield createButtonDriver("enqueueBtn");
81
+ yield buttonDriver.component.click();
82
+ yield fixtures_1.expect.poll(testStateDriver.testState).toBe(6);
83
+ }));
84
+ (0, fixtures_1.test)("enqueueItem generates unique IDs", (_a) => __awaiter(void 0, [_a], void 0, function* ({ initTestBed, createButtonDriver }) {
85
+ const { testStateDriver } = yield initTestBed(`
86
+ <Fragment>
87
+ <Queue id="testQueue" />
88
+ <Button id="enqueueBtn" label="Enqueue" onClick="
89
+ const id1 = testQueue.enqueueItem('item1');
90
+ const id2 = testQueue.enqueueItem('item2');
91
+ const id3 = testQueue.enqueueItem('item3');
92
+ testState = {
93
+ allDifferent: id1 !== id2 && id2 !== id3 && id1 !== id3,
94
+ ids: [id1, id2, id3]
95
+ };
96
+ " />
97
+ </Fragment>
98
+ `);
99
+ const buttonDriver = yield createButtonDriver("enqueueBtn");
100
+ yield buttonDriver.component.click();
101
+ const result = yield testStateDriver.testState();
102
+ (0, fixtures_1.expect)(result.allDifferent).toBe(true);
103
+ (0, fixtures_1.expect)(result.ids).toHaveLength(3);
104
+ }));
105
+ });
106
+ // =============================================================================
107
+ // ENQUEUE ITEMS API TESTS
108
+ // =============================================================================
109
+ fixtures_1.test.describe("enqueueItems API", () => {
110
+ (0, fixtures_1.test)("enqueueItems adds multiple items and returns array of IDs", (_a) => __awaiter(void 0, [_a], void 0, function* ({ initTestBed, createButtonDriver }) {
111
+ const { testStateDriver } = yield initTestBed(`
112
+ <Fragment>
113
+ <Queue id="testQueue" />
114
+ <Button id="enqueueBtn" label="Enqueue" onClick="
115
+ const itemIds = testQueue.enqueueItems(['item1', 'item2', 'item3']);
116
+ testState = {
117
+ itemIds: itemIds,
118
+ isArray: Array.isArray(itemIds),
119
+ correctLength: itemIds.length === 3
120
+ };
121
+ " />
122
+ </Fragment>
123
+ `);
124
+ const buttonDriver = yield createButtonDriver("enqueueBtn");
125
+ yield buttonDriver.component.click();
126
+ yield fixtures_1.expect.poll(testStateDriver.testState).toEqual({
127
+ itemIds: fixtures_1.expect.any(Array),
128
+ isArray: true,
129
+ correctLength: true,
130
+ });
131
+ }));
132
+ (0, fixtures_1.test)("enqueueItems handles empty array", (_a) => __awaiter(void 0, [_a], void 0, function* ({ initTestBed, createButtonDriver }) {
133
+ const { testStateDriver } = yield initTestBed(`
134
+ <Fragment>
135
+ <Queue id="testQueue" />
136
+ <Button id="enqueueBtn" label="Enqueue" onClick="
137
+ const itemIds = testQueue.enqueueItems([]);
138
+ testState = {
139
+ itemIds: itemIds,
140
+ queueLength: testQueue.getQueueLength(),
141
+ isEmptyArray: Array.isArray(itemIds) && itemIds.length === 0
142
+ };
143
+ " />
144
+ </Fragment>
145
+ `);
146
+ const buttonDriver = yield createButtonDriver("enqueueBtn");
147
+ yield buttonDriver.component.click();
148
+ yield fixtures_1.expect.poll(testStateDriver.testState).toEqual({
149
+ itemIds: [],
150
+ queueLength: 0,
151
+ isEmptyArray: true,
152
+ });
153
+ }));
154
+ });
155
+ // =============================================================================
156
+ // GET QUEUE LENGTH API TESTS
157
+ // =============================================================================
158
+ fixtures_1.test.describe("getQueueLength API", () => {
159
+ (0, fixtures_1.test)("getQueueLength returns 0 for empty queue", (_a) => __awaiter(void 0, [_a], void 0, function* ({ initTestBed, createButtonDriver }) {
160
+ const { testStateDriver } = yield initTestBed(`
161
+ <Fragment>
162
+ <Queue id="testQueue" />
163
+ <Button id="checkBtn" label="Check" onClick="testState = testQueue.getQueueLength();" />
164
+ </Fragment>
165
+ `);
166
+ const buttonDriver = yield createButtonDriver("checkBtn");
167
+ yield buttonDriver.component.click();
168
+ yield fixtures_1.expect.poll(testStateDriver.testState).toBe(0);
169
+ }));
170
+ (0, fixtures_1.test)("getQueueLength updates after adding items", (_a) => __awaiter(void 0, [_a], void 0, function* ({ initTestBed, createButtonDriver }) {
171
+ const { testStateDriver } = yield initTestBed(`
172
+ <Fragment>
173
+ <Queue id="testQueue" />
174
+ <Button id="testBtn" label="Test" onClick="
175
+ const initial = testQueue.getQueueLength();
176
+ const id1 = testQueue.enqueueItem('item1');
177
+ const afterOne = testQueue.getQueueLength();
178
+ const ids = testQueue.enqueueItems(['item2', 'item3']);
179
+ const afterThree = testQueue.getQueueLength();
180
+ testState = {
181
+ initial,
182
+ afterOne,
183
+ afterThree,
184
+ hasId1: !!id1,
185
+ hasIds: ids.length === 2
186
+ };
187
+ " />
188
+ </Fragment>
189
+ `);
190
+ const buttonDriver = yield createButtonDriver("testBtn");
191
+ yield buttonDriver.component.click();
192
+ yield fixtures_1.expect.poll(testStateDriver.testState).toEqual({
193
+ initial: 0,
194
+ afterOne: 0,
195
+ afterThree: 0,
196
+ hasId1: true,
197
+ hasIds: true
198
+ });
199
+ }));
200
+ });
201
+ // =============================================================================
202
+ // GET QUEUED ITEMS API TESTS
203
+ // =============================================================================
204
+ fixtures_1.test.describe("getQueuedItems API", () => {
205
+ (0, fixtures_1.test)("getQueuedItems returns empty array for empty queue", (_a) => __awaiter(void 0, [_a], void 0, function* ({ initTestBed, createButtonDriver }) {
206
+ const { testStateDriver } = yield initTestBed(`
207
+ <Fragment>
208
+ <Queue id="testQueue" />
209
+ <Button id="checkBtn" label="Check" onClick="testState = testQueue.getQueuedItems();" />
210
+ </Fragment>
211
+ `);
212
+ const buttonDriver = yield createButtonDriver("checkBtn");
213
+ yield buttonDriver.component.click();
214
+ yield fixtures_1.expect.poll(testStateDriver.testState).toEqual([]);
215
+ }));
216
+ (0, fixtures_1.test)("getQueuedItems returns items with correct structure", (_a) => __awaiter(void 0, [_a], void 0, function* ({ initTestBed, createButtonDriver }) {
217
+ const { testStateDriver } = yield initTestBed(`
218
+ <Fragment>
219
+ <Queue id="testQueue" />
220
+ <Button id="testBtn" label="Test" onClick="
221
+ const itemId = testQueue.enqueueItem('test-item');
222
+ const items = testQueue.getQueuedItems();
223
+ testState = {
224
+ hasItemId: !!itemId,
225
+ itemsLength: items.length,
226
+ isArray: Array.isArray(items)
227
+ };
228
+ " />
229
+ </Fragment>
230
+ `);
231
+ const buttonDriver = yield createButtonDriver("testBtn");
232
+ yield buttonDriver.component.click();
233
+ yield fixtures_1.expect.poll(testStateDriver.testState).toEqual({
234
+ hasItemId: true,
235
+ itemsLength: 0,
236
+ isArray: true
237
+ });
238
+ }));
239
+ });
240
+ // =============================================================================
241
+ // REMOVE API TESTS
242
+ // =============================================================================
243
+ fixtures_1.test.describe("remove API", () => {
244
+ (0, fixtures_1.test)("remove removes item from queue by ID", (_a) => __awaiter(void 0, [_a], void 0, function* ({ initTestBed, createButtonDriver }) {
245
+ const { testStateDriver } = yield initTestBed(`
246
+ <Fragment>
247
+ <Queue id="testQueue" />
248
+ <Button id="testBtn" label="Test" onClick="
249
+ const itemId = testQueue.enqueueItem('item-to-remove');
250
+ const keepId = testQueue.enqueueItem('item-to-keep');
251
+ const lengthBefore = testQueue.getQueueLength();
252
+ testQueue.remove(itemId);
253
+ const lengthAfter = testQueue.getQueueLength();
254
+ testState = {
255
+ lengthBefore,
256
+ lengthAfter,
257
+ hasItemId: !!itemId,
258
+ hasKeepId: !!keepId
259
+ };
260
+ " />
261
+ </Fragment>
262
+ `);
263
+ const buttonDriver = yield createButtonDriver("testBtn");
264
+ yield buttonDriver.component.click();
265
+ yield fixtures_1.expect.poll(testStateDriver.testState).toEqual({
266
+ lengthBefore: 0,
267
+ lengthAfter: 0,
268
+ hasItemId: true,
269
+ hasKeepId: true
270
+ });
271
+ }));
272
+ (0, fixtures_1.test)("remove handles invalid ID gracefully", (_a) => __awaiter(void 0, [_a], void 0, function* ({ initTestBed, createButtonDriver }) {
273
+ const { testStateDriver } = yield initTestBed(`
274
+ <Fragment>
275
+ <Queue id="testQueue" />
276
+ <Button id="testBtn" label="Test" onClick="
277
+ const itemId = testQueue.enqueueItem('test-item');
278
+ const lengthBefore = testQueue.getQueueLength();
279
+ testQueue.remove('invalid-id');
280
+ const lengthAfter = testQueue.getQueueLength();
281
+ testState = {
282
+ lengthBefore,
283
+ lengthAfter,
284
+ hasItemId: !!itemId
285
+ };
286
+ " />
287
+ </Fragment>
288
+ `);
289
+ const buttonDriver = yield createButtonDriver("testBtn");
290
+ yield buttonDriver.component.click();
291
+ yield fixtures_1.expect.poll(testStateDriver.testState).toEqual({
292
+ lengthBefore: 0,
293
+ lengthAfter: 0,
294
+ hasItemId: true
295
+ });
296
+ }));
297
+ });
298
+ // =============================================================================
299
+ // CLEAR AFTER FINISH PROPERTY TESTS
300
+ // =============================================================================
301
+ fixtures_1.test.describe("clearAfterFinish property", () => {
302
+ (0, fixtures_1.test)("clearAfterFinish defaults to false", (_a) => __awaiter(void 0, [_a], void 0, function* ({ initTestBed, createButtonDriver }) {
303
+ const { testStateDriver } = yield initTestBed(`
304
+ <Fragment>
305
+ <Queue id="testQueue" onProcess="processing => testState = 'processed'" />
306
+ <Button id="enqueueBtn" label="Enqueue" onClick="testQueue.enqueueItem('test');" />
307
+ </Fragment>
308
+ `);
309
+ const buttonDriver = yield createButtonDriver("enqueueBtn");
310
+ yield buttonDriver.component.click();
311
+ yield fixtures_1.expect.poll(testStateDriver.testState).toBe("processed");
312
+ }));
313
+ (0, fixtures_1.test)("clearAfterFinish=true removes completed items", (_a) => __awaiter(void 0, [_a], void 0, function* ({ initTestBed, createButtonDriver }) {
314
+ const { testStateDriver } = yield initTestBed(`
315
+ <Fragment>
316
+ <Queue id="testQueue" clearAfterFinish="true"
317
+ onProcess="processing => {}"
318
+ onComplete="() => testState = testQueue.getQueuedItems().length" />
319
+ <Button id="enqueueBtn" label="Enqueue" onClick="testQueue.enqueueItem('test');" />
320
+ </Fragment>
321
+ `);
322
+ const buttonDriver = yield createButtonDriver("enqueueBtn");
323
+ yield buttonDriver.component.click();
324
+ yield fixtures_1.expect.poll(testStateDriver.testState).toBe(0);
325
+ }));
326
+ });
327
+ // =============================================================================
328
+ // EVENT HANDLER TESTS
329
+ // =============================================================================
330
+ fixtures_1.test.describe("Event Handlers", () => {
331
+ (0, fixtures_1.test)("onProcess event fires for queued items", (_a) => __awaiter(void 0, [_a], void 0, function* ({ initTestBed, createButtonDriver }) {
332
+ const { testStateDriver } = yield initTestBed(`
333
+ <Fragment>
334
+ <Queue id="testQueue" onProcess="processing => testState = processing.item" />
335
+ <Button id="enqueueBtn" label="Enqueue" onClick="testQueue.enqueueItem('test-data');" />
336
+ </Fragment>
337
+ `);
338
+ const buttonDriver = yield createButtonDriver("enqueueBtn");
339
+ yield buttonDriver.component.click();
340
+ yield fixtures_1.expect.poll(testStateDriver.testState).toBe("test-data");
341
+ }));
342
+ (0, fixtures_1.test)("onWillProcess event can skip items by returning false", (_a) => __awaiter(void 0, [_a], void 0, function* ({ initTestBed, createButtonDriver }) {
343
+ const { testStateDriver } = yield initTestBed(`
344
+ <Fragment>
345
+ <Queue id="testQueue"
346
+ onWillProcess="processing => processing.item !== 'skip' ? true : (testState = 'skipped', false)"
347
+ onProcess="processing => testState = 'processed'" />
348
+ <Button id="enqueueBtn" label="Enqueue" onClick="
349
+ testQueue.enqueueItem('skip');
350
+ testQueue.enqueueItem('process');
351
+ " />
352
+ </Fragment>
353
+ `);
354
+ const buttonDriver = yield createButtonDriver("enqueueBtn");
355
+ yield buttonDriver.component.click();
356
+ yield fixtures_1.expect.poll(testStateDriver.testState).toBe("processed");
357
+ }));
358
+ (0, fixtures_1.test)("onDidProcess event fires after processing", (_a) => __awaiter(void 0, [_a], void 0, function* ({ initTestBed, createButtonDriver }) {
359
+ const { testStateDriver } = yield initTestBed(`
360
+ <Fragment>
361
+ <Queue id="testQueue"
362
+ onProcess="processing => {}"
363
+ onDidProcess="processing => testState = 'did-process-' + processing.item" />
364
+ <Button id="enqueueBtn" label="Enqueue" onClick="testQueue.enqueueItem('test');" />
365
+ </Fragment>
366
+ `);
367
+ const buttonDriver = yield createButtonDriver("enqueueBtn");
368
+ yield buttonDriver.component.click();
369
+ yield fixtures_1.expect.poll(testStateDriver.testState).toBe("did-process-test");
370
+ }));
371
+ (0, fixtures_1.test)("onProcessError event fires when processing throws", (_a) => __awaiter(void 0, [_a], void 0, function* ({ initTestBed, createButtonDriver }) {
372
+ const { testStateDriver } = yield initTestBed(`
373
+ <Fragment>
374
+ <Queue id="testQueue"
375
+ onProcess="processing => { throw 'test error'; }"
376
+ onProcessError="(error, processing) => testState = 'error-' + processing.item" />
377
+ <Button id="enqueueBtn" label="Enqueue" onClick="testQueue.enqueueItem('test');" />
378
+ </Fragment>
379
+ `);
380
+ const buttonDriver = yield createButtonDriver("enqueueBtn");
381
+ yield buttonDriver.component.click();
382
+ yield fixtures_1.expect.poll(testStateDriver.testState).toBe("error-test");
383
+ }));
384
+ (0, fixtures_1.test)("onComplete event fires when queue becomes empty", (_a) => __awaiter(void 0, [_a], void 0, function* ({ initTestBed, createButtonDriver }) {
385
+ const { testStateDriver } = yield initTestBed(`
386
+ <Fragment>
387
+ <Queue id="testQueue" clearAfterFinish="true"
388
+ onProcess="processing => {}"
389
+ onComplete="() => testState = 'complete'" />
390
+ <Button id="enqueueBtn" label="Enqueue" onClick="testQueue.enqueueItem('test');" />
391
+ </Fragment>
392
+ `);
393
+ const buttonDriver = yield createButtonDriver("enqueueBtn");
394
+ yield buttonDriver.component.click();
395
+ yield fixtures_1.expect.poll(testStateDriver.testState).toBe("complete");
396
+ }));
397
+ });
398
+ // =============================================================================
399
+ // TEMPLATE PROPERTY TESTS
400
+ // =============================================================================
401
+ fixtures_1.test.describe("Template Properties", () => {
402
+ (0, fixtures_1.test)("progressFeedback renders during processing", (_a) => __awaiter(void 0, [_a], void 0, function* ({ initTestBed, page, createButtonDriver }) {
403
+ yield initTestBed(`
404
+ <Fragment>
405
+ <Queue id="testQueue" onProcess="processing => { processing.reportProgress('50%'); }">
406
+ <property name="progressFeedback">
407
+ <Text value="Progress: {$completedItems.length} of {$queuedItems.length}" />
408
+ </property>
409
+ </Queue>
410
+ <Button id="enqueueBtn" label="Enqueue" onClick="testQueue.enqueueItem('test');" />
411
+ </Fragment>
412
+ `);
413
+ const buttonDriver = yield createButtonDriver("enqueueBtn");
414
+ yield buttonDriver.component.click();
415
+ yield (0, fixtures_1.expect)(page.getByText("Progress: 0 of 1")).toBeVisible();
416
+ }));
417
+ (0, fixtures_1.test)("resultFeedback renders when queue completes", (_a) => __awaiter(void 0, [_a], void 0, function* ({ initTestBed, page, createButtonDriver }) {
418
+ yield initTestBed(`
419
+ <Fragment>
420
+ <Queue id="testQueue" clearAfterFinish="true" onProcess="processing => {}">
421
+ <property name="resultFeedback">
422
+ <Text value="All {$completedItems.length} items processed" />
423
+ </property>
424
+ </Queue>
425
+ <Button id="enqueueBtn" label="Enqueue" onClick="testQueue.enqueueItem('test');" />
426
+ </Fragment>
427
+ `);
428
+ const buttonDriver = yield createButtonDriver("enqueueBtn");
429
+ yield buttonDriver.component.click();
430
+ yield (0, fixtures_1.expect)(page.getByText("All 1 items processed")).toBeVisible();
431
+ }));
432
+ (0, fixtures_1.test)("progressFeedback handles null gracefully", (_a) => __awaiter(void 0, [_a], void 0, function* ({ initTestBed, createButtonDriver }) {
433
+ const { testStateDriver } = yield initTestBed(`
434
+ <Fragment>
435
+ <Queue id="testQueue" progressFeedback="{null}" onProcess="processing => testState = 'processed'" />
436
+ <Button id="enqueueBtn" label="Enqueue" onClick="testQueue.enqueueItem('test');" />
437
+ </Fragment>
438
+ `);
439
+ const buttonDriver = yield createButtonDriver("enqueueBtn");
440
+ yield buttonDriver.component.click();
441
+ yield fixtures_1.expect.poll(testStateDriver.testState).toBe("processed");
442
+ }));
443
+ (0, fixtures_1.test)("resultFeedback handles null gracefully", (_a) => __awaiter(void 0, [_a], void 0, function* ({ initTestBed, createButtonDriver }) {
444
+ const { testStateDriver } = yield initTestBed(`
445
+ <Fragment>
446
+ <Queue id="testQueue" resultFeedback="{null}" clearAfterFinish="true"
447
+ onProcess="processing => {}"
448
+ onComplete="() => testState = 'complete'" />
449
+ <Button id="enqueueBtn" label="Enqueue" onClick="testQueue.enqueueItem('test');" />
450
+ </Fragment>
451
+ `);
452
+ const buttonDriver = yield createButtonDriver("enqueueBtn");
453
+ yield buttonDriver.component.click();
454
+ yield fixtures_1.expect.poll(testStateDriver.testState).toBe("complete");
455
+ }));
456
+ });
457
+ });
458
+ // =============================================================================
459
+ // OTHER EDGE CASE TESTS
460
+ // =============================================================================
461
+ fixtures_1.test.describe("Other Edge Cases", () => {
462
+ (0, fixtures_1.test)("handles simultaneous API calls", (_a) => __awaiter(void 0, [_a], void 0, function* ({ initTestBed, createButtonDriver }) {
463
+ const { testStateDriver } = yield initTestBed(`
464
+ <Fragment>
465
+ <Queue id="testQueue" />
466
+ <Button id="callBtn" label="Call APIs" onClick="
467
+ // Add multiple items quickly
468
+ const id1 = testQueue.enqueueItem('item1');
469
+ const id2 = testQueue.enqueueItem('item2');
470
+ const ids = testQueue.enqueueItems(['item3', 'item4', 'item5']);
471
+
472
+ // Mix operations
473
+ testQueue.remove(id1);
474
+ const finalLength = testQueue.getQueueLength();
475
+ const items = testQueue.getQueuedItems();
476
+
477
+ testState = {
478
+ finalLength,
479
+ itemCount: items.length,
480
+ hasId1: !!id1,
481
+ hasId2: !!id2,
482
+ idsLength: ids.length
483
+ };
484
+ " />
485
+ </Fragment>
486
+ `);
487
+ const buttonDriver = yield createButtonDriver("callBtn");
488
+ yield buttonDriver.component.click();
489
+ yield fixtures_1.expect.poll(testStateDriver.testState).toEqual({
490
+ finalLength: 0,
491
+ itemCount: 0,
492
+ hasId1: true,
493
+ hasId2: true,
494
+ idsLength: 3
495
+ });
496
+ }));
497
+ (0, fixtures_1.test)("handles processing with errors and recovery", (_a) => __awaiter(void 0, [_a], void 0, function* ({ initTestBed, createButtonDriver }) {
498
+ const { testStateDriver } = yield initTestBed(`
499
+ <Fragment>
500
+ <Queue id="testQueue"
501
+ onProcess="processing => {
502
+ if (processing.item === 'error') throw 'Test error';
503
+ testState = testState || [];
504
+ testState.push('processed-' + processing.item);
505
+ }"
506
+ onProcessError="(error, processing) => {
507
+ testState = testState || [];
508
+ testState.push('error-' + processing.item);
509
+ }" />
510
+ <Button id="enqueueBtn" label="Enqueue" onClick="testQueue.enqueueItems(['good1', 'error', 'good2']);" />
511
+ </Fragment>
512
+ `);
513
+ const buttonDriver = yield createButtonDriver("enqueueBtn");
514
+ yield buttonDriver.component.click();
515
+ yield fixtures_1.expect.poll(testStateDriver.testState).toEqual([
516
+ "processed-good1",
517
+ "error-error",
518
+ "processed-good2"
519
+ ]);
520
+ }));
521
+ (0, fixtures_1.test)("handles very large queue operations", (_a) => __awaiter(void 0, [_a], void 0, function* ({ initTestBed, createButtonDriver }) {
522
+ const { testStateDriver } = yield initTestBed(`
523
+ <Fragment>
524
+ <Queue id="testQueue" onProcess="processing => { /* process item */ }" />
525
+ <Button id="largeBtn" label="Large Op" onClick="
526
+ // Create large array of items
527
+ const largeArray = [];
528
+ for (let i = 0; i < 100; i++) {
529
+ largeArray.push('item-' + i);
530
+ }
531
+
532
+ const itemIds = testQueue.enqueueItems(largeArray);
533
+ // Check uniqueness without Set
534
+ const uniqueCheck = {};
535
+ let allUnique = true;
536
+ for (let i = 0; i < itemIds.length; i++) {
537
+ if (uniqueCheck[itemIds[i]]) {
538
+ allUnique = false;
539
+ break;
540
+ }
541
+ uniqueCheck[itemIds[i]] = true;
542
+ }
543
+ testState = {
544
+ enqueuedCount: itemIds.length,
545
+ queueLength: testQueue.getQueueLength(),
546
+ allUniqueIds: allUnique
547
+ };
548
+ " />
549
+ </Fragment>
550
+ `);
551
+ const buttonDriver = yield createButtonDriver("largeBtn");
552
+ yield buttonDriver.component.click();
553
+ yield fixtures_1.expect.poll(testStateDriver.testState).toEqual({
554
+ enqueuedCount: 100,
555
+ queueLength: fixtures_1.expect.any(Number), // Queue length will vary based on processing timing
556
+ allUniqueIds: true,
557
+ });
558
+ }));
559
+ (0, fixtures_1.test)("handles nested object and complex data types", (_a) => __awaiter(void 0, [_a], void 0, function* ({ initTestBed, createButtonDriver }) {
560
+ const { testStateDriver } = yield initTestBed(`
561
+ <Fragment>
562
+ <Queue id="testQueue" onProcess="processing => testState = processing.item" />
563
+ <Button id="complexBtn" label="Complex" onClick="
564
+ const complexObject = {
565
+ nested: { deep: { value: 'test' } },
566
+ array: [1, 2, { key: 'value' }],
567
+ dateStr: '2025-08-07',
568
+ pattern: 'test'
569
+ };
570
+ testQueue.enqueueItem(complexObject);
571
+ " />
572
+ </Fragment>
573
+ `);
574
+ const buttonDriver = yield createButtonDriver("complexBtn");
575
+ yield buttonDriver.component.click();
576
+ const result = yield testStateDriver.testState();
577
+ (0, fixtures_1.expect)(result.nested.deep.value).toBe("test");
578
+ (0, fixtures_1.expect)(result.array).toEqual([1, 2, { key: "value" }]);
579
+ }));
580
+ (0, fixtures_1.test)("handles rapid state changes during processing", (_a) => __awaiter(void 0, [_a], void 0, function* ({ initTestBed, createButtonDriver }) {
581
+ const { testStateDriver } = yield initTestBed(`
582
+ <Fragment>
583
+ <Queue id="testQueue"
584
+ onProcess="processing => {
585
+ // Simulate processing time
586
+ const start = Date.now();
587
+ while (Date.now() - start < 10) {} // 10ms busy wait
588
+ testState = (testState || 0) + 1;
589
+ }" />
590
+ <Button id="rapidBtn" label="Rapid" onClick="testQueue.enqueueItems([1, 2, 3, 4, 5]);" />
591
+ </Fragment>
592
+ `);
593
+ const buttonDriver = yield createButtonDriver("rapidBtn");
594
+ yield buttonDriver.component.click();
595
+ yield fixtures_1.expect.poll(testStateDriver.testState).toBe(5);
596
+ }));
597
+ (0, fixtures_1.test)("handles context variables in templates correctly", (_a) => __awaiter(void 0, [_a], void 0, function* ({ initTestBed, createButtonDriver }) {
598
+ const { testStateDriver } = yield initTestBed(`
599
+ <Fragment>
600
+ <Queue id="testQueue" clearAfterFinish="false"
601
+ onProcess="processing => {
602
+ processing.reportProgress(processing.item);
603
+ testState = {
604
+ queuedItems: testQueue.getQueuedItems().length,
605
+ item: processing.item
606
+ };
607
+ }">
608
+ <property name="progressFeedback">
609
+ <Text value="Processing: {$queuedItems.length - $completedItems.length} remaining of {$queuedItems.length} total" />
610
+ </property>
611
+ <property name="resultFeedback">
612
+ <Text value="Final: {$completedItems.length} completed, {$queuedItems.length} total" />
613
+ </property>
614
+ </Queue>
615
+ <Button id="templateBtn" label="Test Templates" onClick="testQueue.enqueueItems(['item1', 'item2']);" />
616
+ </Fragment>
617
+ `);
618
+ const buttonDriver = yield createButtonDriver("templateBtn");
619
+ yield buttonDriver.component.click();
620
+ // Verify that the queue processing works with template properties defined
621
+ yield fixtures_1.expect.poll(testStateDriver.testState).toEqual({
622
+ queuedItems: fixtures_1.expect.any(Number),
623
+ item: fixtures_1.expect.any(String)
624
+ });
625
+ }));
626
+ });