11
11
// This is done to control if and how the code is transformed at runtime.
12
12
// Do not declare test components within this test file as it is very fragile.
13
13
14
+ function expectHookNamesToEqual ( map , expectedNamesArray ) {
15
+ // Slightly hacky since it relies on the iterable order of values()
16
+ expect ( Array . from ( map . values ( ) ) ) . toEqual ( expectedNamesArray ) ;
17
+ }
18
+
19
+ function requireText ( path , encoding ) {
20
+ const { existsSync, readFileSync} = require ( 'fs' ) ;
21
+ if ( existsSync ( path ) ) {
22
+ return Promise . resolve ( readFileSync ( path , encoding ) ) ;
23
+ } else {
24
+ return Promise . reject ( `File not found "${ path } "` ) ;
25
+ }
26
+ }
27
+
28
+ const chromeGlobal = {
29
+ extension : {
30
+ getURL : jest . fn ( ( ...args ) => {
31
+ const { join} = require ( 'path' ) ;
32
+ return join (
33
+ __dirname ,
34
+ '..' ,
35
+ '..' ,
36
+ 'node_modules' ,
37
+ 'source-map' ,
38
+ 'lib' ,
39
+ 'mappings.wasm' ,
40
+ ) ;
41
+ } ) ,
42
+ } ,
43
+ } ;
44
+
14
45
describe ( 'parseHookNames' , ( ) => {
15
46
let fetchMock ;
16
47
let inspectHooks ;
@@ -26,6 +57,9 @@ describe('parseHookNames', () => {
26
57
fetchMock = require ( 'jest-fetch-mock' ) ;
27
58
fetchMock . enableMocks ( ) ;
28
59
60
+ // Mock out portion of browser API used by parseHookNames to initialize "source-map".
61
+ global . chrome = chromeGlobal ;
62
+
29
63
inspectHooks = require ( 'react-debug-tools/src/ReactDebugHooks' )
30
64
. inspectHooks ;
31
65
parseHookNames = require ( '../parseHookNames' ) . parseHookNames ;
@@ -45,44 +79,12 @@ describe('parseHookNames', () => {
45
79
fetchMock . mockIf ( / .+ $ / , request => {
46
80
return requireText ( request . url , 'utf8' ) ;
47
81
} ) ;
48
-
49
- // Mock out portion of browser API used by parseHookNames to initialize "source-map".
50
- global . chrome = {
51
- extension : {
52
- getURL : jest . fn ( ( ...args ) => {
53
- const { join} = require ( 'path' ) ;
54
- return join (
55
- __dirname ,
56
- '..' ,
57
- '..' ,
58
- 'node_modules' ,
59
- 'source-map' ,
60
- 'lib' ,
61
- 'mappings.wasm' ,
62
- ) ;
63
- } ) ,
64
- } ,
65
- } ;
66
82
} ) ;
67
83
68
84
afterEach ( ( ) => {
69
85
fetch . resetMocks ( ) ;
70
86
} ) ;
71
87
72
- function expectHookNamesToEqual ( map , expectedNamesArray ) {
73
- // Slightly hacky since it relies on the iterable order of values()
74
- expect ( Array . from ( map . values ( ) ) ) . toEqual ( expectedNamesArray ) ;
75
- }
76
-
77
- function requireText ( path , encoding ) {
78
- const { existsSync, readFileSync} = require ( 'fs' ) ;
79
- if ( existsSync ( path ) ) {
80
- return Promise . resolve ( readFileSync ( path , encoding ) ) ;
81
- } else {
82
- return Promise . reject ( `File not found "${ path } "` ) ;
83
- }
84
- }
85
-
86
88
async function getHookNamesForComponent ( Component , props = { } ) {
87
89
const hooksTree = inspectHooks ( Component , props , undefined , true ) ;
88
90
const hookNames = await parseHookNames ( hooksTree ) ;
@@ -344,3 +346,68 @@ describe('parseHookNames', () => {
344
346
} ) ;
345
347
} ) ;
346
348
} ) ;
349
+
350
+ describe ( 'parseHookNames worker' , ( ) => {
351
+ let inspectHooks ;
352
+ let parseHookNames ;
353
+ let originalParseHookNamesMock ;
354
+ let workerizedParseHookNamesMock ;
355
+
356
+ beforeEach ( ( ) => {
357
+ window . Worker = undefined ;
358
+
359
+ originalParseHookNamesMock = jest . fn ( ) ;
360
+ workerizedParseHookNamesMock = jest . fn ( ) ;
361
+
362
+ jest . mock ( '../parseHookNames/parseHookNames.js' , ( ) => {
363
+ return {
364
+ __esModule : true ,
365
+ parseHookNames : originalParseHookNamesMock ,
366
+ } ;
367
+ } ) ;
368
+
369
+ jest . mock ( '../parseHookNames/parseHookNames.worker.js' , ( ) => {
370
+ return {
371
+ __esModule : true ,
372
+ default : ( ) => ( {
373
+ parseHookNames : workerizedParseHookNamesMock ,
374
+ } ) ,
375
+ } ;
376
+ } ) ;
377
+
378
+ // Mock out portion of browser API used by parseHookNames to initialize "source-map".
379
+ global . chrome = chromeGlobal ;
380
+
381
+ inspectHooks = require ( 'react-debug-tools/src/ReactDebugHooks' )
382
+ . inspectHooks ;
383
+ parseHookNames = require ( '../parseHookNames' ) . parseHookNames ;
384
+ } ) ;
385
+
386
+ async function getHookNamesForComponent ( Component , props = { } ) {
387
+ const hooksTree = inspectHooks ( Component , props , undefined , true ) ;
388
+ const hookNames = await parseHookNames ( hooksTree ) ;
389
+ return hookNames ;
390
+ }
391
+
392
+ it ( 'should use worker when available' , async ( ) => {
393
+ const Component = require ( './__source__/__untransformed__/ComponentWithUseState' )
394
+ . Component ;
395
+
396
+ window . Worker = true ;
397
+ // resets module so mocked worker instance can be updated
398
+ jest . resetModules ( ) ;
399
+ parseHookNames = require ( '../parseHookNames' ) . parseHookNames ;
400
+
401
+ await getHookNamesForComponent ( Component ) ;
402
+ expect ( workerizedParseHookNamesMock ) . toHaveBeenCalledTimes ( 1 ) ;
403
+ } ) ;
404
+
405
+ it ( 'should use main thread when worker is not available' , async ( ) => {
406
+ const Component = require ( './__source__/__untransformed__/ComponentWithUseState' )
407
+ . Component ;
408
+
409
+ await getHookNamesForComponent ( Component ) ;
410
+ expect ( workerizedParseHookNamesMock ) . toHaveBeenCalledTimes ( 0 ) ;
411
+ expect ( originalParseHookNamesMock ) . toHaveBeenCalledTimes ( 1 ) ;
412
+ } ) ;
413
+ } ) ;
0 commit comments