@shopify/flash-list 2.0.3 → 2.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/AnimatedFlashList.js +4 -6
- package/dist/AnimatedFlashList.js.map +1 -1
- package/dist/FlashList.js +1 -5
- package/dist/FlashList.js.map +1 -1
- package/dist/FlashListProps.d.ts +9 -1
- package/dist/FlashListProps.d.ts.map +1 -1
- package/dist/FlashListProps.js +1 -4
- package/dist/FlashListProps.js.map +1 -1
- package/dist/FlashListRef.js +1 -2
- package/dist/benchmark/AutoScrollHelper.js +22 -30
- package/dist/benchmark/AutoScrollHelper.js.map +1 -1
- package/dist/benchmark/JSFPSMonitor.js +27 -33
- package/dist/benchmark/JSFPSMonitor.js.map +1 -1
- package/dist/benchmark/roundToDecimalPlaces.js +2 -5
- package/dist/benchmark/roundToDecimalPlaces.js.map +1 -1
- package/dist/benchmark/useBenchmark.d.ts +9 -1
- package/dist/benchmark/useBenchmark.d.ts.map +1 -1
- package/dist/benchmark/useBenchmark.js +86 -95
- package/dist/benchmark/useBenchmark.js.map +1 -1
- package/dist/benchmark/useDataMultiplier.js +6 -10
- package/dist/benchmark/useDataMultiplier.js.map +1 -1
- package/dist/benchmark/useFlatListBenchmark.d.ts +4 -1
- package/dist/benchmark/useFlatListBenchmark.d.ts.map +1 -1
- package/dist/benchmark/useFlatListBenchmark.js +73 -81
- package/dist/benchmark/useFlatListBenchmark.js.map +1 -1
- package/dist/errors/ErrorMessages.js +1 -4
- package/dist/errors/ErrorMessages.js.map +1 -1
- package/dist/errors/WarningMessages.d.ts +1 -0
- package/dist/errors/WarningMessages.d.ts.map +1 -1
- package/dist/errors/WarningMessages.js +2 -4
- package/dist/errors/WarningMessages.js.map +1 -1
- package/dist/index.js +17 -35
- package/dist/index.js.map +1 -1
- package/dist/isNewArch.js +6 -9
- package/dist/isNewArch.js.map +1 -1
- package/dist/native/config/PlatformHelper.android.js +2 -5
- package/dist/native/config/PlatformHelper.android.js.map +1 -1
- package/dist/native/config/PlatformHelper.ios.js +2 -5
- package/dist/native/config/PlatformHelper.ios.js.map +1 -1
- package/dist/native/config/PlatformHelper.js +2 -5
- package/dist/native/config/PlatformHelper.js.map +1 -1
- package/dist/native/config/PlatformHelper.web.js +2 -5
- package/dist/native/config/PlatformHelper.web.js.map +1 -1
- package/dist/recyclerview/LayoutCommitObserver.js +20 -24
- package/dist/recyclerview/LayoutCommitObserver.js.map +1 -1
- package/dist/recyclerview/RecyclerView.d.ts.map +1 -1
- package/dist/recyclerview/RecyclerView.js +117 -107
- package/dist/recyclerview/RecyclerView.js.map +1 -1
- package/dist/recyclerview/RecyclerViewContextProvider.js +7 -12
- package/dist/recyclerview/RecyclerViewContextProvider.js.map +1 -1
- package/dist/recyclerview/RecyclerViewManager.d.ts +2 -0
- package/dist/recyclerview/RecyclerViewManager.d.ts.map +1 -1
- package/dist/recyclerview/RecyclerViewManager.js +146 -164
- package/dist/recyclerview/RecyclerViewManager.js.map +1 -1
- package/dist/recyclerview/RecyclerViewProps.js +1 -2
- package/dist/recyclerview/RenderStackManager.js +97 -188
- package/dist/recyclerview/RenderStackManager.js.map +1 -1
- package/dist/recyclerview/ViewHolder.js +16 -20
- package/dist/recyclerview/ViewHolder.js.map +1 -1
- package/dist/recyclerview/ViewHolderCollection.js +26 -30
- package/dist/recyclerview/ViewHolderCollection.js.map +1 -1
- package/dist/recyclerview/components/CompatScroller.js +6 -7
- package/dist/recyclerview/components/CompatScroller.js.map +1 -1
- package/dist/recyclerview/components/CompatView.js +6 -7
- package/dist/recyclerview/components/CompatView.js.map +1 -1
- package/dist/recyclerview/components/ScrollAnchor.js +10 -15
- package/dist/recyclerview/components/ScrollAnchor.js.map +1 -1
- package/dist/recyclerview/components/StickyHeaders.js +34 -40
- package/dist/recyclerview/components/StickyHeaders.js.map +1 -1
- package/dist/recyclerview/helpers/ConsecutiveNumbers.js +39 -66
- package/dist/recyclerview/helpers/ConsecutiveNumbers.js.map +1 -1
- package/dist/recyclerview/helpers/EngagedIndicesTracker.js +57 -63
- package/dist/recyclerview/helpers/EngagedIndicesTracker.js.map +1 -1
- package/dist/recyclerview/helpers/RenderTimeTracker.js +19 -24
- package/dist/recyclerview/helpers/RenderTimeTracker.js.map +1 -1
- package/dist/recyclerview/helpers/VelocityTracker.js +16 -22
- package/dist/recyclerview/helpers/VelocityTracker.js.map +1 -1
- package/dist/recyclerview/hooks/useBoundDetection.js +37 -40
- package/dist/recyclerview/hooks/useBoundDetection.js.map +1 -1
- package/dist/recyclerview/hooks/useLayoutState.js +9 -15
- package/dist/recyclerview/hooks/useLayoutState.js.map +1 -1
- package/dist/recyclerview/hooks/useMappingHelper.js +6 -10
- package/dist/recyclerview/hooks/useMappingHelper.js.map +1 -1
- package/dist/recyclerview/hooks/useOnLoad.d.ts.map +1 -1
- package/dist/recyclerview/hooks/useOnLoad.js +17 -22
- package/dist/recyclerview/hooks/useOnLoad.js.map +1 -1
- package/dist/recyclerview/hooks/useRecyclerViewController.d.ts.map +1 -1
- package/dist/recyclerview/hooks/useRecyclerViewController.js +169 -188
- package/dist/recyclerview/hooks/useRecyclerViewController.js.map +1 -1
- package/dist/recyclerview/hooks/useRecyclerViewManager.js +12 -17
- package/dist/recyclerview/hooks/useRecyclerViewManager.js.map +1 -1
- package/dist/recyclerview/hooks/useRecyclingState.js +10 -14
- package/dist/recyclerview/hooks/useRecyclingState.js.map +1 -1
- package/dist/recyclerview/hooks/useSecondaryProps.js +24 -30
- package/dist/recyclerview/hooks/useSecondaryProps.js.map +1 -1
- package/dist/recyclerview/hooks/useUnmountAwareCallbacks.js +17 -22
- package/dist/recyclerview/hooks/useUnmountAwareCallbacks.js.map +1 -1
- package/dist/recyclerview/hooks/useUnmountFlag.js +5 -9
- package/dist/recyclerview/hooks/useUnmountFlag.js.map +1 -1
- package/dist/recyclerview/layout-managers/GridLayoutManager.js +61 -80
- package/dist/recyclerview/layout-managers/GridLayoutManager.js.map +1 -1
- package/dist/recyclerview/layout-managers/LayoutManager.js +83 -123
- package/dist/recyclerview/layout-managers/LayoutManager.js.map +1 -1
- package/dist/recyclerview/layout-managers/LinearLayoutManager.js +51 -91
- package/dist/recyclerview/layout-managers/LinearLayoutManager.js.map +1 -1
- package/dist/recyclerview/layout-managers/MasonryLayoutManager.js +77 -96
- package/dist/recyclerview/layout-managers/MasonryLayoutManager.js.map +1 -1
- package/dist/recyclerview/utils/adjustOffsetForRTL.js +1 -4
- package/dist/recyclerview/utils/adjustOffsetForRTL.js.map +1 -1
- package/dist/recyclerview/utils/componentUtils.js +4 -9
- package/dist/recyclerview/utils/componentUtils.js.map +1 -1
- package/dist/recyclerview/utils/findVisibleIndex.js +9 -13
- package/dist/recyclerview/utils/findVisibleIndex.js.map +1 -1
- package/dist/recyclerview/utils/measureLayout.js +12 -20
- package/dist/recyclerview/utils/measureLayout.js.map +1 -1
- package/dist/recyclerview/utils/measureLayout.web.js +15 -23
- package/dist/recyclerview/utils/measureLayout.web.js.map +1 -1
- package/dist/recyclerview/viewability/ViewToken.js +1 -2
- package/dist/recyclerview/viewability/ViewabilityHelper.js +34 -41
- package/dist/recyclerview/viewability/ViewabilityHelper.js.map +1 -1
- package/dist/recyclerview/viewability/ViewabilityManager.js +48 -61
- package/dist/recyclerview/viewability/ViewabilityManager.js.map +1 -1
- package/dist/tsconfig.tsbuildinfo +1 -1
- package/dist/utils/AverageWindow.js +28 -39
- package/dist/utils/AverageWindow.js.map +1 -1
- package/package.json +4 -6
- package/src/FlashListProps.ts +8 -1
- package/src/benchmark/useBenchmark.ts +47 -4
- package/src/benchmark/useFlatListBenchmark.ts +38 -5
- package/src/errors/WarningMessages.ts +2 -0
- package/src/recyclerview/RecyclerView.tsx +18 -5
- package/src/recyclerview/RecyclerViewManager.ts +12 -0
- package/src/recyclerview/hooks/useOnLoad.ts +1 -0
- package/src/recyclerview/hooks/useRecyclerViewController.tsx +7 -4
- package/dist/__tests__/AverageWindow.test.d.ts +0 -2
- package/dist/__tests__/AverageWindow.test.d.ts.map +0 -1
- package/dist/__tests__/AverageWindow.test.js +0 -104
- package/dist/__tests__/AverageWindow.test.js.map +0 -1
- package/dist/__tests__/ConsecutiveNumbers.test.d.ts +0 -2
- package/dist/__tests__/ConsecutiveNumbers.test.d.ts.map +0 -1
- package/dist/__tests__/ConsecutiveNumbers.test.js +0 -224
- package/dist/__tests__/ConsecutiveNumbers.test.js.map +0 -1
- package/dist/__tests__/GridLayoutManager.test.d.ts +0 -2
- package/dist/__tests__/GridLayoutManager.test.d.ts.map +0 -1
- package/dist/__tests__/GridLayoutManager.test.js +0 -69
- package/dist/__tests__/GridLayoutManager.test.js.map +0 -1
- package/dist/__tests__/LayoutCommitObserver.test.d.ts +0 -2
- package/dist/__tests__/LayoutCommitObserver.test.d.ts.map +0 -1
- package/dist/__tests__/LayoutCommitObserver.test.js +0 -37
- package/dist/__tests__/LayoutCommitObserver.test.js.map +0 -1
- package/dist/__tests__/LinearLayoutManager.test.d.ts +0 -2
- package/dist/__tests__/LinearLayoutManager.test.d.ts.map +0 -1
- package/dist/__tests__/LinearLayoutManager.test.js +0 -140
- package/dist/__tests__/LinearLayoutManager.test.js.map +0 -1
- package/dist/__tests__/MasonryLayoutManager.test.d.ts +0 -2
- package/dist/__tests__/MasonryLayoutManager.test.d.ts.map +0 -1
- package/dist/__tests__/MasonryLayoutManager.test.js +0 -148
- package/dist/__tests__/MasonryLayoutManager.test.js.map +0 -1
- package/dist/__tests__/RecyclerView.test.d.ts +0 -2
- package/dist/__tests__/RecyclerView.test.d.ts.map +0 -1
- package/dist/__tests__/RecyclerView.test.js +0 -103
- package/dist/__tests__/RecyclerView.test.js.map +0 -1
- package/dist/__tests__/RenderStackManager.test.d.ts +0 -2
- package/dist/__tests__/RenderStackManager.test.d.ts.map +0 -1
- package/dist/__tests__/RenderStackManager.test.js +0 -485
- package/dist/__tests__/RenderStackManager.test.js.map +0 -1
- package/dist/__tests__/ViewabilityHelper.test.d.ts +0 -2
- package/dist/__tests__/ViewabilityHelper.test.d.ts.map +0 -1
- package/dist/__tests__/ViewabilityHelper.test.js +0 -186
- package/dist/__tests__/ViewabilityHelper.test.js.map +0 -1
- package/dist/__tests__/findVisibleIndex.test.d.ts +0 -2
- package/dist/__tests__/findVisibleIndex.test.d.ts.map +0 -1
- package/dist/__tests__/findVisibleIndex.test.js +0 -259
- package/dist/__tests__/findVisibleIndex.test.js.map +0 -1
- package/dist/__tests__/helpers/createLayoutManager.d.ts +0 -34
- package/dist/__tests__/helpers/createLayoutManager.d.ts.map +0 -1
- package/dist/__tests__/helpers/createLayoutManager.js +0 -110
- package/dist/__tests__/helpers/createLayoutManager.js.map +0 -1
- package/dist/__tests__/useUnmountAwareCallbacks.test.d.ts +0 -2
- package/dist/__tests__/useUnmountAwareCallbacks.test.d.ts.map +0 -1
- package/dist/__tests__/useUnmountAwareCallbacks.test.js +0 -185
- package/dist/__tests__/useUnmountAwareCallbacks.test.js.map +0 -1
- package/src/__tests__/AverageWindow.test.ts +0 -128
- package/src/__tests__/ConsecutiveNumbers.test.ts +0 -232
- package/src/__tests__/GridLayoutManager.test.ts +0 -113
- package/src/__tests__/LayoutCommitObserver.test.tsx +0 -63
- package/src/__tests__/LinearLayoutManager.test.ts +0 -227
- package/src/__tests__/MasonryLayoutManager.test.ts +0 -202
- package/src/__tests__/RecyclerView.test.tsx +0 -144
- package/src/__tests__/RenderStackManager.test.ts +0 -574
- package/src/__tests__/ViewabilityHelper.test.ts +0 -282
- package/src/__tests__/findVisibleIndex.test.ts +0 -369
- package/src/__tests__/helpers/createLayoutManager.ts +0 -141
- package/src/__tests__/useUnmountAwareCallbacks.test.tsx +0 -285
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"createLayoutManager.js","sourceRoot":"","sources":["../../../src/__tests__/helpers/createLayoutManager.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"useUnmountAwareCallbacks.test.d.ts","sourceRoot":"","sources":["../../src/__tests__/useUnmountAwareCallbacks.test.tsx"],"names":[],"mappings":""}
|
|
@@ -1,185 +0,0 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
var tslib_1 = require("tslib");
|
|
4
|
-
var react_1 = tslib_1.__importDefault(require("react"));
|
|
5
|
-
var react_testing_1 = require("@quilted/react-testing");
|
|
6
|
-
var useUnmountAwareCallbacks_1 = require("../recyclerview/hooks/useUnmountAwareCallbacks");
|
|
7
|
-
var TestComponent = function (_a) {
|
|
8
|
-
var onRender = _a.onRender;
|
|
9
|
-
var api = (0, useUnmountAwareCallbacks_1.useUnmountAwareTimeout)();
|
|
10
|
-
onRender(api);
|
|
11
|
-
return null;
|
|
12
|
-
};
|
|
13
|
-
describe("useUnmountAwareCallbacks", function () {
|
|
14
|
-
beforeEach(function () {
|
|
15
|
-
jest.useFakeTimers();
|
|
16
|
-
});
|
|
17
|
-
afterEach(function () {
|
|
18
|
-
jest.clearAllTimers();
|
|
19
|
-
jest.clearAllMocks();
|
|
20
|
-
});
|
|
21
|
-
it("returns a setTimeout function", function () {
|
|
22
|
-
var api;
|
|
23
|
-
(0, react_testing_1.render)(react_1.default.createElement(TestComponent, { onRender: function (hookApi) {
|
|
24
|
-
api = hookApi;
|
|
25
|
-
} }));
|
|
26
|
-
expect(api).toBeDefined();
|
|
27
|
-
expect(api === null || api === void 0 ? void 0 : api.setTimeout).toBeDefined();
|
|
28
|
-
expect(typeof (api === null || api === void 0 ? void 0 : api.setTimeout)).toBe("function");
|
|
29
|
-
});
|
|
30
|
-
it("executes the callback after the specified delay", function () {
|
|
31
|
-
var callback = jest.fn();
|
|
32
|
-
var api;
|
|
33
|
-
(0, react_testing_1.render)(react_1.default.createElement(TestComponent, { onRender: function (hookApi) {
|
|
34
|
-
api = hookApi;
|
|
35
|
-
} }));
|
|
36
|
-
api === null || api === void 0 ? void 0 : api.setTimeout(callback, 1000);
|
|
37
|
-
expect(callback).not.toHaveBeenCalled();
|
|
38
|
-
// Fast-forward time
|
|
39
|
-
jest.advanceTimersByTime(1000);
|
|
40
|
-
expect(callback).toHaveBeenCalledTimes(1);
|
|
41
|
-
});
|
|
42
|
-
it("executes multiple callbacks after their respective delays", function () {
|
|
43
|
-
var callback1 = jest.fn();
|
|
44
|
-
var callback2 = jest.fn();
|
|
45
|
-
var api;
|
|
46
|
-
(0, react_testing_1.render)(react_1.default.createElement(TestComponent, { onRender: function (hookApi) {
|
|
47
|
-
api = hookApi;
|
|
48
|
-
} }));
|
|
49
|
-
api === null || api === void 0 ? void 0 : api.setTimeout(callback1, 1000);
|
|
50
|
-
api === null || api === void 0 ? void 0 : api.setTimeout(callback2, 2000);
|
|
51
|
-
expect(callback1).not.toHaveBeenCalled();
|
|
52
|
-
expect(callback2).not.toHaveBeenCalled();
|
|
53
|
-
// Fast-forward time by 1000ms
|
|
54
|
-
jest.advanceTimersByTime(1000);
|
|
55
|
-
expect(callback1).toHaveBeenCalledTimes(1);
|
|
56
|
-
expect(callback2).not.toHaveBeenCalled();
|
|
57
|
-
// Fast-forward time by another 1000ms
|
|
58
|
-
jest.advanceTimersByTime(1000);
|
|
59
|
-
expect(callback1).toHaveBeenCalledTimes(1);
|
|
60
|
-
expect(callback2).toHaveBeenCalledTimes(1);
|
|
61
|
-
});
|
|
62
|
-
it("clears all timeouts when the component unmounts", function () {
|
|
63
|
-
var callback = jest.fn();
|
|
64
|
-
var api;
|
|
65
|
-
var component = (0, react_testing_1.render)(react_1.default.createElement(TestComponent, { onRender: function (hookApi) {
|
|
66
|
-
api = hookApi;
|
|
67
|
-
} }));
|
|
68
|
-
api === null || api === void 0 ? void 0 : api.setTimeout(callback, 1000);
|
|
69
|
-
api === null || api === void 0 ? void 0 : api.setTimeout(callback, 2000);
|
|
70
|
-
// Spy on clearTimeout to verify it's called during unmount
|
|
71
|
-
var clearTimeoutSpy = jest.spyOn(global, "clearTimeout");
|
|
72
|
-
// Unmount the component
|
|
73
|
-
component.unmount();
|
|
74
|
-
// Fast-forward time
|
|
75
|
-
jest.advanceTimersByTime(2000);
|
|
76
|
-
// Expect callbacks not to be called because timeouts were cleared
|
|
77
|
-
expect(callback).not.toHaveBeenCalled();
|
|
78
|
-
expect(clearTimeoutSpy).toHaveBeenCalled();
|
|
79
|
-
});
|
|
80
|
-
it("removes timeout from tracking set once it executes", function () {
|
|
81
|
-
var callback = jest.fn();
|
|
82
|
-
var api;
|
|
83
|
-
var component = (0, react_testing_1.render)(react_1.default.createElement(TestComponent, { onRender: function (hookApi) {
|
|
84
|
-
api = hookApi;
|
|
85
|
-
} }));
|
|
86
|
-
api === null || api === void 0 ? void 0 : api.setTimeout(callback, 1000);
|
|
87
|
-
// Fast-forward time
|
|
88
|
-
jest.advanceTimersByTime(1000);
|
|
89
|
-
// Verify callback was called
|
|
90
|
-
expect(callback).toHaveBeenCalledTimes(1);
|
|
91
|
-
// We can't directly check the timeoutIds Set, so we'll verify indirectly
|
|
92
|
-
// by making sure no clearTimeout calls happen on unmount (since the timeout was already cleared)
|
|
93
|
-
var clearTimeoutSpy = jest.spyOn(global, "clearTimeout");
|
|
94
|
-
clearTimeoutSpy.mockClear(); // Reset the mock calls before unmount
|
|
95
|
-
// Unmount the component
|
|
96
|
-
component.unmount();
|
|
97
|
-
// If the timeout was properly removed from the set, clearTimeout won't be called on unmount
|
|
98
|
-
expect(clearTimeoutSpy).not.toHaveBeenCalled();
|
|
99
|
-
});
|
|
100
|
-
it("handles multiple timeouts correctly", function () {
|
|
101
|
-
var callback1 = jest.fn();
|
|
102
|
-
var callback2 = jest.fn();
|
|
103
|
-
var callback3 = jest.fn();
|
|
104
|
-
var api;
|
|
105
|
-
var component = (0, react_testing_1.render)(react_1.default.createElement(TestComponent, { onRender: function (hookApi) {
|
|
106
|
-
api = hookApi;
|
|
107
|
-
} }));
|
|
108
|
-
// Set up three timeouts with different delays
|
|
109
|
-
api === null || api === void 0 ? void 0 : api.setTimeout(callback1, 1000);
|
|
110
|
-
api === null || api === void 0 ? void 0 : api.setTimeout(callback2, 2000);
|
|
111
|
-
api === null || api === void 0 ? void 0 : api.setTimeout(callback3, 3000);
|
|
112
|
-
// Fast-forward time by 1500ms (should trigger only the first callback)
|
|
113
|
-
jest.advanceTimersByTime(1500);
|
|
114
|
-
expect(callback1).toHaveBeenCalledTimes(1);
|
|
115
|
-
expect(callback2).not.toHaveBeenCalled();
|
|
116
|
-
expect(callback3).not.toHaveBeenCalled();
|
|
117
|
-
// Unmount the component (should clear remaining timeouts)
|
|
118
|
-
component.unmount();
|
|
119
|
-
// Fast-forward time to when all callbacks would have been called
|
|
120
|
-
jest.advanceTimersByTime(2000);
|
|
121
|
-
// Only the first callback should have been called
|
|
122
|
-
expect(callback1).toHaveBeenCalledTimes(1);
|
|
123
|
-
expect(callback2).not.toHaveBeenCalled();
|
|
124
|
-
expect(callback3).not.toHaveBeenCalled();
|
|
125
|
-
});
|
|
126
|
-
it("handles callbacks that trigger new timeouts", function () {
|
|
127
|
-
var finalCallback = jest.fn();
|
|
128
|
-
var api;
|
|
129
|
-
(0, react_testing_1.render)(react_1.default.createElement(TestComponent, { onRender: function (hookApi) {
|
|
130
|
-
api = hookApi;
|
|
131
|
-
} }));
|
|
132
|
-
var firstCallback = function () {
|
|
133
|
-
api === null || api === void 0 ? void 0 : api.setTimeout(finalCallback, 1000);
|
|
134
|
-
};
|
|
135
|
-
api === null || api === void 0 ? void 0 : api.setTimeout(firstCallback, 1000);
|
|
136
|
-
// Fast-forward time to trigger first callback
|
|
137
|
-
jest.advanceTimersByTime(1000);
|
|
138
|
-
expect(finalCallback).not.toHaveBeenCalled();
|
|
139
|
-
// Fast-forward time to trigger second callback
|
|
140
|
-
jest.advanceTimersByTime(1000);
|
|
141
|
-
expect(finalCallback).toHaveBeenCalledTimes(1);
|
|
142
|
-
});
|
|
143
|
-
it("handles zero delay timeouts", function () {
|
|
144
|
-
var callback = jest.fn();
|
|
145
|
-
var api;
|
|
146
|
-
(0, react_testing_1.render)(react_1.default.createElement(TestComponent, { onRender: function (hookApi) {
|
|
147
|
-
api = hookApi;
|
|
148
|
-
} }));
|
|
149
|
-
api === null || api === void 0 ? void 0 : api.setTimeout(callback, 0);
|
|
150
|
-
expect(callback).not.toHaveBeenCalled();
|
|
151
|
-
// Even with zero delay, we need to advance the timer to execute
|
|
152
|
-
jest.advanceTimersByTime(0);
|
|
153
|
-
expect(callback).toHaveBeenCalledTimes(1);
|
|
154
|
-
});
|
|
155
|
-
it("handles errors in callbacks without affecting other timeouts", function () {
|
|
156
|
-
var errorCallback = jest.fn(function () {
|
|
157
|
-
throw new Error("Test error");
|
|
158
|
-
});
|
|
159
|
-
var successCallback = jest.fn();
|
|
160
|
-
var api;
|
|
161
|
-
// Suppress error log during test
|
|
162
|
-
var originalConsoleError = console.error;
|
|
163
|
-
console.error = jest.fn();
|
|
164
|
-
(0, react_testing_1.render)(react_1.default.createElement(TestComponent, { onRender: function (hookApi) {
|
|
165
|
-
api = hookApi;
|
|
166
|
-
} }));
|
|
167
|
-
api === null || api === void 0 ? void 0 : api.setTimeout(errorCallback, 1000);
|
|
168
|
-
api === null || api === void 0 ? void 0 : api.setTimeout(successCallback, 2000);
|
|
169
|
-
// Fast-forward time to trigger error callback
|
|
170
|
-
try {
|
|
171
|
-
jest.advanceTimersByTime(1000);
|
|
172
|
-
}
|
|
173
|
-
catch (error) {
|
|
174
|
-
// Expected error
|
|
175
|
-
}
|
|
176
|
-
expect(errorCallback).toHaveBeenCalledTimes(1);
|
|
177
|
-
expect(successCallback).not.toHaveBeenCalled();
|
|
178
|
-
// Fast-forward time to trigger success callback
|
|
179
|
-
jest.advanceTimersByTime(1000);
|
|
180
|
-
expect(successCallback).toHaveBeenCalledTimes(1);
|
|
181
|
-
// Restore console.error
|
|
182
|
-
console.error = originalConsoleError;
|
|
183
|
-
});
|
|
184
|
-
});
|
|
185
|
-
//# sourceMappingURL=useUnmountAwareCallbacks.test.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"useUnmountAwareCallbacks.test.js","sourceRoot":"","sources":["../../src/__tests__/useUnmountAwareCallbacks.test.tsx"],"names":[],"mappings":"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"}
|
|
@@ -1,128 +0,0 @@
|
|
|
1
|
-
import { AverageWindow, MultiTypeAverageWindow } from "../utils/AverageWindow";
|
|
2
|
-
|
|
3
|
-
describe("AverageWindow", () => {
|
|
4
|
-
const fillAverageWindow = (
|
|
5
|
-
averageWindow: AverageWindow,
|
|
6
|
-
from: number,
|
|
7
|
-
to: number
|
|
8
|
-
) => {
|
|
9
|
-
for (let i = from; i < to; i++) {
|
|
10
|
-
averageWindow.addValue(i);
|
|
11
|
-
}
|
|
12
|
-
};
|
|
13
|
-
it("all input window values should be filled with correct values", () => {
|
|
14
|
-
const commonValue = 50;
|
|
15
|
-
const size = 100;
|
|
16
|
-
const averageWindow = new AverageWindow(size);
|
|
17
|
-
const inputValues = averageWindow["inputValues"];
|
|
18
|
-
|
|
19
|
-
for (let i = 0; i < size; i++) {
|
|
20
|
-
averageWindow.addValue(commonValue);
|
|
21
|
-
}
|
|
22
|
-
expect(Math.round(averageWindow.currentValue)).toBe(commonValue);
|
|
23
|
-
expect(inputValues.every((val) => val === commonValue)).toBe(true);
|
|
24
|
-
});
|
|
25
|
-
it("computes correct average", () => {
|
|
26
|
-
// We're gonna check if average from internal array matches the current average value
|
|
27
|
-
const size = 100;
|
|
28
|
-
const averageWindow = new AverageWindow(size);
|
|
29
|
-
const inputValues = averageWindow["inputValues"];
|
|
30
|
-
fillAverageWindow(averageWindow, 0, 200);
|
|
31
|
-
|
|
32
|
-
// calculate average directly
|
|
33
|
-
const reduceObj = inputValues.reduce(
|
|
34
|
-
(obj, val) => {
|
|
35
|
-
if (val !== undefined) {
|
|
36
|
-
obj.sum += val;
|
|
37
|
-
obj.count++;
|
|
38
|
-
}
|
|
39
|
-
return obj;
|
|
40
|
-
},
|
|
41
|
-
{ sum: 0, count: 0 }
|
|
42
|
-
);
|
|
43
|
-
|
|
44
|
-
// running average could be different by few decimal points so floor is required
|
|
45
|
-
expect(Math.floor(averageWindow.currentValue)).toBe(
|
|
46
|
-
Math.floor(reduceObj.sum / reduceObj.count)
|
|
47
|
-
);
|
|
48
|
-
});
|
|
49
|
-
it("should prioritize new values quickly", () => {
|
|
50
|
-
const size = 30;
|
|
51
|
-
const averageWindow = new AverageWindow(size);
|
|
52
|
-
fillAverageWindow(averageWindow, 0, 100);
|
|
53
|
-
expect(averageWindow.currentValue).toBeGreaterThan(70);
|
|
54
|
-
|
|
55
|
-
fillAverageWindow(averageWindow, 0, 30);
|
|
56
|
-
expect(averageWindow.currentValue).toBeLessThan(30);
|
|
57
|
-
});
|
|
58
|
-
it("reports initial average correctly", () => {
|
|
59
|
-
const size = 30;
|
|
60
|
-
const averageWindow = new AverageWindow(size, 25);
|
|
61
|
-
expect(averageWindow.currentValue).toBe(25);
|
|
62
|
-
});
|
|
63
|
-
it("updates initial average correctly", () => {
|
|
64
|
-
const size = 30;
|
|
65
|
-
const averageWindow = new AverageWindow(size, 10);
|
|
66
|
-
averageWindow.addValue(20);
|
|
67
|
-
expect(averageWindow.currentValue).toBe(15);
|
|
68
|
-
});
|
|
69
|
-
it("increments next index correctly", () => {
|
|
70
|
-
const size = 30;
|
|
71
|
-
const averageWindow = new AverageWindow(size);
|
|
72
|
-
for (let i = 0; i < 300; i++) {
|
|
73
|
-
expect(averageWindow["getNextIndex"]()).toBe(i % size);
|
|
74
|
-
}
|
|
75
|
-
const averageWindow2 = new AverageWindow(size, 1);
|
|
76
|
-
for (let i = 1; i < 300; i++) {
|
|
77
|
-
expect(averageWindow2["getNextIndex"]()).toBe(i % size);
|
|
78
|
-
}
|
|
79
|
-
});
|
|
80
|
-
});
|
|
81
|
-
|
|
82
|
-
describe("MultiTypeAverageWindow", () => {
|
|
83
|
-
it("should maintain separate averages for different types", () => {
|
|
84
|
-
const windowSize = 10;
|
|
85
|
-
const multiTypeAverageWindow = new MultiTypeAverageWindow(windowSize);
|
|
86
|
-
|
|
87
|
-
multiTypeAverageWindow.addValue(10, "type1");
|
|
88
|
-
multiTypeAverageWindow.addValue(20, "type2");
|
|
89
|
-
|
|
90
|
-
expect(multiTypeAverageWindow.getCurrentValue("type1")).toBe(10);
|
|
91
|
-
expect(multiTypeAverageWindow.getCurrentValue("type2")).toBe(20);
|
|
92
|
-
});
|
|
93
|
-
|
|
94
|
-
it("should update averages correctly for each type", () => {
|
|
95
|
-
const windowSize = 5;
|
|
96
|
-
const multiTypeAverageWindow = new MultiTypeAverageWindow(windowSize);
|
|
97
|
-
|
|
98
|
-
multiTypeAverageWindow.addValue(10, "type1");
|
|
99
|
-
multiTypeAverageWindow.addValue(20, "type1");
|
|
100
|
-
multiTypeAverageWindow.addValue(30, "type1");
|
|
101
|
-
|
|
102
|
-
multiTypeAverageWindow.addValue(5, "type2");
|
|
103
|
-
multiTypeAverageWindow.addValue(15, "type2");
|
|
104
|
-
|
|
105
|
-
expect(multiTypeAverageWindow.getCurrentValue("type1")).toBe(20);
|
|
106
|
-
expect(multiTypeAverageWindow.getCurrentValue("type2")).toBe(10);
|
|
107
|
-
});
|
|
108
|
-
|
|
109
|
-
it("should return 0 for non-existent types", () => {
|
|
110
|
-
const windowSize = 5;
|
|
111
|
-
const multiTypeAverageWindow = new MultiTypeAverageWindow(windowSize);
|
|
112
|
-
|
|
113
|
-
expect(multiTypeAverageWindow.getCurrentValue("nonExistentType")).toBe(0);
|
|
114
|
-
});
|
|
115
|
-
|
|
116
|
-
it("should reset all averages", () => {
|
|
117
|
-
const windowSize = 5;
|
|
118
|
-
const multiTypeAverageWindow = new MultiTypeAverageWindow(windowSize);
|
|
119
|
-
|
|
120
|
-
multiTypeAverageWindow.addValue(10, "type1");
|
|
121
|
-
multiTypeAverageWindow.addValue(20, "type2");
|
|
122
|
-
|
|
123
|
-
multiTypeAverageWindow.reset();
|
|
124
|
-
|
|
125
|
-
expect(multiTypeAverageWindow.getCurrentValue("type1")).toBe(0);
|
|
126
|
-
expect(multiTypeAverageWindow.getCurrentValue("type2")).toBe(0);
|
|
127
|
-
});
|
|
128
|
-
});
|
|
@@ -1,232 +0,0 @@
|
|
|
1
|
-
/* eslint-disable id-length */
|
|
2
|
-
import { ConsecutiveNumbers } from "../recyclerview/helpers/ConsecutiveNumbers";
|
|
3
|
-
|
|
4
|
-
describe("ConsecutiveNumbers", () => {
|
|
5
|
-
describe("constructor", () => {
|
|
6
|
-
it("should initialize with start and end indices", () => {
|
|
7
|
-
const numbers = new ConsecutiveNumbers(5, 10);
|
|
8
|
-
expect(numbers.startIndex).toBe(5);
|
|
9
|
-
expect(numbers.endIndex).toBe(10);
|
|
10
|
-
});
|
|
11
|
-
});
|
|
12
|
-
|
|
13
|
-
describe("EMPTY", () => {
|
|
14
|
-
it("should have correct values for EMPTY constant", () => {
|
|
15
|
-
expect(ConsecutiveNumbers.EMPTY.startIndex).toBe(-1);
|
|
16
|
-
expect(ConsecutiveNumbers.EMPTY.endIndex).toBe(-2);
|
|
17
|
-
expect(ConsecutiveNumbers.EMPTY.length).toBe(0);
|
|
18
|
-
});
|
|
19
|
-
});
|
|
20
|
-
|
|
21
|
-
describe("length", () => {
|
|
22
|
-
it("should return correct length for valid range", () => {
|
|
23
|
-
expect(new ConsecutiveNumbers(5, 10).length).toBe(6);
|
|
24
|
-
expect(new ConsecutiveNumbers(0, 0).length).toBe(1);
|
|
25
|
-
});
|
|
26
|
-
|
|
27
|
-
it("should return 0 for invalid range", () => {
|
|
28
|
-
expect(new ConsecutiveNumbers(5, 4).length).toBe(0);
|
|
29
|
-
expect(new ConsecutiveNumbers(10, 5).length).toBe(0);
|
|
30
|
-
});
|
|
31
|
-
});
|
|
32
|
-
|
|
33
|
-
describe("at", () => {
|
|
34
|
-
it("should return correct value at index", () => {
|
|
35
|
-
const numbers = new ConsecutiveNumbers(5, 10);
|
|
36
|
-
expect(numbers.at(0)).toBe(5);
|
|
37
|
-
expect(numbers.at(3)).toBe(8);
|
|
38
|
-
expect(numbers.at(5)).toBe(10);
|
|
39
|
-
});
|
|
40
|
-
|
|
41
|
-
it("should work with negative ranges", () => {
|
|
42
|
-
const numbers = new ConsecutiveNumbers(-3, 2);
|
|
43
|
-
expect(numbers.at(0)).toBe(-3);
|
|
44
|
-
expect(numbers.at(3)).toBe(0);
|
|
45
|
-
expect(numbers.at(5)).toBe(2);
|
|
46
|
-
});
|
|
47
|
-
});
|
|
48
|
-
|
|
49
|
-
describe("equals", () => {
|
|
50
|
-
it("should return true for identical ranges", () => {
|
|
51
|
-
const a = new ConsecutiveNumbers(5, 10);
|
|
52
|
-
const b = new ConsecutiveNumbers(5, 10);
|
|
53
|
-
expect(a.equals(b)).toBe(true);
|
|
54
|
-
});
|
|
55
|
-
|
|
56
|
-
it("should return false for different ranges", () => {
|
|
57
|
-
const a = new ConsecutiveNumbers(5, 10);
|
|
58
|
-
const b = new ConsecutiveNumbers(5, 11);
|
|
59
|
-
const c = new ConsecutiveNumbers(6, 10);
|
|
60
|
-
expect(a.equals(b)).toBe(false);
|
|
61
|
-
expect(a.equals(c)).toBe(false);
|
|
62
|
-
});
|
|
63
|
-
|
|
64
|
-
it("should handle empty ranges", () => {
|
|
65
|
-
expect(ConsecutiveNumbers.EMPTY.equals(ConsecutiveNumbers.EMPTY)).toBe(
|
|
66
|
-
true
|
|
67
|
-
);
|
|
68
|
-
expect(
|
|
69
|
-
ConsecutiveNumbers.EMPTY.equals(new ConsecutiveNumbers(1, 5))
|
|
70
|
-
).toBe(false);
|
|
71
|
-
});
|
|
72
|
-
});
|
|
73
|
-
|
|
74
|
-
describe("toArray", () => {
|
|
75
|
-
it("should return correct array for valid range", () => {
|
|
76
|
-
expect(new ConsecutiveNumbers(5, 8).toArray()).toEqual([5, 6, 7, 8]);
|
|
77
|
-
expect(new ConsecutiveNumbers(0, 3).toArray()).toEqual([0, 1, 2, 3]);
|
|
78
|
-
expect(new ConsecutiveNumbers(-2, 1).toArray()).toEqual([-2, -1, 0, 1]);
|
|
79
|
-
});
|
|
80
|
-
|
|
81
|
-
it("should return empty array for invalid ranges", () => {
|
|
82
|
-
expect(new ConsecutiveNumbers(5, 4).toArray()).toEqual([]);
|
|
83
|
-
expect(ConsecutiveNumbers.EMPTY.toArray()).toEqual([]);
|
|
84
|
-
});
|
|
85
|
-
});
|
|
86
|
-
|
|
87
|
-
describe("includes", () => {
|
|
88
|
-
it("should return true for values in range", () => {
|
|
89
|
-
const numbers = new ConsecutiveNumbers(5, 10);
|
|
90
|
-
expect(numbers.includes(5)).toBe(true);
|
|
91
|
-
expect(numbers.includes(7)).toBe(true);
|
|
92
|
-
expect(numbers.includes(10)).toBe(true);
|
|
93
|
-
});
|
|
94
|
-
|
|
95
|
-
it("should return false for values outside range", () => {
|
|
96
|
-
const numbers = new ConsecutiveNumbers(5, 10);
|
|
97
|
-
expect(numbers.includes(4)).toBe(false);
|
|
98
|
-
expect(numbers.includes(11)).toBe(false);
|
|
99
|
-
});
|
|
100
|
-
|
|
101
|
-
it("should handle empty ranges", () => {
|
|
102
|
-
expect(ConsecutiveNumbers.EMPTY.includes(0)).toBe(false);
|
|
103
|
-
});
|
|
104
|
-
});
|
|
105
|
-
|
|
106
|
-
describe("indexOf", () => {
|
|
107
|
-
it("should return correct index for values in range", () => {
|
|
108
|
-
const numbers = new ConsecutiveNumbers(5, 10);
|
|
109
|
-
expect(numbers.indexOf(5)).toBe(0);
|
|
110
|
-
expect(numbers.indexOf(7)).toBe(2);
|
|
111
|
-
expect(numbers.indexOf(10)).toBe(5);
|
|
112
|
-
});
|
|
113
|
-
|
|
114
|
-
it("should return -1 for values outside range", () => {
|
|
115
|
-
const numbers = new ConsecutiveNumbers(5, 10);
|
|
116
|
-
expect(numbers.indexOf(4)).toBe(-1);
|
|
117
|
-
expect(numbers.indexOf(11)).toBe(-1);
|
|
118
|
-
});
|
|
119
|
-
});
|
|
120
|
-
|
|
121
|
-
describe("findValue", () => {
|
|
122
|
-
it("should find values matching predicate", () => {
|
|
123
|
-
const numbers = new ConsecutiveNumbers(5, 10);
|
|
124
|
-
expect(numbers.findValue((v) => v % 2 === 0)).toBe(6);
|
|
125
|
-
expect(numbers.findValue((v) => v > 8)).toBe(9);
|
|
126
|
-
});
|
|
127
|
-
|
|
128
|
-
it("should return undefined when no match found", () => {
|
|
129
|
-
const numbers = new ConsecutiveNumbers(5, 10);
|
|
130
|
-
expect(numbers.findValue((v) => v > 100)).toBe(undefined);
|
|
131
|
-
});
|
|
132
|
-
|
|
133
|
-
it("should provide index and array to predicate", () => {
|
|
134
|
-
const numbers = new ConsecutiveNumbers(5, 7);
|
|
135
|
-
const mockFn = jest.fn().mockReturnValue(false);
|
|
136
|
-
numbers.findValue(mockFn);
|
|
137
|
-
expect(mockFn).toHaveBeenCalledTimes(3);
|
|
138
|
-
expect(mockFn).toHaveBeenNthCalledWith(1, 5, 0, numbers);
|
|
139
|
-
expect(mockFn).toHaveBeenNthCalledWith(2, 6, 1, numbers);
|
|
140
|
-
expect(mockFn).toHaveBeenNthCalledWith(3, 7, 2, numbers);
|
|
141
|
-
});
|
|
142
|
-
});
|
|
143
|
-
|
|
144
|
-
describe("every", () => {
|
|
145
|
-
it("should return true when all values match predicate", () => {
|
|
146
|
-
const numbers = new ConsecutiveNumbers(5, 10);
|
|
147
|
-
expect(numbers.every((v) => v >= 5)).toBe(true);
|
|
148
|
-
expect(numbers.every((v) => v <= 10)).toBe(true);
|
|
149
|
-
});
|
|
150
|
-
|
|
151
|
-
it("should return false when some values do not match predicate", () => {
|
|
152
|
-
const numbers = new ConsecutiveNumbers(5, 10);
|
|
153
|
-
expect(numbers.every((v) => v % 2 === 0)).toBe(false);
|
|
154
|
-
expect(numbers.every((v) => v > 7)).toBe(false);
|
|
155
|
-
});
|
|
156
|
-
|
|
157
|
-
it("should provide index and array to predicate", () => {
|
|
158
|
-
const numbers = new ConsecutiveNumbers(5, 7);
|
|
159
|
-
const mockFn = jest.fn().mockReturnValue(true);
|
|
160
|
-
numbers.every(mockFn);
|
|
161
|
-
expect(mockFn).toHaveBeenCalledTimes(3);
|
|
162
|
-
expect(mockFn).toHaveBeenNthCalledWith(1, 5, 0, numbers);
|
|
163
|
-
expect(mockFn).toHaveBeenNthCalledWith(2, 6, 1, numbers);
|
|
164
|
-
expect(mockFn).toHaveBeenNthCalledWith(3, 7, 2, numbers);
|
|
165
|
-
});
|
|
166
|
-
|
|
167
|
-
it("should short-circuit when predicate returns false", () => {
|
|
168
|
-
const numbers = new ConsecutiveNumbers(5, 10);
|
|
169
|
-
const mockFn = jest.fn().mockImplementation((v) => v < 7);
|
|
170
|
-
numbers.every(mockFn);
|
|
171
|
-
expect(mockFn).toHaveBeenCalledTimes(3); // Should stop after v=7
|
|
172
|
-
});
|
|
173
|
-
});
|
|
174
|
-
|
|
175
|
-
describe("slice", () => {
|
|
176
|
-
it("should slice with both start and end", () => {
|
|
177
|
-
const numbers = new ConsecutiveNumbers(5, 10);
|
|
178
|
-
const sliced = numbers.slice(1, 4);
|
|
179
|
-
expect(sliced.startIndex).toBe(6);
|
|
180
|
-
expect(sliced.endIndex).toBe(8);
|
|
181
|
-
expect(sliced.length).toBe(3);
|
|
182
|
-
});
|
|
183
|
-
|
|
184
|
-
it("should slice with only start", () => {
|
|
185
|
-
const numbers = new ConsecutiveNumbers(5, 10);
|
|
186
|
-
const sliced = numbers.slice(2);
|
|
187
|
-
expect(sliced.startIndex).toBe(7);
|
|
188
|
-
expect(sliced.endIndex).toBe(10);
|
|
189
|
-
expect(sliced.length).toBe(4);
|
|
190
|
-
});
|
|
191
|
-
|
|
192
|
-
it("should handle out of bounds slices", () => {
|
|
193
|
-
const numbers = new ConsecutiveNumbers(5, 10);
|
|
194
|
-
const sliced = numbers.slice(0, 100);
|
|
195
|
-
expect(sliced.length).toBe(6);
|
|
196
|
-
expect(sliced.startIndex).toBe(5);
|
|
197
|
-
expect(sliced.endIndex).toBe(10);
|
|
198
|
-
});
|
|
199
|
-
|
|
200
|
-
it("should handle invalid slices", () => {
|
|
201
|
-
const numbers = new ConsecutiveNumbers(5, 10);
|
|
202
|
-
const sliced = numbers.slice(4, 3);
|
|
203
|
-
expect(sliced.length).toBe(0);
|
|
204
|
-
expect(sliced.startIndex).toBe(9);
|
|
205
|
-
expect(sliced.endIndex).toBe(8);
|
|
206
|
-
});
|
|
207
|
-
});
|
|
208
|
-
|
|
209
|
-
describe("iterator", () => {
|
|
210
|
-
it("should iterate over all values", () => {
|
|
211
|
-
const numbers = new ConsecutiveNumbers(5, 8);
|
|
212
|
-
const result = [];
|
|
213
|
-
for (const num of numbers) {
|
|
214
|
-
result.push(num);
|
|
215
|
-
}
|
|
216
|
-
expect(result).toEqual([5, 6, 7, 8]);
|
|
217
|
-
});
|
|
218
|
-
|
|
219
|
-
it("should handle empty ranges", () => {
|
|
220
|
-
const result = [];
|
|
221
|
-
for (const num of ConsecutiveNumbers.EMPTY) {
|
|
222
|
-
result.push(num);
|
|
223
|
-
}
|
|
224
|
-
expect(result).toEqual([]);
|
|
225
|
-
});
|
|
226
|
-
|
|
227
|
-
it("should work with spread operator", () => {
|
|
228
|
-
const numbers = new ConsecutiveNumbers(5, 8);
|
|
229
|
-
expect([...numbers]).toEqual([5, 6, 7, 8]);
|
|
230
|
-
});
|
|
231
|
-
});
|
|
232
|
-
});
|