Use toMatchInlineSnapshot for dehydrated values (#20618)

This commit is contained in:
Sebastian Silbermann 2021-04-26 18:30:34 +02:00 committed by GitHub
parent 48740429b4
commit 84b9162cbe
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
7 changed files with 297 additions and 334 deletions

View File

@ -10,10 +10,14 @@
// test() is part of Jest's serializer API // test() is part of Jest's serializer API
export function test(maybeDehydratedValue) { export function test(maybeDehydratedValue) {
const {meta} = require('react-devtools-shared/src/hydration'); const {meta} = require('react-devtools-shared/src/hydration');
const hasOwnProperty = Object.prototype.hasOwnProperty.bind(
maybeDehydratedValue,
);
return ( return (
maybeDehydratedValue !== null && maybeDehydratedValue !== null &&
typeof maybeDehydratedValue === 'object' && typeof maybeDehydratedValue === 'object' &&
maybeDehydratedValue.hasOwnProperty(meta.inspectable) && hasOwnProperty(meta.inspectable) &&
maybeDehydratedValue[meta.inspected] !== true maybeDehydratedValue[meta.inspected] !== true
); );
} }

View File

@ -20,7 +20,6 @@ describe('InspectedElement', () => {
let TestRenderer: ReactTestRenderer; let TestRenderer: ReactTestRenderer;
let bridge: FrontendBridge; let bridge: FrontendBridge;
let store: Store; let store: Store;
let meta;
let utils; let utils;
let BridgeContext; let BridgeContext;
@ -39,8 +38,6 @@ describe('InspectedElement', () => {
utils = require('./utils'); utils = require('./utils');
utils.beforeEachProfiling(); utils.beforeEachProfiling();
meta = require('react-devtools-shared/src/hydration').meta;
bridge = global.bridge; bridge = global.bridge;
store = global.store; store = global.store;
store.collapseNodesByDefault = false; store.collapseNodesByDefault = false;
@ -442,18 +439,21 @@ describe('InspectedElement', () => {
const inspectedElement = await inspectElementAtIndex(0); const inspectedElement = await inspectElementAtIndex(0);
const {props} = (inspectedElement: any); expect(inspectedElement.props).toMatchInlineSnapshot(`
expect(props.boolean_false).toBe(false); Object {
expect(props.boolean_true).toBe(true); "boolean_false": false,
expect(Number.isFinite(props.infinity)).toBe(false); "boolean_true": true,
expect(props.integer_zero).toEqual(0); "float": 1.23,
expect(props.integer_one).toEqual(1); "infinity": Infinity,
expect(props.float).toEqual(1.23); "integer_one": 1,
expect(props.string).toEqual('abc'); "integer_zero": 0,
expect(props.string_empty).toEqual(''); "nan": NaN,
expect(props.nan).toBeNaN(); "string": "abc",
expect(props.value_null).toBeNull(); "string_empty": "",
expect(props.value_undefined).toBeUndefined(); "value_null": null,
"value_undefined": undefined,
}
`);
}); });
it('should support complex data types', async () => { it('should support complex data types', async () => {
@ -539,175 +539,126 @@ describe('InspectedElement', () => {
const inspectedElement = await inspectElementAtIndex(0); const inspectedElement = await inspectElementAtIndex(0);
const { expect(inspectedElement.props).toMatchInlineSnapshot(`
anonymous_fn, Object {
array_buffer, "anonymous_fn": Dehydrated {
array_of_arrays, "preview_short": ƒ () {},
big_int, "preview_long": ƒ () {},
bound_fn, },
data_view, "array_buffer": Dehydrated {
date, "preview_short": ArrayBuffer(3),
fn, "preview_long": ArrayBuffer(3),
html_element, },
immutable, "array_of_arrays": Array [
map, Dehydrated {
map_of_maps, "preview_short": Array(2),
object_of_objects, "preview_long": [Array(3), Array(0)],
object_with_symbol, },
proxy, ],
react_element, "big_int": Dehydrated {
regexp, "preview_short": 123n,
set, "preview_long": 123n,
set_of_sets, },
symbol, "bound_fn": Dehydrated {
typed_array, "preview_short": ƒ bound exampleFunction() {},
} = (inspectedElement: any).props; "preview_long": ƒ bound exampleFunction() {},
},
expect(anonymous_fn[meta.inspectable]).toBe(false); "data_view": Dehydrated {
expect(anonymous_fn[meta.name]).toBe('function'); "preview_short": DataView(3),
expect(anonymous_fn[meta.type]).toBe('function'); "preview_long": DataView(3),
expect(anonymous_fn[meta.preview_long]).toBe('ƒ () {}'); },
expect(anonymous_fn[meta.preview_short]).toBe('ƒ () {}'); "date": Dehydrated {
"preview_short": Tue Dec 31 2019 23:42:42 GMT+0000 (Coordinated Universal Time),
expect(array_buffer[meta.size]).toBe(3); "preview_long": Tue Dec 31 2019 23:42:42 GMT+0000 (Coordinated Universal Time),
expect(array_buffer[meta.inspectable]).toBe(false); },
expect(array_buffer[meta.name]).toBe('ArrayBuffer'); "fn": Dehydrated {
expect(array_buffer[meta.type]).toBe('array_buffer'); "preview_short": ƒ exampleFunction() {},
expect(array_buffer[meta.preview_short]).toBe('ArrayBuffer(3)'); "preview_long": ƒ exampleFunction() {},
expect(array_buffer[meta.preview_long]).toBe('ArrayBuffer(3)'); },
"html_element": Dehydrated {
expect(array_of_arrays[0][meta.size]).toBe(2); "preview_short": <div />,
expect(array_of_arrays[0][meta.inspectable]).toBe(true); "preview_long": <div />,
expect(array_of_arrays[0][meta.name]).toBe('Array'); },
expect(array_of_arrays[0][meta.type]).toBe('array'); "immutable": Object {
expect(array_of_arrays[0][meta.preview_long]).toBe('[Array(3), Array(0)]'); "0": Dehydrated {
expect(array_of_arrays[0][meta.preview_short]).toBe('Array(2)'); "preview_short": Array(2),
"preview_long": ["a", List(3)],
expect(big_int[meta.inspectable]).toBe(false); },
expect(big_int[meta.name]).toBe('123'); "1": Dehydrated {
expect(big_int[meta.type]).toBe('bigint'); "preview_short": Array(2),
expect(big_int[meta.preview_long]).toBe('123n'); "preview_long": ["b", 123],
expect(big_int[meta.preview_short]).toBe('123n'); },
"2": Dehydrated {
expect(bound_fn[meta.inspectable]).toBe(false); "preview_short": Array(2),
expect(bound_fn[meta.name]).toBe('bound exampleFunction'); "preview_long": ["c", Map(2)],
expect(bound_fn[meta.type]).toBe('function'); },
expect(bound_fn[meta.preview_long]).toBe('ƒ bound exampleFunction() {}'); },
expect(bound_fn[meta.preview_short]).toBe('ƒ bound exampleFunction() {}'); "map": Object {
"0": Dehydrated {
expect(data_view[meta.size]).toBe(3); "preview_short": Array(2),
expect(data_view[meta.inspectable]).toBe(false); "preview_long": ["name", "Brian"],
expect(data_view[meta.name]).toBe('DataView'); },
expect(data_view[meta.type]).toBe('data_view'); "1": Dehydrated {
expect(data_view[meta.preview_long]).toBe('DataView(3)'); "preview_short": Array(2),
expect(data_view[meta.preview_short]).toBe('DataView(3)'); "preview_long": ["food", "sushi"],
},
expect(date[meta.inspectable]).toBe(false); },
expect(date[meta.type]).toBe('date'); "map_of_maps": Object {
expect(new Date(date[meta.preview_long]).toISOString()).toBe( "0": Dehydrated {
exampleDateISO, "preview_short": Array(2),
); "preview_long": ["first", Map(2)],
expect(new Date(date[meta.preview_short]).toISOString()).toBe( },
exampleDateISO, "1": Dehydrated {
); "preview_short": Array(2),
"preview_long": ["second", Map(2)],
expect(fn[meta.inspectable]).toBe(false); },
expect(fn[meta.name]).toBe('exampleFunction'); },
expect(fn[meta.type]).toBe('function'); "object_of_objects": Object {
expect(fn[meta.preview_long]).toBe('ƒ exampleFunction() {}'); "inner": Dehydrated {
expect(fn[meta.preview_short]).toBe('ƒ exampleFunction() {}'); "preview_short": {},
"preview_long": {boolean: true, number: 123, string: "abc"},
expect(html_element[meta.inspectable]).toBe(false); },
expect(html_element[meta.name]).toBe('DIV'); },
expect(html_element[meta.type]).toBe('html_element'); "object_with_symbol": Object {
expect(html_element[meta.preview_long]).toBe('<div />'); "Symbol(name)": "hello",
expect(html_element[meta.preview_short]).toBe('<div />'); },
"proxy": Dehydrated {
expect(immutable[meta.inspectable]).toBeUndefined(); // Complex type "preview_short": ƒ () {},
expect(immutable[meta.name]).toBe('Map'); "preview_long": ƒ () {},
expect(immutable[meta.type]).toBe('iterator'); },
expect(immutable[meta.preview_long]).toBe( "react_element": Dehydrated {
'Map(3) {"a" => List(3), "b" => 123, "c" => Map(2)}', "preview_short": <span />,
); "preview_long": <span />,
expect(immutable[meta.preview_short]).toBe('Map(3)'); },
"regexp": Dehydrated {
expect(map[meta.inspectable]).toBeUndefined(); // Complex type "preview_short": /abc/giu,
expect(map[meta.name]).toBe('Map'); "preview_long": /abc/giu,
expect(map[meta.type]).toBe('iterator'); },
expect(map[0][meta.type]).toBe('array'); "set": Object {
expect(map[meta.preview_long]).toBe( "0": "abc",
'Map(2) {"name" => "Brian", "food" => "sushi"}', "1": 123,
); },
expect(map[meta.preview_short]).toBe('Map(2)'); "set_of_sets": Object {
"0": Dehydrated {
expect(map_of_maps[meta.inspectable]).toBeUndefined(); // Complex type "preview_short": Set(3),
expect(map_of_maps[meta.name]).toBe('Map'); "preview_long": Set(3) {"a", "b", "c"},
expect(map_of_maps[meta.type]).toBe('iterator'); },
expect(map_of_maps[0][meta.type]).toBe('array'); "1": Dehydrated {
expect(map_of_maps[meta.preview_long]).toBe( "preview_short": Set(3),
'Map(2) {"first" => Map(2), "second" => Map(2)}', "preview_long": Set(3) {1, 2, 3},
); },
expect(map_of_maps[meta.preview_short]).toBe('Map(2)'); },
"symbol": Dehydrated {
expect(object_of_objects.inner[meta.size]).toBe(3); "preview_short": Symbol(symbol),
expect(object_of_objects.inner[meta.inspectable]).toBe(true); "preview_long": Symbol(symbol),
expect(object_of_objects.inner[meta.name]).toBe(''); },
expect(object_of_objects.inner[meta.type]).toBe('object'); "typed_array": Object {
expect(object_of_objects.inner[meta.preview_long]).toBe( "0": 100,
'{boolean: true, number: 123, string: "abc"}', "1": -100,
); "2": 0,
expect(object_of_objects.inner[meta.preview_short]).toBe('{…}'); },
}
expect(object_with_symbol['Symbol(name)']).toBe('hello'); `);
expect(proxy[meta.inspectable]).toBe(false);
expect(proxy[meta.name]).toBe('function');
expect(proxy[meta.type]).toBe('function');
expect(proxy[meta.preview_long]).toBe('ƒ () {}');
expect(proxy[meta.preview_short]).toBe('ƒ () {}');
expect(react_element[meta.inspectable]).toBe(false);
expect(react_element[meta.name]).toBe('span');
expect(react_element[meta.type]).toBe('react_element');
expect(react_element[meta.preview_long]).toBe('<span />');
expect(react_element[meta.preview_short]).toBe('<span />');
expect(regexp[meta.inspectable]).toBe(false);
expect(regexp[meta.name]).toBe('/abc/giu');
expect(regexp[meta.preview_long]).toBe('/abc/giu');
expect(regexp[meta.preview_short]).toBe('/abc/giu');
expect(regexp[meta.type]).toBe('regexp');
expect(set[meta.inspectable]).toBeUndefined(); // Complex type
expect(set[meta.name]).toBe('Set');
expect(set[meta.type]).toBe('iterator');
expect(set[0]).toBe('abc');
expect(set[1]).toBe(123);
expect(set[meta.preview_long]).toBe('Set(2) {"abc", 123}');
expect(set[meta.preview_short]).toBe('Set(2)');
expect(set_of_sets[meta.inspectable]).toBeUndefined(); // Complex type
expect(set_of_sets[meta.name]).toBe('Set');
expect(set_of_sets[meta.type]).toBe('iterator');
expect(set_of_sets['0'][meta.inspectable]).toBe(true);
expect(set_of_sets[meta.preview_long]).toBe('Set(2) {Set(3), Set(3)}');
expect(set_of_sets[meta.preview_short]).toBe('Set(2)');
expect(symbol[meta.inspectable]).toBe(false);
expect(symbol[meta.name]).toBe('Symbol(symbol)');
expect(symbol[meta.type]).toBe('symbol');
expect(symbol[meta.preview_long]).toBe('Symbol(symbol)');
expect(symbol[meta.preview_short]).toBe('Symbol(symbol)');
expect(typed_array[meta.inspectable]).toBeUndefined(); // Complex type
expect(typed_array[meta.size]).toBe(3);
expect(typed_array[meta.name]).toBe('Int8Array');
expect(typed_array[meta.type]).toBe('typed_array');
expect(typed_array[0]).toBe(100);
expect(typed_array[1]).toBe(-100);
expect(typed_array[2]).toBe(0);
expect(typed_array[meta.preview_long]).toBe('Int8Array(3) [100, -100, 0]');
expect(typed_array[meta.preview_short]).toBe('Int8Array(3)');
}); });
it('should not consume iterables while inspecting', async () => { it('should not consume iterables while inspecting', async () => {
@ -725,13 +676,14 @@ describe('InspectedElement', () => {
); );
const inspectedElement = await inspectElementAtIndex(0); const inspectedElement = await inspectElementAtIndex(0);
expect(inspectedElement.props).toMatchInlineSnapshot(`
const {prop} = (inspectedElement: any).props; Object {
expect(prop[meta.inspectable]).toBe(false); "prop": Dehydrated {
expect(prop[meta.name]).toBe('Generator'); "preview_short": Generator,
expect(prop[meta.type]).toBe('opaque_iterator'); "preview_long": Generator,
expect(prop[meta.preview_long]).toBe('Generator'); },
expect(prop[meta.preview_short]).toBe('Generator'); }
`);
}); });
it('should support objects with no prototype', async () => { it('should support objects with no prototype', async () => {
@ -774,10 +726,14 @@ describe('InspectedElement', () => {
const inspectedElement = await inspectElementAtIndex(0); const inspectedElement = await inspectElementAtIndex(0);
// TRICKY: Don't use toMatchInlineSnapshot() for this test! expect(inspectedElement.props).toMatchInlineSnapshot(`
// Our snapshot serializer relies on hasOwnProperty() for feature detection. Object {
expect(inspectedElement.props.object.name).toBe('blah'); "object": Object {
expect(inspectedElement.props.object.hasOwnProperty).toBe(true); "hasOwnProperty": true,
"name": "blah",
},
}
`);
}); });
it('should support custom objects with enumerable properties and getters', async () => { it('should support custom objects with enumerable properties and getters', async () => {
@ -1834,8 +1790,8 @@ describe('InspectedElement', () => {
ReactDOM.render(<DisplayedComplexValue />, container), ReactDOM.render(<DisplayedComplexValue />, container),
); );
const inspectedElement = await inspectElementAtIndex(0); const {hooks} = await inspectElementAtIndex(0);
expect(inspectedElement.hooks).toMatchInlineSnapshot(` expect(hooks).toMatchInlineSnapshot(`
Array [ Array [
Object { Object {
"id": null, "id": null,

View File

@ -1,12 +1,20 @@
// test() is part of Jest's serializer API // test() is part of Jest's serializer API
export function test(maybeInspectedElement) { export function test(maybeInspectedElement) {
if (
maybeInspectedElement === null ||
typeof maybeInspectedElement !== 'object'
) {
return false;
}
const hasOwnProperty = Object.prototype.hasOwnProperty.bind(
maybeInspectedElement,
);
return ( return (
maybeInspectedElement !== null && hasOwnProperty('canEditFunctionProps') &&
typeof maybeInspectedElement === 'object' && hasOwnProperty('canEditHooks') &&
maybeInspectedElement.hasOwnProperty('canEditFunctionProps') && hasOwnProperty('canToggleSuspense') &&
maybeInspectedElement.hasOwnProperty('canEditHooks') && hasOwnProperty('canViewSource')
maybeInspectedElement.hasOwnProperty('canToggleSuspense') &&
maybeInspectedElement.hasOwnProperty('canViewSource')
); );
} }

View File

@ -207,133 +207,119 @@ describe('InspectedElementContext', () => {
const id = ((store.getElementIDAtIndex(0): any): number); const id = ((store.getElementIDAtIndex(0): any): number);
const inspectedElement = await read(id); const inspectedElement = await read(id);
const { expect(inspectedElement.props).toMatchInlineSnapshot(`
anonymous_fn, Object {
array_buffer, "anonymous_fn": Dehydrated {
array_of_arrays, "preview_short": ƒ () {},
big_int, "preview_long": ƒ () {},
bound_fn, },
data_view, "array_buffer": Dehydrated {
date, "preview_short": ArrayBuffer(3),
fn, "preview_long": ArrayBuffer(3),
html_element, },
immutable, "array_of_arrays": Array [
map, Dehydrated {
map_of_maps, "preview_short": Array(2),
object_of_objects, "preview_long": [Array(3), Array(0)],
react_element, },
regexp, ],
set, "big_int": Dehydrated {
set_of_sets, "preview_short": 123n,
symbol, "preview_long": 123n,
typed_array, },
} = inspectedElement.props; "bound_fn": Dehydrated {
"preview_short": ƒ bound exampleFunction() {},
const {meta} = require('react-devtools-shared/src/hydration'); "preview_long": ƒ bound exampleFunction() {},
},
expect(anonymous_fn[meta.inspectable]).toBe(false); "data_view": Dehydrated {
expect(anonymous_fn[meta.name]).toBe('function'); "preview_short": DataView(3),
expect(anonymous_fn[meta.type]).toBe('function'); "preview_long": DataView(3),
expect(anonymous_fn[meta.preview_long]).toBe('ƒ () {}'); },
expect(anonymous_fn[meta.preview_short]).toBe('ƒ () {}'); "date": Dehydrated {
"preview_short": Thu Jan 01 1970 00:00:00 GMT+0000 (Coordinated Universal Time),
expect(array_buffer[meta.size]).toBe(3); "preview_long": Thu Jan 01 1970 00:00:00 GMT+0000 (Coordinated Universal Time),
expect(array_buffer[meta.inspectable]).toBe(false); },
expect(array_buffer[meta.name]).toBe('ArrayBuffer'); "fn": Dehydrated {
expect(array_buffer[meta.type]).toBe('array_buffer'); "preview_short": ƒ exampleFunction() {},
expect(array_buffer[meta.preview_short]).toBe('ArrayBuffer(3)'); "preview_long": ƒ exampleFunction() {},
expect(array_buffer[meta.preview_long]).toBe('ArrayBuffer(3)'); },
"html_element": Dehydrated {
expect(array_of_arrays[0][meta.size]).toBe(2); "preview_short": <div />,
expect(array_of_arrays[0][meta.inspectable]).toBe(true); "preview_long": <div />,
expect(array_of_arrays[0][meta.name]).toBe('Array'); },
expect(array_of_arrays[0][meta.type]).toBe('array'); "immutable": Object {
expect(array_of_arrays[0][meta.preview_long]).toBe('[Array(3), Array(0)]'); "0": Dehydrated {
expect(array_of_arrays[0][meta.preview_short]).toBe('Array(2)'); "preview_short": Array(2),
"preview_long": ["a", List(3)],
expect(big_int[meta.inspectable]).toBe(false); },
expect(big_int[meta.name]).toBe('123'); "1": Dehydrated {
expect(big_int[meta.type]).toBe('bigint'); "preview_short": Array(2),
"preview_long": ["b", 123],
expect(bound_fn[meta.inspectable]).toBe(false); },
expect(bound_fn[meta.name]).toBe('bound exampleFunction'); "2": Dehydrated {
expect(bound_fn[meta.type]).toBe('function'); "preview_short": Array(2),
expect(bound_fn[meta.preview_long]).toBe('ƒ bound exampleFunction() {}'); "preview_long": ["c", Map(2)],
expect(bound_fn[meta.preview_short]).toBe('ƒ bound exampleFunction() {}'); },
},
expect(data_view[meta.size]).toBe(3); "map": Object {
expect(data_view[meta.inspectable]).toBe(false); "0": Dehydrated {
expect(data_view[meta.name]).toBe('DataView'); "preview_short": Array(2),
expect(data_view[meta.type]).toBe('data_view'); "preview_long": ["name", "Brian"],
},
expect(date[meta.inspectable]).toBe(false); "1": Dehydrated {
expect(date[meta.type]).toBe('date'); "preview_short": Array(2),
"preview_long": ["food", "sushi"],
expect(fn[meta.inspectable]).toBe(false); },
expect(fn[meta.name]).toBe('exampleFunction'); },
expect(fn[meta.type]).toBe('function'); "map_of_maps": Object {
expect(fn[meta.preview_long]).toBe('ƒ exampleFunction() {}'); "0": Dehydrated {
expect(fn[meta.preview_short]).toBe('ƒ exampleFunction() {}'); "preview_short": Array(2),
"preview_long": ["first", Map(2)],
expect(html_element[meta.inspectable]).toBe(false); },
expect(html_element[meta.name]).toBe('DIV'); "1": Dehydrated {
expect(html_element[meta.type]).toBe('html_element'); "preview_short": Array(2),
"preview_long": ["second", Map(2)],
expect(immutable[meta.inspectable]).toBeUndefined(); // Complex type },
expect(immutable[meta.name]).toBe('Map'); },
expect(immutable[meta.type]).toBe('iterator'); "object_of_objects": Object {
"inner": Dehydrated {
expect(map[meta.inspectable]).toBeUndefined(); // Complex type "preview_short": {},
expect(map[meta.name]).toBe('Map'); "preview_long": {boolean: true, number: 123, string: "abc"},
expect(map[meta.type]).toBe('iterator'); },
expect(map[0][meta.type]).toBe('array'); },
"react_element": Dehydrated {
expect(map_of_maps[meta.inspectable]).toBeUndefined(); // Complex type "preview_short": <span />,
expect(map_of_maps[meta.name]).toBe('Map'); "preview_long": <span />,
expect(map_of_maps[meta.type]).toBe('iterator'); },
expect(map_of_maps[0][meta.type]).toBe('array'); "regexp": Dehydrated {
"preview_short": /abc/giu,
expect(object_of_objects.inner[meta.size]).toBe(3); "preview_long": /abc/giu,
expect(object_of_objects.inner[meta.inspectable]).toBe(true); },
expect(object_of_objects.inner[meta.name]).toBe(''); "set": Object {
expect(object_of_objects.inner[meta.type]).toBe('object'); "0": "abc",
expect(object_of_objects.inner[meta.preview_long]).toBe( "1": 123,
'{boolean: true, number: 123, string: "abc"}', },
); "set_of_sets": Object {
expect(object_of_objects.inner[meta.preview_short]).toBe('{…}'); "0": Dehydrated {
"preview_short": Set(3),
expect(react_element[meta.inspectable]).toBe(false); "preview_long": Set(3) {"a", "b", "c"},
expect(react_element[meta.name]).toBe('span'); },
expect(react_element[meta.type]).toBe('react_element'); "1": Dehydrated {
"preview_short": Set(3),
expect(regexp[meta.inspectable]).toBe(false); "preview_long": Set(3) {1, 2, 3},
expect(regexp[meta.name]).toBe('/abc/giu'); },
expect(regexp[meta.preview_long]).toBe('/abc/giu'); },
expect(regexp[meta.preview_short]).toBe('/abc/giu'); "symbol": Dehydrated {
expect(regexp[meta.type]).toBe('regexp'); "preview_short": Symbol(symbol),
"preview_long": Symbol(symbol),
expect(set[meta.inspectable]).toBeUndefined(); // Complex type },
expect(set[meta.name]).toBe('Set'); "typed_array": Object {
expect(set[meta.type]).toBe('iterator'); "0": 100,
expect(set[0]).toBe('abc'); "1": -100,
expect(set[1]).toBe(123); "2": 0,
},
expect(set_of_sets[meta.inspectable]).toBeUndefined(); // Complex type }
expect(set_of_sets[meta.name]).toBe('Set'); `);
expect(set_of_sets[meta.type]).toBe('iterator');
expect(set_of_sets['0'][meta.inspectable]).toBe(true);
expect(symbol[meta.inspectable]).toBe(false);
expect(symbol[meta.name]).toBe('Symbol(symbol)');
expect(symbol[meta.type]).toBe('symbol');
expect(typed_array[meta.inspectable]).toBeUndefined(); // Complex type
expect(typed_array[meta.size]).toBe(3);
expect(typed_array[meta.name]).toBe('Int8Array');
expect(typed_array[meta.type]).toBe('typed_array');
expect(typed_array[0]).toBe(100);
expect(typed_array[1]).toBe(-100);
expect(typed_array[2]).toBe(0);
}); });
it('should support objects with no prototype', async () => { it('should support objects with no prototype', async () => {

View File

@ -6,11 +6,12 @@ export function test(maybeState) {
return false; return false;
} }
const hasOwnProperty = Object.prototype.hasOwnProperty.bind(maybeState);
// Duck typing at its finest. // Duck typing at its finest.
return ( return (
maybeState.hasOwnProperty('inspectedElementID') && hasOwnProperty('inspectedElementID') &&
maybeState.hasOwnProperty('ownerFlatTree') && hasOwnProperty('ownerFlatTree') &&
maybeState.hasOwnProperty('ownerSubtreeLeafElementID') hasOwnProperty('ownerSubtreeLeafElementID')
); );
} }

View File

@ -1,6 +1,7 @@
'use strict'; 'use strict';
module.exports = { module.exports = {
globalSetup: require.resolve('./setupGlobal.js'),
haste: { haste: {
hasteImplModulePath: require.resolve('./noHaste.js'), hasteImplModulePath: require.resolve('./noHaste.js'),
}, },

View File

@ -0,0 +1,7 @@
/* eslint-disable */
module.exports = () => {
// can use beforeEach/afterEach or setupEnvironment.js in node >= 13: https://github.com/nodejs/node/pull/20026
// jest's `setupFiles` is too late: https://stackoverflow.com/a/56482581/3406963
process.env.TZ = 'UTC';
};