Skip to content
Merged
Prev Previous commit
Next Next commit
Add scaffolding for importing an inlined renderer
  • Loading branch information
gaearon committed May 18, 2018
commit cb2548e99cebd58f2ef9687d4ce47ced9deb8285
7 changes: 1 addition & 6 deletions packages/react-art/src/ReactART.js
Original file line number Diff line number Diff line change
Expand Up @@ -6,12 +6,11 @@
*/

import React from 'react';
import ReactFiberReconciler from 'react-reconciler';
import ARTRenderer from 'react-reconciler/inline';
import Transform from 'art/core/transform';
import Mode from 'art/modes/current';
import FastNoSideEffects from 'art/modes/fast-noSideEffects';

import ReactARTHostConfig from './ReactARTHostConfig';
import {TYPES, childrenAsString} from './ReactARTInternals';

Mode.setCurrent(
Expand Down Expand Up @@ -132,10 +131,6 @@ class Text extends React.Component {
}
}

/** ART Renderer */

const ARTRenderer = ReactFiberReconciler(ReactARTHostConfig);

/** API */

export const ClippingRectangle = TYPES.CLIPPING_RECTANGLE;
Expand Down
36 changes: 20 additions & 16 deletions packages/react-art/src/__tests__/ReactART-test.js
Original file line number Diff line number Diff line change
Expand Up @@ -15,22 +15,26 @@ const React = require('react');
const ReactDOM = require('react-dom');
const ReactTestUtils = require('react-dom/test-utils');

let Group;
let Shape;
let Surface;
let TestComponent;

const Missing = {};
// Isolate test renderer.
jest.resetModules();
const ReactTestRenderer = require('react-test-renderer');

// Isolate ART renderer.
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

It's unfortunate that forgetting to do this causes a totally non-obvious (to me) failure:
screen shot 2018-05-18 at 2 24 12 pm

I guess this is the only test where we need to do this though?

Copy link
Collaborator Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Yeah. But good point. I think we might want to try to fail early although I’m not yet sure how.

jest.resetModules();
const ReactART = require('react-art');
const ARTSVGMode = require('art/modes/svg');
const ARTCurrentMode = require('art/modes/current');

const renderer = require('react-test-renderer');
const Circle = require('react-art/Circle');
const Rectangle = require('react-art/Rectangle');
const Wedge = require('react-art/Wedge');

let Group;
let Shape;
let Surface;
let TestComponent;

const Missing = {};

function testDOMNodeStructure(domNode, expectedStructure) {
expect(domNode).toBeDefined();
expect(domNode.nodeName).toBe(expectedStructure.nodeName);
Expand Down Expand Up @@ -362,7 +366,7 @@ describe('ReactART', () => {

// Using test renderer instead of the DOM renderer here because async
// testing APIs for the DOM renderer don't exist.
const testRenderer = renderer.create(
const testRenderer = ReactTestRenderer.create(
<CurrentRendererContext.Provider value="Test">
<Yield value="A" />
<Yield value="B" />
Expand Down Expand Up @@ -397,15 +401,15 @@ describe('ReactART', () => {

describe('ReactARTComponents', () => {
it('should generate a <Shape> with props for drawing the Circle', () => {
const circle = renderer.create(
const circle = ReactTestRenderer.create(
<Circle radius={10} stroke="green" strokeWidth={3} fill="blue" />,
);
expect(circle.toJSON()).toMatchSnapshot();
});

it('should warn if radius is missing on a Circle component', () => {
expect(() =>
renderer.create(<Circle stroke="green" strokeWidth={3} fill="blue" />),
ReactTestRenderer.create(<Circle stroke="green" strokeWidth={3} fill="blue" />),
).toWarnDev(
'Warning: Failed prop type: The prop `radius` is marked as required in `Circle`, ' +
'but its value is `undefined`.' +
Expand All @@ -414,15 +418,15 @@ describe('ReactARTComponents', () => {
});

it('should generate a <Shape> with props for drawing the Rectangle', () => {
const rectangle = renderer.create(
const rectangle = ReactTestRenderer.create(
<Rectangle width={50} height={50} stroke="green" fill="blue" />,
);
expect(rectangle.toJSON()).toMatchSnapshot();
});

it('should warn if width/height is missing on a Rectangle component', () => {
expect(() =>
renderer.create(<Rectangle stroke="green" fill="blue" />),
ReactTestRenderer.create(<Rectangle stroke="green" fill="blue" />),
).toWarnDev([
'Warning: Failed prop type: The prop `width` is marked as required in `Rectangle`, ' +
'but its value is `undefined`.' +
Expand All @@ -434,21 +438,21 @@ describe('ReactARTComponents', () => {
});

it('should generate a <Shape> with props for drawing the Wedge', () => {
const wedge = renderer.create(
const wedge = ReactTestRenderer.create(
<Wedge outerRadius={50} startAngle={0} endAngle={360} fill="blue" />,
);
expect(wedge.toJSON()).toMatchSnapshot();
});

it('should return null if startAngle equals to endAngle on Wedge', () => {
const wedge = renderer.create(
const wedge = ReactTestRenderer.create(
<Wedge outerRadius={50} startAngle={0} endAngle={0} fill="blue" />,
);
expect(wedge.toJSON()).toBeNull();
});

it('should warn if outerRadius/startAngle/endAngle is missing on a Wedge component', () => {
expect(() => renderer.create(<Wedge fill="blue" />)).toWarnDev([
expect(() => ReactTestRenderer.create(<Wedge fill="blue" />)).toWarnDev([
'Warning: Failed prop type: The prop `outerRadius` is marked as required in `Wedge`, ' +
'but its value is `undefined`.' +
'\n in Wedge (at **)',
Expand Down
5 changes: 1 addition & 4 deletions packages/react-dom/src/client/ReactDOM.js
Original file line number Diff line number Diff line change
Expand Up @@ -19,7 +19,7 @@ import type {Container} from './ReactDOMHostConfig';
import '../shared/checkReact';
import './ReactDOMClientInjection';

import ReactFiberReconciler from 'react-reconciler';
import DOMRenderer from 'react-reconciler/inline';
import * as ReactPortal from 'shared/ReactPortal';
import ExecutionEnvironment from 'fbjs/lib/ExecutionEnvironment';
import * as ReactGenericBatching from 'events/ReactGenericBatching';
Expand All @@ -35,7 +35,6 @@ import invariant from 'fbjs/lib/invariant';
import lowPriorityWarning from 'shared/lowPriorityWarning';
import warning from 'fbjs/lib/warning';

import ReactDOMHostConfig from './ReactDOMHostConfig';
import * as ReactDOMComponentTree from './ReactDOMComponentTree';
import * as ReactDOMFiberComponent from './ReactDOMFiberComponent';
import * as ReactDOMEventListener from '../events/ReactDOMEventListener';
Expand Down Expand Up @@ -447,8 +446,6 @@ function shouldHydrateDueToLegacyHeuristic(container) {
);
}

const DOMRenderer = ReactFiberReconciler(ReactDOMHostConfig);

ReactGenericBatching.injection.injectRenderer(DOMRenderer);

let warnedAboutHydrateAPI = false;
Expand Down
3 changes: 2 additions & 1 deletion packages/react-native-renderer/src/ReactFabric.js
Original file line number Diff line number Diff line change
Expand Up @@ -12,14 +12,15 @@ import type {ReactNodeList} from 'shared/ReactTypes';

import './ReactFabricInjection';

import ReactFabricRenderer from 'react-reconciler/inline';

import * as ReactPortal from 'shared/ReactPortal';
import * as ReactGenericBatching from 'events/ReactGenericBatching';
import ReactVersion from 'shared/ReactVersion';

import NativeMethodsMixin from './NativeMethodsMixin';
import ReactNativeComponent from './ReactNativeComponent';
import * as ReactNativeComponentTree from './ReactNativeComponentTree';
import ReactFabricRenderer from './ReactFabricRenderer';
import {getInspectorDataForViewTag} from './ReactNativeFiberInspector';

import {ReactCurrentOwner} from 'shared/ReactGlobalSharedState';
Expand Down
15 changes: 0 additions & 15 deletions packages/react-native-renderer/src/ReactFabricRenderer.js

This file was deleted.

4 changes: 1 addition & 3 deletions packages/react-native-renderer/src/ReactNativeRenderer.js
Original file line number Diff line number Diff line change
Expand Up @@ -12,7 +12,7 @@ import type {ReactNodeList} from 'shared/ReactTypes';

import './ReactNativeInjection';

import ReactFiberReconciler from 'react-reconciler';
import ReactNativeFiberRenderer from 'react-reconciler/inline';
import * as ReactPortal from 'shared/ReactPortal';
import * as ReactGenericBatching from 'events/ReactGenericBatching';
import ReactVersion from 'shared/ReactVersion';
Expand All @@ -31,8 +31,6 @@ import {ReactCurrentOwner} from 'shared/ReactGlobalSharedState';
import getComponentName from 'shared/getComponentName';
import warning from 'fbjs/lib/warning';

const ReactNativeFiberRenderer = ReactFiberReconciler(ReactNativeHostConfig);

const findHostInstance = ReactNativeFiberRenderer.findHostInstance;

function findNodeHandle(componentOrHandle: any): ?number {
Expand Down
1 change: 1 addition & 0 deletions packages/react-reconciler/inline.js
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
// TODO
4 changes: 1 addition & 3 deletions packages/react-test-renderer/src/ReactTestRenderer.js
Original file line number Diff line number Diff line change
Expand Up @@ -11,7 +11,7 @@ import type {Fiber} from 'react-reconciler/src/ReactFiber';
import type {FiberRoot} from 'react-reconciler/src/ReactFiberRoot';
import type {Instance, TextInstance} from './ReactTestHostConfig';

import ReactFiberReconciler from 'react-reconciler';
import TestRenderer from 'react-reconciler/inline';
import {batchedUpdates} from 'events/ReactGenericBatching';
import {findCurrentFiberUsingSlowPath} from 'react-reconciler/reflection';
import {
Expand Down Expand Up @@ -54,8 +54,6 @@ type FindOptions = $Shape<{

export type Predicate = (node: ReactTestInstance) => ?boolean;

const TestRenderer = ReactFiberReconciler(ReactTestHostConfig);

const defaultTestOptions = {
createNodeMock: function() {
return null;
Expand Down
52 changes: 52 additions & 0 deletions scripts/jest/setupMocks.js
Original file line number Diff line number Diff line change
@@ -1,7 +1,59 @@
const obj = {};
jest.mock('fbjs/lib/emptyObject', () => obj);

jest.mock('react-reconciler', () => {
return (config) => {
jest.mock('react-reconciler/src/ReactFiberHostConfig', () => config);
return require.requireActual('react-reconciler');
};
});

jest.mock('react-test-renderer', () => {
jest.mock('react-reconciler/inline', () => {
jest.mock('react-reconciler/src/ReactFiberHostConfig',
() => require.requireActual('react-test-renderer/src/ReactTestHostConfig')
);
return require.requireActual('react-reconciler');
});
return require.requireActual('react-test-renderer');
});

jest.mock('react-dom', () => {
jest.mock('react-reconciler/inline', () => {
jest.mock('react-reconciler/src/ReactFiberHostConfig',
() => require.requireActual('react-dom/src/client/ReactDOMHostConfig')
);
return require.requireActual('react-reconciler');
});
return require.requireActual('react-dom');
});

jest.mock('react-art', () => {
jest.mock('react-reconciler/inline', () => {
jest.mock('react-reconciler/src/ReactFiberHostConfig',
() => require.requireActual('react-art/src/ReactARTHostConfig')
);
return require.requireActual('react-reconciler');
});
return require.requireActual('react-art');
});

jest.mock('react-native-renderer', () => {
jest.mock('react-reconciler/inline', () => {
jest.mock('react-reconciler/src/ReactFiberHostConfig',
() => require.requireActual('react-native-renderer/src/ReactNativeHostConfig')
);
return require.requireActual('react-reconciler');
});
return require.requireActual('react-native-renderer');
});

jest.mock('react-native-renderer/fabric', () => {
jest.mock('react-reconciler/inline', () => {
jest.mock('react-reconciler/src/ReactFiberHostConfig',
() => require.requireActual('react-native-renderer/src/ReactFabricHostConfig')
);
return require.requireActual('react-reconciler');
});
return require.requireActual('react-native-renderer/fabric');
});