-
Notifications
You must be signed in to change notification settings - Fork 46.9k
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
Update test and stack frame code to support newer V8 stack formats (#…
- Loading branch information
Brian Vaughn
authored
Oct 11, 2021
1 parent
55d7500
commit c16b005
Showing
4 changed files
with
63 additions
and
3 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,50 @@ | ||
'use strict'; | ||
|
||
// V8 uses a different message format when reading properties of null or undefined. | ||
// Older versions use e.g. "Cannot read property 'world' of undefined" | ||
// Newer versions use e.g. "Cannot read properties of undefined (reading 'world')" | ||
// This file overrides the built-in toThrow() matches to handle both cases, | ||
// enabling the React project to support Node 12-16 witout forking tests. | ||
|
||
const toThrowMatchers = require('expect/build/toThrowMatchers').default; | ||
const builtInToThrow = toThrowMatchers.toThrow; | ||
|
||
// Detect the newer stack format: | ||
let newErrorFormat = false; | ||
try { | ||
null.test(); | ||
} catch (error) { | ||
if (error.message.includes('Cannot read properties of null')) { | ||
newErrorFormat = true; | ||
} | ||
} | ||
|
||
// Detect the message pattern we need to rename: | ||
const regex = /Cannot read property '([^']+)' of (.+)/; | ||
|
||
// Massage strings (written in the older format) to match the newer format | ||
// if tests are currently running on Node 16+ | ||
function normalizeErrorMessage(message) { | ||
if (newErrorFormat) { | ||
const match = message.match(regex); | ||
if (match) { | ||
return `Cannot read properties of ${match[2]} (reading '${match[1]}')`; | ||
} | ||
} | ||
|
||
return message; | ||
} | ||
|
||
function toThrow(value, expectedValue) { | ||
if (typeof expectedValue === 'string') { | ||
expectedValue = normalizeErrorMessage(expectedValue); | ||
} else if (expectedValue instanceof Error) { | ||
expectedValue.message = normalizeErrorMessage(expectedValue.message); | ||
} | ||
|
||
return builtInToThrow.call(this, value, expectedValue); | ||
} | ||
|
||
module.exports = { | ||
toThrow, | ||
}; |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters