@gtkx/testing 1.0.0-rc.4 → 1.1.0

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 (212) hide show
  1. package/README.md +5 -5
  2. package/dist/accessible-native.d.ts +16 -0
  3. package/dist/accessible-native.d.ts.map +1 -0
  4. package/dist/accessible-native.js +206 -0
  5. package/dist/accessible-native.js.map +1 -0
  6. package/dist/act.d.ts +1 -3
  7. package/dist/act.d.ts.map +1 -1
  8. package/dist/act.js +1 -1
  9. package/dist/act.js.map +1 -1
  10. package/dist/build-queries.d.ts +27 -10
  11. package/dist/build-queries.d.ts.map +1 -1
  12. package/dist/build-queries.js +22 -24
  13. package/dist/build-queries.js.map +1 -1
  14. package/dist/cleanup-registry.d.ts +1 -1
  15. package/dist/cleanup-registry.d.ts.map +1 -1
  16. package/dist/cleanup-registry.js.map +1 -1
  17. package/dist/config.d.ts +8 -1
  18. package/dist/config.d.ts.map +1 -1
  19. package/dist/config.js +1 -0
  20. package/dist/config.js.map +1 -1
  21. package/dist/errors.d.ts +10 -1
  22. package/dist/errors.d.ts.map +1 -1
  23. package/dist/errors.js +10 -1
  24. package/dist/errors.js.map +1 -1
  25. package/dist/fire-event.d.ts +35 -6
  26. package/dist/fire-event.d.ts.map +1 -1
  27. package/dist/fire-event.js +23 -7
  28. package/dist/fire-event.js.map +1 -1
  29. package/dist/frame-sync.d.ts +3 -2
  30. package/dist/frame-sync.d.ts.map +1 -1
  31. package/dist/frame-sync.js +19 -9
  32. package/dist/frame-sync.js.map +1 -1
  33. package/dist/harness-window.d.ts +5 -0
  34. package/dist/harness-window.d.ts.map +1 -0
  35. package/dist/harness-window.js +17 -0
  36. package/dist/harness-window.js.map +1 -0
  37. package/dist/index.d.ts +14 -7
  38. package/dist/index.d.ts.map +1 -1
  39. package/dist/index.js +9 -5
  40. package/dist/index.js.map +1 -1
  41. package/dist/internal.d.ts +5 -0
  42. package/dist/internal.d.ts.map +1 -0
  43. package/dist/internal.js +5 -0
  44. package/dist/internal.js.map +1 -0
  45. package/dist/matchers.d.ts +88 -46
  46. package/dist/matchers.d.ts.map +1 -1
  47. package/dist/matchers.js +178 -20
  48. package/dist/matchers.js.map +1 -1
  49. package/dist/pretty-format.d.ts +2 -0
  50. package/dist/pretty-format.d.ts.map +1 -0
  51. package/dist/pretty-format.js +2 -0
  52. package/dist/pretty-format.js.map +1 -0
  53. package/dist/pretty-widget.d.ts +5 -2
  54. package/dist/pretty-widget.d.ts.map +1 -1
  55. package/dist/pretty-widget.js +75 -57
  56. package/dist/pretty-widget.js.map +1 -1
  57. package/dist/production.d.ts +8 -0
  58. package/dist/production.d.ts.map +1 -0
  59. package/dist/production.js +34 -0
  60. package/dist/production.js.map +1 -0
  61. package/dist/queries.d.ts +98 -56
  62. package/dist/queries.d.ts.map +1 -1
  63. package/dist/queries.js +123 -83
  64. package/dist/queries.js.map +1 -1
  65. package/dist/query-helpers.d.ts +44 -0
  66. package/dist/query-helpers.d.ts.map +1 -0
  67. package/dist/query-helpers.js +57 -0
  68. package/dist/query-helpers.js.map +1 -0
  69. package/dist/render-children.d.ts +9 -0
  70. package/dist/render-children.d.ts.map +1 -0
  71. package/dist/render-children.js +11 -0
  72. package/dist/render-children.js.map +1 -0
  73. package/dist/render.d.ts +12 -1
  74. package/dist/render.d.ts.map +1 -1
  75. package/dist/render.js +52 -16
  76. package/dist/render.js.map +1 -1
  77. package/dist/role-helpers.d.ts +12 -3
  78. package/dist/role-helpers.d.ts.map +1 -1
  79. package/dist/role-helpers.js +15 -5
  80. package/dist/role-helpers.js.map +1 -1
  81. package/dist/role-naming.d.ts +5 -0
  82. package/dist/role-naming.d.ts.map +1 -0
  83. package/dist/role-naming.js +96 -0
  84. package/dist/role-naming.js.map +1 -0
  85. package/dist/screenshot.d.ts +12 -20
  86. package/dist/screenshot.d.ts.map +1 -1
  87. package/dist/screenshot.js +179 -93
  88. package/dist/screenshot.js.map +1 -1
  89. package/dist/timers.d.ts +9 -0
  90. package/dist/timers.d.ts.map +1 -0
  91. package/dist/timers.js +21 -0
  92. package/dist/timers.js.map +1 -0
  93. package/dist/traversal.d.ts +7 -1
  94. package/dist/traversal.d.ts.map +1 -1
  95. package/dist/traversal.js +40 -6
  96. package/dist/traversal.js.map +1 -1
  97. package/dist/types.d.ts +32 -15
  98. package/dist/types.d.ts.map +1 -1
  99. package/dist/types.js.map +1 -1
  100. package/dist/user-event/adjustment.d.ts +3 -0
  101. package/dist/user-event/adjustment.d.ts.map +1 -1
  102. package/dist/user-event/adjustment.js +25 -3
  103. package/dist/user-event/adjustment.js.map +1 -1
  104. package/dist/user-event/click.d.ts +44 -8
  105. package/dist/user-event/click.d.ts.map +1 -1
  106. package/dist/user-event/click.js +176 -44
  107. package/dist/user-event/click.js.map +1 -1
  108. package/dist/user-event/column-header-click.d.ts +4 -0
  109. package/dist/user-event/column-header-click.d.ts.map +1 -0
  110. package/dist/user-event/column-header-click.js +55 -0
  111. package/dist/user-event/column-header-click.js.map +1 -0
  112. package/dist/user-event/event-wrapper.d.ts.map +1 -1
  113. package/dist/user-event/event-wrapper.js +34 -20
  114. package/dist/user-event/event-wrapper.js.map +1 -1
  115. package/dist/user-event/index.d.ts +80 -13
  116. package/dist/user-event/index.d.ts.map +1 -1
  117. package/dist/user-event/index.js +44 -26
  118. package/dist/user-event/index.js.map +1 -1
  119. package/dist/user-event/indexed-children.d.ts +10 -0
  120. package/dist/user-event/indexed-children.d.ts.map +1 -0
  121. package/dist/user-event/indexed-children.js +50 -0
  122. package/dist/user-event/indexed-children.js.map +1 -0
  123. package/dist/user-event/keyboard.d.ts.map +1 -1
  124. package/dist/user-event/keyboard.js +115 -31
  125. package/dist/user-event/keyboard.js.map +1 -1
  126. package/dist/user-event/list-row-click.d.ts +4 -0
  127. package/dist/user-event/list-row-click.d.ts.map +1 -0
  128. package/dist/user-event/list-row-click.js +38 -0
  129. package/dist/user-event/list-row-click.js.map +1 -0
  130. package/dist/user-event/native-click.d.ts +6 -0
  131. package/dist/user-event/native-click.d.ts.map +1 -0
  132. package/dist/user-event/native-click.js +36 -0
  133. package/dist/user-event/native-click.js.map +1 -0
  134. package/dist/user-event/notebook-tab-click.d.ts +5 -0
  135. package/dist/user-event/notebook-tab-click.d.ts.map +1 -0
  136. package/dist/user-event/notebook-tab-click.js +39 -0
  137. package/dist/user-event/notebook-tab-click.js.map +1 -0
  138. package/dist/user-event/pointer.d.ts +1 -1
  139. package/dist/user-event/pointer.d.ts.map +1 -1
  140. package/dist/user-event/pointer.js +33 -9
  141. package/dist/user-event/pointer.js.map +1 -1
  142. package/dist/user-event/selection.d.ts +11 -8
  143. package/dist/user-event/selection.d.ts.map +1 -1
  144. package/dist/user-event/selection.js +49 -38
  145. package/dist/user-event/selection.js.map +1 -1
  146. package/dist/user-event/text.d.ts +12 -5
  147. package/dist/user-event/text.d.ts.map +1 -1
  148. package/dist/user-event/text.js +151 -46
  149. package/dist/user-event/text.js.map +1 -1
  150. package/dist/wait-for.d.ts.map +1 -1
  151. package/dist/wait-for.js +4 -3
  152. package/dist/wait-for.js.map +1 -1
  153. package/dist/widget-accessible-properties.d.ts +14 -26
  154. package/dist/widget-accessible-properties.d.ts.map +1 -1
  155. package/dist/widget-accessible-properties.js +135 -190
  156. package/dist/widget-accessible-properties.js.map +1 -1
  157. package/dist/widget-getters.d.ts +11 -0
  158. package/dist/widget-getters.d.ts.map +1 -0
  159. package/dist/widget-getters.js +46 -0
  160. package/dist/widget-getters.js.map +1 -0
  161. package/dist/window-state.d.ts +10 -0
  162. package/dist/window-state.d.ts.map +1 -0
  163. package/dist/window-state.js +41 -0
  164. package/dist/window-state.js.map +1 -0
  165. package/dist/within.d.ts +3 -2
  166. package/dist/within.d.ts.map +1 -1
  167. package/dist/within.js +3 -2
  168. package/dist/within.js.map +1 -1
  169. package/package.json +21 -8
  170. package/src/accessible-native.ts +333 -0
  171. package/src/act.ts +1 -1
  172. package/src/build-queries.ts +47 -41
  173. package/src/cleanup-registry.ts +1 -1
  174. package/src/config.ts +10 -1
  175. package/src/errors.ts +12 -1
  176. package/src/fire-event.ts +61 -8
  177. package/src/frame-sync.ts +30 -9
  178. package/src/harness-window.ts +23 -0
  179. package/src/index.ts +18 -11
  180. package/src/internal.ts +12 -0
  181. package/src/matchers.ts +457 -72
  182. package/src/pretty-format.ts +1 -0
  183. package/src/pretty-widget.ts +98 -70
  184. package/src/production.ts +51 -0
  185. package/src/queries.ts +127 -89
  186. package/src/query-helpers.ts +97 -0
  187. package/src/render-children.ts +25 -0
  188. package/src/render.tsx +77 -17
  189. package/src/role-helpers.ts +16 -5
  190. package/src/role-naming.ts +99 -0
  191. package/src/screenshot.ts +266 -104
  192. package/src/timers.ts +31 -0
  193. package/src/traversal.ts +66 -6
  194. package/src/types.ts +34 -17
  195. package/src/user-event/adjustment.ts +31 -3
  196. package/src/user-event/click.ts +248 -52
  197. package/src/user-event/column-header-click.ts +76 -0
  198. package/src/user-event/event-wrapper.ts +41 -23
  199. package/src/user-event/index.ts +130 -40
  200. package/src/user-event/indexed-children.ts +75 -0
  201. package/src/user-event/keyboard.ts +161 -43
  202. package/src/user-event/list-row-click.ts +54 -0
  203. package/src/user-event/native-click.ts +51 -0
  204. package/src/user-event/notebook-tab-click.ts +57 -0
  205. package/src/user-event/pointer.ts +48 -9
  206. package/src/user-event/selection.ts +67 -41
  207. package/src/user-event/text.ts +192 -46
  208. package/src/wait-for.ts +4 -4
  209. package/src/widget-accessible-properties.ts +183 -230
  210. package/src/widget-getters.ts +85 -0
  211. package/src/window-state.ts +70 -0
  212. package/src/within.ts +3 -2
@@ -0,0 +1,85 @@
1
+ import type * as GObject from "@gtkx/gi/gobject";
2
+ import type * as Gtk from "@gtkx/gi/gtk";
3
+ import { getClassType, getInstanceType, TYPE_INVALID, typeName } from "@gtkx/runtime";
4
+ import { resolveWrapperClass } from "@gtkx/runtime/internal";
5
+ import { type AnyClass, walkClassChain } from "@gtkx/utils";
6
+
7
+ const UNNAMED_TYPE_TAG = "Object";
8
+
9
+ const getWidgetMethod = (widget: Gtk.Widget, name: string): unknown => Reflect.get(widget, name);
10
+ const getWidgetTypeName = (widget: Gtk.Widget): string | null => typeName(getInstanceType(widget));
11
+ const isClass = (value: unknown): value is AnyClass => typeof value === "function";
12
+
13
+ const nonEmpty = (value: unknown): string | undefined =>
14
+ typeof value === "string" && value.length > 0 ? value : undefined;
15
+
16
+ const getObjectClass = (object: GObject.Object): AnyClass | null => {
17
+ const cls: unknown = object.constructor;
18
+
19
+ return isClass(cls) ? cls : null;
20
+ };
21
+
22
+ const getNearestClassName = (object: GObject.Object): string | undefined =>
23
+ walkClassChain(getObjectClass(object), (ancestor) => nonEmpty(ancestor.name));
24
+
25
+ const getUntypedClassName = (object: GObject.Object): string | undefined => {
26
+ const cls = getObjectClass(object);
27
+
28
+ return cls !== null && getClassType(cls) === TYPE_INVALID ? nonEmpty(cls.name) : undefined;
29
+ };
30
+
31
+ const getExactWrapperName = (type: bigint): string | undefined => {
32
+ const wrapper = resolveWrapperClass(type);
33
+
34
+ return wrapper !== null && getClassType(wrapper) === type ? nonEmpty(wrapper.name) : undefined;
35
+ };
36
+
37
+ const getTypeTag = (object: GObject.Object): string => {
38
+ const type = getInstanceType(object);
39
+
40
+ return (
41
+ getUntypedClassName(object) ??
42
+ getExactWrapperName(type) ??
43
+ nonEmpty(typeName(type)) ??
44
+ getNearestClassName(object) ??
45
+ UNNAMED_TYPE_TAG
46
+ );
47
+ };
48
+
49
+ const isDefaultWidgetName = (widget: Gtk.Widget, name: string): boolean =>
50
+ name.length === 0 || name === getWidgetTypeName(widget);
51
+
52
+ const hasWidgetMethod = (widget: Gtk.Widget, name: string): boolean =>
53
+ typeof getWidgetMethod(widget, name) === "function";
54
+
55
+ /* eslint-disable-next-line @typescript-eslint/no-unnecessary-type-parameters -- callers name the signature */
56
+ const getCallableMethod = <Args extends unknown[], Result>(
57
+ widget: Gtk.Widget,
58
+ name: string,
59
+ ): ((...args: Args) => Result) | null => {
60
+ const fn = getWidgetMethod(widget, name);
61
+
62
+ return typeof fn === "function" ? (fn as (...args: Args) => Result).bind(widget) : null;
63
+ };
64
+
65
+ const callBooleanGetter = (widget: Gtk.Widget, method: string): boolean | null => {
66
+ const value = getCallableMethod<[], unknown>(widget, method)?.();
67
+
68
+ return typeof value === "boolean" ? value : null;
69
+ };
70
+
71
+ const callStringGetter = (widget: Gtk.Widget, method: string): string | null => {
72
+ const value = getCallableMethod<[], unknown>(widget, method)?.();
73
+
74
+ return typeof value === "string" ? value : null;
75
+ };
76
+
77
+ export {
78
+ callBooleanGetter,
79
+ callStringGetter,
80
+ getCallableMethod,
81
+ getTypeTag,
82
+ getWidgetTypeName,
83
+ hasWidgetMethod,
84
+ isDefaultWidgetName,
85
+ };
@@ -0,0 +1,70 @@
1
+ import * as Gtk from "@gtkx/gi/gtk";
2
+
3
+ const WINDOW_NOT_ALLOCATED = "it was never allocated a size";
4
+ const WINDOW_NOT_ACTIVATED = "it never became active";
5
+ const NO_WINDOW_ACTIVATED = "no window of the application ever became active";
6
+
7
+ const canDisplayDeliverActivation = (window: Gtk.Window): boolean => window.getDisplay().getDefaultSeat() !== null;
8
+ const isWindow = (widget: Gtk.Widget): widget is Gtk.Window => widget instanceof Gtk.Window;
9
+
10
+ const mappedToplevels = (): Gtk.Window[] =>
11
+ Gtk.Window.listToplevels().filter((widget) => isWindow(widget)).filter((window) => window.getMapped());
12
+
13
+ const isWindowAllocated = (window: Gtk.Window): boolean => {
14
+ const [isComputed, allocation] = window.computeBounds(window);
15
+
16
+ return isComputed && allocation.getWidth() > 0;
17
+ };
18
+
19
+ const activeToplevel = (): Gtk.Window | null => mappedToplevels().find((toplevel) => toplevel.isActive()) ?? null;
20
+
21
+ const isWindowActivated = (window: Gtk.Window): boolean =>
22
+ !canDisplayDeliverActivation(window) || window.isActive();
23
+
24
+ const isApplicationActivated = (window: Gtk.Window): boolean =>
25
+ !canDisplayDeliverActivation(window) || activeToplevel() !== null;
26
+
27
+ const isTransientDescendant = (window: Gtk.Window, ancestor: Gtk.Window): boolean => {
28
+ for (let parent = window.getTransientFor(); parent !== null; parent = parent.getTransientFor()) {
29
+ if (parent === ancestor) {
30
+ return true;
31
+ }
32
+ }
33
+
34
+ return false;
35
+ };
36
+
37
+ const isModalGrabHeldOver = (modal: Gtk.Window, window: Gtk.Window): boolean =>
38
+ modal.getModal() &&
39
+ modal !== window &&
40
+ modal.getGroup() === window.getGroup() &&
41
+ !isTransientDescendant(window, modal);
42
+
43
+ const isWindowBlockedByModal = (window: Gtk.Window): boolean =>
44
+ mappedToplevels().some((toplevel) => isModalGrabHeldOver(toplevel, window));
45
+
46
+ const findPresentedWindowFailure = (window: Gtk.Window): string | null => {
47
+ if (!isWindowAllocated(window)) {
48
+ return WINDOW_NOT_ALLOCATED;
49
+ }
50
+
51
+ return isWindowActivated(window) ? null : WINDOW_NOT_ACTIVATED;
52
+ };
53
+
54
+ const findRenderedWindowFailure = (window: Gtk.Window): string | null => {
55
+ if (!isWindowAllocated(window)) {
56
+ return WINDOW_NOT_ALLOCATED;
57
+ }
58
+
59
+ return isApplicationActivated(window) ? null : NO_WINDOW_ACTIVATED;
60
+ };
61
+
62
+ export {
63
+ activeToplevel,
64
+ findPresentedWindowFailure,
65
+ findRenderedWindowFailure,
66
+ isWindowActivated,
67
+ isWindowAllocated,
68
+ isWindowBlockedByModal,
69
+ mappedToplevels,
70
+ };
package/src/within.ts CHANGED
@@ -16,7 +16,8 @@ const bindCustomQueries = <Q extends QueryMap>(customQueries: Q, container: Cont
16
16
 
17
17
  /**
18
18
  * Binds the built-in queries, and any custom queries, to a specific container
19
- * so they search only within that scope.
19
+ * so they search only within that scope. Also exported as `getQueriesForElement`,
20
+ * which reads better in library code.
20
21
  *
21
22
  * @param container The scope the returned queries operate on.
22
23
  * @param queries Optional custom queries to bind alongside the built-in ones.
@@ -30,4 +31,4 @@ const within = <Q extends QueryMap = Record<never, never>>(
30
31
  ...(queries ? bindCustomQueries(queries, container) : ({} as BoundCustomQueries<Q>)),
31
32
  });
32
33
 
33
- export { within };
34
+ export { within, within as getQueriesForElement };