@internetarchive/bookreader 5.0.0-93 → 5.0.0-95

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 (224) hide show
  1. package/.github/workflows/npm-publish.yml +2 -12
  2. package/BookReaderDemo/IADemoBr.js +1 -24
  3. package/BookReaderDemo/demo-internetarchive.html +1 -0
  4. package/CHANGELOG.md +19 -1
  5. package/README.md +0 -2
  6. package/package.json +8 -4
  7. package/scripts/postversion.js +3 -2
  8. package/scripts/preversion.js +3 -1
  9. package/scripts/version.js +4 -6
  10. package/src/BookNavigator/book-navigator.js +38 -12
  11. package/src/BookNavigator/downloads/downloads-provider.js +2 -2
  12. package/src/BookNavigator/search/search-provider.js +5 -5
  13. package/src/BookNavigator/search/search-results.js +1 -1
  14. package/src/BookNavigator/sharing.js +2 -2
  15. package/src/BookNavigator/viewable-files.js +2 -2
  16. package/src/BookNavigator/visual-adjustments/visual-adjustments-provider.js +3 -3
  17. package/src/BookNavigator/visual-adjustments/visual-adjustments.js +2 -2
  18. package/src/BookReader.js +57 -31
  19. package/src/assets/images/hypothesis.ico +0 -0
  20. package/src/css/_TextSelection.scss +3 -1
  21. package/src/plugins/plugin.autoplay.js +3 -3
  22. package/src/plugins/plugin.chapters.js +2 -2
  23. package/src/plugins/plugin.experiments.js +294 -0
  24. package/src/plugins/plugin.iiif.js +1 -1
  25. package/src/plugins/plugin.text_selection.js +112 -1
  26. package/src/plugins/search/view.js +5 -5
  27. package/src/plugins/tts/plugin.tts.js +3 -3
  28. package/src/plugins/url/plugin.url.js +2 -2
  29. package/tests/e2e/autoplay.test.js +1 -1
  30. package/tests/e2e/base.test.js +4 -4
  31. package/tests/e2e/helpers/base.js +2 -2
  32. package/tests/e2e/models/BookReader.js +1 -1
  33. package/tests/e2e/rightToLeft.test.js +4 -4
  34. package/tests/e2e/viewmode.test.js +2 -2
  35. package/tests/jest/BookNavigator/book-navigator.test.js +0 -13
  36. package/tests/jest/BookNavigator/downloads/downloads-provider.test.js +1 -1
  37. package/tests/jest/BookNavigator/downloads/downloads.test.js +1 -1
  38. package/tests/jest/BookNavigator/search/search-provider.test.js +5 -5
  39. package/tests/jest/BookReader.test.js +10 -10
  40. package/tests/jest/plugins/plugin.autoplay.test.js +6 -6
  41. package/tests/jest/plugins/plugin.chapters.test.js +2 -2
  42. package/tests/jest/plugins/plugin.resume.test.js +13 -13
  43. package/tests/jest/plugins/plugin.text_selection.test.js +155 -24
  44. package/tests/jest/plugins/search/plugin.search.test.js +7 -7
  45. package/tests/jest/plugins/search/plugin.search.view.test.js +8 -8
  46. package/tests/jest/plugins/search/utils.js +1 -1
  47. package/tests/jest/plugins/tts/PageChunkIterator.test.js +2 -2
  48. package/tests/jest/plugins/url/UrlPlugin.test.js +1 -1
  49. package/webpack.config.js +8 -3
  50. package/BookReader/BookReader.css +0 -2250
  51. package/BookReader/BookReader.js +0 -3
  52. package/BookReader/BookReader.js.LICENSE.txt +0 -72
  53. package/BookReader/BookReader.js.map +0 -1
  54. package/BookReader/ia-bookreader-bundle.js +0 -1782
  55. package/BookReader/ia-bookreader-bundle.js.LICENSE.txt +0 -7
  56. package/BookReader/ia-bookreader-bundle.js.map +0 -1
  57. package/BookReader/icons/1up.svg +0 -1
  58. package/BookReader/icons/2up.svg +0 -1
  59. package/BookReader/icons/advance.svg +0 -3
  60. package/BookReader/icons/chevron-right.svg +0 -1
  61. package/BookReader/icons/close-circle-dark.svg +0 -1
  62. package/BookReader/icons/close-circle.svg +0 -1
  63. package/BookReader/icons/fullscreen.svg +0 -1
  64. package/BookReader/icons/fullscreen_exit.svg +0 -1
  65. package/BookReader/icons/hamburger.svg +0 -1
  66. package/BookReader/icons/left-arrow.svg +0 -1
  67. package/BookReader/icons/magnify-minus.svg +0 -1
  68. package/BookReader/icons/magnify-plus.svg +0 -1
  69. package/BookReader/icons/magnify.svg +0 -1
  70. package/BookReader/icons/pause.svg +0 -1
  71. package/BookReader/icons/play.svg +0 -1
  72. package/BookReader/icons/playback-speed.svg +0 -1
  73. package/BookReader/icons/read-aloud.svg +0 -1
  74. package/BookReader/icons/review.svg +0 -3
  75. package/BookReader/icons/thumbnails.svg +0 -1
  76. package/BookReader/icons/voice.svg +0 -1
  77. package/BookReader/icons/volume-full.svg +0 -1
  78. package/BookReader/images/BRicons.png +0 -0
  79. package/BookReader/images/BRicons.svg +0 -5
  80. package/BookReader/images/BRicons_ia.png +0 -0
  81. package/BookReader/images/back_pages.png +0 -0
  82. package/BookReader/images/book_bottom_icon.png +0 -0
  83. package/BookReader/images/book_down_icon.png +0 -0
  84. package/BookReader/images/book_left_icon.png +0 -0
  85. package/BookReader/images/book_leftmost_icon.png +0 -0
  86. package/BookReader/images/book_right_icon.png +0 -0
  87. package/BookReader/images/book_rightmost_icon.png +0 -0
  88. package/BookReader/images/book_top_icon.png +0 -0
  89. package/BookReader/images/book_up_icon.png +0 -0
  90. package/BookReader/images/books_graphic.svg +0 -1
  91. package/BookReader/images/booksplit.png +0 -0
  92. package/BookReader/images/control_pause_icon.png +0 -0
  93. package/BookReader/images/control_play_icon.png +0 -0
  94. package/BookReader/images/embed_icon.png +0 -0
  95. package/BookReader/images/icon-home-ia.png +0 -0
  96. package/BookReader/images/icon_OL-logo-xs.png +0 -0
  97. package/BookReader/images/icon_alert-xs.png +0 -0
  98. package/BookReader/images/icon_book.svg +0 -1
  99. package/BookReader/images/icon_bookmark.svg +0 -1
  100. package/BookReader/images/icon_close-pop.png +0 -0
  101. package/BookReader/images/icon_download.png +0 -0
  102. package/BookReader/images/icon_gear.svg +0 -1
  103. package/BookReader/images/icon_hamburger.svg +0 -1
  104. package/BookReader/images/icon_home.png +0 -0
  105. package/BookReader/images/icon_home.svg +0 -1
  106. package/BookReader/images/icon_home_ia.png +0 -0
  107. package/BookReader/images/icon_indicator.png +0 -0
  108. package/BookReader/images/icon_info.svg +0 -1
  109. package/BookReader/images/icon_one_page.svg +0 -1
  110. package/BookReader/images/icon_pause.svg +0 -1
  111. package/BookReader/images/icon_play.svg +0 -1
  112. package/BookReader/images/icon_playback-rate.svg +0 -1
  113. package/BookReader/images/icon_return.png +0 -0
  114. package/BookReader/images/icon_search_button.svg +0 -1
  115. package/BookReader/images/icon_share.svg +0 -1
  116. package/BookReader/images/icon_skip-ahead.svg +0 -1
  117. package/BookReader/images/icon_skip-back.svg +0 -2
  118. package/BookReader/images/icon_speaker.svg +0 -1
  119. package/BookReader/images/icon_speaker_open.svg +0 -1
  120. package/BookReader/images/icon_thumbnails.svg +0 -1
  121. package/BookReader/images/icon_toc.svg +0 -1
  122. package/BookReader/images/icon_two_pages.svg +0 -1
  123. package/BookReader/images/icon_zoomer.png +0 -0
  124. package/BookReader/images/loading.gif +0 -0
  125. package/BookReader/images/logo_icon.png +0 -0
  126. package/BookReader/images/marker_chap-off.png +0 -0
  127. package/BookReader/images/marker_chap-off.svg +0 -1
  128. package/BookReader/images/marker_chap-off_ia.png +0 -0
  129. package/BookReader/images/marker_chap-on.png +0 -0
  130. package/BookReader/images/marker_chap-on.svg +0 -1
  131. package/BookReader/images/marker_srch-on.svg +0 -1
  132. package/BookReader/images/marker_srchchap-off.png +0 -0
  133. package/BookReader/images/marker_srchchap-on.png +0 -0
  134. package/BookReader/images/nav_control-dn.png +0 -0
  135. package/BookReader/images/nav_control-dn_ia.png +0 -0
  136. package/BookReader/images/nav_control-up.png +0 -0
  137. package/BookReader/images/nav_control-up_ia.png +0 -0
  138. package/BookReader/images/nav_control.png +0 -0
  139. package/BookReader/images/one_page_mode_icon.png +0 -0
  140. package/BookReader/images/paper-badge.png +0 -0
  141. package/BookReader/images/print_icon.png +0 -0
  142. package/BookReader/images/progressbar.gif +0 -0
  143. package/BookReader/images/right_edges.png +0 -0
  144. package/BookReader/images/slider.png +0 -0
  145. package/BookReader/images/slider_ia.png +0 -0
  146. package/BookReader/images/thumbnail_mode_icon.png +0 -0
  147. package/BookReader/images/transparent.png +0 -0
  148. package/BookReader/images/two_page_mode_icon.png +0 -0
  149. package/BookReader/images/unviewable_page.png +0 -0
  150. package/BookReader/images/zoom_in_icon.png +0 -0
  151. package/BookReader/images/zoom_out_icon.png +0 -0
  152. package/BookReader/jquery-3.js +0 -2
  153. package/BookReader/jquery-3.js.LICENSE.txt +0 -24
  154. package/BookReader/plugins/plugin.archive_analytics.js +0 -2
  155. package/BookReader/plugins/plugin.archive_analytics.js.map +0 -1
  156. package/BookReader/plugins/plugin.autoplay.js +0 -2
  157. package/BookReader/plugins/plugin.autoplay.js.map +0 -1
  158. package/BookReader/plugins/plugin.chapters.js +0 -26
  159. package/BookReader/plugins/plugin.chapters.js.LICENSE.txt +0 -1
  160. package/BookReader/plugins/plugin.chapters.js.map +0 -1
  161. package/BookReader/plugins/plugin.iframe.js +0 -2
  162. package/BookReader/plugins/plugin.iframe.js.map +0 -1
  163. package/BookReader/plugins/plugin.iiif.js +0 -2
  164. package/BookReader/plugins/plugin.iiif.js.map +0 -1
  165. package/BookReader/plugins/plugin.resume.js +0 -2
  166. package/BookReader/plugins/plugin.resume.js.map +0 -1
  167. package/BookReader/plugins/plugin.search.js +0 -3
  168. package/BookReader/plugins/plugin.search.js.LICENSE.txt +0 -1
  169. package/BookReader/plugins/plugin.search.js.map +0 -1
  170. package/BookReader/plugins/plugin.text_selection.js +0 -3
  171. package/BookReader/plugins/plugin.text_selection.js.LICENSE.txt +0 -1
  172. package/BookReader/plugins/plugin.text_selection.js.map +0 -1
  173. package/BookReader/plugins/plugin.tts.js +0 -3
  174. package/BookReader/plugins/plugin.tts.js.LICENSE.txt +0 -29
  175. package/BookReader/plugins/plugin.tts.js.map +0 -1
  176. package/BookReader/plugins/plugin.url.js +0 -2
  177. package/BookReader/plugins/plugin.url.js.map +0 -1
  178. package/BookReader/plugins/plugin.vendor-fullscreen.js +0 -2
  179. package/BookReader/plugins/plugin.vendor-fullscreen.js.map +0 -1
  180. package/BookReader/webcomponents-bundle.js +0 -3
  181. package/BookReader/webcomponents-bundle.js.LICENSE.txt +0 -9
  182. package/BookReader/webcomponents-bundle.js.map +0 -1
  183. package/src/BookReader/BookModel.js +0 -554
  184. package/src/BookReader/DragScrollable.js +0 -233
  185. package/src/BookReader/ImageCache.js +0 -149
  186. package/src/BookReader/Mode1Up.js +0 -108
  187. package/src/BookReader/Mode1UpLit.js +0 -388
  188. package/src/BookReader/Mode2Up.js +0 -105
  189. package/src/BookReader/Mode2UpLit.js +0 -777
  190. package/src/BookReader/ModeCoordinateSpace.js +0 -29
  191. package/src/BookReader/ModeSmoothZoom.js +0 -312
  192. package/src/BookReader/ModeThumb.js +0 -342
  193. package/src/BookReader/Navbar/Navbar.js +0 -355
  194. package/src/BookReader/PageContainer.js +0 -169
  195. package/src/BookReader/ReduceSet.js +0 -26
  196. package/src/BookReader/Toolbar/Toolbar.js +0 -362
  197. package/src/BookReader/events.js +0 -19
  198. package/src/BookReader/options.js +0 -382
  199. package/src/BookReader/utils/HTMLDimensionsCacher.js +0 -44
  200. package/src/BookReader/utils/ScrollClassAdder.js +0 -31
  201. package/src/BookReader/utils/SelectionObserver.js +0 -45
  202. package/src/BookReader/utils/classes.js +0 -36
  203. package/src/BookReader/utils.js +0 -300
  204. package/tests/jest/BookReader/BookModel.test.js +0 -372
  205. package/tests/jest/BookReader/BookReaderPublicFunctions.test.js +0 -263
  206. package/tests/jest/BookReader/ImageCache.test.js +0 -150
  207. package/tests/jest/BookReader/Mode1UpLit.test.js +0 -73
  208. package/tests/jest/BookReader/Mode2Up.test.js +0 -98
  209. package/tests/jest/BookReader/Mode2UpLit.test.js +0 -190
  210. package/tests/jest/BookReader/ModeCoordinateSpace.test.js +0 -16
  211. package/tests/jest/BookReader/ModeSmoothZoom.test.js +0 -218
  212. package/tests/jest/BookReader/ModeThumb.test.js +0 -71
  213. package/tests/jest/BookReader/Navbar/Navbar.test.js +0 -182
  214. package/tests/jest/BookReader/PageContainer.test.js +0 -238
  215. package/tests/jest/BookReader/ReduceSet.test.js +0 -38
  216. package/tests/jest/BookReader/Toolbar/Toolbar.test.js +0 -26
  217. package/tests/jest/BookReader/utils/HTMLDimensionsCacher.test.js +0 -59
  218. package/tests/jest/BookReader/utils/ScrollClassAdder.test.js +0 -49
  219. package/tests/jest/BookReader/utils/SelectionObserver.test.js +0 -57
  220. package/tests/jest/BookReader/utils/classes.test.js +0 -88
  221. package/tests/jest/BookReader/utils.test.js +0 -250
  222. /package/{.eslintrc.js → .eslintrc.cjs} +0 -0
  223. /package/{.testcaferc.js → .testcaferc.cjs} +0 -0
  224. /package/{babel.config.js → babel.config.cjs} +0 -0
@@ -1,250 +0,0 @@
1
- import sinon from 'sinon';
2
- import { afterEventLoop, eventTargetMixin } from '../utils.js';
3
- import {
4
- clamp,
5
- cssPercentage,
6
- debounce,
7
- decodeURIComponentPlus,
8
- encodeURIComponentPlus,
9
- escapeHTML,
10
- escapeRegExp,
11
- getActiveElement,
12
- isInputActive,
13
- parseAnimationSpeed,
14
- poll,
15
- polyfillCustomEvent,
16
- PolyfilledCustomEvent,
17
- promisifyEvent,
18
- sleep,
19
- } from '@/src/BookReader/utils.js';
20
-
21
- test('clamp function returns Math.min(Math.max(value, min), max)', () => {
22
- expect(clamp(2,1,3)).toEqual(2);
23
- });
24
-
25
- test('calculate a percentage suitable for CSS', () => {
26
- expect(cssPercentage(2,1)).toEqual('200%');
27
- });
28
-
29
- test('escapeHTML function which replaces the string', () => {
30
- expect(escapeHTML('Me & You')).toEqual('Me & You');
31
- expect(escapeHTML('Me > You')).toEqual('Me > You');
32
- expect(escapeHTML('Me < You')).toEqual('Me &lt; You');
33
- expect(escapeHTML('Me " You')).toEqual('Me &quot; You');
34
- });
35
-
36
- test('Decodes a URI component and converts + to emptyStr', () => {
37
- expect(decodeURIComponentPlus("https%3A%2F%2Farchive.org%2Fskr+")).toEqual("https://archive.org/skr ");
38
- expect(decodeURIComponentPlus("%3Fx%3D+test")).toEqual("?x= test");
39
- });
40
-
41
- test('Encodes a URI component and converts emptyStr to +', () => {
42
- expect(encodeURIComponentPlus("?x=test ")).toEqual("%3Fx%3Dtest+");
43
- expect(encodeURIComponentPlus("ABC abc 123")).toEqual("ABC+abc+123");
44
- });
45
-
46
- describe('getActiveElement', () => {
47
- test('Can ignore shadow DOM', () => {
48
- const doc = {activeElement: { shadowRoot: {activeElement: {}}}};
49
- expect(getActiveElement(doc, false)).toBe(doc.activeElement);
50
- });
51
-
52
- test('Can traverse shadow DOM', () => {
53
- const doc = {activeElement: { shadowRoot: {activeElement: {}}}};
54
- expect(getActiveElement(doc, true)).toBe(doc.activeElement.shadowRoot.activeElement);
55
- });
56
-
57
- test('Handles non-shadow elements', () => {
58
- const doc = {activeElement: {}};
59
- expect(getActiveElement(doc, true)).toBe(doc.activeElement);
60
- });
61
-
62
- test('Handles no active element', () => {
63
- const doc = {activeElement: null};
64
- expect(getActiveElement(doc, true)).toBe(null);
65
- });
66
- });
67
-
68
- describe('isInputActive', () => {
69
- test('Handles no activeElement', () => {
70
- expect(isInputActive({activeElement: null})).toBe(false);
71
- });
72
-
73
- test('Handles deep input activeElement', () => {
74
- const doc = {activeElement: { shadowRoot: {activeElement: { tagName: 'INPUT' }}}};
75
- expect(isInputActive(doc)).toBe(true);
76
- });
77
-
78
- test('Handles deep non-input activeElement', () => {
79
- const doc = {activeElement: { shadowRoot: {activeElement: { tagName: 'A' }}}};
80
- expect(isInputActive(doc)).toBe(false);
81
- });
82
-
83
- test('Handles textarea activeElement', () => {
84
- const doc = {activeElement: { tagName: 'TEXTAREA' }};
85
- expect(isInputActive(doc)).toBe(true);
86
- });
87
- });
88
-
89
- describe('debounce', () => {
90
- /** @type {sinon.SinonFakeTimers} */
91
- let clock;
92
- beforeEach(() => clock = sinon.useFakeTimers());
93
- afterEach(() => clock.restore());
94
-
95
- test('testing debounce', () => {
96
- const func = jest.fn();
97
- const debouncedFunc = debounce(func, 1000);
98
- // Call it immediately
99
- debouncedFunc();
100
- expect(func).toHaveBeenCalledTimes(0); // func not called
101
-
102
- // Call it several times with 500ms between each call
103
- for (let i = 0; i < 10; i++) {
104
- clock.tick(500);
105
- debouncedFunc();
106
- }
107
- expect(func).toHaveBeenCalledTimes(0); // func not called
108
-
109
- // wait 1000ms
110
- clock.tick(1000);
111
- expect(func).toHaveBeenCalledTimes(1); // func called
112
- });
113
- });
114
-
115
-
116
- describe('polyfillCustomEvent', () => {
117
- test('Overrides when missing', () => {
118
- const win = {};
119
- polyfillCustomEvent(win);
120
- expect(win).toHaveProperty('CustomEvent');
121
- });
122
-
123
- test('Overrides when not a function', () => {
124
- const win = { CustomEvent: {} };
125
- polyfillCustomEvent(win);
126
- expect(typeof win.CustomEvent).toBe('function');
127
- });
128
- });
129
-
130
- describe('PolyfilledCustomEvent', () => {
131
- test('Can be called as a constructor', () => {
132
- new PolyfilledCustomEvent('foo');
133
- });
134
-
135
- test('Calls deprecated browser methods', () => {
136
- const createEventSpy = sinon.spy(document, 'createEvent');
137
- const initCustomEventSpy = sinon.spy(CustomEvent.prototype, 'initCustomEvent');
138
- new PolyfilledCustomEvent('foo');
139
- expect(createEventSpy.callCount).toBe(1);
140
- expect(initCustomEventSpy.callCount).toBe(1);
141
- });
142
- });
143
-
144
- describe('poll', () => {
145
- beforeEach(() => jest.useFakeTimers());
146
- afterEach(() => jest.useRealTimers());
147
- test('polls until condition is true', async () => {
148
- const fakeSleep = sinon.spy((ms) => jest.advanceTimersByTime(ms));
149
-
150
- const returns = [null, null, 'foo'];
151
- const check = sinon.spy(() => returns.shift());
152
- const result = await poll(check, {_sleep: fakeSleep});
153
- expect(fakeSleep.callCount).toBe(2);
154
- expect(result).toBe('foo');
155
- expect(check.callCount).toBe(3);
156
- });
157
-
158
- test('times out eventually', async () => {
159
- const fakeSleep = sinon.spy((ms) => jest.advanceTimersByTime(ms));
160
-
161
- const check = sinon.stub().returns(null);
162
- const result = await poll(check, {_sleep: fakeSleep});
163
- expect(result).toBeUndefined();
164
- expect(check.callCount).toBe(10);
165
- });
166
- });
167
-
168
- describe('sleep', () => {
169
- test('Sleep 0 doest not called immediately', async () => {
170
- const spy = sinon.spy();
171
- sleep(0).then(spy);
172
- expect(spy.callCount).toBe(0);
173
- await afterEventLoop();
174
- expect(spy.callCount).toBe(1);
175
- });
176
-
177
- test('Waits the appropriate ms', async () => {
178
- const clock = sinon.useFakeTimers();
179
- const spy = sinon.spy();
180
- sleep(10).then(spy);
181
- expect(spy.callCount).toBe(0);
182
- clock.tick(10);
183
- expect(spy.callCount).toBe(0);
184
- clock.restore();
185
-
186
- await afterEventLoop();
187
- expect(spy.callCount).toBe(1);
188
- });
189
- });
190
-
191
- describe('promisifyEvent', () => {
192
- test('Resolves once event fires', async () => {
193
- const fakeTarget = eventTargetMixin();
194
- const resolveSpy = sinon.spy();
195
- promisifyEvent(fakeTarget, 'pause').then(resolveSpy);
196
-
197
- await afterEventLoop();
198
- expect(resolveSpy.callCount).toBe(0);
199
- fakeTarget.dispatchEvent('pause', {});
200
- await afterEventLoop();
201
- expect(resolveSpy.callCount).toBe(1);
202
- });
203
-
204
- test('Only resolves once', async () => {
205
- const fakeTarget = eventTargetMixin();
206
- const resolveSpy = sinon.spy();
207
- promisifyEvent(fakeTarget, 'pause').then(resolveSpy);
208
-
209
- await afterEventLoop();
210
- expect(resolveSpy.callCount).toBe(0);
211
- fakeTarget.dispatchEvent('pause', {});
212
- fakeTarget.dispatchEvent('pause', {});
213
- fakeTarget.dispatchEvent('pause', {});
214
- fakeTarget.dispatchEvent('pause', {});
215
-
216
- await afterEventLoop();
217
- expect(resolveSpy.callCount).toBe(1);
218
- });
219
- });
220
-
221
- describe('escapeRegex', () => {
222
- test('Escapes regex', () => {
223
- expect(escapeRegExp('.*')).toBe('\\.\\*');
224
- expect(escapeRegExp('foo')).toBe('foo');
225
- expect(escapeRegExp('foo.bar')).toBe('foo\\.bar');
226
- expect(escapeRegExp('{{{')).toBe('\\{\\{\\{');
227
- expect(escapeRegExp('')).toBe('');
228
- expect(escapeRegExp('https://example.com')).toBe('https://example\\.com');
229
- });
230
- });
231
-
232
- describe('parseAnimationSpeed', () => {
233
- test('Parses numbers', () => {
234
- expect(parseAnimationSpeed(100)).toBe(100);
235
- expect(parseAnimationSpeed(0)).toBe(0);
236
- expect(parseAnimationSpeed(1000)).toBe(1000);
237
- });
238
-
239
- test('Parses strings', () => {
240
- expect(parseAnimationSpeed('slow')).toBe(600);
241
- expect(parseAnimationSpeed('fast')).toBe(200);
242
- expect(parseAnimationSpeed('100')).toBe(100);
243
- });
244
-
245
- test('Handles invalid input', () => {
246
- expect(parseAnimationSpeed('foo')).toBeFalsy();
247
- expect(parseAnimationSpeed('')).toBeFalsy();
248
- expect(parseAnimationSpeed(null)).toBeFalsy();
249
- });
250
- });
File without changes
File without changes
File without changes