-
-
Notifications
You must be signed in to change notification settings - Fork 156
Expand file tree
/
Copy pathrefocus.spec.tsx
More file actions
114 lines (97 loc) · 3.55 KB
/
refocus.spec.tsx
File metadata and controls
114 lines (97 loc) · 3.55 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
import "../__fixtures__/mocks";
import {
INPUT_LAYOUT_B,
INPUT_TARGET_B,
KEYBOARD_HEIGHT,
inputEvent,
kbEvent,
lastScrollToY,
mockInput,
mockKeyboardHandlers,
mockOffset,
mockScrollTo,
mockSelectionHandler,
renderKeyboardAwareScrollView,
reset,
selectionEvent,
} from "../__fixtures__/testUtils";
beforeEach(() => {
reset();
});
describe("KeyboardAwareScrollView — refocus same input", () => {
// Input B: point = 695.67 + 47 = 742.67
// relativeScrollTo = 312 - (928 - 742.67) + 62 = 188.67
describe("iOS 15: refocus after keyboard hide", () => {
it("should use fresh selection data on refocus", async () => {
await renderKeyboardAwareScrollView();
mockInput.value = inputEvent(INPUT_TARGET_B, INPUT_LAYOUT_B);
// ---- First focus (cursor at y=47) ----
mockKeyboardHandlers.current.onStart(
kbEvent(KEYBOARD_HEIGHT, INPUT_TARGET_B),
);
mockSelectionHandler.current(selectionEvent(INPUT_TARGET_B, 47, 0));
mockKeyboardHandlers.current.onMove(
kbEvent(KEYBOARD_HEIGHT, INPUT_TARGET_B),
);
mockKeyboardHandlers.current.onEnd(
kbEvent(KEYBOARD_HEIGHT, INPUT_TARGET_B),
);
mockOffset.value = 189;
// ---- Keyboard hide ----
mockKeyboardHandlers.current.onStart(kbEvent(0, INPUT_TARGET_B));
mockKeyboardHandlers.current.onEnd(kbEvent(0, INPUT_TARGET_B));
mockOffset.value = 0;
// ---- Second focus (cursor moved to y=20) ----
mockScrollTo.mockClear();
mockKeyboardHandlers.current.onStart(
kbEvent(KEYBOARD_HEIGHT, INPUT_TARGET_B),
);
mockSelectionHandler.current(selectionEvent(INPUT_TARGET_B, 20, 5));
mockKeyboardHandlers.current.onMove(
kbEvent(KEYBOARD_HEIGHT, INPUT_TARGET_B),
);
// point = 695.67 + 20 = 715.67
// relativeScrollTo = 312 - (928 - 715.67) + 62 = 161.67
expect(lastScrollToY()).toBeCloseTo(161.67, 0);
mockKeyboardHandlers.current.onEnd(
kbEvent(KEYBOARD_HEIGHT, INPUT_TARGET_B),
);
});
});
describe("Android: selection not re-emitted on refocus", () => {
it("should use stale selection as fallback", async () => {
await renderKeyboardAwareScrollView();
mockInput.value = inputEvent(INPUT_TARGET_B, INPUT_LAYOUT_B);
// ---- First focus (selection arrives) ----
mockSelectionHandler.current(selectionEvent(INPUT_TARGET_B, 47, 0));
mockKeyboardHandlers.current.onStart(
kbEvent(KEYBOARD_HEIGHT, INPUT_TARGET_B),
);
mockKeyboardHandlers.current.onMove(
kbEvent(KEYBOARD_HEIGHT, INPUT_TARGET_B),
);
mockKeyboardHandlers.current.onEnd(
kbEvent(KEYBOARD_HEIGHT, INPUT_TARGET_B),
);
mockOffset.value = 189;
// ---- Keyboard hide ----
mockKeyboardHandlers.current.onStart(kbEvent(0, INPUT_TARGET_B));
mockKeyboardHandlers.current.onEnd(kbEvent(0, INPUT_TARGET_B));
mockOffset.value = 0;
// ---- Second focus (NO selection event — Android behavior) ----
mockScrollTo.mockClear();
mockKeyboardHandlers.current.onStart(
kbEvent(KEYBOARD_HEIGHT, INPUT_TARGET_B),
);
// No selectionHandler call — Android doesn't re-emit for same cursor
mockKeyboardHandlers.current.onMove(
kbEvent(KEYBOARD_HEIGHT, INPUT_TARGET_B),
);
// Must use stale selection (height=47), NOT full input height (60.33)
expect(lastScrollToY()).toBeCloseTo(188.67, 0);
mockKeyboardHandlers.current.onEnd(
kbEvent(KEYBOARD_HEIGHT, INPUT_TARGET_B),
);
});
});
});