@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.
Files changed (194) hide show
  1. package/dist/AnimatedFlashList.js +4 -6
  2. package/dist/AnimatedFlashList.js.map +1 -1
  3. package/dist/FlashList.js +1 -5
  4. package/dist/FlashList.js.map +1 -1
  5. package/dist/FlashListProps.d.ts +9 -1
  6. package/dist/FlashListProps.d.ts.map +1 -1
  7. package/dist/FlashListProps.js +1 -4
  8. package/dist/FlashListProps.js.map +1 -1
  9. package/dist/FlashListRef.js +1 -2
  10. package/dist/benchmark/AutoScrollHelper.js +22 -30
  11. package/dist/benchmark/AutoScrollHelper.js.map +1 -1
  12. package/dist/benchmark/JSFPSMonitor.js +27 -33
  13. package/dist/benchmark/JSFPSMonitor.js.map +1 -1
  14. package/dist/benchmark/roundToDecimalPlaces.js +2 -5
  15. package/dist/benchmark/roundToDecimalPlaces.js.map +1 -1
  16. package/dist/benchmark/useBenchmark.d.ts +9 -1
  17. package/dist/benchmark/useBenchmark.d.ts.map +1 -1
  18. package/dist/benchmark/useBenchmark.js +86 -95
  19. package/dist/benchmark/useBenchmark.js.map +1 -1
  20. package/dist/benchmark/useDataMultiplier.js +6 -10
  21. package/dist/benchmark/useDataMultiplier.js.map +1 -1
  22. package/dist/benchmark/useFlatListBenchmark.d.ts +4 -1
  23. package/dist/benchmark/useFlatListBenchmark.d.ts.map +1 -1
  24. package/dist/benchmark/useFlatListBenchmark.js +73 -81
  25. package/dist/benchmark/useFlatListBenchmark.js.map +1 -1
  26. package/dist/errors/ErrorMessages.js +1 -4
  27. package/dist/errors/ErrorMessages.js.map +1 -1
  28. package/dist/errors/WarningMessages.d.ts +1 -0
  29. package/dist/errors/WarningMessages.d.ts.map +1 -1
  30. package/dist/errors/WarningMessages.js +2 -4
  31. package/dist/errors/WarningMessages.js.map +1 -1
  32. package/dist/index.js +17 -35
  33. package/dist/index.js.map +1 -1
  34. package/dist/isNewArch.js +6 -9
  35. package/dist/isNewArch.js.map +1 -1
  36. package/dist/native/config/PlatformHelper.android.js +2 -5
  37. package/dist/native/config/PlatformHelper.android.js.map +1 -1
  38. package/dist/native/config/PlatformHelper.ios.js +2 -5
  39. package/dist/native/config/PlatformHelper.ios.js.map +1 -1
  40. package/dist/native/config/PlatformHelper.js +2 -5
  41. package/dist/native/config/PlatformHelper.js.map +1 -1
  42. package/dist/native/config/PlatformHelper.web.js +2 -5
  43. package/dist/native/config/PlatformHelper.web.js.map +1 -1
  44. package/dist/recyclerview/LayoutCommitObserver.js +20 -24
  45. package/dist/recyclerview/LayoutCommitObserver.js.map +1 -1
  46. package/dist/recyclerview/RecyclerView.d.ts.map +1 -1
  47. package/dist/recyclerview/RecyclerView.js +117 -107
  48. package/dist/recyclerview/RecyclerView.js.map +1 -1
  49. package/dist/recyclerview/RecyclerViewContextProvider.js +7 -12
  50. package/dist/recyclerview/RecyclerViewContextProvider.js.map +1 -1
  51. package/dist/recyclerview/RecyclerViewManager.d.ts +2 -0
  52. package/dist/recyclerview/RecyclerViewManager.d.ts.map +1 -1
  53. package/dist/recyclerview/RecyclerViewManager.js +146 -164
  54. package/dist/recyclerview/RecyclerViewManager.js.map +1 -1
  55. package/dist/recyclerview/RecyclerViewProps.js +1 -2
  56. package/dist/recyclerview/RenderStackManager.js +97 -188
  57. package/dist/recyclerview/RenderStackManager.js.map +1 -1
  58. package/dist/recyclerview/ViewHolder.js +16 -20
  59. package/dist/recyclerview/ViewHolder.js.map +1 -1
  60. package/dist/recyclerview/ViewHolderCollection.js +26 -30
  61. package/dist/recyclerview/ViewHolderCollection.js.map +1 -1
  62. package/dist/recyclerview/components/CompatScroller.js +6 -7
  63. package/dist/recyclerview/components/CompatScroller.js.map +1 -1
  64. package/dist/recyclerview/components/CompatView.js +6 -7
  65. package/dist/recyclerview/components/CompatView.js.map +1 -1
  66. package/dist/recyclerview/components/ScrollAnchor.js +10 -15
  67. package/dist/recyclerview/components/ScrollAnchor.js.map +1 -1
  68. package/dist/recyclerview/components/StickyHeaders.js +34 -40
  69. package/dist/recyclerview/components/StickyHeaders.js.map +1 -1
  70. package/dist/recyclerview/helpers/ConsecutiveNumbers.js +39 -66
  71. package/dist/recyclerview/helpers/ConsecutiveNumbers.js.map +1 -1
  72. package/dist/recyclerview/helpers/EngagedIndicesTracker.js +57 -63
  73. package/dist/recyclerview/helpers/EngagedIndicesTracker.js.map +1 -1
  74. package/dist/recyclerview/helpers/RenderTimeTracker.js +19 -24
  75. package/dist/recyclerview/helpers/RenderTimeTracker.js.map +1 -1
  76. package/dist/recyclerview/helpers/VelocityTracker.js +16 -22
  77. package/dist/recyclerview/helpers/VelocityTracker.js.map +1 -1
  78. package/dist/recyclerview/hooks/useBoundDetection.js +37 -40
  79. package/dist/recyclerview/hooks/useBoundDetection.js.map +1 -1
  80. package/dist/recyclerview/hooks/useLayoutState.js +9 -15
  81. package/dist/recyclerview/hooks/useLayoutState.js.map +1 -1
  82. package/dist/recyclerview/hooks/useMappingHelper.js +6 -10
  83. package/dist/recyclerview/hooks/useMappingHelper.js.map +1 -1
  84. package/dist/recyclerview/hooks/useOnLoad.d.ts.map +1 -1
  85. package/dist/recyclerview/hooks/useOnLoad.js +17 -22
  86. package/dist/recyclerview/hooks/useOnLoad.js.map +1 -1
  87. package/dist/recyclerview/hooks/useRecyclerViewController.d.ts.map +1 -1
  88. package/dist/recyclerview/hooks/useRecyclerViewController.js +169 -188
  89. package/dist/recyclerview/hooks/useRecyclerViewController.js.map +1 -1
  90. package/dist/recyclerview/hooks/useRecyclerViewManager.js +12 -17
  91. package/dist/recyclerview/hooks/useRecyclerViewManager.js.map +1 -1
  92. package/dist/recyclerview/hooks/useRecyclingState.js +10 -14
  93. package/dist/recyclerview/hooks/useRecyclingState.js.map +1 -1
  94. package/dist/recyclerview/hooks/useSecondaryProps.js +24 -30
  95. package/dist/recyclerview/hooks/useSecondaryProps.js.map +1 -1
  96. package/dist/recyclerview/hooks/useUnmountAwareCallbacks.js +17 -22
  97. package/dist/recyclerview/hooks/useUnmountAwareCallbacks.js.map +1 -1
  98. package/dist/recyclerview/hooks/useUnmountFlag.js +5 -9
  99. package/dist/recyclerview/hooks/useUnmountFlag.js.map +1 -1
  100. package/dist/recyclerview/layout-managers/GridLayoutManager.js +61 -80
  101. package/dist/recyclerview/layout-managers/GridLayoutManager.js.map +1 -1
  102. package/dist/recyclerview/layout-managers/LayoutManager.js +83 -123
  103. package/dist/recyclerview/layout-managers/LayoutManager.js.map +1 -1
  104. package/dist/recyclerview/layout-managers/LinearLayoutManager.js +51 -91
  105. package/dist/recyclerview/layout-managers/LinearLayoutManager.js.map +1 -1
  106. package/dist/recyclerview/layout-managers/MasonryLayoutManager.js +77 -96
  107. package/dist/recyclerview/layout-managers/MasonryLayoutManager.js.map +1 -1
  108. package/dist/recyclerview/utils/adjustOffsetForRTL.js +1 -4
  109. package/dist/recyclerview/utils/adjustOffsetForRTL.js.map +1 -1
  110. package/dist/recyclerview/utils/componentUtils.js +4 -9
  111. package/dist/recyclerview/utils/componentUtils.js.map +1 -1
  112. package/dist/recyclerview/utils/findVisibleIndex.js +9 -13
  113. package/dist/recyclerview/utils/findVisibleIndex.js.map +1 -1
  114. package/dist/recyclerview/utils/measureLayout.js +12 -20
  115. package/dist/recyclerview/utils/measureLayout.js.map +1 -1
  116. package/dist/recyclerview/utils/measureLayout.web.js +15 -23
  117. package/dist/recyclerview/utils/measureLayout.web.js.map +1 -1
  118. package/dist/recyclerview/viewability/ViewToken.js +1 -2
  119. package/dist/recyclerview/viewability/ViewabilityHelper.js +34 -41
  120. package/dist/recyclerview/viewability/ViewabilityHelper.js.map +1 -1
  121. package/dist/recyclerview/viewability/ViewabilityManager.js +48 -61
  122. package/dist/recyclerview/viewability/ViewabilityManager.js.map +1 -1
  123. package/dist/tsconfig.tsbuildinfo +1 -1
  124. package/dist/utils/AverageWindow.js +28 -39
  125. package/dist/utils/AverageWindow.js.map +1 -1
  126. package/package.json +4 -6
  127. package/src/FlashListProps.ts +8 -1
  128. package/src/benchmark/useBenchmark.ts +47 -4
  129. package/src/benchmark/useFlatListBenchmark.ts +38 -5
  130. package/src/errors/WarningMessages.ts +2 -0
  131. package/src/recyclerview/RecyclerView.tsx +18 -5
  132. package/src/recyclerview/RecyclerViewManager.ts +12 -0
  133. package/src/recyclerview/hooks/useOnLoad.ts +1 -0
  134. package/src/recyclerview/hooks/useRecyclerViewController.tsx +7 -4
  135. package/dist/__tests__/AverageWindow.test.d.ts +0 -2
  136. package/dist/__tests__/AverageWindow.test.d.ts.map +0 -1
  137. package/dist/__tests__/AverageWindow.test.js +0 -104
  138. package/dist/__tests__/AverageWindow.test.js.map +0 -1
  139. package/dist/__tests__/ConsecutiveNumbers.test.d.ts +0 -2
  140. package/dist/__tests__/ConsecutiveNumbers.test.d.ts.map +0 -1
  141. package/dist/__tests__/ConsecutiveNumbers.test.js +0 -224
  142. package/dist/__tests__/ConsecutiveNumbers.test.js.map +0 -1
  143. package/dist/__tests__/GridLayoutManager.test.d.ts +0 -2
  144. package/dist/__tests__/GridLayoutManager.test.d.ts.map +0 -1
  145. package/dist/__tests__/GridLayoutManager.test.js +0 -69
  146. package/dist/__tests__/GridLayoutManager.test.js.map +0 -1
  147. package/dist/__tests__/LayoutCommitObserver.test.d.ts +0 -2
  148. package/dist/__tests__/LayoutCommitObserver.test.d.ts.map +0 -1
  149. package/dist/__tests__/LayoutCommitObserver.test.js +0 -37
  150. package/dist/__tests__/LayoutCommitObserver.test.js.map +0 -1
  151. package/dist/__tests__/LinearLayoutManager.test.d.ts +0 -2
  152. package/dist/__tests__/LinearLayoutManager.test.d.ts.map +0 -1
  153. package/dist/__tests__/LinearLayoutManager.test.js +0 -140
  154. package/dist/__tests__/LinearLayoutManager.test.js.map +0 -1
  155. package/dist/__tests__/MasonryLayoutManager.test.d.ts +0 -2
  156. package/dist/__tests__/MasonryLayoutManager.test.d.ts.map +0 -1
  157. package/dist/__tests__/MasonryLayoutManager.test.js +0 -148
  158. package/dist/__tests__/MasonryLayoutManager.test.js.map +0 -1
  159. package/dist/__tests__/RecyclerView.test.d.ts +0 -2
  160. package/dist/__tests__/RecyclerView.test.d.ts.map +0 -1
  161. package/dist/__tests__/RecyclerView.test.js +0 -103
  162. package/dist/__tests__/RecyclerView.test.js.map +0 -1
  163. package/dist/__tests__/RenderStackManager.test.d.ts +0 -2
  164. package/dist/__tests__/RenderStackManager.test.d.ts.map +0 -1
  165. package/dist/__tests__/RenderStackManager.test.js +0 -485
  166. package/dist/__tests__/RenderStackManager.test.js.map +0 -1
  167. package/dist/__tests__/ViewabilityHelper.test.d.ts +0 -2
  168. package/dist/__tests__/ViewabilityHelper.test.d.ts.map +0 -1
  169. package/dist/__tests__/ViewabilityHelper.test.js +0 -186
  170. package/dist/__tests__/ViewabilityHelper.test.js.map +0 -1
  171. package/dist/__tests__/findVisibleIndex.test.d.ts +0 -2
  172. package/dist/__tests__/findVisibleIndex.test.d.ts.map +0 -1
  173. package/dist/__tests__/findVisibleIndex.test.js +0 -259
  174. package/dist/__tests__/findVisibleIndex.test.js.map +0 -1
  175. package/dist/__tests__/helpers/createLayoutManager.d.ts +0 -34
  176. package/dist/__tests__/helpers/createLayoutManager.d.ts.map +0 -1
  177. package/dist/__tests__/helpers/createLayoutManager.js +0 -110
  178. package/dist/__tests__/helpers/createLayoutManager.js.map +0 -1
  179. package/dist/__tests__/useUnmountAwareCallbacks.test.d.ts +0 -2
  180. package/dist/__tests__/useUnmountAwareCallbacks.test.d.ts.map +0 -1
  181. package/dist/__tests__/useUnmountAwareCallbacks.test.js +0 -185
  182. package/dist/__tests__/useUnmountAwareCallbacks.test.js.map +0 -1
  183. package/src/__tests__/AverageWindow.test.ts +0 -128
  184. package/src/__tests__/ConsecutiveNumbers.test.ts +0 -232
  185. package/src/__tests__/GridLayoutManager.test.ts +0 -113
  186. package/src/__tests__/LayoutCommitObserver.test.tsx +0 -63
  187. package/src/__tests__/LinearLayoutManager.test.ts +0 -227
  188. package/src/__tests__/MasonryLayoutManager.test.ts +0 -202
  189. package/src/__tests__/RecyclerView.test.tsx +0 -144
  190. package/src/__tests__/RenderStackManager.test.ts +0 -574
  191. package/src/__tests__/ViewabilityHelper.test.ts +0 -282
  192. package/src/__tests__/findVisibleIndex.test.ts +0 -369
  193. package/src/__tests__/helpers/createLayoutManager.ts +0 -141
  194. 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,2 +0,0 @@
1
- export {};
2
- //# sourceMappingURL=useUnmountAwareCallbacks.test.d.ts.map
@@ -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
- });