@gtkx/testing 0.20.0 → 1.0.0-rc.1
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.
- package/README.md +122 -55
- package/dist/act.d.ts +19 -0
- package/dist/act.d.ts.map +1 -0
- package/dist/act.js +48 -0
- package/dist/act.js.map +1 -0
- package/dist/bound-queries.d.ts +32 -0
- package/dist/bound-queries.d.ts.map +1 -0
- package/dist/bound-queries.js +2 -0
- package/dist/bound-queries.js.map +1 -0
- package/dist/build-queries.d.ts +16 -0
- package/dist/build-queries.d.ts.map +1 -0
- package/dist/build-queries.js +103 -0
- package/dist/build-queries.js.map +1 -0
- package/dist/cleanup-registry.d.ts +4 -0
- package/dist/cleanup-registry.d.ts.map +1 -0
- package/dist/cleanup-registry.js +11 -0
- package/dist/cleanup-registry.js.map +1 -0
- package/dist/config.d.ts +18 -51
- package/dist/config.d.ts.map +1 -1
- package/dist/config.js +9 -40
- package/dist/config.js.map +1 -1
- package/dist/editable.d.ts +7 -0
- package/dist/editable.d.ts.map +1 -0
- package/dist/editable.js +24 -0
- package/dist/editable.js.map +1 -0
- package/dist/errors.d.ts +29 -0
- package/dist/errors.d.ts.map +1 -0
- package/dist/errors.js +119 -0
- package/dist/errors.js.map +1 -0
- package/dist/fire-event.d.ts +7 -25
- package/dist/fire-event.d.ts.map +1 -1
- package/dist/fire-event.js +9 -29
- package/dist/fire-event.js.map +1 -1
- package/dist/frame-sync.d.ts +3 -0
- package/dist/frame-sync.d.ts.map +1 -0
- package/dist/frame-sync.js +30 -0
- package/dist/frame-sync.js.map +1 -0
- package/dist/index.d.ts +16 -11
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +10 -6
- package/dist/index.js.map +1 -1
- package/dist/matchers.d.ts +55 -0
- package/dist/matchers.d.ts.map +1 -0
- package/dist/matchers.js +103 -0
- package/dist/matchers.js.map +1 -0
- package/dist/pretty-widget.d.ts +21 -25
- package/dist/pretty-widget.d.ts.map +1 -1
- package/dist/pretty-widget.js +69 -115
- package/dist/pretty-widget.js.map +1 -1
- package/dist/queries.d.ts +130 -177
- package/dist/queries.d.ts.map +1 -1
- package/dist/queries.js +212 -325
- package/dist/queries.js.map +1 -1
- package/dist/register-test-hooks.d.ts +2 -0
- package/dist/register-test-hooks.d.ts.map +1 -0
- package/dist/register-test-hooks.js +15 -0
- package/dist/register-test-hooks.js.map +1 -0
- package/dist/render-hook.d.ts +14 -35
- package/dist/render-hook.d.ts.map +1 -1
- package/dist/render-hook.js +8 -45
- package/dist/render-hook.js.map +1 -1
- package/dist/render.d.ts +11 -41
- package/dist/render.d.ts.map +1 -1
- package/dist/render.js +129 -118
- package/dist/render.js.map +1 -1
- package/dist/role-helpers.d.ts +16 -51
- package/dist/role-helpers.d.ts.map +1 -1
- package/dist/role-helpers.js +39 -58
- package/dist/role-helpers.js.map +1 -1
- package/dist/screen.d.ts +6 -63
- package/dist/screen.d.ts.map +1 -1
- package/dist/screen.js +21 -109
- package/dist/screen.js.map +1 -1
- package/dist/screenshot.d.ts +20 -23
- package/dist/screenshot.d.ts.map +1 -1
- package/dist/screenshot.js +89 -48
- package/dist/screenshot.js.map +1 -1
- package/dist/suggestions.d.ts +22 -0
- package/dist/suggestions.d.ts.map +1 -0
- package/dist/suggestions.js +56 -0
- package/dist/suggestions.js.map +1 -0
- package/dist/traversal.d.ts +10 -8
- package/dist/traversal.d.ts.map +1 -1
- package/dist/traversal.js +28 -13
- package/dist/traversal.js.map +1 -1
- package/dist/types.d.ts +103 -172
- package/dist/types.d.ts.map +1 -1
- package/dist/types.js.map +1 -1
- package/dist/user-event/adjustment.d.ts +8 -0
- package/dist/user-event/adjustment.d.ts.map +1 -0
- package/dist/user-event/adjustment.js +33 -0
- package/dist/user-event/adjustment.js.map +1 -0
- package/dist/user-event/click.d.ts +7 -0
- package/dist/user-event/click.d.ts.map +1 -0
- package/dist/user-event/click.js +65 -0
- package/dist/user-event/click.js.map +1 -0
- package/dist/user-event/controller.d.ts +7 -0
- package/dist/user-event/controller.d.ts.map +1 -0
- package/dist/user-event/controller.js +28 -0
- package/dist/user-event/controller.js.map +1 -0
- package/dist/user-event/dispatch.d.ts +7 -0
- package/dist/user-event/dispatch.d.ts.map +1 -0
- package/dist/user-event/dispatch.js +10 -0
- package/dist/user-event/dispatch.js.map +1 -0
- package/dist/user-event/event-wrapper.d.ts +3 -0
- package/dist/user-event/event-wrapper.d.ts.map +1 -0
- package/dist/user-event/event-wrapper.js +48 -0
- package/dist/user-event/event-wrapper.js.map +1 -0
- package/dist/user-event/gesture.d.ts +31 -0
- package/dist/user-event/gesture.d.ts.map +1 -0
- package/dist/user-event/gesture.js +105 -0
- package/dist/user-event/gesture.js.map +1 -0
- package/dist/user-event/index.d.ts +44 -0
- package/dist/user-event/index.d.ts.map +1 -0
- package/dist/user-event/index.js +38 -0
- package/dist/user-event/index.js.map +1 -0
- package/dist/user-event/keyboard.d.ts +9 -0
- package/dist/user-event/keyboard.d.ts.map +1 -0
- package/dist/user-event/keyboard.js +173 -0
- package/dist/user-event/keyboard.js.map +1 -0
- package/dist/user-event/pointer.d.ts +6 -0
- package/dist/user-event/pointer.d.ts.map +1 -0
- package/dist/user-event/pointer.js +27 -0
- package/dist/user-event/pointer.js.map +1 -0
- package/dist/user-event/selection.d.ts +4 -0
- package/dist/user-event/selection.d.ts.map +1 -0
- package/dist/user-event/selection.js +106 -0
- package/dist/user-event/selection.js.map +1 -0
- package/dist/user-event/state.d.ts +6 -0
- package/dist/user-event/state.d.ts.map +1 -0
- package/dist/user-event/state.js +2 -0
- package/dist/user-event/state.js.map +1 -0
- package/dist/user-event/text.d.ts +17 -0
- package/dist/user-event/text.d.ts.map +1 -0
- package/dist/user-event/text.js +107 -0
- package/dist/user-event/text.js.map +1 -0
- package/dist/wait-for.d.ts +13 -32
- package/dist/wait-for.d.ts.map +1 -1
- package/dist/wait-for.js +62 -73
- package/dist/wait-for.js.map +1 -1
- package/dist/widget-accessible-properties.d.ts +33 -0
- package/dist/widget-accessible-properties.d.ts.map +1 -0
- package/dist/widget-accessible-properties.js +215 -0
- package/dist/widget-accessible-properties.js.map +1 -0
- package/dist/within.d.ts +9 -26
- package/dist/within.d.ts.map +1 -1
- package/dist/within.js +15 -25
- package/dist/within.js.map +1 -1
- package/package.json +21 -12
- package/src/act.ts +68 -0
- package/src/bound-queries.ts +36 -0
- package/src/build-queries.ts +185 -0
- package/src/cleanup-registry.ts +14 -0
- package/src/config.ts +28 -59
- package/src/editable.ts +30 -0
- package/src/errors.ts +130 -0
- package/src/fire-event.ts +11 -38
- package/src/frame-sync.ts +34 -0
- package/src/index.ts +60 -18
- package/src/matchers.ts +200 -0
- package/src/pretty-widget.ts +99 -138
- package/src/queries.ts +321 -425
- package/src/register-test-hooks.ts +16 -0
- package/src/render-hook.tsx +31 -44
- package/src/render.tsx +161 -149
- package/src/role-helpers.ts +47 -67
- package/src/screen.ts +21 -114
- package/src/screenshot.ts +104 -55
- package/src/suggestions.ts +87 -0
- package/src/traversal.ts +32 -18
- package/src/types.ts +115 -176
- package/src/user-event/adjustment.ts +49 -0
- package/src/user-event/click.ts +70 -0
- package/src/user-event/controller.ts +44 -0
- package/src/user-event/dispatch.ts +23 -0
- package/src/user-event/event-wrapper.ts +54 -0
- package/src/user-event/gesture.ts +154 -0
- package/src/user-event/index.ts +74 -0
- package/src/user-event/keyboard.ts +204 -0
- package/src/user-event/pointer.ts +34 -0
- package/src/user-event/selection.ts +122 -0
- package/src/user-event/state.ts +6 -0
- package/src/user-event/text.ts +137 -0
- package/src/wait-for.ts +79 -80
- package/src/widget-accessible-properties.ts +244 -0
- package/src/within.ts +26 -27
- package/dist/bind-queries.d.ts +0 -14
- package/dist/bind-queries.d.ts.map +0 -1
- package/dist/bind-queries.js +0 -29
- package/dist/bind-queries.js.map +0 -1
- package/dist/error-builder.d.ts +0 -28
- package/dist/error-builder.d.ts.map +0 -1
- package/dist/error-builder.js +0 -81
- package/dist/error-builder.js.map +0 -1
- package/dist/timing.d.ts +0 -18
- package/dist/timing.d.ts.map +0 -1
- package/dist/timing.js +0 -18
- package/dist/timing.js.map +0 -1
- package/dist/user-event.d.ts +0 -138
- package/dist/user-event.d.ts.map +0 -1
- package/dist/user-event.js +0 -411
- package/dist/user-event.js.map +0 -1
- package/dist/widget-text.d.ts +0 -69
- package/dist/widget-text.d.ts.map +0 -1
- package/dist/widget-text.js +0 -177
- package/dist/widget-text.js.map +0 -1
- package/dist/widget.d.ts +0 -3
- package/dist/widget.d.ts.map +0 -1
- package/dist/widget.js +0 -13
- package/dist/widget.js.map +0 -1
- package/src/bind-queries.ts +0 -52
- package/src/error-builder.ts +0 -102
- package/src/timing.ts +0 -17
- package/src/user-event.ts +0 -492
- package/src/widget-text.ts +0 -202
- package/src/widget.ts +0 -15
|
@@ -0,0 +1,137 @@
|
|
|
1
|
+
import * as Gdk from "@gtkx/gi/gdk";
|
|
2
|
+
import * as GObject from "@gtkx/gi/gobject";
|
|
3
|
+
import * as Gtk from "@gtkx/gi/gtk";
|
|
4
|
+
import { EDITABLE_ROLES, type EditableTarget, getEditableDelegate, isEditable } from "../editable.js";
|
|
5
|
+
import { formatRoleList } from "../role-helpers.js";
|
|
6
|
+
import { wrapEvent } from "./event-wrapper.js";
|
|
7
|
+
|
|
8
|
+
/** Options for {@link type}. */
|
|
9
|
+
export type TypeOptions = {
|
|
10
|
+
/** Do not focus the widget before typing. */
|
|
11
|
+
skipClick?: boolean | undefined;
|
|
12
|
+
/** Select from this offset before typing, replacing the selected range with the typed text. */
|
|
13
|
+
initialSelectionStart?: number | undefined;
|
|
14
|
+
/** End offset of the initial selection (defaults to the start offset). */
|
|
15
|
+
initialSelectionEnd?: number | undefined;
|
|
16
|
+
};
|
|
17
|
+
|
|
18
|
+
const EDITABLE_REQUIRED = `expected editable widget (${formatRoleList(EDITABLE_ROLES)})`;
|
|
19
|
+
|
|
20
|
+
const insertEditableText = (widget: EditableTarget, text: string): void => {
|
|
21
|
+
if (widget instanceof Gtk.TextView) {
|
|
22
|
+
widget.emit("insert-at-cursor", text);
|
|
23
|
+
return;
|
|
24
|
+
}
|
|
25
|
+
const target = getEditableDelegate(widget) ?? widget;
|
|
26
|
+
if (target instanceof Gtk.Text) {
|
|
27
|
+
target.emit("insert-at-cursor", text);
|
|
28
|
+
return;
|
|
29
|
+
}
|
|
30
|
+
|
|
31
|
+
const position = widget.getPosition();
|
|
32
|
+
const newPosition = widget.insertText(text, text.length, position);
|
|
33
|
+
widget.setPosition(newPosition);
|
|
34
|
+
};
|
|
35
|
+
|
|
36
|
+
const readSelection = (widget: EditableTarget): string => {
|
|
37
|
+
if (widget instanceof Gtk.TextView) {
|
|
38
|
+
const buffer = widget.getBuffer();
|
|
39
|
+
const [hasSelection, start, end] = buffer.getSelectionBounds();
|
|
40
|
+
return hasSelection ? buffer.getText(start, end, true) : "";
|
|
41
|
+
}
|
|
42
|
+
const [hasSelection, start, end] = widget.getSelectionBounds();
|
|
43
|
+
return hasSelection ? widget.getChars(start, end) : "";
|
|
44
|
+
};
|
|
45
|
+
|
|
46
|
+
const deleteSelection = (widget: EditableTarget): void => {
|
|
47
|
+
if (widget instanceof Gtk.TextView) {
|
|
48
|
+
widget.getBuffer().deleteSelection(false, true);
|
|
49
|
+
return;
|
|
50
|
+
}
|
|
51
|
+
widget.deleteSelection();
|
|
52
|
+
};
|
|
53
|
+
|
|
54
|
+
const setEditableText = (widget: EditableTarget, text: string): void => {
|
|
55
|
+
if (widget instanceof Gtk.TextView) {
|
|
56
|
+
widget.getBuffer().setText(text, text.length);
|
|
57
|
+
return;
|
|
58
|
+
}
|
|
59
|
+
widget.setText(text);
|
|
60
|
+
};
|
|
61
|
+
|
|
62
|
+
const applyInitialSelection = (widget: EditableTarget, options: TypeOptions): void => {
|
|
63
|
+
if (options.initialSelectionStart === undefined) return;
|
|
64
|
+
const start = options.initialSelectionStart;
|
|
65
|
+
const end = options.initialSelectionEnd ?? start;
|
|
66
|
+
if (widget instanceof Gtk.TextView) {
|
|
67
|
+
const buffer = widget.getBuffer();
|
|
68
|
+
buffer.selectRange(buffer.getIterAtOffset(start), buffer.getIterAtOffset(end));
|
|
69
|
+
if (end !== start) deleteSelection(widget);
|
|
70
|
+
return;
|
|
71
|
+
}
|
|
72
|
+
widget.selectRegion(start, end);
|
|
73
|
+
if (end !== start) widget.deleteSelection();
|
|
74
|
+
widget.setPosition(start);
|
|
75
|
+
};
|
|
76
|
+
|
|
77
|
+
const writeClipboardText = (widget: Gtk.Widget, text: string): void => {
|
|
78
|
+
const value = GObject.buildValue(GObject.TYPE_STRING, (v) => v.setString(text));
|
|
79
|
+
widget.getClipboard().set(value);
|
|
80
|
+
};
|
|
81
|
+
|
|
82
|
+
export const resetClipboard = (): void => {
|
|
83
|
+
Gdk.Display.getDefault()?.getClipboard().setContent(null);
|
|
84
|
+
};
|
|
85
|
+
|
|
86
|
+
export const type = (widget: Gtk.Widget, text: string, options?: TypeOptions): Promise<void> =>
|
|
87
|
+
wrapEvent(widget, () => {
|
|
88
|
+
if (!isEditable(widget)) {
|
|
89
|
+
throw new Error(`Cannot type into element: ${EDITABLE_REQUIRED}`);
|
|
90
|
+
}
|
|
91
|
+
|
|
92
|
+
if (!options?.skipClick) {
|
|
93
|
+
widget.grabFocus();
|
|
94
|
+
}
|
|
95
|
+
|
|
96
|
+
applyInitialSelection(widget, options ?? {});
|
|
97
|
+
insertEditableText(widget, text);
|
|
98
|
+
});
|
|
99
|
+
|
|
100
|
+
export const clear = (widget: Gtk.Widget): Promise<void> =>
|
|
101
|
+
wrapEvent(widget, () => {
|
|
102
|
+
if (!isEditable(widget)) {
|
|
103
|
+
throw new Error(`Cannot clear element: ${EDITABLE_REQUIRED}`);
|
|
104
|
+
}
|
|
105
|
+
|
|
106
|
+
setEditableText(widget, "");
|
|
107
|
+
});
|
|
108
|
+
|
|
109
|
+
export const copy = (widget: Gtk.Widget): Promise<void> =>
|
|
110
|
+
wrapEvent(widget, () => {
|
|
111
|
+
if (!isEditable(widget)) {
|
|
112
|
+
throw new Error(`Cannot copy: ${EDITABLE_REQUIRED}`);
|
|
113
|
+
}
|
|
114
|
+
|
|
115
|
+
writeClipboardText(widget, readSelection(widget));
|
|
116
|
+
});
|
|
117
|
+
|
|
118
|
+
export const cut = (widget: Gtk.Widget): Promise<void> =>
|
|
119
|
+
wrapEvent(widget, () => {
|
|
120
|
+
if (!isEditable(widget)) {
|
|
121
|
+
throw new Error(`Cannot cut: ${EDITABLE_REQUIRED}`);
|
|
122
|
+
}
|
|
123
|
+
|
|
124
|
+
writeClipboardText(widget, readSelection(widget));
|
|
125
|
+
deleteSelection(widget);
|
|
126
|
+
});
|
|
127
|
+
|
|
128
|
+
export const paste = async (widget: Gtk.Widget, text?: string): Promise<void> => {
|
|
129
|
+
if (!isEditable(widget)) {
|
|
130
|
+
throw new Error(`Cannot paste: ${EDITABLE_REQUIRED}`);
|
|
131
|
+
}
|
|
132
|
+
|
|
133
|
+
const content = text ?? (await widget.getClipboard().readTextAsync(null)) ?? "";
|
|
134
|
+
await wrapEvent(widget, () => {
|
|
135
|
+
insertEditableText(widget, content);
|
|
136
|
+
});
|
|
137
|
+
};
|
package/src/wait-for.ts
CHANGED
|
@@ -1,115 +1,114 @@
|
|
|
1
|
-
import type * as Gtk from "@gtkx/
|
|
1
|
+
import type * as Gtk from "@gtkx/gi/gtk";
|
|
2
|
+
import { runWithActEnvironment } from "./act.js";
|
|
2
3
|
import { getConfig } from "./config.js";
|
|
3
|
-
import {
|
|
4
|
+
import { timeoutError } from "./errors.js";
|
|
4
5
|
import type { WaitForOptions } from "./types.js";
|
|
5
6
|
|
|
6
7
|
const DEFAULT_INTERVAL = 50;
|
|
7
8
|
|
|
9
|
+
const delay = (ms: number): Promise<void> => new Promise((resolve) => setTimeout(resolve, ms));
|
|
10
|
+
|
|
11
|
+
const copyStackTrace = (target: Error, source: Error): void => {
|
|
12
|
+
if (source.stack) {
|
|
13
|
+
target.stack = source.stack.replace(source.message, target.message);
|
|
14
|
+
}
|
|
15
|
+
};
|
|
16
|
+
|
|
8
17
|
/**
|
|
9
|
-
*
|
|
10
|
-
*
|
|
11
|
-
* Repeatedly calls the callback until it returns without throwing,
|
|
12
|
-
* or until the timeout is reached.
|
|
13
|
-
*
|
|
14
|
-
* @param callback - Function to execute repeatedly
|
|
15
|
-
* @param options - Timeout and interval configuration
|
|
16
|
-
* @returns Promise resolving to the callback's return value
|
|
17
|
-
*
|
|
18
|
-
* @example
|
|
19
|
-
* ```tsx
|
|
20
|
-
* import { waitFor } from "@gtkx/testing";
|
|
18
|
+
* Repeatedly invokes a callback until it succeeds without throwing or the
|
|
19
|
+
* timeout elapses, retrying on each rejection at a fixed interval.
|
|
21
20
|
*
|
|
22
|
-
*
|
|
23
|
-
*
|
|
24
|
-
*
|
|
25
|
-
* ```
|
|
21
|
+
* @param callback The assertion or query to retry; its resolved value is returned.
|
|
22
|
+
* @param options Optional timeout, interval, and timeout error customization.
|
|
23
|
+
* @returns The callback's result once it succeeds.
|
|
26
24
|
*/
|
|
27
|
-
export const waitFor =
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
const startTime = Date.now();
|
|
31
|
-
let lastError: Error | null = null;
|
|
32
|
-
|
|
33
|
-
while (Date.now() - startTime < timeout) {
|
|
34
|
-
try {
|
|
35
|
-
return await callback();
|
|
36
|
-
} catch (error) {
|
|
37
|
-
lastError = error as Error;
|
|
38
|
-
await new Promise((resolve) => setTimeout(resolve, interval));
|
|
39
|
-
}
|
|
25
|
+
export const waitFor = <T>(callback: () => T | Promise<T>, options?: WaitForOptions): Promise<T> => {
|
|
26
|
+
if (typeof callback !== "function") {
|
|
27
|
+
throw new TypeError("Received `callback` arg must be a function");
|
|
40
28
|
}
|
|
41
29
|
|
|
42
|
-
const
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
30
|
+
const stackTraceError = options?.stackTraceError ?? new Error("STACK_TRACE_MESSAGE");
|
|
31
|
+
|
|
32
|
+
return Promise.resolve(
|
|
33
|
+
runWithActEnvironment(false, async () => {
|
|
34
|
+
const config = getConfig();
|
|
35
|
+
const { timeout = config.asyncUtilTimeout, interval = DEFAULT_INTERVAL, onTimeout } = options ?? {};
|
|
36
|
+
const startTime = Date.now();
|
|
37
|
+
let lastError: Error | null = null;
|
|
38
|
+
|
|
39
|
+
while (Date.now() - startTime < timeout) {
|
|
40
|
+
try {
|
|
41
|
+
const result = await callback();
|
|
42
|
+
await delay(0);
|
|
43
|
+
return result;
|
|
44
|
+
} catch (error) {
|
|
45
|
+
lastError = error as Error;
|
|
46
|
+
await delay(interval);
|
|
47
|
+
}
|
|
48
|
+
}
|
|
49
|
+
|
|
50
|
+
const error = timeoutError(timeout, lastError);
|
|
51
|
+
const finalError = onTimeout ? onTimeout(error) : error;
|
|
52
|
+
copyStackTrace(finalError, stackTraceError);
|
|
53
|
+
throw finalError;
|
|
54
|
+
}),
|
|
55
|
+
);
|
|
47
56
|
};
|
|
48
57
|
|
|
49
|
-
type
|
|
58
|
+
type RemovalTarget = Gtk.Widget | Gtk.Widget[] | null;
|
|
59
|
+
|
|
60
|
+
type ElementOrCallback = Gtk.Widget | Gtk.Widget[] | (() => RemovalTarget);
|
|
50
61
|
|
|
51
|
-
const
|
|
62
|
+
const getTarget = (elementOrCallback: ElementOrCallback): RemovalTarget => {
|
|
52
63
|
if (typeof elementOrCallback === "function") {
|
|
53
64
|
return elementOrCallback();
|
|
54
65
|
}
|
|
55
66
|
return elementOrCallback;
|
|
56
67
|
};
|
|
57
68
|
|
|
58
|
-
const
|
|
59
|
-
if (
|
|
69
|
+
const isWidgetRemoved = (widget: Gtk.Widget | null): boolean => {
|
|
70
|
+
if (widget === null) return true;
|
|
60
71
|
|
|
61
72
|
try {
|
|
62
|
-
|
|
63
|
-
return parent === null;
|
|
73
|
+
return widget.getRoot() === null;
|
|
64
74
|
} catch {
|
|
65
75
|
return true;
|
|
66
76
|
}
|
|
67
77
|
};
|
|
68
78
|
|
|
79
|
+
const isTargetRemoved = (target: RemovalTarget): boolean => {
|
|
80
|
+
if (Array.isArray(target)) {
|
|
81
|
+
return target.length === 0 || target.every(isWidgetRemoved);
|
|
82
|
+
}
|
|
83
|
+
return isWidgetRemoved(target);
|
|
84
|
+
};
|
|
85
|
+
|
|
86
|
+
const ELEMENT_NOT_REMOVED = new Error("Element not yet removed");
|
|
87
|
+
|
|
69
88
|
/**
|
|
70
|
-
* Waits
|
|
71
|
-
*
|
|
72
|
-
* Polls until the element no longer has a parent or no longer exists.
|
|
73
|
-
*
|
|
74
|
-
* @param elementOrCallback - Element or function returning element to watch
|
|
75
|
-
* @param options - Timeout and interval configuration
|
|
76
|
-
*
|
|
77
|
-
* @example
|
|
78
|
-
* ```tsx
|
|
79
|
-
* import { waitForElementToBeRemoved } from "@gtkx/testing";
|
|
89
|
+
* Waits until the given widget or widgets are detached from the tree. Rejects
|
|
90
|
+
* immediately if the target is already absent when called.
|
|
80
91
|
*
|
|
81
|
-
*
|
|
82
|
-
*
|
|
83
|
-
*
|
|
84
|
-
* ```
|
|
92
|
+
* @param elementOrCallback The widget, array of widgets, or a function
|
|
93
|
+
* returning them to observe for removal.
|
|
94
|
+
* @param options Optional timeout and interval settings.
|
|
85
95
|
*/
|
|
86
|
-
export const waitForElementToBeRemoved =
|
|
96
|
+
export const waitForElementToBeRemoved = (
|
|
87
97
|
elementOrCallback: ElementOrCallback,
|
|
88
98
|
options?: WaitForOptions,
|
|
89
99
|
): Promise<void> => {
|
|
90
|
-
const
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
"Element already removed: waitForElementToBeRemoved requires the element to be present initially",
|
|
100
|
+
const stackTraceError = new Error("STACK_TRACE_MESSAGE");
|
|
101
|
+
if (isTargetRemoved(getTarget(elementOrCallback))) {
|
|
102
|
+
return Promise.reject(
|
|
103
|
+
new Error(
|
|
104
|
+
"Element already removed: waitForElementToBeRemoved requires the element to be present initially",
|
|
105
|
+
),
|
|
97
106
|
);
|
|
98
107
|
}
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
return;
|
|
106
|
-
}
|
|
107
|
-
await new Promise((resolve) => setTimeout(resolve, interval));
|
|
108
|
-
}
|
|
109
|
-
|
|
110
|
-
const timeoutError = new Error(`Timed out after ${timeout}ms waiting for element to be removed.`);
|
|
111
|
-
if (onTimeout) {
|
|
112
|
-
throw onTimeout(timeoutError);
|
|
113
|
-
}
|
|
114
|
-
throw timeoutError;
|
|
108
|
+
return waitFor(
|
|
109
|
+
() => {
|
|
110
|
+
if (!isTargetRemoved(getTarget(elementOrCallback))) throw ELEMENT_NOT_REMOVED;
|
|
111
|
+
},
|
|
112
|
+
{ ...options, stackTraceError },
|
|
113
|
+
);
|
|
115
114
|
};
|
|
@@ -0,0 +1,244 @@
|
|
|
1
|
+
import * as Gtk from "@gtkx/gi/gtk";
|
|
2
|
+
import { getAccessibleMetadata } from "@gtkx/react/internal";
|
|
3
|
+
import { EDITABLE_ROLES, isEditable, readEditableText } from "./editable.js";
|
|
4
|
+
import { descendants } from "./traversal.js";
|
|
5
|
+
|
|
6
|
+
const callStringGetter = (widget: Gtk.Widget, method: string): string | null => {
|
|
7
|
+
const fn: unknown = Reflect.get(widget, method);
|
|
8
|
+
if (typeof fn !== "function") return null;
|
|
9
|
+
const value = (fn as () => string | null).call(widget);
|
|
10
|
+
return value ?? null;
|
|
11
|
+
};
|
|
12
|
+
|
|
13
|
+
const readAccessibleString = (widget: Gtk.Widget, key: string): string | null => {
|
|
14
|
+
const value = getAccessibleMetadata<string>(widget, key);
|
|
15
|
+
return typeof value === "string" ? value : null;
|
|
16
|
+
};
|
|
17
|
+
|
|
18
|
+
const readAccessibleNumber = (widget: Gtk.Widget, key: string): number | null => {
|
|
19
|
+
const value = getAccessibleMetadata<number>(widget, key);
|
|
20
|
+
return typeof value === "number" ? value : null;
|
|
21
|
+
};
|
|
22
|
+
|
|
23
|
+
const readAccessibleBoolean = (widget: Gtk.Widget, key: string): boolean | null => {
|
|
24
|
+
const value = getAccessibleMetadata<boolean>(widget, key);
|
|
25
|
+
return typeof value === "boolean" ? value : null;
|
|
26
|
+
};
|
|
27
|
+
|
|
28
|
+
const getLabelText = (widget: Gtk.Widget): string | null => {
|
|
29
|
+
if (widget instanceof Gtk.Label) return widget.getLabel();
|
|
30
|
+
if (widget instanceof Gtk.Inscription) return widget.getText() ?? null;
|
|
31
|
+
return null;
|
|
32
|
+
};
|
|
33
|
+
|
|
34
|
+
const DEFAULT_TEXT_GETTERS = ["getLabel", "getText", "getTitle"] as const;
|
|
35
|
+
|
|
36
|
+
/**
|
|
37
|
+
* Returns a widget's own text by trying its label, text, and title getters in
|
|
38
|
+
* order, or null when none produce a value.
|
|
39
|
+
*
|
|
40
|
+
* @param widget The widget to read text from.
|
|
41
|
+
*/
|
|
42
|
+
export const getWidgetNodeText = (widget: Gtk.Widget): string | null => {
|
|
43
|
+
for (const getter of DEFAULT_TEXT_GETTERS) {
|
|
44
|
+
const value = callStringGetter(widget, getter);
|
|
45
|
+
if (value) return value;
|
|
46
|
+
}
|
|
47
|
+
return null;
|
|
48
|
+
};
|
|
49
|
+
|
|
50
|
+
const stripMnemonic = (text: string): string => text.replace(/_(.)/g, "$1");
|
|
51
|
+
|
|
52
|
+
const namingLabelText = (widget: Gtk.Widget): string | null => {
|
|
53
|
+
const text = getLabelText(widget);
|
|
54
|
+
if (text === null) return null;
|
|
55
|
+
return widget instanceof Gtk.Label && widget.getUseUnderline() ? stripMnemonic(text) : text;
|
|
56
|
+
};
|
|
57
|
+
|
|
58
|
+
const isNamingLabelRole = (role: Gtk.AccessibleRole, includePresentation: boolean): boolean =>
|
|
59
|
+
role === Gtk.AccessibleRole.LABEL || (includePresentation && role === Gtk.AccessibleRole.PRESENTATION);
|
|
60
|
+
|
|
61
|
+
const collectLabels = (widget: Gtk.Widget): string[] => {
|
|
62
|
+
const includePresentation = widget.getAccessibleRole() === Gtk.AccessibleRole.MENU_ITEM;
|
|
63
|
+
const labels: string[] = [];
|
|
64
|
+
for (const descendant of descendants(widget)) {
|
|
65
|
+
if (!isNamingLabelRole(descendant.getAccessibleRole(), includePresentation)) continue;
|
|
66
|
+
const labelText = namingLabelText(descendant);
|
|
67
|
+
if (labelText) labels.push(labelText);
|
|
68
|
+
}
|
|
69
|
+
return labels;
|
|
70
|
+
};
|
|
71
|
+
|
|
72
|
+
export const getWidgetLabelText = (widget: Gtk.Widget): string | null => {
|
|
73
|
+
if (widget.getAccessibleRole() !== Gtk.AccessibleRole.LABEL) return null;
|
|
74
|
+
return getLabelText(widget);
|
|
75
|
+
};
|
|
76
|
+
|
|
77
|
+
export const getWidgetAccessibleName = (widget: Gtk.Widget): string | null => {
|
|
78
|
+
const role = widget.getAccessibleRole();
|
|
79
|
+
|
|
80
|
+
if (role === Gtk.AccessibleRole.TAB_PANEL) {
|
|
81
|
+
const parent = widget.getParent();
|
|
82
|
+
if (parent instanceof Gtk.Stack) {
|
|
83
|
+
const page = parent.getPage(widget);
|
|
84
|
+
return page.getTitle() ?? null;
|
|
85
|
+
}
|
|
86
|
+
return null;
|
|
87
|
+
}
|
|
88
|
+
|
|
89
|
+
const accessibleLabel = getAccessibleMetadata<string>(widget, "accessibleLabel");
|
|
90
|
+
if (accessibleLabel) return accessibleLabel;
|
|
91
|
+
|
|
92
|
+
const ownText = getWidgetNodeText(widget);
|
|
93
|
+
if (ownText) return ownText;
|
|
94
|
+
|
|
95
|
+
const childLabels = collectLabels(widget);
|
|
96
|
+
if (childLabels.length > 0) return childLabels.join(" ");
|
|
97
|
+
|
|
98
|
+
return callStringGetter(widget, "getTooltipText");
|
|
99
|
+
};
|
|
100
|
+
|
|
101
|
+
export const getWidgetName = (widget: Gtk.Widget): string | null => {
|
|
102
|
+
return widget.getName();
|
|
103
|
+
};
|
|
104
|
+
|
|
105
|
+
export const getWidgetPlaceholderText = (widget: Gtk.Widget): string | null => {
|
|
106
|
+
if (!EDITABLE_ROLES.has(widget.getAccessibleRole()) || !(widget instanceof Gtk.Editable)) {
|
|
107
|
+
return null;
|
|
108
|
+
}
|
|
109
|
+
|
|
110
|
+
return callStringGetter(widget, "getPlaceholderText");
|
|
111
|
+
};
|
|
112
|
+
|
|
113
|
+
export const getWidgetDisplayValue = (widget: Gtk.Widget): string | null => {
|
|
114
|
+
if (EDITABLE_ROLES.has(widget.getAccessibleRole()) && isEditable(widget)) {
|
|
115
|
+
return readEditableText(widget);
|
|
116
|
+
}
|
|
117
|
+
|
|
118
|
+
return null;
|
|
119
|
+
};
|
|
120
|
+
|
|
121
|
+
export const getWidgetCheckedState = (widget: Gtk.Widget): boolean | null => {
|
|
122
|
+
if (widget instanceof Gtk.CheckButton) return widget.getActive();
|
|
123
|
+
if (widget instanceof Gtk.Switch) return widget.getActive();
|
|
124
|
+
if (widget instanceof Gtk.ToggleButton && widget.getAccessibleRole() === Gtk.AccessibleRole.RADIO) {
|
|
125
|
+
return widget.getActive();
|
|
126
|
+
}
|
|
127
|
+
return null;
|
|
128
|
+
};
|
|
129
|
+
|
|
130
|
+
export const getWidgetPressedState = (widget: Gtk.Widget): boolean | null => {
|
|
131
|
+
if (widget instanceof Gtk.ToggleButton) return widget.getActive();
|
|
132
|
+
return null;
|
|
133
|
+
};
|
|
134
|
+
|
|
135
|
+
export const getWidgetExpandedState = (widget: Gtk.Widget): boolean | null => {
|
|
136
|
+
if (widget instanceof Gtk.Expander) {
|
|
137
|
+
return widget.getExpanded();
|
|
138
|
+
}
|
|
139
|
+
|
|
140
|
+
if (widget instanceof Gtk.TreeExpander) {
|
|
141
|
+
return widget.getListRow()?.getExpanded() ?? null;
|
|
142
|
+
}
|
|
143
|
+
|
|
144
|
+
return null;
|
|
145
|
+
};
|
|
146
|
+
|
|
147
|
+
export const getWidgetSelectedState = (widget: Gtk.Widget): boolean | null => {
|
|
148
|
+
if (widget instanceof Gtk.ListBoxRow) {
|
|
149
|
+
return widget.isSelected();
|
|
150
|
+
}
|
|
151
|
+
|
|
152
|
+
if (widget.getAccessibleRole() === Gtk.AccessibleRole.ROW) {
|
|
153
|
+
return (widget.getStateFlags() & Gtk.StateFlags.SELECTED) !== 0;
|
|
154
|
+
}
|
|
155
|
+
|
|
156
|
+
return null;
|
|
157
|
+
};
|
|
158
|
+
|
|
159
|
+
export const getWidgetLevel = (widget: Gtk.Widget): number | null => {
|
|
160
|
+
return readAccessibleNumber(widget, "accessibleLevel");
|
|
161
|
+
};
|
|
162
|
+
|
|
163
|
+
export const getWidgetInvalidState = (widget: Gtk.Widget): Gtk.AccessibleInvalidState | null => {
|
|
164
|
+
return getAccessibleMetadata<Gtk.AccessibleInvalidState>(widget, "accessibleInvalid");
|
|
165
|
+
};
|
|
166
|
+
|
|
167
|
+
export const getWidgetErrorMessage = (widget: Gtk.Widget): Gtk.Widget[] | null => {
|
|
168
|
+
const targets = getAccessibleMetadata<Gtk.Widget[]>(widget, "accessibleErrorMessage");
|
|
169
|
+
return Array.isArray(targets) && targets.length > 0 ? targets : null;
|
|
170
|
+
};
|
|
171
|
+
|
|
172
|
+
export const getWidgetBusyState = (widget: Gtk.Widget): boolean | null => {
|
|
173
|
+
return readAccessibleBoolean(widget, "accessibleBusy");
|
|
174
|
+
};
|
|
175
|
+
|
|
176
|
+
export const getWidgetDescription = (widget: Gtk.Widget): string | null => {
|
|
177
|
+
return readAccessibleString(widget, "accessibleDescription");
|
|
178
|
+
};
|
|
179
|
+
|
|
180
|
+
export type WidgetValue = {
|
|
181
|
+
now: number | null;
|
|
182
|
+
min: number | null;
|
|
183
|
+
max: number | null;
|
|
184
|
+
text: string | null;
|
|
185
|
+
};
|
|
186
|
+
|
|
187
|
+
type ValueTriplet = { now: number | null; min: number | null; max: number | null };
|
|
188
|
+
|
|
189
|
+
const adjustmentValue = (adjustment: Gtk.Adjustment): ValueTriplet => ({
|
|
190
|
+
now: adjustment.getValue(),
|
|
191
|
+
min: adjustment.getLower(),
|
|
192
|
+
max: adjustment.getUpper(),
|
|
193
|
+
});
|
|
194
|
+
|
|
195
|
+
const getWidgetLiveValue = (widget: Gtk.Widget): ValueTriplet | null => {
|
|
196
|
+
if (widget instanceof Gtk.Range) return adjustmentValue(widget.getAdjustment());
|
|
197
|
+
if (widget instanceof Gtk.Scrollbar) return adjustmentValue(widget.getAdjustment());
|
|
198
|
+
if (widget instanceof Gtk.SpinButton) return adjustmentValue(widget.getAdjustment());
|
|
199
|
+
if (widget instanceof Gtk.ScaleButton) return adjustmentValue(widget.getAdjustment());
|
|
200
|
+
if (widget instanceof Gtk.LevelBar) {
|
|
201
|
+
return { now: widget.getValue(), min: widget.getMinValue(), max: widget.getMaxValue() };
|
|
202
|
+
}
|
|
203
|
+
if (widget instanceof Gtk.ProgressBar) return { now: widget.getFraction(), min: 0, max: 1 };
|
|
204
|
+
return null;
|
|
205
|
+
};
|
|
206
|
+
|
|
207
|
+
export const getWidgetValue = (widget: Gtk.Widget): WidgetValue => {
|
|
208
|
+
const text = readAccessibleString(widget, "accessibleValueText");
|
|
209
|
+
const live = getWidgetLiveValue(widget);
|
|
210
|
+
if (live) return { ...live, text };
|
|
211
|
+
return {
|
|
212
|
+
now: readAccessibleNumber(widget, "accessibleValueNow"),
|
|
213
|
+
min: readAccessibleNumber(widget, "accessibleValueMin"),
|
|
214
|
+
max: readAccessibleNumber(widget, "accessibleValueMax"),
|
|
215
|
+
text,
|
|
216
|
+
};
|
|
217
|
+
};
|
|
218
|
+
|
|
219
|
+
export const getWidgetOwnLabel = (widget: Gtk.Widget): string | null => {
|
|
220
|
+
return readAccessibleString(widget, "accessibleLabel");
|
|
221
|
+
};
|
|
222
|
+
|
|
223
|
+
export const getWidgetLabelledByText = (widget: Gtk.Widget): string | null => {
|
|
224
|
+
const targets = getAccessibleMetadata<Gtk.Widget[]>(widget, "accessibleLabelledBy");
|
|
225
|
+
if (!Array.isArray(targets) || targets.length === 0) return null;
|
|
226
|
+
|
|
227
|
+
const texts: string[] = [];
|
|
228
|
+
for (const target of targets) {
|
|
229
|
+
const text = getWidgetAccessibleName(target);
|
|
230
|
+
if (text !== null) texts.push(text);
|
|
231
|
+
}
|
|
232
|
+
|
|
233
|
+
return texts.length > 0 ? texts.join(" ") : null;
|
|
234
|
+
};
|
|
235
|
+
|
|
236
|
+
export const isInaccessible = (widget: Gtk.Widget): boolean => {
|
|
237
|
+
let current: Gtk.Widget | null = widget;
|
|
238
|
+
while (current) {
|
|
239
|
+
if (!current.getVisible()) return true;
|
|
240
|
+
if (readAccessibleBoolean(current, "accessibleHidden") === true) return true;
|
|
241
|
+
current = current.getParent();
|
|
242
|
+
}
|
|
243
|
+
return false;
|
|
244
|
+
};
|
package/src/within.ts
CHANGED
|
@@ -1,31 +1,30 @@
|
|
|
1
|
-
import type
|
|
2
|
-
import {
|
|
3
|
-
import type {
|
|
1
|
+
import type { BoundQueries } from "./bound-queries.js";
|
|
2
|
+
import { builtinQueries } from "./queries.js";
|
|
3
|
+
import type { Container } from "./traversal.js";
|
|
4
|
+
import type { BoundCustomQueries, QueryMap } from "./types.js";
|
|
5
|
+
|
|
6
|
+
const bindQuery =
|
|
7
|
+
<Args extends unknown[], Result>(query: (container: Container, ...args: Args) => Result, container: Container) =>
|
|
8
|
+
(...args: Args): Result =>
|
|
9
|
+
query(container, ...args);
|
|
10
|
+
|
|
11
|
+
const bindCustomQueries = <Q extends QueryMap>(customQueries: Q, container: Container): BoundCustomQueries<Q> => {
|
|
12
|
+
const entries = Object.entries(customQueries).map(([key, query]) => [key, bindQuery(query, container)] as const);
|
|
13
|
+
return Object.fromEntries(entries) as BoundCustomQueries<Q>;
|
|
14
|
+
};
|
|
4
15
|
|
|
5
16
|
/**
|
|
6
|
-
*
|
|
7
|
-
*
|
|
8
|
-
* Use this to query within a specific section of your UI rather than
|
|
9
|
-
* the entire application.
|
|
10
|
-
*
|
|
11
|
-
* @param container - The widget to scope queries to
|
|
12
|
-
* @returns Object with query methods bound to the container
|
|
13
|
-
*
|
|
14
|
-
* @example
|
|
15
|
-
* ```tsx
|
|
16
|
-
* import { render, within } from "@gtkx/testing";
|
|
17
|
-
*
|
|
18
|
-
* test("scoped queries", async () => {
|
|
19
|
-
* await render(<MyPage />);
|
|
20
|
-
*
|
|
21
|
-
* const sidebar = await screen.findByRole(Gtk.AccessibleRole.NAVIGATION);
|
|
22
|
-
* const sidebarQueries = within(sidebar);
|
|
23
|
-
*
|
|
24
|
-
* // Only searches within the sidebar
|
|
25
|
-
* const navButton = await sidebarQueries.findByRole(Gtk.AccessibleRole.BUTTON);
|
|
26
|
-
* });
|
|
27
|
-
* ```
|
|
17
|
+
* Binds the built-in queries, and any custom queries, to a specific container
|
|
18
|
+
* so they search only within that scope.
|
|
28
19
|
*
|
|
29
|
-
* @
|
|
20
|
+
* @param container The scope the returned queries operate on.
|
|
21
|
+
* @param queries Optional custom queries to bind alongside the built-in ones.
|
|
22
|
+
* @returns The queries bound to the container.
|
|
30
23
|
*/
|
|
31
|
-
export const within =
|
|
24
|
+
export const within = <Q extends QueryMap = Record<never, never>>(
|
|
25
|
+
container: Container,
|
|
26
|
+
queries?: Q,
|
|
27
|
+
): BoundQueries & BoundCustomQueries<Q> => ({
|
|
28
|
+
...bindCustomQueries(builtinQueries, container),
|
|
29
|
+
...(queries ? bindCustomQueries(queries, container) : ({} as BoundCustomQueries<Q>)),
|
|
30
|
+
});
|
package/dist/bind-queries.d.ts
DELETED
|
@@ -1,14 +0,0 @@
|
|
|
1
|
-
import type { Container } from "./traversal.js";
|
|
2
|
-
import type { BoundQueries } from "./types.js";
|
|
3
|
-
type ContainerOrGetter = Container | (() => Container);
|
|
4
|
-
/**
|
|
5
|
-
* Binds all query functions to a container.
|
|
6
|
-
*
|
|
7
|
-
* @param containerOrGetter - The container to bind queries to, or a function that returns it
|
|
8
|
-
* @returns Object with all query methods bound to the container
|
|
9
|
-
*
|
|
10
|
-
* @internal
|
|
11
|
-
*/
|
|
12
|
-
export declare const bindQueries: (containerOrGetter: ContainerOrGetter) => BoundQueries;
|
|
13
|
-
export {};
|
|
14
|
-
//# sourceMappingURL=bind-queries.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"bind-queries.d.ts","sourceRoot":"","sources":["../src/bind-queries.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,gBAAgB,CAAC;AAChD,OAAO,KAAK,EAAE,YAAY,EAA8C,MAAM,YAAY,CAAC;AAE3F,KAAK,iBAAiB,GAAG,SAAS,GAAG,CAAC,MAAM,SAAS,CAAC,CAAC;AAKvD;;;;;;;GAOG;AACH,eAAO,MAAM,WAAW,GAAI,mBAAmB,iBAAiB,KAAG,YAiCjE,CAAC"}
|
package/dist/bind-queries.js
DELETED
|
@@ -1,29 +0,0 @@
|
|
|
1
|
-
import * as queries from "./queries.js";
|
|
2
|
-
const resolveContainer = (containerOrGetter) => typeof containerOrGetter === "function" ? containerOrGetter() : containerOrGetter;
|
|
3
|
-
/**
|
|
4
|
-
* Binds all query functions to a container.
|
|
5
|
-
*
|
|
6
|
-
* @param containerOrGetter - The container to bind queries to, or a function that returns it
|
|
7
|
-
* @returns Object with all query methods bound to the container
|
|
8
|
-
*
|
|
9
|
-
* @internal
|
|
10
|
-
*/
|
|
11
|
-
export const bindQueries = (containerOrGetter) => ({
|
|
12
|
-
queryByRole: (role, options) => queries.queryByRole(resolveContainer(containerOrGetter), role, options),
|
|
13
|
-
queryByLabelText: (text, options) => queries.queryByLabelText(resolveContainer(containerOrGetter), text, options),
|
|
14
|
-
queryByText: (text, options) => queries.queryByText(resolveContainer(containerOrGetter), text, options),
|
|
15
|
-
queryByTestId: (testId, options) => queries.queryByTestId(resolveContainer(containerOrGetter), testId, options),
|
|
16
|
-
queryAllByRole: (role, options) => queries.queryAllByRole(resolveContainer(containerOrGetter), role, options),
|
|
17
|
-
queryAllByLabelText: (text, options) => queries.queryAllByLabelText(resolveContainer(containerOrGetter), text, options),
|
|
18
|
-
queryAllByText: (text, options) => queries.queryAllByText(resolveContainer(containerOrGetter), text, options),
|
|
19
|
-
queryAllByTestId: (testId, options) => queries.queryAllByTestId(resolveContainer(containerOrGetter), testId, options),
|
|
20
|
-
findByRole: (role, options) => queries.findByRole(resolveContainer(containerOrGetter), role, options),
|
|
21
|
-
findByLabelText: (text, options) => queries.findByLabelText(resolveContainer(containerOrGetter), text, options),
|
|
22
|
-
findByText: (text, options) => queries.findByText(resolveContainer(containerOrGetter), text, options),
|
|
23
|
-
findByTestId: (testId, options) => queries.findByTestId(resolveContainer(containerOrGetter), testId, options),
|
|
24
|
-
findAllByRole: (role, options) => queries.findAllByRole(resolveContainer(containerOrGetter), role, options),
|
|
25
|
-
findAllByLabelText: (text, options) => queries.findAllByLabelText(resolveContainer(containerOrGetter), text, options),
|
|
26
|
-
findAllByText: (text, options) => queries.findAllByText(resolveContainer(containerOrGetter), text, options),
|
|
27
|
-
findAllByTestId: (testId, options) => queries.findAllByTestId(resolveContainer(containerOrGetter), testId, options),
|
|
28
|
-
});
|
|
29
|
-
//# sourceMappingURL=bind-queries.js.map
|