/** * Copyright (c) Facebook, Inc. and its affiliates. * * This source code is licensed under the MIT license found in the * LICENSE file in the root directory of this source tree. * * @emails react-core * @jest-environment node */ 'use strict'; let React; let ReactNative; let createReactNativeComponentClass; let computeComponentStackForErrorReporting; function normalizeCodeLocInfo(str) { return str && str.replace(/\(at .+?:\d+\)/g, '(at **)'); } describe('ReactNativeError', () => { beforeEach(() => { jest.resetModules(); React = require('react'); ReactNative = require('react-native-renderer'); createReactNativeComponentClass = require('ReactNativeViewConfigRegistry') .register; computeComponentStackForErrorReporting = ReactNative.__SECRET_INTERNALS_DO_NOT_USE_OR_YOU_WILL_BE_FIRED .computeComponentStackForErrorReporting; }); it('should be able to extract a component stack from a native view', () => { const View = createReactNativeComponentClass('View', () => ({ validAttributes: {foo: true}, uiViewClassName: 'View', })); const ref = React.createRef(); function FunctionalComponent(props) { return props.children; } class ClassComponent extends React.Component { render() { return ( ); } } ReactNative.render(, 1); let reactTag = ReactNative.findNodeHandle(ref.current); let componentStack = normalizeCodeLocInfo( computeComponentStackForErrorReporting(reactTag), ); if (__DEV__) { expect(componentStack).toBe( '\n' + ' in View (at **)\n' + ' in FunctionalComponent (at **)\n' + ' in ClassComponent (at **)', ); } else { expect(componentStack).toBe( '\n' + ' in View\n' + ' in FunctionalComponent\n' + ' in ClassComponent', ); } }); });