@@ -14,13 +14,28 @@ const ReactDOMServerIntegrationUtils = require('./utils/ReactDOMServerIntegratio
1414let React ;
1515let ReactDOM ;
1616let ReactDOMServer ;
17+ let pure ;
18+ let yieldedValues ;
19+ let yieldValue ;
20+ let clearYields ;
1721
1822function initModules ( ) {
1923 // Reset warning cache.
2024 jest . resetModuleRegistry ( ) ;
2125 React = require ( 'react' ) ;
2226 ReactDOM = require ( 'react-dom' ) ;
2327 ReactDOMServer = require ( 'react-dom/server' ) ;
28+ pure = React . pure ;
29+
30+ yieldedValues = [ ] ;
31+ yieldValue = value => {
32+ yieldedValues . push ( value ) ;
33+ } ;
34+ clearYields = ( ) => {
35+ const ret = yieldedValues ;
36+ yieldedValues = [ ] ;
37+ return ret ;
38+ } ;
2439
2540 // Make them available to the helpers.
2641 return {
@@ -65,4 +80,57 @@ describe('ReactDOMServerIntegration', () => {
6580 expect ( div . tagName ) . toBe ( 'DIV' ) ;
6681 expect ( div . textContent ) . toBe ( 'Test' ) ;
6782 } ) ;
83+
84+ describe ( 'pure functional components' , ( ) => {
85+ beforeEach ( ( ) => {
86+ resetModules ( ) ;
87+ } ) ;
88+
89+ function Text ( { text} ) {
90+ yieldValue ( text ) ;
91+ return < span > { text } </ span > ;
92+ }
93+
94+ function Counter ( { count} ) {
95+ return < Text text = { 'Count: ' + count } /> ;
96+ }
97+
98+ itRenders ( 'basic render' , async render => {
99+ const PureCounter = pure ( Counter ) ;
100+ const domNode = await render ( < PureCounter count = { 0 } /> ) ;
101+ expect ( domNode . textContent ) . toEqual ( 'Count: 0' ) ;
102+ } ) ;
103+
104+ itRenders ( 'when a ref is passed' , async render => {
105+ const RefCounter = ( props , ref ) => < Counter count = { ref . current } /> ;
106+ const PureRefCounter = pure ( RefCounter ) ;
107+
108+ const ref = React . createRef ( ) ;
109+ ref . current = 0 ;
110+ await render ( < PureRefCounter ref = { ref } /> ) ;
111+
112+ expect ( clearYields ( ) ) . toEqual ( [ 'Count: 0' ] ) ;
113+ } ) ;
114+
115+ itRenders ( 'with comparator' , async render => {
116+ const PureCounter = pure ( Counter , ( oldProps , newProps ) => false ) ;
117+ await render ( < PureCounter count = { 0 } /> ) ;
118+ expect ( clearYields ( ) ) . toEqual ( [ 'Count: 0' ] ) ;
119+ } ) ;
120+
121+ itRenders (
122+ 'comparator functions are not invoked on the server' ,
123+ async render => {
124+ const PureCounter = pure ( Counter , ( oldProps , newProps ) => {
125+ yieldValue (
126+ `Old count: ${ oldProps . count } , New count: ${ newProps . count } ` ,
127+ ) ;
128+ return oldProps . count === newProps . count ;
129+ } ) ;
130+
131+ await render ( < PureCounter count = { 0 } /> ) ;
132+ expect ( clearYields ( ) ) . toEqual ( [ 'Count: 0' ] ) ;
133+ } ,
134+ ) ;
135+ } ) ;
68136} ) ;
0 commit comments