@testing-library/react-native 14.0.0-beta.0 → 14.0.0-beta.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 +22 -33
- package/build/event-builder/base.js.map +1 -0
- package/build/event-builder/common.d.ts +152 -0
- package/build/event-builder/common.js +80 -0
- package/build/event-builder/common.js.map +1 -0
- package/build/event-builder/index.d.ts +3 -0
- package/build/event-builder/index.js +39 -0
- package/build/event-builder/index.js.map +1 -0
- package/build/event-builder/scroll.d.ts +56 -0
- package/build/event-builder/scroll.js +51 -0
- package/build/event-builder/scroll.js.map +1 -0
- package/build/event-builder/text.d.ts +162 -0
- package/build/event-builder/text.js +113 -0
- package/build/event-builder/text.js.map +1 -0
- package/build/fire-event.d.ts +6 -5
- package/build/fire-event.js +47 -23
- package/build/fire-event.js.map +1 -1
- package/build/helpers/accessibility.d.ts +18 -15
- package/build/helpers/accessibility.js +64 -47
- package/build/helpers/accessibility.js.map +1 -1
- package/build/helpers/component-tree.d.ts +9 -9
- package/build/helpers/component-tree.js +17 -17
- package/build/helpers/component-tree.js.map +1 -1
- package/build/helpers/find-all.d.ts +2 -2
- package/build/helpers/find-all.js +1 -1
- package/build/helpers/find-all.js.map +1 -1
- package/build/helpers/format-element.d.ts +5 -5
- package/build/helpers/format-element.js +9 -9
- package/build/helpers/format-element.js.map +1 -1
- package/build/helpers/host-component-names.d.ts +13 -13
- package/build/helpers/host-component-names.js +18 -18
- package/build/helpers/host-component-names.js.map +1 -1
- package/build/helpers/matchers/match-accessibility-state.d.ts +2 -2
- package/build/helpers/matchers/match-accessibility-state.js +6 -6
- package/build/helpers/matchers/match-accessibility-state.js.map +1 -1
- package/build/helpers/matchers/match-accessibility-value.d.ts +2 -2
- package/build/helpers/matchers/match-accessibility-value.js +2 -2
- package/build/helpers/matchers/match-accessibility-value.js.map +1 -1
- package/build/helpers/matchers/match-label-text.d.ts +2 -2
- package/build/helpers/matchers/match-label-text.js +2 -2
- package/build/helpers/matchers/match-label-text.js.map +1 -1
- package/build/helpers/matchers/match-text-content.d.ts +5 -5
- package/build/helpers/matchers/match-text-content.js +5 -5
- package/build/helpers/matchers/match-text-content.js.map +1 -1
- package/build/helpers/pointer-events.d.ts +2 -2
- package/build/helpers/pointer-events.js +4 -4
- package/build/helpers/pointer-events.js.map +1 -1
- package/build/helpers/text-content.d.ts +2 -2
- package/build/helpers/text-content.js +5 -5
- package/build/helpers/text-content.js.map +1 -1
- package/build/helpers/text-input.d.ts +3 -3
- package/build/helpers/text-input.js +6 -6
- package/build/helpers/text-input.js.map +1 -1
- package/build/matchers/to-be-busy.d.ts +2 -2
- package/build/matchers/to-be-busy.js +5 -5
- package/build/matchers/to-be-busy.js.map +1 -1
- package/build/matchers/to-be-checked.d.ts +2 -2
- package/build/matchers/to-be-checked.js +9 -9
- package/build/matchers/to-be-checked.js.map +1 -1
- package/build/matchers/to-be-disabled.d.ts +3 -3
- package/build/matchers/to-be-disabled.js +10 -10
- package/build/matchers/to-be-disabled.js.map +1 -1
- package/build/matchers/to-be-empty-element.d.ts +2 -2
- package/build/matchers/to-be-empty-element.js +4 -4
- package/build/matchers/to-be-empty-element.js.map +1 -1
- package/build/matchers/to-be-expanded.d.ts +3 -3
- package/build/matchers/to-be-expanded.js +10 -10
- package/build/matchers/to-be-expanded.js.map +1 -1
- package/build/matchers/to-be-on-the-screen.d.ts +2 -2
- package/build/matchers/to-be-on-the-screen.js +7 -7
- package/build/matchers/to-be-on-the-screen.js.map +1 -1
- package/build/matchers/to-be-partially-checked.d.ts +2 -2
- package/build/matchers/to-be-partially-checked.js +8 -8
- package/build/matchers/to-be-partially-checked.js.map +1 -1
- package/build/matchers/to-be-selected.d.ts +2 -2
- package/build/matchers/to-be-selected.js +4 -4
- package/build/matchers/to-be-selected.js.map +1 -1
- package/build/matchers/to-be-visible.d.ts +2 -2
- package/build/matchers/to-be-visible.js +12 -12
- package/build/matchers/to-be-visible.js.map +1 -1
- package/build/matchers/to-contain-element.d.ts +2 -2
- package/build/matchers/to-contain-element.js +6 -6
- package/build/matchers/to-contain-element.js.map +1 -1
- package/build/matchers/to-have-accessibility-value.d.ts +2 -2
- package/build/matchers/to-have-accessibility-value.js +6 -6
- package/build/matchers/to-have-accessibility-value.js.map +1 -1
- package/build/matchers/to-have-accessible-name.d.ts +2 -2
- package/build/matchers/to-have-accessible-name.js +5 -10
- package/build/matchers/to-have-accessible-name.js.map +1 -1
- package/build/matchers/to-have-display-value.d.ts +2 -2
- package/build/matchers/to-have-display-value.js +6 -6
- package/build/matchers/to-have-display-value.js.map +1 -1
- package/build/matchers/to-have-prop.d.ts +2 -2
- package/build/matchers/to-have-prop.js +6 -6
- package/build/matchers/to-have-prop.js.map +1 -1
- package/build/matchers/to-have-style.d.ts +2 -2
- package/build/matchers/to-have-style.js +5 -5
- package/build/matchers/to-have-style.js.map +1 -1
- package/build/matchers/to-have-text-content.d.ts +2 -2
- package/build/matchers/to-have-text-content.js +4 -4
- package/build/matchers/to-have-text-content.js.map +1 -1
- package/build/matchers/types.d.ts +20 -20
- package/build/matchers/types.js.map +1 -1
- package/build/matchers/utils.d.ts +4 -4
- package/build/matchers/utils.js +6 -6
- package/build/matchers/utils.js.map +1 -1
- package/build/native-state.d.ts +3 -3
- package/build/native-state.js +2 -2
- package/build/native-state.js.map +1 -1
- package/build/queries/display-value.d.ts +2 -2
- package/build/queries/display-value.js +12 -12
- package/build/queries/display-value.js.map +1 -1
- package/build/queries/hint-text.d.ts +2 -2
- package/build/queries/hint-text.js +11 -11
- package/build/queries/hint-text.js.map +1 -1
- package/build/queries/label-text.d.ts +2 -2
- package/build/queries/label-text.js +9 -9
- package/build/queries/label-text.js.map +1 -1
- package/build/queries/make-queries.d.ts +8 -8
- package/build/queries/make-queries.js +11 -11
- package/build/queries/make-queries.js.map +1 -1
- package/build/queries/placeholder-text.d.ts +2 -2
- package/build/queries/placeholder-text.js +11 -11
- package/build/queries/placeholder-text.js.map +1 -1
- package/build/queries/role.d.ts +2 -2
- package/build/queries/role.js +17 -27
- package/build/queries/role.js.map +1 -1
- package/build/queries/test-id.d.ts +2 -2
- package/build/queries/test-id.js +11 -11
- package/build/queries/test-id.js.map +1 -1
- package/build/queries/text.d.ts +2 -2
- package/build/queries/text.js +9 -9
- package/build/queries/text.js.map +1 -1
- package/build/render.d.ts +3 -4
- package/build/render.js +17 -3
- package/build/render.js.map +1 -1
- package/build/screen.js.map +1 -1
- package/build/test-utils/react-version-gates.d.ts +1 -0
- package/build/test-utils/react-version-gates.js +28 -0
- package/build/test-utils/react-version-gates.js.map +1 -0
- package/build/types.d.ts +7 -0
- package/build/types.js.map +1 -1
- package/build/user-event/clear.d.ts +2 -2
- package/build/user-event/clear.js +13 -13
- package/build/user-event/clear.js.map +1 -1
- package/build/user-event/index.d.ts +7 -7
- package/build/user-event/index.js +6 -6
- package/build/user-event/index.js.map +1 -1
- package/build/user-event/paste.d.ts +2 -2
- package/build/user-event/paste.js +18 -18
- package/build/user-event/paste.js.map +1 -1
- package/build/user-event/press/press.d.ts +3 -3
- package/build/user-event/press/press.js +35 -35
- package/build/user-event/press/press.js.map +1 -1
- package/build/user-event/scroll/scroll-to.d.ts +2 -2
- package/build/user-event/scroll/scroll-to.js +20 -20
- package/build/user-event/scroll/scroll-to.js.map +1 -1
- package/build/user-event/setup/setup.d.ts +11 -11
- package/build/user-event/setup/setup.js.map +1 -1
- package/build/user-event/type/type.d.ts +3 -3
- package/build/user-event/type/type.js +27 -28
- package/build/user-event/type/type.js.map +1 -1
- package/build/user-event/utils/dispatch-event.d.ts +3 -3
- package/build/user-event/utils/dispatch-event.js +4 -4
- package/build/user-event/utils/dispatch-event.js.map +1 -1
- package/build/user-event/utils/index.d.ts +0 -1
- package/build/user-event/utils/index.js +0 -11
- package/build/user-event/utils/index.js.map +1 -1
- package/build/within.d.ts +3 -3
- package/build/within.js +10 -10
- package/build/within.js.map +1 -1
- package/package.json +38 -27
- package/build/tsconfig.release.tsbuildinfo +0 -1
- package/build/user-event/event-builder/base.js.map +0 -1
- package/build/user-event/event-builder/common.d.ts +0 -155
- package/build/user-event/event-builder/common.js +0 -77
- package/build/user-event/event-builder/common.js.map +0 -1
- package/build/user-event/event-builder/index.d.ts +0 -318
- package/build/user-event/event-builder/index.js +0 -15
- package/build/user-event/event-builder/index.js.map +0 -1
- package/build/user-event/event-builder/scroll-view.d.ts +0 -58
- package/build/user-event/event-builder/scroll-view.js +0 -53
- package/build/user-event/event-builder/scroll-view.js.map +0 -1
- package/build/user-event/event-builder/text-input.d.ts +0 -165
- package/build/user-event/event-builder/text-input.js +0 -105
- package/build/user-event/event-builder/text-input.js.map +0 -1
- package/build/user-event/utils/text-range.d.ts +0 -4
- package/build/user-event/utils/text-range.js +0 -6
- package/build/user-event/utils/text-range.js.map +0 -1
- /package/build/{user-event/event-builder → event-builder}/base.d.ts +0 -0
- /package/build/{user-event/event-builder → event-builder}/base.js +0 -0
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"paste.js","names":["
|
|
1
|
+
{"version":3,"file":"paste.js","names":["_eventBuilder","require","_errors","_hostComponentNames","_pointerEvents","_textInput","_nativeState","_utils","paste","instance","text","isHostTextInput","ErrorWithStack","type","isEditableTextInput","isPointerEventEnabled","dispatchEvent","buildFocusEvent","textToClear","getTextInputValue","rangeToClear","start","end","length","buildTextSelectionChangeEvent","nativeState","valueForInstance","set","buildTextChangeEvent","rangeAfter","isMultiline","props","multiline","contentSize","getTextContentSize","buildContentSizeChangeEvent","wait","config","buildEndEditingEvent","buildBlurEvent"],"sources":["../../src/user-event/paste.ts"],"sourcesContent":["import type { TestInstance } from 'test-renderer';\n\nimport {\n buildBlurEvent,\n buildContentSizeChangeEvent,\n buildEndEditingEvent,\n buildFocusEvent,\n buildTextChangeEvent,\n buildTextSelectionChangeEvent,\n} from '../event-builder';\nimport { ErrorWithStack } from '../helpers/errors';\nimport { isHostTextInput } from '../helpers/host-component-names';\nimport { isPointerEventEnabled } from '../helpers/pointer-events';\nimport { getTextInputValue, isEditableTextInput } from '../helpers/text-input';\nimport { nativeState } from '../native-state';\nimport type { UserEventInstance } from './setup';\nimport { dispatchEvent, getTextContentSize, wait } from './utils';\n\nexport async function paste(\n this: UserEventInstance,\n instance: TestInstance,\n text: string,\n): Promise<void> {\n if (!isHostTextInput(instance)) {\n throw new ErrorWithStack(\n `paste() only supports host \"TextInput\" instances. Passed instance has type: \"${instance.type}\".`,\n paste,\n );\n }\n\n if (!isEditableTextInput(instance) || !isPointerEventEnabled(instance)) {\n return;\n }\n\n // 1. Enter instance\n await dispatchEvent(instance, 'focus', buildFocusEvent());\n\n // 2. Select all\n const textToClear = getTextInputValue(instance);\n const rangeToClear = { start: 0, end: textToClear.length };\n await dispatchEvent(instance, 'selectionChange', buildTextSelectionChangeEvent(rangeToClear));\n\n // 3. Paste the text\n nativeState.valueForInstance.set(instance, text);\n await dispatchEvent(instance, 'change', buildTextChangeEvent(text));\n await dispatchEvent(instance, 'changeText', text);\n\n const rangeAfter = { start: text.length, end: text.length };\n await dispatchEvent(instance, 'selectionChange', buildTextSelectionChangeEvent(rangeAfter));\n\n // According to the docs only multiline TextInput emits contentSizeChange event\n // @see: https://reactnative.dev/docs/textinput#oncontentsizechange\n const isMultiline = instance.props.multiline === true;\n if (isMultiline) {\n const contentSize = getTextContentSize(text);\n await dispatchEvent(instance, 'contentSizeChange', buildContentSizeChangeEvent(contentSize));\n }\n\n // 4. Exit instance\n await wait(this.config);\n await dispatchEvent(instance, 'endEditing', buildEndEditingEvent(text));\n await dispatchEvent(instance, 'blur', buildBlurEvent());\n}\n"],"mappings":";;;;;;AAEA,IAAAA,aAAA,GAAAC,OAAA;AAQA,IAAAC,OAAA,GAAAD,OAAA;AACA,IAAAE,mBAAA,GAAAF,OAAA;AACA,IAAAG,cAAA,GAAAH,OAAA;AACA,IAAAI,UAAA,GAAAJ,OAAA;AACA,IAAAK,YAAA,GAAAL,OAAA;AAEA,IAAAM,MAAA,GAAAN,OAAA;AAEO,eAAeO,KAAKA,CAEzBC,QAAsB,EACtBC,IAAY,EACG;EACf,IAAI,CAAC,IAAAC,mCAAe,EAACF,QAAQ,CAAC,EAAE;IAC9B,MAAM,IAAIG,sBAAc,CACtB,gFAAgFH,QAAQ,CAACI,IAAI,IAAI,EACjGL,KACF,CAAC;EACH;EAEA,IAAI,CAAC,IAAAM,8BAAmB,EAACL,QAAQ,CAAC,IAAI,CAAC,IAAAM,oCAAqB,EAACN,QAAQ,CAAC,EAAE;IACtE;EACF;;EAEA;EACA,MAAM,IAAAO,oBAAa,EAACP,QAAQ,EAAE,OAAO,EAAE,IAAAQ,6BAAe,EAAC,CAAC,CAAC;;EAEzD;EACA,MAAMC,WAAW,GAAG,IAAAC,4BAAiB,EAACV,QAAQ,CAAC;EAC/C,MAAMW,YAAY,GAAG;IAAEC,KAAK,EAAE,CAAC;IAAEC,GAAG,EAAEJ,WAAW,CAACK;EAAO,CAAC;EAC1D,MAAM,IAAAP,oBAAa,EAACP,QAAQ,EAAE,iBAAiB,EAAE,IAAAe,2CAA6B,EAACJ,YAAY,CAAC,CAAC;;EAE7F;EACAK,wBAAW,CAACC,gBAAgB,CAACC,GAAG,CAAClB,QAAQ,EAAEC,IAAI,CAAC;EAChD,MAAM,IAAAM,oBAAa,EAACP,QAAQ,EAAE,QAAQ,EAAE,IAAAmB,kCAAoB,EAAClB,IAAI,CAAC,CAAC;EACnE,MAAM,IAAAM,oBAAa,EAACP,QAAQ,EAAE,YAAY,EAAEC,IAAI,CAAC;EAEjD,MAAMmB,UAAU,GAAG;IAAER,KAAK,EAAEX,IAAI,CAACa,MAAM;IAAED,GAAG,EAAEZ,IAAI,CAACa;EAAO,CAAC;EAC3D,MAAM,IAAAP,oBAAa,EAACP,QAAQ,EAAE,iBAAiB,EAAE,IAAAe,2CAA6B,EAACK,UAAU,CAAC,CAAC;;EAE3F;EACA;EACA,MAAMC,WAAW,GAAGrB,QAAQ,CAACsB,KAAK,CAACC,SAAS,KAAK,IAAI;EACrD,IAAIF,WAAW,EAAE;IACf,MAAMG,WAAW,GAAG,IAAAC,yBAAkB,EAACxB,IAAI,CAAC;IAC5C,MAAM,IAAAM,oBAAa,EAACP,QAAQ,EAAE,mBAAmB,EAAE,IAAA0B,yCAA2B,EAACF,WAAW,CAAC,CAAC;EAC9F;;EAEA;EACA,MAAM,IAAAG,WAAI,EAAC,IAAI,CAACC,MAAM,CAAC;EACvB,MAAM,IAAArB,oBAAa,EAACP,QAAQ,EAAE,YAAY,EAAE,IAAA6B,kCAAoB,EAAC5B,IAAI,CAAC,CAAC;EACvE,MAAM,IAAAM,oBAAa,EAACP,QAAQ,EAAE,MAAM,EAAE,IAAA8B,4BAAc,EAAC,CAAC,CAAC;AACzD","ignoreList":[]}
|
|
@@ -1,9 +1,9 @@
|
|
|
1
|
-
import type {
|
|
1
|
+
import type { TestInstance } from 'test-renderer';
|
|
2
2
|
import type { UserEventInstance } from '../setup';
|
|
3
3
|
export declare const DEFAULT_MIN_PRESS_DURATION = 130;
|
|
4
4
|
export declare const DEFAULT_LONG_PRESS_DELAY_MS = 500;
|
|
5
5
|
export interface PressOptions {
|
|
6
6
|
duration?: number;
|
|
7
7
|
}
|
|
8
|
-
export declare function press(this: UserEventInstance,
|
|
9
|
-
export declare function longPress(this: UserEventInstance,
|
|
8
|
+
export declare function press(this: UserEventInstance, instance: TestInstance): Promise<void>;
|
|
9
|
+
export declare function longPress(this: UserEventInstance, instance: TestInstance, options?: PressOptions): Promise<void>;
|
|
@@ -7,95 +7,95 @@ exports.DEFAULT_MIN_PRESS_DURATION = exports.DEFAULT_LONG_PRESS_DELAY_MS = void
|
|
|
7
7
|
exports.longPress = longPress;
|
|
8
8
|
exports.press = press;
|
|
9
9
|
var _act = require("../../act");
|
|
10
|
+
var _eventBuilder = require("../../event-builder");
|
|
10
11
|
var _eventHandler = require("../../event-handler");
|
|
11
12
|
var _componentTree = require("../../helpers/component-tree");
|
|
12
13
|
var _errors = require("../../helpers/errors");
|
|
13
14
|
var _hostComponentNames = require("../../helpers/host-component-names");
|
|
14
15
|
var _pointerEvents = require("../../helpers/pointer-events");
|
|
15
|
-
var _eventBuilder = require("../event-builder");
|
|
16
16
|
var _utils = require("../utils");
|
|
17
17
|
// These are constants defined in the React Native repo
|
|
18
18
|
// See: https://github.com/facebook/react-native/blob/50e38cc9f1e6713228a91ad50f426c4f65e65e1a/packages/react-native/Libraries/Pressability/Pressability.js#L264
|
|
19
19
|
const DEFAULT_MIN_PRESS_DURATION = exports.DEFAULT_MIN_PRESS_DURATION = 130;
|
|
20
20
|
const DEFAULT_LONG_PRESS_DELAY_MS = exports.DEFAULT_LONG_PRESS_DELAY_MS = 500;
|
|
21
|
-
async function press(
|
|
22
|
-
if (!(0, _componentTree.
|
|
23
|
-
throw new _errors.ErrorWithStack(`press() works only with host
|
|
21
|
+
async function press(instance) {
|
|
22
|
+
if (!(0, _componentTree.isTestInstance)(instance)) {
|
|
23
|
+
throw new _errors.ErrorWithStack(`press() works only with host instances.`, press);
|
|
24
24
|
}
|
|
25
|
-
await basePress(this.config,
|
|
25
|
+
await basePress(this.config, instance, {
|
|
26
26
|
type: 'press'
|
|
27
27
|
});
|
|
28
28
|
}
|
|
29
|
-
async function longPress(
|
|
30
|
-
if (!(0, _componentTree.
|
|
31
|
-
throw new _errors.ErrorWithStack(`longPress() works only with host
|
|
29
|
+
async function longPress(instance, options) {
|
|
30
|
+
if (!(0, _componentTree.isTestInstance)(instance)) {
|
|
31
|
+
throw new _errors.ErrorWithStack(`longPress() works only with host instances.`, longPress);
|
|
32
32
|
}
|
|
33
|
-
await basePress(this.config,
|
|
33
|
+
await basePress(this.config, instance, {
|
|
34
34
|
type: 'longPress',
|
|
35
35
|
duration: options?.duration ?? DEFAULT_LONG_PRESS_DELAY_MS
|
|
36
36
|
});
|
|
37
37
|
}
|
|
38
|
-
const basePress = async (config,
|
|
39
|
-
if (isEnabledHostElement(
|
|
40
|
-
await emitDirectPressEvents(config,
|
|
38
|
+
const basePress = async (config, instance, options) => {
|
|
39
|
+
if (isEnabledHostElement(instance) && hasPressEventHandler(instance)) {
|
|
40
|
+
await emitDirectPressEvents(config, instance, options);
|
|
41
41
|
return;
|
|
42
42
|
}
|
|
43
|
-
if (isEnabledTouchResponder(
|
|
44
|
-
await emitPressabilityPressEvents(config,
|
|
43
|
+
if (isEnabledTouchResponder(instance)) {
|
|
44
|
+
await emitPressabilityPressEvents(config, instance, options);
|
|
45
45
|
return;
|
|
46
46
|
}
|
|
47
|
-
if (!
|
|
47
|
+
if (!instance.parent) {
|
|
48
48
|
return;
|
|
49
49
|
}
|
|
50
|
-
await basePress(config,
|
|
50
|
+
await basePress(config, instance.parent, options);
|
|
51
51
|
};
|
|
52
|
-
function isEnabledHostElement(
|
|
53
|
-
if (!(0, _pointerEvents.isPointerEventEnabled)(
|
|
52
|
+
function isEnabledHostElement(instance) {
|
|
53
|
+
if (!(0, _pointerEvents.isPointerEventEnabled)(instance)) {
|
|
54
54
|
return false;
|
|
55
55
|
}
|
|
56
|
-
if ((0, _hostComponentNames.isHostText)(
|
|
57
|
-
return
|
|
56
|
+
if ((0, _hostComponentNames.isHostText)(instance)) {
|
|
57
|
+
return instance.props.disabled !== true;
|
|
58
58
|
}
|
|
59
|
-
if ((0, _hostComponentNames.isHostTextInput)(
|
|
60
|
-
return
|
|
59
|
+
if ((0, _hostComponentNames.isHostTextInput)(instance)) {
|
|
60
|
+
return instance.props.editable !== false;
|
|
61
61
|
}
|
|
62
62
|
return true;
|
|
63
63
|
}
|
|
64
|
-
function isEnabledTouchResponder(
|
|
65
|
-
return (0, _pointerEvents.isPointerEventEnabled)(
|
|
64
|
+
function isEnabledTouchResponder(instance) {
|
|
65
|
+
return (0, _pointerEvents.isPointerEventEnabled)(instance) && instance.props.onStartShouldSetResponder?.();
|
|
66
66
|
}
|
|
67
|
-
function hasPressEventHandler(
|
|
68
|
-
return (0, _eventHandler.getEventHandlerFromProps)(
|
|
67
|
+
function hasPressEventHandler(instance) {
|
|
68
|
+
return (0, _eventHandler.getEventHandlerFromProps)(instance.props, 'press') || (0, _eventHandler.getEventHandlerFromProps)(instance.props, 'longPress') || (0, _eventHandler.getEventHandlerFromProps)(instance.props, 'pressIn') || (0, _eventHandler.getEventHandlerFromProps)(instance.props, 'pressOut');
|
|
69
69
|
}
|
|
70
70
|
|
|
71
71
|
/**
|
|
72
|
-
* Dispatches a press event sequence for host
|
|
72
|
+
* Dispatches a press event sequence for host instances that have `onPress*` event handlers.
|
|
73
73
|
*/
|
|
74
|
-
async function emitDirectPressEvents(config,
|
|
74
|
+
async function emitDirectPressEvents(config, instance, options) {
|
|
75
75
|
await (0, _utils.wait)(config);
|
|
76
|
-
await (0, _utils.dispatchEvent)(
|
|
76
|
+
await (0, _utils.dispatchEvent)(instance, 'pressIn', (0, _eventBuilder.buildTouchEvent)());
|
|
77
77
|
await (0, _utils.wait)(config, options.duration);
|
|
78
78
|
|
|
79
79
|
// Long press events are emitted before `pressOut`.
|
|
80
80
|
if (options.type === 'longPress') {
|
|
81
|
-
await (0, _utils.dispatchEvent)(
|
|
81
|
+
await (0, _utils.dispatchEvent)(instance, 'longPress', (0, _eventBuilder.buildTouchEvent)());
|
|
82
82
|
}
|
|
83
|
-
await (0, _utils.dispatchEvent)(
|
|
83
|
+
await (0, _utils.dispatchEvent)(instance, 'pressOut', (0, _eventBuilder.buildTouchEvent)());
|
|
84
84
|
|
|
85
85
|
// Regular press events are emitted after `pressOut` according to the React Native docs.
|
|
86
86
|
// See: https://reactnative.dev/docs/pressable#onpress
|
|
87
87
|
// Experimentally for very short presses (< 130ms) `press` events are actually emitted before `onPressOut`, but
|
|
88
88
|
// we will ignore that as in reality most pressed would be above the 130ms threshold.
|
|
89
89
|
if (options.type === 'press') {
|
|
90
|
-
await (0, _utils.dispatchEvent)(
|
|
90
|
+
await (0, _utils.dispatchEvent)(instance, 'press', (0, _eventBuilder.buildTouchEvent)());
|
|
91
91
|
}
|
|
92
92
|
}
|
|
93
|
-
async function emitPressabilityPressEvents(config,
|
|
93
|
+
async function emitPressabilityPressEvents(config, instance, options) {
|
|
94
94
|
await (0, _utils.wait)(config);
|
|
95
|
-
await (0, _utils.dispatchEvent)(
|
|
95
|
+
await (0, _utils.dispatchEvent)(instance, 'responderGrant', (0, _eventBuilder.buildResponderGrantEvent)());
|
|
96
96
|
const duration = options.duration ?? DEFAULT_MIN_PRESS_DURATION;
|
|
97
97
|
await (0, _utils.wait)(config, duration);
|
|
98
|
-
await (0, _utils.dispatchEvent)(
|
|
98
|
+
await (0, _utils.dispatchEvent)(instance, 'responderRelease', (0, _eventBuilder.buildResponderReleaseEvent)());
|
|
99
99
|
|
|
100
100
|
// React Native will wait for minimal delay of DEFAULT_MIN_PRESS_DURATION
|
|
101
101
|
// before emitting the `pressOut` event. We need to wait here, so that
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"press.js","names":["_act","require","_eventHandler","_componentTree","_errors","_hostComponentNames","_pointerEvents","
|
|
1
|
+
{"version":3,"file":"press.js","names":["_act","require","_eventBuilder","_eventHandler","_componentTree","_errors","_hostComponentNames","_pointerEvents","_utils","DEFAULT_MIN_PRESS_DURATION","exports","DEFAULT_LONG_PRESS_DELAY_MS","press","instance","isTestInstance","ErrorWithStack","basePress","config","type","longPress","options","duration","isEnabledHostElement","hasPressEventHandler","emitDirectPressEvents","isEnabledTouchResponder","emitPressabilityPressEvents","parent","isPointerEventEnabled","isHostText","props","disabled","isHostTextInput","editable","onStartShouldSetResponder","getEventHandlerFromProps","wait","dispatchEvent","buildTouchEvent","buildResponderGrantEvent","buildResponderReleaseEvent","act"],"sources":["../../../src/user-event/press/press.ts"],"sourcesContent":["import type { TestInstance } from 'test-renderer';\n\nimport { act } from '../../act';\nimport {\n buildResponderGrantEvent,\n buildResponderReleaseEvent,\n buildTouchEvent,\n} from '../../event-builder';\nimport { getEventHandlerFromProps } from '../../event-handler';\nimport { isTestInstance } from '../../helpers/component-tree';\nimport { ErrorWithStack } from '../../helpers/errors';\nimport { isHostText, isHostTextInput } from '../../helpers/host-component-names';\nimport { isPointerEventEnabled } from '../../helpers/pointer-events';\nimport type { UserEventConfig, UserEventInstance } from '../setup';\nimport { dispatchEvent, wait } from '../utils';\n\n// These are constants defined in the React Native repo\n// See: https://github.com/facebook/react-native/blob/50e38cc9f1e6713228a91ad50f426c4f65e65e1a/packages/react-native/Libraries/Pressability/Pressability.js#L264\nexport const DEFAULT_MIN_PRESS_DURATION = 130;\nexport const DEFAULT_LONG_PRESS_DELAY_MS = 500;\n\nexport interface PressOptions {\n duration?: number;\n}\n\nexport async function press(this: UserEventInstance, instance: TestInstance): Promise<void> {\n if (!isTestInstance(instance)) {\n throw new ErrorWithStack(`press() works only with host instances.`, press);\n }\n\n await basePress(this.config, instance, {\n type: 'press',\n });\n}\n\nexport async function longPress(\n this: UserEventInstance,\n instance: TestInstance,\n options?: PressOptions,\n): Promise<void> {\n if (!isTestInstance(instance)) {\n throw new ErrorWithStack(`longPress() works only with host instances.`, longPress);\n }\n\n await basePress(this.config, instance, {\n type: 'longPress',\n duration: options?.duration ?? DEFAULT_LONG_PRESS_DELAY_MS,\n });\n}\n\ninterface BasePressOptions {\n type: 'press' | 'longPress';\n duration?: number;\n}\n\nconst basePress = async (\n config: UserEventConfig,\n instance: TestInstance,\n options: BasePressOptions,\n): Promise<void> => {\n if (isEnabledHostElement(instance) && hasPressEventHandler(instance)) {\n await emitDirectPressEvents(config, instance, options);\n return;\n }\n\n if (isEnabledTouchResponder(instance)) {\n await emitPressabilityPressEvents(config, instance, options);\n return;\n }\n\n if (!instance.parent) {\n return;\n }\n\n await basePress(config, instance.parent, options);\n};\n\nfunction isEnabledHostElement(instance: TestInstance) {\n if (!isPointerEventEnabled(instance)) {\n return false;\n }\n\n if (isHostText(instance)) {\n return instance.props.disabled !== true;\n }\n\n if (isHostTextInput(instance)) {\n return instance.props.editable !== false;\n }\n\n return true;\n}\n\nfunction isEnabledTouchResponder(instance: TestInstance) {\n return isPointerEventEnabled(instance) && instance.props.onStartShouldSetResponder?.();\n}\n\nfunction hasPressEventHandler(instance: TestInstance) {\n return (\n getEventHandlerFromProps(instance.props, 'press') ||\n getEventHandlerFromProps(instance.props, 'longPress') ||\n getEventHandlerFromProps(instance.props, 'pressIn') ||\n getEventHandlerFromProps(instance.props, 'pressOut')\n );\n}\n\n/**\n * Dispatches a press event sequence for host instances that have `onPress*` event handlers.\n */\nasync function emitDirectPressEvents(\n config: UserEventConfig,\n instance: TestInstance,\n options: BasePressOptions,\n) {\n await wait(config);\n await dispatchEvent(instance, 'pressIn', buildTouchEvent());\n\n await wait(config, options.duration);\n\n // Long press events are emitted before `pressOut`.\n if (options.type === 'longPress') {\n await dispatchEvent(instance, 'longPress', buildTouchEvent());\n }\n\n await dispatchEvent(instance, 'pressOut', buildTouchEvent());\n\n // Regular press events are emitted after `pressOut` according to the React Native docs.\n // See: https://reactnative.dev/docs/pressable#onpress\n // Experimentally for very short presses (< 130ms) `press` events are actually emitted before `onPressOut`, but\n // we will ignore that as in reality most pressed would be above the 130ms threshold.\n if (options.type === 'press') {\n await dispatchEvent(instance, 'press', buildTouchEvent());\n }\n}\n\nasync function emitPressabilityPressEvents(\n config: UserEventConfig,\n instance: TestInstance,\n options: BasePressOptions,\n) {\n await wait(config);\n\n await dispatchEvent(instance, 'responderGrant', buildResponderGrantEvent());\n\n const duration = options.duration ?? DEFAULT_MIN_PRESS_DURATION;\n await wait(config, duration);\n\n await dispatchEvent(instance, 'responderRelease', buildResponderReleaseEvent());\n\n // React Native will wait for minimal delay of DEFAULT_MIN_PRESS_DURATION\n // before emitting the `pressOut` event. We need to wait here, so that\n // `press()` function does not return before that.\n if (DEFAULT_MIN_PRESS_DURATION - duration > 0) {\n await act(() => wait(config, DEFAULT_MIN_PRESS_DURATION - duration));\n }\n}\n"],"mappings":"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","ignoreList":[]}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import type {
|
|
1
|
+
import type { TestInstance } from 'test-renderer';
|
|
2
2
|
import type { Size } from '../../types';
|
|
3
3
|
import type { UserEventInstance } from '../setup';
|
|
4
4
|
interface CommonScrollToOptions {
|
|
@@ -18,5 +18,5 @@ export interface HorizontalScrollToOptions extends CommonScrollToOptions {
|
|
|
18
18
|
momentumY?: never;
|
|
19
19
|
}
|
|
20
20
|
export type ScrollToOptions = VerticalScrollToOptions | HorizontalScrollToOptions;
|
|
21
|
-
export declare function scrollTo(this: UserEventInstance,
|
|
21
|
+
export declare function scrollTo(this: UserEventInstance, instance: TestInstance, options: ScrollToOptions): Promise<void>;
|
|
22
22
|
export {};
|
|
@@ -5,20 +5,20 @@ Object.defineProperty(exports, "__esModule", {
|
|
|
5
5
|
});
|
|
6
6
|
exports.scrollTo = scrollTo;
|
|
7
7
|
var _jestMatcherUtils = require("jest-matcher-utils");
|
|
8
|
+
var _eventBuilder = require("../../event-builder");
|
|
8
9
|
var _errors = require("../../helpers/errors");
|
|
9
10
|
var _hostComponentNames = require("../../helpers/host-component-names");
|
|
10
11
|
var _object = require("../../helpers/object");
|
|
11
12
|
var _nativeState = require("../../native-state");
|
|
12
|
-
var _eventBuilder = require("../event-builder");
|
|
13
13
|
var _utils = require("../utils");
|
|
14
14
|
var _utils2 = require("./utils");
|
|
15
|
-
async function scrollTo(
|
|
16
|
-
if (!(0, _hostComponentNames.isHostScrollView)(
|
|
17
|
-
throw new _errors.ErrorWithStack(`scrollTo() works only with host "ScrollView"
|
|
15
|
+
async function scrollTo(instance, options) {
|
|
16
|
+
if (!(0, _hostComponentNames.isHostScrollView)(instance)) {
|
|
17
|
+
throw new _errors.ErrorWithStack(`scrollTo() works only with host "ScrollView" instances. Passed instance has type "${instance.type}".`, scrollTo);
|
|
18
18
|
}
|
|
19
|
-
ensureScrollViewDirection(
|
|
20
|
-
await (0, _utils.dispatchEvent)(
|
|
21
|
-
const initialOffset = _nativeState.nativeState.
|
|
19
|
+
ensureScrollViewDirection(instance, options);
|
|
20
|
+
await (0, _utils.dispatchEvent)(instance, 'contentSizeChange', options.contentSize?.width ?? 0, options.contentSize?.height ?? 0);
|
|
21
|
+
const initialOffset = _nativeState.nativeState.contentOffsetForInstance.get(instance) ?? {
|
|
22
22
|
x: 0,
|
|
23
23
|
y: 0
|
|
24
24
|
};
|
|
@@ -26,54 +26,54 @@ async function scrollTo(element, options) {
|
|
|
26
26
|
y: options.y,
|
|
27
27
|
x: options.x
|
|
28
28
|
}, initialOffset, _utils2.linearInterpolator);
|
|
29
|
-
await emitDragScrollEvents(this.config,
|
|
29
|
+
await emitDragScrollEvents(this.config, instance, dragSteps, options);
|
|
30
30
|
const momentumStart = dragSteps.at(-1) ?? initialOffset;
|
|
31
31
|
const momentumSteps = (0, _utils2.createScrollSteps)({
|
|
32
32
|
y: options.momentumY,
|
|
33
33
|
x: options.momentumX
|
|
34
34
|
}, momentumStart, _utils2.inertialInterpolator);
|
|
35
|
-
await emitMomentumScrollEvents(this.config,
|
|
35
|
+
await emitMomentumScrollEvents(this.config, instance, momentumSteps, options);
|
|
36
36
|
const finalOffset = momentumSteps.at(-1) ?? dragSteps.at(-1) ?? initialOffset;
|
|
37
|
-
_nativeState.nativeState.
|
|
37
|
+
_nativeState.nativeState.contentOffsetForInstance.set(instance, finalOffset);
|
|
38
38
|
}
|
|
39
|
-
async function emitDragScrollEvents(config,
|
|
39
|
+
async function emitDragScrollEvents(config, instance, scrollSteps, scrollOptions) {
|
|
40
40
|
if (scrollSteps.length === 0) {
|
|
41
41
|
return;
|
|
42
42
|
}
|
|
43
43
|
await (0, _utils.wait)(config);
|
|
44
|
-
await (0, _utils.dispatchEvent)(
|
|
44
|
+
await (0, _utils.dispatchEvent)(instance, 'scrollBeginDrag', (0, _eventBuilder.buildScrollEvent)(scrollSteps[0], scrollOptions));
|
|
45
45
|
|
|
46
46
|
// Note: experimentally, in case of drag scroll the last scroll step
|
|
47
47
|
// will not trigger `scroll` event.
|
|
48
48
|
// See: https://github.com/callstack/react-native-testing-library/wiki/ScrollView-Events
|
|
49
49
|
for (let i = 1; i < scrollSteps.length - 1; i += 1) {
|
|
50
50
|
await (0, _utils.wait)(config);
|
|
51
|
-
await (0, _utils.dispatchEvent)(
|
|
51
|
+
await (0, _utils.dispatchEvent)(instance, 'scroll', (0, _eventBuilder.buildScrollEvent)(scrollSteps[i], scrollOptions));
|
|
52
52
|
}
|
|
53
53
|
await (0, _utils.wait)(config);
|
|
54
54
|
const lastStep = scrollSteps.at(-1);
|
|
55
|
-
await (0, _utils.dispatchEvent)(
|
|
55
|
+
await (0, _utils.dispatchEvent)(instance, 'scrollEndDrag', (0, _eventBuilder.buildScrollEvent)(lastStep, scrollOptions));
|
|
56
56
|
}
|
|
57
|
-
async function emitMomentumScrollEvents(config,
|
|
57
|
+
async function emitMomentumScrollEvents(config, instance, scrollSteps, scrollOptions) {
|
|
58
58
|
if (scrollSteps.length === 0) {
|
|
59
59
|
return;
|
|
60
60
|
}
|
|
61
61
|
await (0, _utils.wait)(config);
|
|
62
|
-
await (0, _utils.dispatchEvent)(
|
|
62
|
+
await (0, _utils.dispatchEvent)(instance, 'momentumScrollBegin', (0, _eventBuilder.buildScrollEvent)(scrollSteps[0], scrollOptions));
|
|
63
63
|
|
|
64
64
|
// Note: experimentally, in case of momentum scroll the last scroll step
|
|
65
65
|
// will trigger `scroll` event.
|
|
66
66
|
// See: https://github.com/callstack/react-native-testing-library/wiki/ScrollView-Events
|
|
67
67
|
for (let i = 1; i < scrollSteps.length; i += 1) {
|
|
68
68
|
await (0, _utils.wait)(config);
|
|
69
|
-
await (0, _utils.dispatchEvent)(
|
|
69
|
+
await (0, _utils.dispatchEvent)(instance, 'scroll', (0, _eventBuilder.buildScrollEvent)(scrollSteps[i], scrollOptions));
|
|
70
70
|
}
|
|
71
71
|
await (0, _utils.wait)(config);
|
|
72
72
|
const lastStep = scrollSteps.at(-1);
|
|
73
|
-
await (0, _utils.dispatchEvent)(
|
|
73
|
+
await (0, _utils.dispatchEvent)(instance, 'momentumScrollEnd', (0, _eventBuilder.buildScrollEvent)(lastStep, scrollOptions));
|
|
74
74
|
}
|
|
75
|
-
function ensureScrollViewDirection(
|
|
76
|
-
const isVerticalScrollView =
|
|
75
|
+
function ensureScrollViewDirection(instance, options) {
|
|
76
|
+
const isVerticalScrollView = instance.props.horizontal !== true;
|
|
77
77
|
const hasHorizontalScrollOptions = options.x !== undefined || options.momentumX !== undefined;
|
|
78
78
|
if (isVerticalScrollView && hasHorizontalScrollOptions) {
|
|
79
79
|
throw new _errors.ErrorWithStack(`scrollTo() expected only vertical scroll options: "y" and "momentumY" for vertical "ScrollView" element but received ${(0, _jestMatcherUtils.stringify)((0, _object.pick)(options, ['x', 'momentumX']))}`, scrollTo);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"scroll-to.js","names":["_jestMatcherUtils","require","_errors","_hostComponentNames","_object","_nativeState","_eventBuilder","_utils","_utils2","scrollTo","element","options","isHostScrollView","ErrorWithStack","type","ensureScrollViewDirection","dispatchEvent","contentSize","width","height","initialOffset","nativeState","contentOffsetForElement","get","x","y","dragSteps","createScrollSteps","linearInterpolator","emitDragScrollEvents","config","momentumStart","at","momentumSteps","momentumY","momentumX","inertialInterpolator","emitMomentumScrollEvents","finalOffset","set","scrollSteps","scrollOptions","length","wait","EventBuilder","ScrollView","scroll","i","lastStep","isVerticalScrollView","props","horizontal","hasHorizontalScrollOptions","undefined","stringify","pick","hasVerticalScrollOptions"],"sources":["../../../src/user-event/scroll/scroll-to.ts"],"sourcesContent":["import { stringify } from 'jest-matcher-utils';\nimport type { HostElement } from 'test-renderer';\n\nimport { ErrorWithStack } from '../../helpers/errors';\nimport { isHostScrollView } from '../../helpers/host-component-names';\nimport { pick } from '../../helpers/object';\nimport { nativeState } from '../../native-state';\nimport type { Point, Size } from '../../types';\nimport { EventBuilder } from '../event-builder';\nimport type { UserEventConfig, UserEventInstance } from '../setup';\nimport { dispatchEvent, wait } from '../utils';\nimport { createScrollSteps, inertialInterpolator, linearInterpolator } from './utils';\n\ninterface CommonScrollToOptions {\n contentSize?: Size;\n layoutMeasurement?: Size;\n}\n\nexport interface VerticalScrollToOptions extends CommonScrollToOptions {\n y: number;\n momentumY?: number;\n\n // Vertical scroll should not contain horizontal scroll part.\n x?: never;\n momentumX?: never;\n}\n\nexport interface HorizontalScrollToOptions extends CommonScrollToOptions {\n x: number;\n momentumX?: number;\n\n // Horizontal scroll should not contain vertical scroll part.\n y?: never;\n momentumY?: never;\n}\n\nexport type ScrollToOptions = VerticalScrollToOptions | HorizontalScrollToOptions;\n\nexport async function scrollTo(\n this: UserEventInstance,\n element: HostElement,\n options: ScrollToOptions,\n): Promise<void> {\n if (!isHostScrollView(element)) {\n throw new ErrorWithStack(\n `scrollTo() works only with host \"ScrollView\" elements. Passed element has type \"${element.type}\".`,\n scrollTo,\n );\n }\n\n ensureScrollViewDirection(element, options);\n\n await dispatchEvent(\n element,\n 'contentSizeChange',\n options.contentSize?.width ?? 0,\n options.contentSize?.height ?? 0,\n );\n\n const initialOffset = nativeState.contentOffsetForElement.get(element) ?? { x: 0, y: 0 };\n const dragSteps = createScrollSteps(\n { y: options.y, x: options.x },\n initialOffset,\n linearInterpolator,\n );\n await emitDragScrollEvents(this.config, element, dragSteps, options);\n\n const momentumStart = dragSteps.at(-1) ?? initialOffset;\n const momentumSteps = createScrollSteps(\n { y: options.momentumY, x: options.momentumX },\n momentumStart,\n inertialInterpolator,\n );\n await emitMomentumScrollEvents(this.config, element, momentumSteps, options);\n\n const finalOffset = momentumSteps.at(-1) ?? dragSteps.at(-1) ?? initialOffset;\n nativeState.contentOffsetForElement.set(element, finalOffset);\n}\n\nasync function emitDragScrollEvents(\n config: UserEventConfig,\n element: HostElement,\n scrollSteps: Point[],\n scrollOptions: ScrollToOptions,\n) {\n if (scrollSteps.length === 0) {\n return;\n }\n\n await wait(config);\n await dispatchEvent(\n element,\n 'scrollBeginDrag',\n EventBuilder.ScrollView.scroll(scrollSteps[0], scrollOptions),\n );\n\n // Note: experimentally, in case of drag scroll the last scroll step\n // will not trigger `scroll` event.\n // See: https://github.com/callstack/react-native-testing-library/wiki/ScrollView-Events\n for (let i = 1; i < scrollSteps.length - 1; i += 1) {\n await wait(config);\n await dispatchEvent(\n element,\n 'scroll',\n EventBuilder.ScrollView.scroll(scrollSteps[i], scrollOptions),\n );\n }\n\n await wait(config);\n const lastStep = scrollSteps.at(-1);\n await dispatchEvent(\n element,\n 'scrollEndDrag',\n EventBuilder.ScrollView.scroll(lastStep, scrollOptions),\n );\n}\n\nasync function emitMomentumScrollEvents(\n config: UserEventConfig,\n element: HostElement,\n scrollSteps: Point[],\n scrollOptions: ScrollToOptions,\n) {\n if (scrollSteps.length === 0) {\n return;\n }\n\n await wait(config);\n await dispatchEvent(\n element,\n 'momentumScrollBegin',\n EventBuilder.ScrollView.scroll(scrollSteps[0], scrollOptions),\n );\n\n // Note: experimentally, in case of momentum scroll the last scroll step\n // will trigger `scroll` event.\n // See: https://github.com/callstack/react-native-testing-library/wiki/ScrollView-Events\n for (let i = 1; i < scrollSteps.length; i += 1) {\n await wait(config);\n await dispatchEvent(\n element,\n 'scroll',\n EventBuilder.ScrollView.scroll(scrollSteps[i], scrollOptions),\n );\n }\n\n await wait(config);\n const lastStep = scrollSteps.at(-1);\n await dispatchEvent(\n element,\n 'momentumScrollEnd',\n EventBuilder.ScrollView.scroll(lastStep, scrollOptions),\n );\n}\n\nfunction ensureScrollViewDirection(element: HostElement, options: ScrollToOptions) {\n const isVerticalScrollView = element.props.horizontal !== true;\n\n const hasHorizontalScrollOptions = options.x !== undefined || options.momentumX !== undefined;\n if (isVerticalScrollView && hasHorizontalScrollOptions) {\n throw new ErrorWithStack(\n `scrollTo() expected only vertical scroll options: \"y\" and \"momentumY\" for vertical \"ScrollView\" element but received ${stringify(\n pick(options, ['x', 'momentumX']),\n )}`,\n scrollTo,\n );\n }\n\n const hasVerticalScrollOptions = options.y !== undefined || options.momentumY !== undefined;\n if (!isVerticalScrollView && hasVerticalScrollOptions) {\n throw new ErrorWithStack(\n `scrollTo() expected only horizontal scroll options: \"x\" and \"momentumX\" for horizontal \"ScrollView\" element but received ${stringify(\n pick(options, ['y', 'momentumY']),\n )}`,\n scrollTo,\n );\n }\n}\n"],"mappings":"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","ignoreList":[]}
|
|
1
|
+
{"version":3,"file":"scroll-to.js","names":["_jestMatcherUtils","require","_eventBuilder","_errors","_hostComponentNames","_object","_nativeState","_utils","_utils2","scrollTo","instance","options","isHostScrollView","ErrorWithStack","type","ensureScrollViewDirection","dispatchEvent","contentSize","width","height","initialOffset","nativeState","contentOffsetForInstance","get","x","y","dragSteps","createScrollSteps","linearInterpolator","emitDragScrollEvents","config","momentumStart","at","momentumSteps","momentumY","momentumX","inertialInterpolator","emitMomentumScrollEvents","finalOffset","set","scrollSteps","scrollOptions","length","wait","buildScrollEvent","i","lastStep","isVerticalScrollView","props","horizontal","hasHorizontalScrollOptions","undefined","stringify","pick","hasVerticalScrollOptions"],"sources":["../../../src/user-event/scroll/scroll-to.ts"],"sourcesContent":["import { stringify } from 'jest-matcher-utils';\nimport type { TestInstance } from 'test-renderer';\n\nimport { buildScrollEvent } from '../../event-builder';\nimport { ErrorWithStack } from '../../helpers/errors';\nimport { isHostScrollView } from '../../helpers/host-component-names';\nimport { pick } from '../../helpers/object';\nimport { nativeState } from '../../native-state';\nimport type { Point, Size } from '../../types';\nimport type { UserEventConfig, UserEventInstance } from '../setup';\nimport { dispatchEvent, wait } from '../utils';\nimport { createScrollSteps, inertialInterpolator, linearInterpolator } from './utils';\n\ninterface CommonScrollToOptions {\n contentSize?: Size;\n layoutMeasurement?: Size;\n}\n\nexport interface VerticalScrollToOptions extends CommonScrollToOptions {\n y: number;\n momentumY?: number;\n\n // Vertical scroll should not contain horizontal scroll part.\n x?: never;\n momentumX?: never;\n}\n\nexport interface HorizontalScrollToOptions extends CommonScrollToOptions {\n x: number;\n momentumX?: number;\n\n // Horizontal scroll should not contain vertical scroll part.\n y?: never;\n momentumY?: never;\n}\n\nexport type ScrollToOptions = VerticalScrollToOptions | HorizontalScrollToOptions;\n\nexport async function scrollTo(\n this: UserEventInstance,\n instance: TestInstance,\n options: ScrollToOptions,\n): Promise<void> {\n if (!isHostScrollView(instance)) {\n throw new ErrorWithStack(\n `scrollTo() works only with host \"ScrollView\" instances. Passed instance has type \"${instance.type}\".`,\n scrollTo,\n );\n }\n\n ensureScrollViewDirection(instance, options);\n\n await dispatchEvent(\n instance,\n 'contentSizeChange',\n options.contentSize?.width ?? 0,\n options.contentSize?.height ?? 0,\n );\n\n const initialOffset = nativeState.contentOffsetForInstance.get(instance) ?? { x: 0, y: 0 };\n const dragSteps = createScrollSteps(\n { y: options.y, x: options.x },\n initialOffset,\n linearInterpolator,\n );\n await emitDragScrollEvents(this.config, instance, dragSteps, options);\n\n const momentumStart = dragSteps.at(-1) ?? initialOffset;\n const momentumSteps = createScrollSteps(\n { y: options.momentumY, x: options.momentumX },\n momentumStart,\n inertialInterpolator,\n );\n await emitMomentumScrollEvents(this.config, instance, momentumSteps, options);\n\n const finalOffset = momentumSteps.at(-1) ?? dragSteps.at(-1) ?? initialOffset;\n nativeState.contentOffsetForInstance.set(instance, finalOffset);\n}\n\nasync function emitDragScrollEvents(\n config: UserEventConfig,\n instance: TestInstance,\n scrollSteps: Point[],\n scrollOptions: ScrollToOptions,\n) {\n if (scrollSteps.length === 0) {\n return;\n }\n\n await wait(config);\n await dispatchEvent(instance, 'scrollBeginDrag', buildScrollEvent(scrollSteps[0], scrollOptions));\n\n // Note: experimentally, in case of drag scroll the last scroll step\n // will not trigger `scroll` event.\n // See: https://github.com/callstack/react-native-testing-library/wiki/ScrollView-Events\n for (let i = 1; i < scrollSteps.length - 1; i += 1) {\n await wait(config);\n await dispatchEvent(instance, 'scroll', buildScrollEvent(scrollSteps[i], scrollOptions));\n }\n\n await wait(config);\n const lastStep = scrollSteps.at(-1);\n await dispatchEvent(instance, 'scrollEndDrag', buildScrollEvent(lastStep, scrollOptions));\n}\n\nasync function emitMomentumScrollEvents(\n config: UserEventConfig,\n instance: TestInstance,\n scrollSteps: Point[],\n scrollOptions: ScrollToOptions,\n) {\n if (scrollSteps.length === 0) {\n return;\n }\n\n await wait(config);\n await dispatchEvent(\n instance,\n 'momentumScrollBegin',\n buildScrollEvent(scrollSteps[0], scrollOptions),\n );\n\n // Note: experimentally, in case of momentum scroll the last scroll step\n // will trigger `scroll` event.\n // See: https://github.com/callstack/react-native-testing-library/wiki/ScrollView-Events\n for (let i = 1; i < scrollSteps.length; i += 1) {\n await wait(config);\n await dispatchEvent(instance, 'scroll', buildScrollEvent(scrollSteps[i], scrollOptions));\n }\n\n await wait(config);\n const lastStep = scrollSteps.at(-1);\n await dispatchEvent(instance, 'momentumScrollEnd', buildScrollEvent(lastStep, scrollOptions));\n}\n\nfunction ensureScrollViewDirection(instance: TestInstance, options: ScrollToOptions) {\n const isVerticalScrollView = instance.props.horizontal !== true;\n\n const hasHorizontalScrollOptions = options.x !== undefined || options.momentumX !== undefined;\n if (isVerticalScrollView && hasHorizontalScrollOptions) {\n throw new ErrorWithStack(\n `scrollTo() expected only vertical scroll options: \"y\" and \"momentumY\" for vertical \"ScrollView\" element but received ${stringify(\n pick(options, ['x', 'momentumX']),\n )}`,\n scrollTo,\n );\n }\n\n const hasVerticalScrollOptions = options.y !== undefined || options.momentumY !== undefined;\n if (!isVerticalScrollView && hasVerticalScrollOptions) {\n throw new ErrorWithStack(\n `scrollTo() expected only horizontal scroll options: \"x\" and \"momentumX\" for horizontal \"ScrollView\" element but received ${stringify(\n pick(options, ['y', 'momentumY']),\n )}`,\n scrollTo,\n );\n }\n}\n"],"mappings":"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","ignoreList":[]}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import type {
|
|
1
|
+
import type { TestInstance } from 'test-renderer';
|
|
2
2
|
import type { PressOptions } from '../press';
|
|
3
3
|
import type { ScrollToOptions } from '../scroll';
|
|
4
4
|
import type { TypeOptions } from '../type';
|
|
@@ -44,8 +44,8 @@ export interface UserEventConfig {
|
|
|
44
44
|
*/
|
|
45
45
|
export interface UserEventInstance {
|
|
46
46
|
config: UserEventConfig;
|
|
47
|
-
press: (
|
|
48
|
-
longPress: (
|
|
47
|
+
press: (instance: TestInstance) => Promise<void>;
|
|
48
|
+
longPress: (instance: TestInstance, options?: PressOptions) => Promise<void>;
|
|
49
49
|
/**
|
|
50
50
|
* Simulate user pressing on a given `TextInput` element and typing given text.
|
|
51
51
|
*
|
|
@@ -58,7 +58,7 @@ export interface UserEventInstance {
|
|
|
58
58
|
* The exact events sent depend on the props of the TextInput (`editable`,
|
|
59
59
|
* `multiline`, etc) and passed options.
|
|
60
60
|
*
|
|
61
|
-
* @param
|
|
61
|
+
* @param instance TextInput instance to type on
|
|
62
62
|
* @param text Text to type
|
|
63
63
|
* @param options Options affecting typing behavior:
|
|
64
64
|
* - `skipPress` - if true, `pressIn` and `pressOut` events will not be
|
|
@@ -66,7 +66,7 @@ export interface UserEventInstance {
|
|
|
66
66
|
* - `submitEditing` - if true, `submitEditing` event will be triggered after
|
|
67
67
|
* typing the text.
|
|
68
68
|
*/
|
|
69
|
-
type: (
|
|
69
|
+
type: (instance: TestInstance, text: string, options?: TypeOptions) => Promise<void>;
|
|
70
70
|
/**
|
|
71
71
|
* Simulate user clearing the text of a given `TextInput` element.
|
|
72
72
|
*
|
|
@@ -76,9 +76,9 @@ export interface UserEventInstance {
|
|
|
76
76
|
* 3. pressing backspace to delete all text
|
|
77
77
|
* 4. leaving TextInput
|
|
78
78
|
*
|
|
79
|
-
* @param
|
|
79
|
+
* @param instance TextInput instance to clear
|
|
80
80
|
*/
|
|
81
|
-
clear: (
|
|
81
|
+
clear: (instance: TestInstance) => Promise<void>;
|
|
82
82
|
/**
|
|
83
83
|
* Simulate user pasting the text to a given `TextInput` element.
|
|
84
84
|
*
|
|
@@ -88,14 +88,14 @@ export interface UserEventInstance {
|
|
|
88
88
|
* 3. paste the text
|
|
89
89
|
* 4. leaving TextInput
|
|
90
90
|
*
|
|
91
|
-
* @param
|
|
91
|
+
* @param instance TextInput instance to paste to
|
|
92
92
|
*/
|
|
93
|
-
paste: (
|
|
93
|
+
paste: (instance: TestInstance, text: string) => Promise<void>;
|
|
94
94
|
/**
|
|
95
95
|
* Simlate user scorlling a ScrollView element.
|
|
96
96
|
*
|
|
97
|
-
* @param
|
|
97
|
+
* @param instance ScrollView instance
|
|
98
98
|
* @returns
|
|
99
99
|
*/
|
|
100
|
-
scrollTo: (
|
|
100
|
+
scrollTo: (instance: TestInstance, options: ScrollToOptions) => Promise<void>;
|
|
101
101
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"setup.js","names":["_timers","require","_validateOptions","_wrapAsync","_clear","_paste","_press","_scroll","_type","_utils","universalJestAdvanceTimersBy","ms","jestFakeTimersAreEnabled","jest","advanceTimersByTime","Promise","resolve","defaultOptions","delay","advanceTimers","setup","options","config","createConfig","instance","createInstance","callsite","rest","validateOptions","undefined","api","press","wrapAndBindImpl","longPress","type","clear","paste","scrollTo","Object","assign","impl","method","args","wrapAsync","apply","then","result","wait","defineProperty","get","name"],"sources":["../../../src/user-event/setup/setup.ts"],"sourcesContent":["import type {
|
|
1
|
+
{"version":3,"file":"setup.js","names":["_timers","require","_validateOptions","_wrapAsync","_clear","_paste","_press","_scroll","_type","_utils","universalJestAdvanceTimersBy","ms","jestFakeTimersAreEnabled","jest","advanceTimersByTime","Promise","resolve","defaultOptions","delay","advanceTimers","setup","options","config","createConfig","instance","createInstance","callsite","rest","validateOptions","undefined","api","press","wrapAndBindImpl","longPress","type","clear","paste","scrollTo","Object","assign","impl","method","args","wrapAsync","apply","then","result","wait","defineProperty","get","name"],"sources":["../../../src/user-event/setup/setup.ts"],"sourcesContent":["import type { TestInstance } from 'test-renderer';\n\nimport { jestFakeTimersAreEnabled } from '../../helpers/timers';\nimport { validateOptions } from '../../helpers/validate-options';\nimport { wrapAsync } from '../../helpers/wrap-async';\nimport { clear } from '../clear';\nimport { paste } from '../paste';\nimport type { PressOptions } from '../press';\nimport { longPress, press } from '../press';\nimport type { ScrollToOptions } from '../scroll';\nimport { scrollTo } from '../scroll';\nimport type { TypeOptions } from '../type';\nimport { type } from '../type';\nimport { wait } from '../utils';\n\nexport interface UserEventSetupOptions {\n /**\n * Between some subsequent inputs like typing a series of characters\n * the code execution is delayed per `setTimeout` for (at least) `delay` seconds.\n * This moves the next changes at least to next macro task\n * and allows other (asynchronous) code to run between events.\n *\n * `null` prevents `setTimeout` from being called.\n *\n * @default 0\n */\n delay?: number;\n\n /**\n * Function to be called to advance fake timers. Setting it is necessary for\n * fake timers to work.\n *\n * @example jest.advanceTimersByTime\n */\n advanceTimers?: (delay: number) => Promise<void> | void;\n}\n\n/**\n * This functions allow wait to work correctly under both real and fake Jest timers.\n */\nfunction universalJestAdvanceTimersBy(ms: number) {\n if (jestFakeTimersAreEnabled()) {\n return jest.advanceTimersByTime(ms);\n } else {\n return Promise.resolve();\n }\n}\n\nconst defaultOptions: Required<UserEventSetupOptions> = {\n delay: 0,\n advanceTimers: universalJestAdvanceTimersBy,\n};\n\n/**\n * Creates a new instance of user event instance with the given options.\n *\n * @param options\n * @returns UserEvent instance\n */\nexport function setup(options?: UserEventSetupOptions) {\n const config = createConfig(options, setup);\n const instance = createInstance(config);\n return instance;\n}\n\n/**\n * Options affecting all user event interactions.\n *\n * @param delay between some subsequent inputs like typing a series of characters\n * @param advanceTimers function to be called to advance fake timers\n */\nexport interface UserEventConfig {\n delay: number;\n advanceTimers: (delay: number) => Promise<void> | void;\n}\n\nfunction createConfig(\n options: UserEventSetupOptions = {},\n // eslint-disable-next-line @typescript-eslint/no-unsafe-function-type\n callsite: Function,\n): UserEventConfig {\n const { delay, advanceTimers, ...rest } = options;\n validateOptions('userEvent.setup', rest, callsite);\n\n return {\n ...defaultOptions,\n ...(delay !== undefined && { delay }),\n ...(advanceTimers !== undefined && { advanceTimers }),\n };\n}\n\n/**\n * UserEvent instance used to invoke user interaction functions.\n */\nexport interface UserEventInstance {\n config: UserEventConfig;\n\n press: (instance: TestInstance) => Promise<void>;\n longPress: (instance: TestInstance, options?: PressOptions) => Promise<void>;\n\n /**\n * Simulate user pressing on a given `TextInput` element and typing given text.\n *\n * This method will trigger the events for each character of the text:\n * `keyPress`, `change`, `changeText`, `endEditing`, etc.\n *\n * It will also trigger events connected with entering and leaving the text\n * input.\n *\n * The exact events sent depend on the props of the TextInput (`editable`,\n * `multiline`, etc) and passed options.\n *\n * @param instance TextInput instance to type on\n * @param text Text to type\n * @param options Options affecting typing behavior:\n * - `skipPress` - if true, `pressIn` and `pressOut` events will not be\n * triggered.\n * - `submitEditing` - if true, `submitEditing` event will be triggered after\n * typing the text.\n */\n type: (instance: TestInstance, text: string, options?: TypeOptions) => Promise<void>;\n\n /**\n * Simulate user clearing the text of a given `TextInput` element.\n *\n * This method will simulate:\n * 1. entering TextInput\n * 2. selecting all text\n * 3. pressing backspace to delete all text\n * 4. leaving TextInput\n *\n * @param instance TextInput instance to clear\n */\n clear: (instance: TestInstance) => Promise<void>;\n\n /**\n * Simulate user pasting the text to a given `TextInput` element.\n *\n * This method will simulate:\n * 1. entering TextInput\n * 2. selecting all text\n * 3. paste the text\n * 4. leaving TextInput\n *\n * @param instance TextInput instance to paste to\n */\n paste: (instance: TestInstance, text: string) => Promise<void>;\n\n /**\n * Simlate user scorlling a ScrollView element.\n *\n * @param instance ScrollView instance\n * @returns\n */\n scrollTo: (instance: TestInstance, options: ScrollToOptions) => Promise<void>;\n}\n\nfunction createInstance(config: UserEventConfig): UserEventInstance {\n const instance = {\n config,\n } as UserEventInstance;\n\n // Bind interactions to given User Event instance.\n const api = {\n press: wrapAndBindImpl(instance, press),\n longPress: wrapAndBindImpl(instance, longPress),\n type: wrapAndBindImpl(instance, type),\n clear: wrapAndBindImpl(instance, clear),\n paste: wrapAndBindImpl(instance, paste),\n scrollTo: wrapAndBindImpl(instance, scrollTo),\n };\n\n Object.assign(instance, api);\n return instance;\n}\n\n/**\n * Wraps user interaction with `wrapAsync` (temporarily disable `act` environment while\n * calling & resolving the async callback, then flush the microtask queue)\n *\n * This implementation is sourced from `testing-library/user-event`\n * @see https://github.com/testing-library/user-event/blob/7a305dee9ab833d6f338d567fc2e862b4838b76a/src/setup/setup.ts#L121\n */\nfunction wrapAndBindImpl<\n Args extends never[],\n Impl extends (this: UserEventInstance, ...args: Args) => Promise<unknown>,\n>(instance: UserEventInstance, impl: Impl) {\n function method(...args: Args) {\n return wrapAsync(() =>\n // eslint-disable-next-line promise/prefer-await-to-then\n impl.apply(instance, args).then(async (result) => {\n await wait(instance.config);\n return result;\n }),\n );\n }\n\n // Copy implementation name to the returned function\n Object.defineProperty(method, 'name', { get: () => impl.name });\n\n return method as Impl;\n}\n"],"mappings":"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","ignoreList":[]}
|
|
@@ -1,16 +1,16 @@
|
|
|
1
|
-
import type {
|
|
1
|
+
import type { TestInstance } from 'test-renderer';
|
|
2
2
|
import type { UserEventConfig, UserEventInstance } from '../setup';
|
|
3
3
|
export interface TypeOptions {
|
|
4
4
|
skipPress?: boolean;
|
|
5
5
|
submitEditing?: boolean;
|
|
6
6
|
skipBlur?: boolean;
|
|
7
7
|
}
|
|
8
|
-
export declare function type(this: UserEventInstance,
|
|
8
|
+
export declare function type(this: UserEventInstance, instance: TestInstance, text: string, options?: TypeOptions): Promise<void>;
|
|
9
9
|
type EmitTypingEventsContext = {
|
|
10
10
|
config: UserEventConfig;
|
|
11
11
|
key: string;
|
|
12
12
|
text: string;
|
|
13
13
|
isAccepted?: boolean;
|
|
14
14
|
};
|
|
15
|
-
export declare function emitTypingEvents(
|
|
15
|
+
export declare function emitTypingEvents(instance: TestInstance, { config, key, text, isAccepted }: EmitTypingEventsContext): Promise<void>;
|
|
16
16
|
export {};
|