1111// This is done to control if and how the code is transformed at runtime.
1212// Do not declare test components within this test file as it is very fragile.
1313
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+
1445describe ( 'parseHookNames' , ( ) => {
1546 let fetchMock ;
1647 let inspectHooks ;
@@ -26,6 +57,9 @@ describe('parseHookNames', () => {
2657 fetchMock = require ( 'jest-fetch-mock' ) ;
2758 fetchMock . enableMocks ( ) ;
2859
60+ // Mock out portion of browser API used by parseHookNames to initialize "source-map".
61+ global . chrome = chromeGlobal ;
62+
2963 inspectHooks = require ( 'react-debug-tools/src/ReactDebugHooks' )
3064 . inspectHooks ;
3165 parseHookNames = require ( '../parseHookNames' ) . parseHookNames ;
@@ -45,44 +79,12 @@ describe('parseHookNames', () => {
4579 fetchMock . mockIf ( / .+ $ / , request => {
4680 return requireText ( request . url , 'utf8' ) ;
4781 } ) ;
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- } ;
6682 } ) ;
6783
6884 afterEach ( ( ) => {
6985 fetch . resetMocks ( ) ;
7086 } ) ;
7187
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-
8688 async function getHookNamesForComponent ( Component , props = { } ) {
8789 const hooksTree = inspectHooks ( Component , props , undefined , true ) ;
8890 const hookNames = await parseHookNames ( hooksTree ) ;
@@ -344,3 +346,68 @@ describe('parseHookNames', () => {
344346 } ) ;
345347 } ) ;
346348} ) ;
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