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,1003 @@
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 component_test_helpers_1 = require("../../testing/component-test-helpers");
13
+ const fixtures_1 = require("../../testing/fixtures");
14
+ // =============================================================================
15
+ // BASIC FUNCTIONALITY TESTS
16
+ // =============================================================================
17
+ fixtures_1.test.describe("Basic Functionality", () => {
18
+ (0, fixtures_1.test)("renders basic controls with no props", (_a) => __awaiter(void 0, [_a], void 0, function* ({ initTestBed, page }) {
19
+ yield initTestBed(`<Pagination />`);
20
+ yield (0, fixtures_1.expect)(page.getByRole("button", { name: "Previous page" })).toBeVisible();
21
+ yield (0, fixtures_1.expect)(page.getByRole("button", { name: "Next page" })).toBeVisible();
22
+ }));
23
+ (0, fixtures_1.test)("controls are disabled if enabled=false", (_a) => __awaiter(void 0, [_a], void 0, function* ({ initTestBed, page }) {
24
+ yield initTestBed(`<Pagination enabled="false" itemCount="100" pageSize="10" pageIndex="0" />`);
25
+ // Should not show navigation buttons
26
+ yield (0, fixtures_1.expect)(page.getByRole("button", { name: "First page" })).toBeDisabled();
27
+ yield (0, fixtures_1.expect)(page.getByRole("button", { name: "Previous page" })).toBeDisabled();
28
+ yield (0, fixtures_1.expect)(page.getByRole("button", { name: "Next page" })).toBeDisabled();
29
+ yield (0, fixtures_1.expect)(page.getByRole("button", { name: "Last page" })).toBeDisabled();
30
+ }));
31
+ (0, fixtures_1.test)("controls are disabled if enabled=false #2", (_a) => __awaiter(void 0, [_a], void 0, function* ({ initTestBed, page }) {
32
+ yield initTestBed(`<Pagination enabled="false" itemCount="100" pageSize="10" pageIndex="0" maxVisiblePages="3" />`);
33
+ // Should not show navigation buttons
34
+ yield (0, fixtures_1.expect)(page.getByRole("button", { name: "First page" })).toBeDisabled();
35
+ yield (0, fixtures_1.expect)(page.getByRole("button", { name: "Page 1" })).toBeDisabled();
36
+ yield (0, fixtures_1.expect)(page.getByRole("button", { name: "Page 2" })).toBeDisabled();
37
+ yield (0, fixtures_1.expect)(page.getByRole("button", { name: "Page 3" })).toBeDisabled();
38
+ yield (0, fixtures_1.expect)(page.getByRole("button", { name: "Last page" })).toBeDisabled();
39
+ }));
40
+ (0, fixtures_1.test)("renders with basic props", (_a) => __awaiter(void 0, [_a], void 0, function* ({ initTestBed, page }) {
41
+ yield initTestBed(`<Pagination itemCount="100" pageSize="10" pageIndex="0" />`);
42
+ // Should show navigation buttons
43
+ yield (0, fixtures_1.expect)(page.getByRole("button", { name: "First page" })).toBeVisible();
44
+ yield (0, fixtures_1.expect)(page.getByRole("button", { name: "Previous page" })).toBeVisible();
45
+ yield (0, fixtures_1.expect)(page.getByRole("button", { name: "Next page" })).toBeVisible();
46
+ yield (0, fixtures_1.expect)(page.getByRole("button", { name: "Last page" })).toBeVisible();
47
+ // Should show page info by default
48
+ yield (0, fixtures_1.expect)(page.getByText("Page 1 of 10 (100 items)")).toBeVisible();
49
+ }));
50
+ (0, fixtures_1.test)("renders when itemCount is zero", (_a) => __awaiter(void 0, [_a], void 0, function* ({ initTestBed, page }) {
51
+ yield initTestBed(`<Pagination itemCount="0"/>`);
52
+ // Component should not be visible
53
+ yield (0, fixtures_1.expect)(page.getByRole("button", { name: "First page" })).toBeVisible();
54
+ yield (0, fixtures_1.expect)(page.getByText(/Page \d+ of \d+/)).toBeVisible();
55
+ }));
56
+ (0, fixtures_1.test)("handles itemCount property correctly", (_a) => __awaiter(void 0, [_a], void 0, function* ({ initTestBed, page }) {
57
+ yield initTestBed(`<Pagination itemCount="25" pageSize="5"/>`);
58
+ // Should calculate correct total pages (25 items / 5 per page = 5 pages)
59
+ yield (0, fixtures_1.expect)(page.getByText("Page 1 of 5 (25 items)")).toBeVisible();
60
+ }));
61
+ (0, fixtures_1.test)("handles pageSize property correctly", (_a) => __awaiter(void 0, [_a], void 0, function* ({ initTestBed, page }) {
62
+ yield initTestBed(`<Pagination itemCount="100" pageSize="20"/>`);
63
+ // Should calculate correct total pages (100 items / 20 per page = 5 pages)
64
+ yield (0, fixtures_1.expect)(page.getByText("Page 1 of 5 (100 items)")).toBeVisible();
65
+ }));
66
+ (0, fixtures_1.test)("handles showPageInfo property correctly", (_a) => __awaiter(void 0, [_a], void 0, function* ({ initTestBed, page }) {
67
+ yield initTestBed(`<Pagination itemCount="50" pageSize="10" showPageInfo="false"/>`);
68
+ // Should not show page info when showPageInfo is false
69
+ yield (0, fixtures_1.expect)(page.getByText(/Page \d+ of \d+/)).not.toBeVisible();
70
+ // But should still show navigation buttons
71
+ yield (0, fixtures_1.expect)(page.getByRole("button", { name: "First page" })).toBeVisible();
72
+ }));
73
+ (0, fixtures_1.test)("handles pageIndex property correctly", (_a) => __awaiter(void 0, [_a], void 0, function* ({ initTestBed, page }) {
74
+ yield initTestBed(`<Pagination itemCount="50" pageSize="10" pageIndex="2" showPageInfo="false" />`);
75
+ // Should show page 3 (0-based index 2)
76
+ yield (0, fixtures_1.expect)(page.getByText("3", { exact: true })).toBeVisible();
77
+ }));
78
+ (0, fixtures_1.test)("handles maxVisiblePages property correctly", (_a) => __awaiter(void 0, [_a], void 0, function* ({ initTestBed, page }) {
79
+ yield initTestBed(`<Pagination itemCount="100" pageSize="10" maxVisiblePages="3"/>`);
80
+ // With maxVisiblePages=3, should only show 3 page buttons
81
+ const pageButtons = page.getByRole("button").filter({ hasText: /^\d+$/ });
82
+ yield (0, fixtures_1.expect)(pageButtons).toHaveCount(3);
83
+ // Should show pages 1, 2, 3
84
+ yield (0, fixtures_1.expect)(page.getByRole("button", { name: "Page 1" })).toBeVisible();
85
+ yield (0, fixtures_1.expect)(page.getByRole("button", { name: "Page 2" })).toBeVisible();
86
+ yield (0, fixtures_1.expect)(page.getByRole("button", { name: "Page 3" })).toBeVisible();
87
+ }));
88
+ (0, fixtures_1.test)("handles maxVisiblePages when there's only one page", (_a) => __awaiter(void 0, [_a], void 0, function* ({ initTestBed, page }) {
89
+ yield initTestBed(`<Pagination itemCount="5" pageSize="10" maxVisiblePages="1"/>`);
90
+ // Should show just the page number as text, not a button
91
+ yield (0, fixtures_1.expect)(page.getByText("1", { exact: true })).toBeVisible();
92
+ // Should not have clickable page buttons
93
+ const pageButtons = page.getByRole("button").filter({ hasText: /^\d+$/ });
94
+ yield (0, fixtures_1.expect)(pageButtons).toHaveCount(0);
95
+ }));
96
+ (0, fixtures_1.test)("navigation buttons are disabled correctly on first page", (_a) => __awaiter(void 0, [_a], void 0, function* ({ initTestBed, page }) {
97
+ yield initTestBed(`<Pagination itemCount="50" pageSize="10" pageIndex="0"/>`);
98
+ // First and Previous buttons should be disabled
99
+ yield (0, fixtures_1.expect)(page.getByRole("button", { name: "First page" })).toBeDisabled();
100
+ yield (0, fixtures_1.expect)(page.getByRole("button", { name: "Previous page" })).toBeDisabled();
101
+ // Next and Last buttons should be enabled
102
+ yield (0, fixtures_1.expect)(page.getByRole("button", { name: "Next page" })).toBeEnabled();
103
+ yield (0, fixtures_1.expect)(page.getByRole("button", { name: "Last page" })).toBeEnabled();
104
+ }));
105
+ (0, fixtures_1.test)("navigation buttons are disabled correctly on last page", (_a) => __awaiter(void 0, [_a], void 0, function* ({ initTestBed, page }) {
106
+ yield initTestBed(`<Pagination itemCount="50" pageSize="10" pageIndex="4"/>`);
107
+ // Next and Last buttons should be disabled
108
+ yield (0, fixtures_1.expect)(page.getByRole("button", { name: "Next page" })).toBeDisabled();
109
+ yield (0, fixtures_1.expect)(page.getByRole("button", { name: "Last page" })).toBeDisabled();
110
+ // First and Previous buttons should be enabled
111
+ yield (0, fixtures_1.expect)(page.getByRole("button", { name: "First page" })).toBeEnabled();
112
+ yield (0, fixtures_1.expect)(page.getByRole("button", { name: "Previous page" })).toBeEnabled();
113
+ }));
114
+ (0, fixtures_1.test)("handles edge case with single item", (_a) => __awaiter(void 0, [_a], void 0, function* ({ initTestBed, page }) {
115
+ yield initTestBed(`<Pagination itemCount="1" pageSize="10"/>`);
116
+ yield (0, fixtures_1.expect)(page.getByText("Page 1 of 1 (1 items)")).toBeVisible();
117
+ yield (0, fixtures_1.expect)(page.getByRole("button", { name: "First Page" })).toBeDisabled();
118
+ yield (0, fixtures_1.expect)(page.getByRole("button", { name: "Previous Page" })).toBeDisabled();
119
+ yield (0, fixtures_1.expect)(page.getByRole("button", { name: "Next Page" })).toBeDisabled();
120
+ yield (0, fixtures_1.expect)(page.getByRole("button", { name: "Last Page" })).toBeDisabled();
121
+ }));
122
+ (0, fixtures_1.test)("handles negative itemCount gracefully", (_a) => __awaiter(void 0, [_a], void 0, function* ({ initTestBed, page }) {
123
+ yield initTestBed(`<Pagination itemCount="-5" pageSize="10" pageIndex="0"/>`);
124
+ yield (0, fixtures_1.expect)(page.getByRole("button", { name: "Previous Page" })).toBeVisible();
125
+ yield (0, fixtures_1.expect)(page.getByRole("button", { name: "Next Page" })).toBeVisible();
126
+ }));
127
+ (0, fixtures_1.test)("handles negative pageIndex gracefully", (_a) => __awaiter(void 0, [_a], void 0, function* ({ initTestBed, page }) {
128
+ yield initTestBed(`<Pagination itemCount="10" pageSize="5" pageIndex="-1"/>`);
129
+ // Should clamp pageIndex to 0 and render first page
130
+ yield (0, fixtures_1.expect)(page.getByText("Page 1 of 2 (10 items)")).toBeVisible();
131
+ yield (0, fixtures_1.expect)(page.getByRole("button", { name: "First page" })).toBeDisabled();
132
+ yield (0, fixtures_1.expect)(page.getByRole("button", { name: "Previous page" })).toBeDisabled();
133
+ }));
134
+ (0, fixtures_1.test)("handles negative pageSize gracefully", (_a) => __awaiter(void 0, [_a], void 0, function* ({ initTestBed, page }) {
135
+ yield initTestBed(`<Pagination itemCount="10" pageSize="-5" pageIndex="0"/>`);
136
+ // Should clamp pageSize to 1 and render first page
137
+ yield (0, fixtures_1.expect)(page.getByText("Page 1 of 1 (10 items)")).toBeVisible();
138
+ yield (0, fixtures_1.expect)(page.getByRole("button", { name: "First page" })).toBeDisabled();
139
+ yield (0, fixtures_1.expect)(page.getByRole("button", { name: "Previous page" })).toBeDisabled();
140
+ }));
141
+ (0, fixtures_1.test)("displays minimal layout if no itemCount provided", (_a) => __awaiter(void 0, [_a], void 0, function* ({ initTestBed, page }) {
142
+ yield initTestBed(`<Pagination />`);
143
+ // Should show minimal layout
144
+ yield (0, fixtures_1.expect)(page.getByText("Page 1 of 1 (1 items)")).not.toBeAttached();
145
+ yield (0, fixtures_1.expect)(page.getByRole("button", { name: "First Page" })).not.toBeAttached();
146
+ yield (0, fixtures_1.expect)(page.getByRole("button", { name: "Previous Page" })).toBeDisabled();
147
+ yield (0, fixtures_1.expect)(page.getByRole("button", { name: "Next Page" })).toBeDisabled();
148
+ yield (0, fixtures_1.expect)(page.getByRole("button", { name: "Last Page" })).not.toBeAttached();
149
+ }));
150
+ (0, fixtures_1.test)("hasPrevPage modifies Previous button enabled state", (_a) => __awaiter(void 0, [_a], void 0, function* ({ initTestBed, page }) {
151
+ yield initTestBed(`<Pagination hasPrevPage="true" />`);
152
+ yield (0, fixtures_1.expect)(page.getByRole("button", { name: "Previous page" })).toBeEnabled();
153
+ }));
154
+ (0, fixtures_1.test)("hasPrevPage does not interfere with Next button state", (_a) => __awaiter(void 0, [_a], void 0, function* ({ initTestBed, page }) {
155
+ yield initTestBed(`<Pagination hasPrevPage="true" hasNextPage="false" />`);
156
+ yield (0, fixtures_1.expect)(page.getByRole("button", { name: "Next page" })).toBeDisabled();
157
+ }));
158
+ (0, fixtures_1.test)("hasNextPage modifies Next button enabled state", (_a) => __awaiter(void 0, [_a], void 0, function* ({ initTestBed, page }) {
159
+ yield initTestBed(`<Pagination hasNextPage="true" />`);
160
+ yield (0, fixtures_1.expect)(page.getByRole("button", { name: "Next page" })).toBeEnabled();
161
+ }));
162
+ (0, fixtures_1.test)("hasNextPage does not interfere with Previous button state", (_a) => __awaiter(void 0, [_a], void 0, function* ({ initTestBed, page, }) {
163
+ yield initTestBed(`<Pagination hasNextPage="true" hasPrevPage="false" />`);
164
+ yield (0, fixtures_1.expect)(page.getByRole("button", { name: "Previous page" })).toBeDisabled();
165
+ }));
166
+ (0, fixtures_1.test)("hasPrevPage and hasNextPage have no effect if itemCount >= 0", (_a) => __awaiter(void 0, [_a], void 0, function* ({ initTestBed, page, }) {
167
+ yield initTestBed(`<Pagination itemCount="50" pageSize="10" pageIndex="2" hasPrevPage="false" hasNextPage="false" />`);
168
+ yield (0, fixtures_1.expect)(page.getByRole("button", { name: "Previous page" })).toBeEnabled();
169
+ yield (0, fixtures_1.expect)(page.getByRole("button", { name: "Next page" })).toBeEnabled();
170
+ }));
171
+ (0, fixtures_1.test)("shows page size selector by default when pageSizeOptions are provided", (_a) => __awaiter(void 0, [_a], void 0, function* ({ initTestBed, page, }) {
172
+ yield initTestBed(`<Pagination itemCount="50" pageSize="10" pageSizeOptions="{[5, 10, 20]}"/>`);
173
+ yield (0, fixtures_1.expect)(page.locator("select")).toBeVisible();
174
+ }));
175
+ (0, fixtures_1.test)("hides page size selector when showPageSizeSelector is false", (_a) => __awaiter(void 0, [_a], void 0, function* ({ initTestBed, page, }) {
176
+ yield initTestBed(`
177
+ <Pagination
178
+ itemCount="50"
179
+ pageSize="10"
180
+ pageSizeOptions="{[5, 10, 20]}"
181
+ showPageSizeSelector="false"
182
+ />
183
+ `);
184
+ yield (0, fixtures_1.expect)(page.locator("select")).not.toBeVisible();
185
+ }));
186
+ (0, fixtures_1.test)("shows page size selector when showPageSizeSelector is true", (_a) => __awaiter(void 0, [_a], void 0, function* ({ initTestBed, page, }) {
187
+ yield initTestBed(`
188
+ <Pagination
189
+ itemCount="50"
190
+ pageSize="10"
191
+ pageSizeOptions="{[5, 10, 20]}"
192
+ showPageSizeSelector="true"
193
+ />
194
+ `);
195
+ yield (0, fixtures_1.expect)(page.locator("select")).toBeVisible();
196
+ }));
197
+ (0, fixtures_1.test)("showPageSizeSelector has no effect when pageSizeOptions is empty", (_a) => __awaiter(void 0, [_a], void 0, function* ({ initTestBed, page, }) {
198
+ yield initTestBed(`<Pagination itemCount="50" pageSize="10" showPageSizeSelector="true"/>`);
199
+ yield (0, fixtures_1.expect)(page.locator("select")).not.toBeVisible();
200
+ }));
201
+ (0, fixtures_1.test)("showPageSizeSelector has no effect when pageSizeOptions has only one option", (_a) => __awaiter(void 0, [_a], void 0, function* ({ initTestBed, page, }) {
202
+ yield initTestBed(`<Pagination itemCount="50" pageSize="10" pageSizeOptions="{[10]}" showPageSizeSelector="true"/>`);
203
+ yield (0, fixtures_1.expect)(page.locator("select")).not.toBeVisible();
204
+ }));
205
+ (0, fixtures_1.test)("does not show page size selector when pageSizeOptions is not provided", (_a) => __awaiter(void 0, [_a], void 0, function* ({ initTestBed, page, }) {
206
+ yield initTestBed(`<Pagination itemCount="50" pageSize="10"/>`);
207
+ yield (0, fixtures_1.expect)(page.getByText("Items per page")).not.toBeVisible();
208
+ yield (0, fixtures_1.expect)(page.locator("select")).not.toBeVisible();
209
+ }));
210
+ (0, fixtures_1.test)("shows page size selector when multiple pageSizeOptions are provided", (_a) => __awaiter(void 0, [_a], void 0, function* ({ initTestBed, page, }) {
211
+ yield initTestBed(`<Pagination itemCount="50" pageSize="10" pageSizeOptions="{[5, 10, 20]}"/>`);
212
+ // Should show page size selector
213
+ yield (0, fixtures_1.expect)(page.getByText("Items per page")).toBeVisible();
214
+ // Should show select dropdown with current value
215
+ const select = page.locator("select");
216
+ yield (0, fixtures_1.expect)(select).toBeVisible();
217
+ yield (0, fixtures_1.expect)(select).toHaveValue("10");
218
+ // Check that all options exist in the DOM (even if not visible)
219
+ yield (0, fixtures_1.expect)(select.locator('option[value="5"]')).toHaveCount(1);
220
+ yield (0, fixtures_1.expect)(select.locator('option[value="10"]')).toHaveCount(1);
221
+ yield (0, fixtures_1.expect)(select.locator('option[value="20"]')).toHaveCount(1);
222
+ }));
223
+ (0, fixtures_1.test)("page size selector is disabled when component is disabled", (_a) => __awaiter(void 0, [_a], void 0, function* ({ initTestBed, page, }) {
224
+ yield initTestBed(`<Pagination enabled="false" itemCount="50" pageSize="10" pageSizeOptions="{[5, 10, 20]}"/>`);
225
+ // Select should be disabled
226
+ const select = page.locator("select");
227
+ yield (0, fixtures_1.expect)(select).toBeDisabled();
228
+ }));
229
+ (0, fixtures_1.test)("page size selector allows changing selection", (_a) => __awaiter(void 0, [_a], void 0, function* ({ initTestBed, page }) {
230
+ yield initTestBed(`<Pagination itemCount="50" pageSize="10" pageSizeOptions="{[5, 10, 20]}"/>`);
231
+ // Should show page size selector
232
+ yield (0, fixtures_1.expect)(page.getByText("Items per page")).toBeVisible();
233
+ // Should start with correct value
234
+ const select = page.locator("select");
235
+ yield (0, fixtures_1.expect)(select).toHaveValue("10");
236
+ // Should be able to interact with the select (this triggers the event)
237
+ yield select.selectOption("20");
238
+ // Note: In a real application, the parent would update the pageSize prop
239
+ // which would cause the select to show the new value. For this test,
240
+ // we're just verifying the interaction is possible.
241
+ }));
242
+ (0, fixtures_1.test)("page size selector reflects current pageSize", (_a) => __awaiter(void 0, [_a], void 0, function* ({ initTestBed, page }) {
243
+ yield initTestBed(`<Pagination itemCount="100" pageSize="20" pageSizeOptions="{[5, 10, 20, 50]}"/>`);
244
+ // Select should show current page size
245
+ const select = page.locator("select");
246
+ yield (0, fixtures_1.expect)(select).toHaveValue("20");
247
+ }));
248
+ (0, fixtures_1.test)("handles pageSize not in pageSizeOptions gracefully", (_a) => __awaiter(void 0, [_a], void 0, function* ({ initTestBed, page }) {
249
+ yield initTestBed(`<Pagination itemCount="100" pageSize="15" pageSizeOptions="{[5, 10, 20]}"/>`);
250
+ // Should show page size selector since multiple options are provided
251
+ yield (0, fixtures_1.expect)(page.getByText("Items per page")).toBeVisible();
252
+ const select = page.locator("select");
253
+ yield (0, fixtures_1.expect)(select).toBeVisible();
254
+ // When pageSize (15) is not in pageSizeOptions, component defaults to first option (5)
255
+ // This tests how the component handles mismatched pageSize vs pageSizeOptions
256
+ yield (0, fixtures_1.expect)(select).toHaveValue("5");
257
+ // All original options should still be available
258
+ yield (0, fixtures_1.expect)(select.locator('option[value="5"]')).toHaveCount(1);
259
+ yield (0, fixtures_1.expect)(select.locator('option[value="10"]')).toHaveCount(1);
260
+ yield (0, fixtures_1.expect)(select.locator('option[value="20"]')).toHaveCount(1);
261
+ // Page calculations should use the actual pageSize (15), not the selected option (5)
262
+ // 100 items / 15 per page = 6.67 -> 7 pages
263
+ yield (0, fixtures_1.expect)(page.getByText("Page 1 of 7 (100 items)")).toBeVisible();
264
+ }));
265
+ // Edge cases for showPageSizeSelector property
266
+ (0, fixtures_1.test)("handles null showPageSizeSelector property", (_a) => __awaiter(void 0, [_a], void 0, function* ({ initTestBed, page }) {
267
+ yield initTestBed(`<Pagination itemCount="50" pageSize="10" pageSizeOptions="{[5, 10, 20]}" showPageSizeSelector="{null}"/>`);
268
+ // Should fall back to default behavior (true) when null
269
+ yield (0, fixtures_1.expect)(page.getByText("Items per page")).toBeVisible();
270
+ yield (0, fixtures_1.expect)(page.locator("select")).toBeVisible();
271
+ }));
272
+ (0, fixtures_1.test)("handles undefined showPageSizeSelector property", (_a) => __awaiter(void 0, [_a], void 0, function* ({ initTestBed, page }) {
273
+ yield initTestBed(`<Pagination itemCount="50" pageSize="10" pageSizeOptions="{[5, 10, 20]}" showPageSizeSelector="{undefined}"/>`);
274
+ // Should fall back to default behavior (true) when undefined
275
+ yield (0, fixtures_1.expect)(page.getByText("Items per page")).toBeVisible();
276
+ yield (0, fixtures_1.expect)(page.locator("select")).toBeVisible();
277
+ }));
278
+ (0, fixtures_1.test)("handles string 'false' for showPageSizeSelector property", (_a) => __awaiter(void 0, [_a], void 0, function* ({ initTestBed, page, }) {
279
+ yield initTestBed(`<Pagination itemCount="50" pageSize="10" pageSizeOptions="{[5, 10, 20]}" showPageSizeSelector="false"/>`);
280
+ // Should treat string 'false' as false
281
+ yield (0, fixtures_1.expect)(page.getByText("Items per page")).not.toBeVisible();
282
+ yield (0, fixtures_1.expect)(page.locator("select")).not.toBeVisible();
283
+ }));
284
+ (0, fixtures_1.test)("handles string 'true' for showPageSizeSelector property", (_a) => __awaiter(void 0, [_a], void 0, function* ({ initTestBed, page }) {
285
+ yield initTestBed(`<Pagination itemCount="50" pageSize="10" pageSizeOptions="{[5, 10, 20]}" showPageSizeSelector="true"/>`);
286
+ // Should treat string 'true' as true
287
+ yield (0, fixtures_1.expect)(page.getByText("Items per page")).toBeVisible();
288
+ yield (0, fixtures_1.expect)(page.locator("select")).toBeVisible();
289
+ }));
290
+ (0, fixtures_1.test)("handles numeric 0 for showPageSizeSelector property", (_a) => __awaiter(void 0, [_a], void 0, function* ({ initTestBed, page }) {
291
+ yield initTestBed(`<Pagination itemCount="50" pageSize="10" pageSizeOptions="{[5, 10, 20]}" showPageSizeSelector="{0}"/>`);
292
+ // Should treat 0 as false
293
+ yield (0, fixtures_1.expect)(page.getByText("Items per page")).not.toBeVisible();
294
+ yield (0, fixtures_1.expect)(page.locator("select")).not.toBeVisible();
295
+ }));
296
+ (0, fixtures_1.test)("handles numeric 1 for showPageSizeSelector property", (_a) => __awaiter(void 0, [_a], void 0, function* ({ initTestBed, page }) {
297
+ yield initTestBed(`<Pagination itemCount="50" pageSize="10" pageSizeOptions="{[5, 10, 20]}" showPageSizeSelector="{1}"/>`);
298
+ // Should treat 1 as true
299
+ yield (0, fixtures_1.expect)(page.getByText("Items per page")).toBeVisible();
300
+ yield (0, fixtures_1.expect)(page.locator("select")).toBeVisible();
301
+ }));
302
+ (0, fixtures_1.test)("handles object for showPageSizeSelector property", (_a) => __awaiter(void 0, [_a], void 0, function* ({ initTestBed, page }) {
303
+ yield initTestBed(`<Pagination itemCount="50" pageSize="10" pageSizeOptions="{[5, 10, 20]}" showPageSizeSelector="{{a: 'b'}}" />`);
304
+ // Objects may cause component to not render properly in some contexts
305
+ const pageSizeText = page.getByText("Items per page");
306
+ const exists = yield pageSizeText.count();
307
+ if (exists > 0) {
308
+ // Should treat object as truthy (true) when it renders
309
+ yield (0, fixtures_1.expect)(pageSizeText).toBeVisible();
310
+ yield (0, fixtures_1.expect)(page.locator("select")).toBeVisible();
311
+ }
312
+ else {
313
+ // Component may not render page size selector with invalid object input
314
+ yield (0, fixtures_1.expect)(pageSizeText).not.toBeVisible();
315
+ }
316
+ }));
317
+ (0, fixtures_1.test)("handles empty string for showPageSizeSelector property", (_a) => __awaiter(void 0, [_a], void 0, function* ({ initTestBed, page }) {
318
+ yield initTestBed(`<Pagination itemCount="50" pageSize="10" pageSizeOptions="{[5, 10, 20]}" showPageSizeSelector=""/>`);
319
+ // Should treat empty string as false
320
+ yield (0, fixtures_1.expect)(page.getByText("Items per page")).not.toBeVisible();
321
+ yield (0, fixtures_1.expect)(page.locator("select")).not.toBeVisible();
322
+ }));
323
+ (0, fixtures_1.test)("defaults to horizontal orientation", (_a) => __awaiter(void 0, [_a], void 0, function* ({ initTestBed, page }) {
324
+ yield initTestBed(`<Pagination itemCount="50" pageSize="10"/>`);
325
+ // Should have horizontal class by default
326
+ const nav = page.locator('nav[aria-label="Pagination"]');
327
+ const prevButton = nav.getByRole("button", { name: "Previous page" });
328
+ const nextButton = nav.getByRole("button", { name: "Next page" });
329
+ const { top: prevTop, bottom: prevBottom } = yield (0, component_test_helpers_1.getBounds)(prevButton);
330
+ const { top: nextTop, bottom: nextBottom } = yield (0, component_test_helpers_1.getBounds)(nextButton);
331
+ (0, fixtures_1.expect)(prevBottom).toEqualWithTolerance(nextBottom, 1);
332
+ (0, fixtures_1.expect)(prevTop).toEqualWithTolerance(nextTop, 1);
333
+ }));
334
+ (0, fixtures_1.test)("applies horizontal orientation when specified", (_a) => __awaiter(void 0, [_a], void 0, function* ({ initTestBed, page }) {
335
+ yield initTestBed(`<Pagination itemCount="50" pageSize="10" orientation="horizontal"/>`);
336
+ // Should have horizontal class
337
+ const nav = page.locator('nav[aria-label="Pagination"]');
338
+ const prevButton = nav.getByRole("button", { name: "Previous page" });
339
+ const nextButton = nav.getByRole("button", { name: "Next page" });
340
+ const { top: prevTop, bottom: prevBottom } = yield (0, component_test_helpers_1.getBounds)(prevButton);
341
+ const { top: nextTop, bottom: nextBottom } = yield (0, component_test_helpers_1.getBounds)(nextButton);
342
+ (0, fixtures_1.expect)(prevBottom).toEqualWithTolerance(nextBottom, 1);
343
+ (0, fixtures_1.expect)(prevTop).toEqualWithTolerance(nextTop, 1);
344
+ }));
345
+ (0, fixtures_1.test)("applies vertical orientation when specified", (_a) => __awaiter(void 0, [_a], void 0, function* ({ initTestBed, page }) {
346
+ yield initTestBed(`<Pagination itemCount="50" pageSize="10" orientation="vertical"/>`);
347
+ // Should have vertical class
348
+ const nav = page.locator('nav[aria-label="Pagination"]');
349
+ const prevButton = nav.getByRole("button", { name: "Previous page" });
350
+ const nextButton = nav.getByRole("button", { name: "Next page" });
351
+ const { bottom: prevBottom } = yield (0, component_test_helpers_1.getBounds)(prevButton);
352
+ const { top: nextTop } = yield (0, component_test_helpers_1.getBounds)(nextButton);
353
+ (0, fixtures_1.expect)(prevBottom).toBeLessThan(nextTop);
354
+ }));
355
+ (0, fixtures_1.test)("falls back to default orientation for invalid values", (_a) => __awaiter(void 0, [_a], void 0, function* ({ initTestBed, page }) {
356
+ yield initTestBed(`<Pagination itemCount="50" pageSize="10" orientation="invalid"/>`);
357
+ // Should fall back to horizontal (default)
358
+ const nav = page.locator('nav[aria-label="Pagination"]');
359
+ const prevButton = nav.getByRole("button", { name: "Previous page" });
360
+ const nextButton = nav.getByRole("button", { name: "Next page" });
361
+ const { top: prevTop, bottom: prevBottom } = yield (0, component_test_helpers_1.getBounds)(prevButton);
362
+ const { top: nextTop, bottom: nextBottom } = yield (0, component_test_helpers_1.getBounds)(nextButton);
363
+ (0, fixtures_1.expect)(prevBottom).toEqualWithTolerance(nextBottom, 1);
364
+ (0, fixtures_1.expect)(prevTop).toEqualWithTolerance(nextTop, 1);
365
+ }));
366
+ (0, fixtures_1.test)("vertical orientation works with page size selector", (_a) => __awaiter(void 0, [_a], void 0, function* ({ initTestBed, page }) {
367
+ yield initTestBed(`<Pagination itemCount="50" pageSize="10" orientation="vertical" pageSizeOptions="{[5, 10, 20]}"/>`);
368
+ // Should have vertical class and show page size selector
369
+ const nav = page.locator('nav[aria-label="Pagination"]');
370
+ const prevButton = nav.getByRole("button", { name: "Previous page" });
371
+ const nextButton = nav.getByRole("button", { name: "Next page" });
372
+ const { bottom: prevBottom } = yield (0, component_test_helpers_1.getBounds)(prevButton);
373
+ const { top: nextTop } = yield (0, component_test_helpers_1.getBounds)(nextButton);
374
+ (0, fixtures_1.expect)(prevBottom).toBeLessThan(nextTop);
375
+ yield (0, fixtures_1.expect)(page.getByText("Items per page")).toBeVisible();
376
+ }));
377
+ (0, fixtures_1.test)("applies buttonRowPosition correctly", (_a) => __awaiter(void 0, [_a], void 0, function* ({ initTestBed, page }) {
378
+ yield initTestBed(`<Pagination
379
+ itemCount="50"
380
+ pageSize="10"
381
+ buttonRowPosition="start"
382
+ pageSizeOptions="{[5, 10, 20]}"
383
+ pageSizeSelectorPosition="end"
384
+ pageInfoPosition="center"
385
+ />`);
386
+ // Check that pagination controls exist and are rendered
387
+ yield (0, fixtures_1.expect)(page.locator('[data-component="pagination-controls"]')).toBeVisible();
388
+ // Check the structure shows proper positioning (buttons should be rendered before page size selector)
389
+ const nav = page.locator('nav[aria-label="Pagination"]');
390
+ yield (0, fixtures_1.expect)(nav).toBeVisible();
391
+ }));
392
+ (0, fixtures_1.test)("applies pageSizeSelectorPosition correctly", (_a) => __awaiter(void 0, [_a], void 0, function* ({ initTestBed, page }) {
393
+ yield initTestBed(`<Pagination
394
+ itemCount="50"
395
+ pageSize="10"
396
+ buttonRowPosition="center"
397
+ pageSizeOptions="{[5, 10, 20]}"
398
+ pageSizeSelectorPosition="start"
399
+ pageInfoPosition="end"
400
+ />`);
401
+ // Check that page size selector exists and is rendered
402
+ yield (0, fixtures_1.expect)(page.locator('[data-component="page-size-selector-container"]')).toBeVisible();
403
+ yield (0, fixtures_1.expect)(page.getByText("Items per page")).toBeVisible();
404
+ }));
405
+ (0, fixtures_1.test)("applies pageInfoPosition correctly", (_a) => __awaiter(void 0, [_a], void 0, function* ({ initTestBed, page }) {
406
+ yield initTestBed(`<Pagination
407
+ itemCount="50"
408
+ pageSize="10"
409
+ buttonRowPosition="start"
410
+ pageSizeSelectorPosition="center"
411
+ pageInfoPosition="end"
412
+ />`);
413
+ // Check that page info exists and is rendered
414
+ yield (0, fixtures_1.expect)(page.locator('[data-component="page-info"]')).toBeVisible();
415
+ yield (0, fixtures_1.expect)(page.getByText("Page 1 of 5 (50 items)")).toBeVisible();
416
+ }));
417
+ (0, fixtures_1.test)("renders only necessary components based on props", (_a) => __awaiter(void 0, [_a], void 0, function* ({ initTestBed, page }) {
418
+ yield initTestBed(`<Pagination
419
+ itemCount="50"
420
+ pageSize="10"
421
+ buttonRowPosition="start"
422
+ showPageInfo="false"
423
+ showPageSizeSelector="false"
424
+ />`);
425
+ // Button row should be rendered
426
+ yield (0, fixtures_1.expect)(page.locator('[data-component="pagination-controls"]')).toBeVisible();
427
+ // Page info and size selector should not be rendered
428
+ yield (0, fixtures_1.expect)(page.locator('[data-component="page-info"]')).not.toBeVisible();
429
+ yield (0, fixtures_1.expect)(page.locator('[data-component="page-size-selector-container"]')).not.toBeVisible();
430
+ }));
431
+ (0, fixtures_1.test)("renders multiple components when in different positions", (_a) => __awaiter(void 0, [_a], void 0, function* ({ initTestBed, page }) {
432
+ yield initTestBed(`<Pagination
433
+ itemCount="50"
434
+ pageSize="10"
435
+ buttonRowPosition="start"
436
+ pageSizeOptions="{[5, 10, 20]}"
437
+ pageSizeSelectorPosition="center"
438
+ pageInfoPosition="end"
439
+ />`);
440
+ // All components should be rendered
441
+ yield (0, fixtures_1.expect)(page.locator('[data-component="pagination-controls"]')).toBeVisible();
442
+ yield (0, fixtures_1.expect)(page.locator('[data-component="page-size-selector-container"]')).toBeVisible();
443
+ yield (0, fixtures_1.expect)(page.locator('[data-component="page-info"]')).toBeVisible();
444
+ }));
445
+ (0, fixtures_1.test)("positions work correctly with vertical orientation", (_a) => __awaiter(void 0, [_a], void 0, function* ({ initTestBed, page }) {
446
+ yield initTestBed(`<Pagination
447
+ itemCount="50"
448
+ pageSize="10"
449
+ orientation="vertical"
450
+ buttonRowPosition="start"
451
+ pageSizeOptions="{[5, 10, 20]}"
452
+ pageSizeSelectorPosition="center"
453
+ pageInfoPosition="end"
454
+ />`);
455
+ const nav = page.locator('nav[aria-label="Pagination"]');
456
+ yield (0, fixtures_1.expect)(nav).toHaveClass(/paginationVertical/);
457
+ // All components should still be positioned correctly
458
+ yield (0, fixtures_1.expect)(page.locator('[data-component="pagination-controls"]')).toBeVisible();
459
+ yield (0, fixtures_1.expect)(page.locator('[data-component="page-size-selector-container"]')).toBeVisible();
460
+ yield (0, fixtures_1.expect)(page.locator('[data-component="page-info"]')).toBeVisible();
461
+ }));
462
+ (0, fixtures_1.test)("grid layout maintains accessibility", (_a) => __awaiter(void 0, [_a], void 0, function* ({ initTestBed, page }) {
463
+ yield initTestBed(`<Pagination
464
+ itemCount="50"
465
+ pageSize="10"
466
+ buttonRowPosition="center"
467
+ pageSizeOptions="{[5, 10, 20]}"
468
+ pageSizeSelectorPosition="start"
469
+ pageInfoPosition="end"
470
+ />`);
471
+ // All accessibility features should still work
472
+ const nav = page.getByRole("navigation");
473
+ yield (0, fixtures_1.expect)(nav).toBeVisible();
474
+ yield (0, fixtures_1.expect)(nav).toHaveAttribute("aria-label", "Pagination");
475
+ // The buttons here don't have explicit labels, but they are still targetable because of accessible aria-label props
476
+ yield (0, fixtures_1.expect)(page.getByLabel("First page")).toBeVisible();
477
+ yield (0, fixtures_1.expect)(page.getByLabel("Previous page")).toBeVisible();
478
+ yield (0, fixtures_1.expect)(page.getByLabel("Next page")).toBeVisible();
479
+ yield (0, fixtures_1.expect)(page.getByLabel("Last page")).toBeVisible();
480
+ }));
481
+ });
482
+ // =============================================================================
483
+ // GRID LAYOUT AND POSITIONING TESTS
484
+ // =============================================================================
485
+ fixtures_1.test.describe("Grid Layout and Positioning", () => {
486
+ (0, fixtures_1.test)("default positions work correctly", (_a) => __awaiter(void 0, [_a], void 0, function* ({ initTestBed, page }) {
487
+ yield initTestBed(`<Pagination
488
+ itemCount="50"
489
+ pageSize="10"
490
+ pageSizeOptions="{[5, 10, 20]}"
491
+ />`);
492
+ // Default: pageSizeSelectorPosition="start", buttonRowPosition="center", pageInfoPosition="end"
493
+ // All components should be visible with default positioning
494
+ yield (0, fixtures_1.expect)(page.locator('[data-component="page-size-selector-container"]')).toBeVisible();
495
+ yield (0, fixtures_1.expect)(page.locator('[data-component="pagination-controls"]')).toBeVisible();
496
+ yield (0, fixtures_1.expect)(page.locator('[data-component="page-info"]')).toBeVisible();
497
+ }));
498
+ (0, fixtures_1.test)("multiple components can be positioned in same location", (_a) => __awaiter(void 0, [_a], void 0, function* ({ initTestBed, page }) {
499
+ yield initTestBed(`<Pagination
500
+ itemCount="50"
501
+ pageSize="10"
502
+ buttonRowPosition="start"
503
+ pageSizeOptions="{[5, 10, 20]}"
504
+ pageSizeSelectorPosition="start"
505
+ pageInfoPosition="end"
506
+ />`);
507
+ // Both button row and page size selector should be rendered (both in start position)
508
+ yield (0, fixtures_1.expect)(page.locator('[data-component="pagination-controls"]')).toBeVisible();
509
+ yield (0, fixtures_1.expect)(page.locator('[data-component="page-size-selector-container"]')).toBeVisible();
510
+ yield (0, fixtures_1.expect)(page.locator('[data-component="page-info"]')).toBeVisible();
511
+ }));
512
+ (0, fixtures_1.test)("handles invalid position values gracefully", (_a) => __awaiter(void 0, [_a], void 0, function* ({ initTestBed, page }) {
513
+ yield initTestBed(`<Pagination
514
+ itemCount="50"
515
+ pageSize="10"
516
+ buttonRowPosition="invalid"
517
+ pageSizeOptions="{[5, 10, 20]}"
518
+ pageSizeSelectorPosition="invalid"
519
+ pageInfoPosition="invalid"
520
+ />`);
521
+ // Should still render the nav container even with invalid positions
522
+ const nav = page.locator('nav[aria-label="Pagination"]');
523
+ yield (0, fixtures_1.expect)(nav).toBeVisible();
524
+ // With invalid positions, components may not be placed in slots, but the nav should exist
525
+ // The component should handle this gracefully by either falling back to defaults or not rendering slots
526
+ }));
527
+ (0, fixtures_1.test)("components are not rendered when disabled", (_a) => __awaiter(void 0, [_a], void 0, function* ({ initTestBed, page }) {
528
+ yield initTestBed(`<Pagination
529
+ itemCount="50"
530
+ pageSize="10"
531
+ buttonRowPosition="center"
532
+ showPageInfo="false"
533
+ showPageSizeSelector="false"
534
+ />`);
535
+ // Only button row should be rendered
536
+ yield (0, fixtures_1.expect)(page.locator('[data-component="pagination-controls"]')).toBeVisible();
537
+ yield (0, fixtures_1.expect)(page.locator('[data-component="page-size-selector-container"]')).not.toBeVisible();
538
+ yield (0, fixtures_1.expect)(page.locator('[data-component="page-info"]')).not.toBeVisible();
539
+ }));
540
+ (0, fixtures_1.test)("grid adapts to content in vertical orientation", (_a) => __awaiter(void 0, [_a], void 0, function* ({ initTestBed, page }) {
541
+ yield initTestBed(`<Pagination
542
+ itemCount="50"
543
+ pageSize="10"
544
+ orientation="vertical"
545
+ buttonRowPosition="start"
546
+ pageSizeOptions="{[5, 10, 20]}"
547
+ pageSizeSelectorPosition="end"
548
+ showPageInfo="false"
549
+ />`);
550
+ const nav = page.locator('nav[aria-label="Pagination"]');
551
+ yield (0, fixtures_1.expect)(nav).toHaveClass(/paginationVertical/);
552
+ // Should have button row and page size selector
553
+ yield (0, fixtures_1.expect)(page.locator('[data-component="pagination-controls"]')).toBeVisible();
554
+ yield (0, fixtures_1.expect)(page.locator('[data-component="page-size-selector-container"]')).toBeVisible();
555
+ yield (0, fixtures_1.expect)(page.locator('[data-component="page-info"]')).not.toBeVisible();
556
+ }));
557
+ (0, fixtures_1.test)("component order reflects positioning", (_a) => __awaiter(void 0, [_a], void 0, function* ({ initTestBed, page }) {
558
+ yield initTestBed(`<Pagination
559
+ itemCount="50"
560
+ pageSize="10"
561
+ buttonRowPosition="end"
562
+ pageSizeOptions="{[5, 10, 20]}"
563
+ pageSizeSelectorPosition="start"
564
+ pageInfoPosition="center"
565
+ />`);
566
+ // All components should be rendered
567
+ yield (0, fixtures_1.expect)(page.locator('[data-component="pagination-controls"]')).toBeVisible();
568
+ yield (0, fixtures_1.expect)(page.locator('[data-component="page-size-selector-container"]')).toBeVisible();
569
+ yield (0, fixtures_1.expect)(page.locator('[data-component="page-info"]')).toBeVisible();
570
+ }));
571
+ (0, fixtures_1.test)("position properties work with minimal pagination", (_a) => __awaiter(void 0, [_a], void 0, function* ({ initTestBed, page }) {
572
+ yield initTestBed(`<Pagination
573
+ buttonRowPosition="center"
574
+ hasPrevPage="true"
575
+ hasNextPage="true"
576
+ />`);
577
+ // Even without itemCount, minimal layout should work
578
+ yield (0, fixtures_1.expect)(page.getByRole("button", { name: "Previous page" })).toBeVisible();
579
+ yield (0, fixtures_1.expect)(page.getByRole("button", { name: "Next page" })).toBeVisible();
580
+ }));
581
+ });
582
+ // =============================================================================
583
+ // ACCESSIBILITY TESTS
584
+ // =============================================================================
585
+ fixtures_1.test.describe("Accessibility", () => {
586
+ (0, fixtures_1.test)("component container has correct role", (_a) => __awaiter(void 0, [_a], void 0, function* ({ initTestBed, page }) {
587
+ yield initTestBed(`<Pagination itemCount="50" pageSize="10" />`);
588
+ yield (0, fixtures_1.expect)(page.getByRole("navigation")).toBeVisible();
589
+ }));
590
+ (0, fixtures_1.test)("navigation buttons have correct accessibility attributes", (_a) => __awaiter(void 0, [_a], void 0, function* ({ initTestBed, page, }) {
591
+ yield initTestBed(`<Pagination itemCount="50" pageSize="10"/>`);
592
+ // Check button roles and labels
593
+ yield (0, fixtures_1.expect)(page.getByLabel("First page")).toBeVisible();
594
+ yield (0, fixtures_1.expect)(page.getByLabel("Previous page")).toBeVisible();
595
+ yield (0, fixtures_1.expect)(page.getByLabel("Next page")).toBeVisible();
596
+ yield (0, fixtures_1.expect)(page.getByLabel("Last page")).toBeVisible();
597
+ }));
598
+ (0, fixtures_1.test)("page indicator has correct aria attribute if maxVisiblePages=1", (_a) => __awaiter(void 0, [_a], void 0, function* ({ initTestBed, page, }) {
599
+ yield initTestBed(`<Pagination itemCount="50" pageSize="10" maxVisiblePages="1"/>`);
600
+ yield (0, fixtures_1.expect)(page.getByText("1", { exact: true })).toHaveAttribute("aria-current", "true");
601
+ }));
602
+ (0, fixtures_1.test)("page buttons have correct accessibility attributes", (_a) => __awaiter(void 0, [_a], void 0, function* ({ initTestBed, page }) {
603
+ yield initTestBed(`<Pagination itemCount="50" pageSize="10" maxVisiblePages="5"/>`);
604
+ // Page buttons should have appropriate labels
605
+ yield (0, fixtures_1.expect)(page.getByLabel("Page 1")).toBeVisible();
606
+ yield (0, fixtures_1.expect)(page.getByLabel("Page 2")).toBeVisible();
607
+ yield (0, fixtures_1.expect)(page.getByLabel("Page 3")).toBeVisible();
608
+ yield (0, fixtures_1.expect)(page.getByLabel("Page 4")).toBeVisible();
609
+ yield (0, fixtures_1.expect)(page.getByLabel("Page 5")).toBeVisible();
610
+ }));
611
+ (0, fixtures_1.test)("current page button has correct aria attribute if maxVisiblePages>1", (_a) => __awaiter(void 0, [_a], void 0, function* ({ initTestBed, page, }) {
612
+ yield initTestBed(`<Pagination itemCount="50" pageSize="10" maxVisiblePages="5"/>`);
613
+ yield (0, fixtures_1.expect)(page.getByLabel("Page 1 (current)", { exact: true })).toBeVisible();
614
+ }));
615
+ (0, fixtures_1.test)("disabled buttons are properly marked as disabled", (_a) => __awaiter(void 0, [_a], void 0, function* ({ initTestBed, page }) {
616
+ yield initTestBed(`<Pagination itemCount="50" pageSize="10" pageIndex="0"/>`);
617
+ yield (0, fixtures_1.expect)(page.getByRole("button", { name: "First page" })).toBeDisabled();
618
+ yield (0, fixtures_1.expect)(page.getByRole("button", { name: "Previous page" })).toBeDisabled();
619
+ yield (0, fixtures_1.expect)(page.getByRole("button", { name: "Next page" })).toBeEnabled();
620
+ yield (0, fixtures_1.expect)(page.getByRole("button", { name: "Last page" })).toBeEnabled();
621
+ }));
622
+ (0, fixtures_1.test)("disabled buttons are properly marked as disabled #2", (_a) => __awaiter(void 0, [_a], void 0, function* ({ initTestBed, page }) {
623
+ yield initTestBed(`<Pagination itemCount="50" pageSize="10" pageIndex="5"/>`);
624
+ yield (0, fixtures_1.expect)(page.getByRole("button", { name: "First page" })).toBeEnabled();
625
+ yield (0, fixtures_1.expect)(page.getByRole("button", { name: "Previous page" })).toBeEnabled();
626
+ yield (0, fixtures_1.expect)(page.getByRole("button", { name: "Next page" })).toBeDisabled();
627
+ yield (0, fixtures_1.expect)(page.getByRole("button", { name: "Last page" })).toBeDisabled();
628
+ }));
629
+ (0, fixtures_1.test)("buttons are focusable and keyboard navigable", (_a) => __awaiter(void 0, [_a], void 0, function* ({ initTestBed, page }) {
630
+ yield initTestBed(`<Pagination itemCount="50" pageSize="10" maxVisiblePages="3"/>`);
631
+ // Test tab navigation through buttons
632
+ yield page.keyboard.press("Tab");
633
+ yield (0, fixtures_1.expect)(page.getByRole("button", { name: "Page 1" })).toBeFocused();
634
+ yield page.keyboard.press("Tab");
635
+ yield (0, fixtures_1.expect)(page.getByRole("button", { name: "Page 2" })).toBeFocused();
636
+ }));
637
+ });
638
+ // =============================================================================
639
+ // INTERACTION TESTS
640
+ // =============================================================================
641
+ fixtures_1.test.describe("User Interactions", () => {
642
+ (0, fixtures_1.test)("page button click triggers pageDidChange event", (_a) => __awaiter(void 0, [_a], void 0, function* ({ initTestBed, page }) {
643
+ const { testStateDriver } = yield initTestBed(`
644
+ <Pagination
645
+ itemCount="50"
646
+ pageSize="10"
647
+ pageIndex="0"
648
+ maxVisiblePages="5"
649
+ onPageDidChange="arg => testState = arg"
650
+ />
651
+ `);
652
+ yield page.getByRole("button", { name: "Page 3" }).click();
653
+ yield fixtures_1.expect.poll(testStateDriver.testState).toBe(2); // 0-based index
654
+ }));
655
+ (0, fixtures_1.test)("next button click triggers pageDidChange event", (_a) => __awaiter(void 0, [_a], void 0, function* ({ initTestBed, page }) {
656
+ const { testStateDriver } = yield initTestBed(`
657
+ <Pagination
658
+ itemCount="50"
659
+ pageSize="10"
660
+ pageIndex="0"
661
+ onPageDidChange="arg => testState = arg"
662
+ />
663
+ `);
664
+ yield page.getByRole("button", { name: "Next page" }).click();
665
+ yield fixtures_1.expect.poll(testStateDriver.testState).toBe(1);
666
+ }));
667
+ (0, fixtures_1.test)("previous button click triggers pageDidChange event", (_a) => __awaiter(void 0, [_a], void 0, function* ({ initTestBed, page }) {
668
+ const { testStateDriver } = yield initTestBed(`
669
+ <Pagination
670
+ itemCount="50"
671
+ pageSize="10"
672
+ pageIndex="2"
673
+ onPageDidChange="arg => testState = arg"
674
+ />
675
+ `);
676
+ yield page.getByRole("button", { name: "Previous page" }).click();
677
+ yield fixtures_1.expect.poll(testStateDriver.testState).toBe(1);
678
+ }));
679
+ (0, fixtures_1.test)("first page button click triggers pageDidChange event", (_a) => __awaiter(void 0, [_a], void 0, function* ({ initTestBed, page }) {
680
+ const { testStateDriver } = yield initTestBed(`
681
+ <Pagination
682
+ itemCount="50"
683
+ pageSize="10"
684
+ pageIndex="3"
685
+ onPageDidChange="arg => testState = arg"
686
+ />
687
+ `);
688
+ yield page.getByRole("button", { name: "First page" }).click();
689
+ yield fixtures_1.expect.poll(testStateDriver.testState).toBe(0);
690
+ }));
691
+ (0, fixtures_1.test)("last page button click triggers pageDidChange event", (_a) => __awaiter(void 0, [_a], void 0, function* ({ initTestBed, page }) {
692
+ const { testStateDriver } = yield initTestBed(`
693
+ <Pagination
694
+ itemCount="50"
695
+ pageSize="10"
696
+ pageIndex="0"
697
+ onPageDidChange="arg => testState = arg"
698
+ />
699
+ `);
700
+ yield page.getByRole("button", { name: "Last page" }).click();
701
+ yield fixtures_1.expect.poll(testStateDriver.testState).toBe(4); // Last page index
702
+ }));
703
+ (0, fixtures_1.test)("keyboard navigation works on page buttons", (_a) => __awaiter(void 0, [_a], void 0, function* ({ initTestBed, page }) {
704
+ yield initTestBed(`
705
+ <Pagination
706
+ var.current="0"
707
+ pageIndex="{current}"
708
+ onPageDidChange="(next) => current = next"
709
+ itemCount="50"
710
+ pageSize="10"
711
+ maxVisiblePages="5" />
712
+ `);
713
+ const pageButton = page.getByRole("button", { name: "Page 2" });
714
+ yield pageButton.click();
715
+ // Should navigate to page 2 (button should become active)
716
+ yield (0, fixtures_1.expect)(pageButton).toHaveAttribute("aria-label", "Page 2 (current)");
717
+ yield (0, fixtures_1.expect)(pageButton).toHaveAttribute("aria-current", "true");
718
+ }));
719
+ (0, fixtures_1.test)("space key activates page buttons", (_a) => __awaiter(void 0, [_a], void 0, function* ({ initTestBed, page }) {
720
+ const { testStateDriver } = yield initTestBed(`
721
+ <Pagination
722
+ itemCount="50"
723
+ pageSize="10"
724
+ pageIndex="0"
725
+ maxVisiblePages="5"
726
+ onPageDidChange="arg => testState = arg"
727
+ />
728
+ `);
729
+ const pageButton = page.getByRole("button", { name: "Page 3" });
730
+ yield pageButton.focus();
731
+ yield pageButton.press("Space");
732
+ yield fixtures_1.expect.poll(testStateDriver.testState).toBe(2);
733
+ }));
734
+ (0, fixtures_1.test)("enter key activates page buttons", (_a) => __awaiter(void 0, [_a], void 0, function* ({ initTestBed, page }) {
735
+ const { testStateDriver } = yield initTestBed(`
736
+ <Pagination
737
+ itemCount="50"
738
+ pageSize="10"
739
+ pageIndex="0"
740
+ maxVisiblePages="5"
741
+ onPageDidChange="arg => testState = arg"
742
+ />
743
+ `);
744
+ const pageButton = page.getByRole("button", { name: "Page 3" });
745
+ yield pageButton.focus();
746
+ yield pageButton.press("Enter");
747
+ yield fixtures_1.expect.poll(testStateDriver.testState).toBe(2);
748
+ }));
749
+ (0, fixtures_1.test)("pageDidChange fires correctly if itemCount is undefined", (_a) => __awaiter(void 0, [_a], void 0, function* ({ initTestBed, page }) {
750
+ const { testStateDriver } = yield initTestBed(`
751
+ <Pagination
752
+ itemCount="{undefined}"
753
+ hasNextPage="{true}"
754
+ pageSize="10"
755
+ pageIndex="0"
756
+ onPageDidChange="page => testState = page"
757
+ />
758
+ `);
759
+ const pageButton = page.getByRole("button", { name: "Next page" });
760
+ yield pageButton.click();
761
+ yield fixtures_1.expect.poll(testStateDriver.testState).toBe(1);
762
+ }));
763
+ });
764
+ // =============================================================================
765
+ // API TESTS
766
+ // =============================================================================
767
+ fixtures_1.test.describe("Component APIs", () => {
768
+ (0, fixtures_1.test)("moveFirst API method works correctly", (_a) => __awaiter(void 0, [_a], void 0, function* ({ initTestBed, page }) {
769
+ const { testStateDriver } = yield initTestBed(`
770
+ <Fragment>
771
+ <Pagination
772
+ id="pagination"
773
+ itemCount="50"
774
+ pageSize="10"
775
+ pageIndex="3"
776
+ onPageDidChange="arg => testState = arg"
777
+ />
778
+ <Button onClick="pagination.moveFirst()">Move First</Button>
779
+ </Fragment>
780
+ `);
781
+ yield page.getByRole("button", { name: "Move First" }).click();
782
+ yield fixtures_1.expect.poll(testStateDriver.testState).toBe(0);
783
+ }));
784
+ (0, fixtures_1.test)("moveLast API method works correctly", (_a) => __awaiter(void 0, [_a], void 0, function* ({ initTestBed, page }) {
785
+ const { testStateDriver } = yield initTestBed(`
786
+ <Fragment>
787
+ <Pagination
788
+ id="pagination"
789
+ itemCount="50"
790
+ pageSize="10"
791
+ pageIndex="0"
792
+ onPageDidChange="arg => testState = arg"
793
+ />
794
+ <Button onClick="pagination.moveLast()">Move Last</Button>
795
+ </Fragment>
796
+ `);
797
+ yield page.getByRole("button", { name: "Move Last" }).click();
798
+ yield fixtures_1.expect.poll(testStateDriver.testState).toBe(4);
799
+ }));
800
+ (0, fixtures_1.test)("movePrev API method works correctly", (_a) => __awaiter(void 0, [_a], void 0, function* ({ initTestBed, page }) {
801
+ const { testStateDriver } = yield initTestBed(`
802
+ <Fragment>
803
+ <Pagination
804
+ id="pagination"
805
+ itemCount="50"
806
+ pageSize="10"
807
+ pageIndex="2"
808
+ onPageDidChange="arg => testState = arg"
809
+ />
810
+ <Button onClick="pagination.movePrev()">Move Previous</Button>
811
+ </Fragment>
812
+ `);
813
+ yield page.getByRole("button", { name: "Move Previous" }).click();
814
+ yield fixtures_1.expect.poll(testStateDriver.testState).toBe(1);
815
+ }));
816
+ (0, fixtures_1.test)("moveNext API method works correctly", (_a) => __awaiter(void 0, [_a], void 0, function* ({ initTestBed, page }) {
817
+ const { testStateDriver } = yield initTestBed(`
818
+ <Fragment>
819
+ <Pagination
820
+ id="pagination"
821
+ itemCount="50"
822
+ pageSize="10"
823
+ pageIndex="1"
824
+ onPageDidChange="arg => testState = arg"
825
+ />
826
+ <Button onClick="pagination.moveNext()">Move Next</Button>
827
+ </Fragment>
828
+ `);
829
+ yield page.getByRole("button", { name: "Move Next" }).click();
830
+ yield fixtures_1.expect.poll(testStateDriver.testState).toBe(2);
831
+ }));
832
+ (0, fixtures_1.test)("currentPage API method returns correct value", (_a) => __awaiter(void 0, [_a], void 0, function* ({ initTestBed, page }) {
833
+ const { testStateDriver } = yield initTestBed(`
834
+ <Fragment>
835
+ <Pagination
836
+ id="pagination"
837
+ itemCount="50"
838
+ pageSize="10"
839
+ pageIndex="2"
840
+ />
841
+ <Button onClick="testState = pagination.currentPage">Get Current Page</Button>
842
+ </Fragment>
843
+ `);
844
+ yield page.getByRole("button", { name: "Get Current Page" }).click();
845
+ yield fixtures_1.expect.poll(testStateDriver.testState).toBe(3); // 1-based page number
846
+ }));
847
+ (0, fixtures_1.test)("currentPageSize API method returns correct value", (_a) => __awaiter(void 0, [_a], void 0, function* ({ initTestBed, page }) {
848
+ const { testStateDriver } = yield initTestBed(`
849
+ <Fragment>
850
+ <Pagination
851
+ id="pagination"
852
+ itemCount="50"
853
+ pageSize="15"
854
+ />
855
+ <Button onClick="testState = pagination.currentPageSize">Get Page Size</Button>
856
+ </Fragment>
857
+ `);
858
+ yield page.getByRole("button", { name: "Get Page Size" }).click();
859
+ yield fixtures_1.expect.poll(testStateDriver.testState).toBe(15);
860
+ }));
861
+ (0, fixtures_1.test)("API methods handle boundary conditions correctly (moveFirst, movePrev)", (_a) => __awaiter(void 0, [_a], void 0, function* ({ initTestBed, page, }) {
862
+ const { testStateDriver } = yield initTestBed(`
863
+ <Fragment>
864
+ <Pagination
865
+ id="pagination"
866
+ itemCount="50"
867
+ pageSize="10"
868
+ pageIndex="0"
869
+ onPageDidChange="arg => testState = testState == null ? [arg] : [...testState, arg]"
870
+ />
871
+ <Button onClick="pagination.movePrev()">Move Previous From First</Button>
872
+ <Button onClick="pagination.moveFirst()">Move First From First</Button>
873
+ </Fragment>
874
+ `);
875
+ // Try to move previous from first page - should not trigger event
876
+ yield page.getByRole("button", { name: "Move Previous From First" }).click();
877
+ yield page.getByRole("button", { name: "Move First From First" }).click();
878
+ // Should not have triggered any page changes since we're already on first page
879
+ yield fixtures_1.expect.poll(testStateDriver.testState).toBeNull();
880
+ }));
881
+ (0, fixtures_1.test)("API methods handle boundary conditions correctly (moveLast, moveNext)", (_a) => __awaiter(void 0, [_a], void 0, function* ({ initTestBed, page, }) {
882
+ const { testStateDriver } = yield initTestBed(`
883
+ <Fragment>
884
+ <Pagination
885
+ id="pagination"
886
+ itemCount="50"
887
+ pageSize="10"
888
+ pageIndex="5"
889
+ onPageDidChange="arg => testState = testState == null ? [arg] : [...testState, arg]"
890
+ />
891
+ <Button onClick="pagination.moveNext()">Move Next From Last</Button>
892
+ <Button onClick="pagination.moveLast()">Move Last From Last</Button>
893
+ </Fragment>
894
+ `);
895
+ // Try to move next from last page - should not trigger event
896
+ yield page.getByRole("button", { name: "Move Next From Last" }).click();
897
+ yield page.getByRole("button", { name: "Move Last From Last" }).click();
898
+ // Should not have triggered any page changes since we're already on last page
899
+ yield fixtures_1.expect.poll(testStateDriver.testState).toBeNull();
900
+ }));
901
+ });
902
+ // =============================================================================
903
+ // OTHER EDGE CASE TESTS
904
+ // =============================================================================
905
+ fixtures_1.test.describe("Other Edge Cases", () => {
906
+ (0, fixtures_1.test)("visible pages adjust correctly when navigating", (_a) => __awaiter(void 0, [_a], void 0, function* ({ initTestBed, page }) {
907
+ yield initTestBed(`
908
+ <Pagination
909
+ itemCount="100"
910
+ pageSize="10"
911
+ pageIndex="5"
912
+ maxVisiblePages="3"
913
+ />
914
+ `);
915
+ // Should show pages around current page (page 6: index 5)
916
+ yield (0, fixtures_1.expect)(page.getByRole("button", { name: "Page 5" })).toBeVisible();
917
+ yield (0, fixtures_1.expect)(page.getByRole("button", { name: "Page 6" })).toBeVisible();
918
+ yield (0, fixtures_1.expect)(page.getByRole("button", { name: "Page 7" })).toBeVisible();
919
+ }));
920
+ (0, fixtures_1.test)("visible pages handle edge case near beginning", (_a) => __awaiter(void 0, [_a], void 0, function* ({ initTestBed, page }) {
921
+ yield initTestBed(`
922
+ <Pagination
923
+ itemCount="100"
924
+ pageSize="10"
925
+ pageIndex="0"
926
+ maxVisiblePages="3"
927
+ />
928
+ `);
929
+ // Should show first 3 pages when on first page
930
+ yield (0, fixtures_1.expect)(page.getByRole("button", { name: "Page 1" })).toBeVisible();
931
+ yield (0, fixtures_1.expect)(page.getByRole("button", { name: "Page 2" })).toBeVisible();
932
+ yield (0, fixtures_1.expect)(page.getByRole("button", { name: "Page 3" })).toBeVisible();
933
+ }));
934
+ (0, fixtures_1.test)("visible pages handle edge case near end", (_a) => __awaiter(void 0, [_a], void 0, function* ({ initTestBed, page }) {
935
+ yield initTestBed(`
936
+ <Pagination
937
+ itemCount="100"
938
+ pageSize="10"
939
+ pageIndex="9"
940
+ maxVisiblePages="3"
941
+ />
942
+ `);
943
+ // Should show last 3 pages when on last page
944
+ yield (0, fixtures_1.expect)(page.getByRole("button", { name: "Page 8" })).toBeVisible();
945
+ yield (0, fixtures_1.expect)(page.getByRole("button", { name: "Page 9" })).toBeVisible();
946
+ yield (0, fixtures_1.expect)(page.getByRole("button", { name: "Page 10" })).toBeVisible();
947
+ }));
948
+ (0, fixtures_1.test)("shows all pages when total pages less than maxVisiblePages", (_a) => __awaiter(void 0, [_a], void 0, function* ({ initTestBed, page, }) {
949
+ yield initTestBed(`
950
+ <Pagination
951
+ itemCount="30"
952
+ pageSize="10"
953
+ maxVisiblePages="5"
954
+ />
955
+ `);
956
+ // Should show all 3 pages since 3 < 5
957
+ yield (0, fixtures_1.expect)(page.getByRole("button", { name: "Page 1" })).toBeVisible();
958
+ yield (0, fixtures_1.expect)(page.getByRole("button", { name: "Page 2" })).toBeVisible();
959
+ yield (0, fixtures_1.expect)(page.getByRole("button", { name: "Page 3" })).toBeVisible();
960
+ // Should not show page 4 or 5
961
+ yield (0, fixtures_1.expect)(page.getByRole("button", { name: "Page 4" })).not.toBeVisible();
962
+ yield (0, fixtures_1.expect)(page.getByRole("button", { name: "Page 5" })).not.toBeVisible();
963
+ }));
964
+ (0, fixtures_1.test)("handles extremely large numbers", (_a) => __awaiter(void 0, [_a], void 0, function* ({ initTestBed, page }) {
965
+ yield initTestBed(`<Pagination itemCount="9999999" pageSize="1000"/>`);
966
+ // Should handle large numbers without crashing
967
+ yield (0, fixtures_1.expect)(page.getByText(/Page 1 of \d+/)).toBeVisible();
968
+ yield (0, fixtures_1.expect)(page.getByRole("button", { name: "First page" })).toBeVisible();
969
+ }));
970
+ (0, fixtures_1.test)("handles page size larger than item count", (_a) => __awaiter(void 0, [_a], void 0, function* ({ initTestBed, page }) {
971
+ yield initTestBed(`<Pagination itemCount="5" pageSize="20"/>`);
972
+ // Should show only 1 page when page size exceeds item count
973
+ yield (0, fixtures_1.expect)(page.getByText("Page 1 of 1 (5 items)")).toBeVisible();
974
+ yield (0, fixtures_1.expect)(page.getByRole("button", { name: "First page" })).toBeDisabled();
975
+ yield (0, fixtures_1.expect)(page.getByRole("button", { name: "Last page" })).toBeDisabled();
976
+ }));
977
+ (0, fixtures_1.test)("handles pageIndex beyond valid range", (_a) => __awaiter(void 0, [_a], void 0, function* ({ initTestBed, page }) {
978
+ yield initTestBed(`<Pagination itemCount="30" pageSize="10" pageIndex="999"/>`);
979
+ // Should clamp to valid range - last page should be shown
980
+ yield (0, fixtures_1.expect)(page.getByText("Page 3 of 3 (30 items)")).toBeVisible();
981
+ }));
982
+ (0, fixtures_1.test)("handles maxVisiblePages of 1 correctly", (_a) => __awaiter(void 0, [_a], void 0, function* ({ initTestBed, page }) {
983
+ yield initTestBed(`<Pagination itemCount="50" pageSize="10" maxVisiblePages="1"/>`);
984
+ // Should show only current page as text, not as button
985
+ yield (0, fixtures_1.expect)(page.getByText("1", { exact: true })).toBeVisible();
986
+ // Should still show navigation buttons
987
+ yield (0, fixtures_1.expect)(page.getByRole("button", { name: "First page" })).toBeVisible();
988
+ yield (0, fixtures_1.expect)(page.getByRole("button", { name: "Next page" })).toBeVisible();
989
+ }));
990
+ (0, fixtures_1.test)("handles maxVisiblePages larger than total pages", (_a) => __awaiter(void 0, [_a], void 0, function* ({ initTestBed, page }) {
991
+ yield initTestBed(`<Pagination itemCount="20" pageSize="10" maxVisiblePages="10"/>`);
992
+ // Invalid maxVisiblePages (10) should fall back to default (1)
993
+ // With maxVisiblePages=1, should show current page as text, not buttons
994
+ yield (0, fixtures_1.expect)(page.getByText("1", { exact: true })).toBeVisible();
995
+ yield (0, fixtures_1.expect)(page.getByRole("button", { name: "Page 1" })).not.toBeVisible();
996
+ yield (0, fixtures_1.expect)(page.getByRole("button", { name: "Page 2" })).not.toBeVisible();
997
+ }));
998
+ (0, fixtures_1.test)("works correctly with fractional page calculations", (_a) => __awaiter(void 0, [_a], void 0, function* ({ initTestBed, page }) {
999
+ yield initTestBed(`<Pagination itemCount="17" pageSize="5"/>`);
1000
+ // 17 items / 5 per page = 3.4 -> should round up to 4 pages
1001
+ yield (0, fixtures_1.expect)(page.getByText("Page 1 of 4 (17 items)")).toBeVisible();
1002
+ }));
1003
+ });