@@ -33,12 +33,16 @@ const ReactTestRenderer = require('react-test-renderer');
3333
3434// Isolate the noop renderer
3535jest . resetModules ( ) ;
36+ const ReactNoop = require ( 'react-noop-renderer' ) ;
37+ const Scheduler = require ( 'scheduler' ) ;
3638
3739let Group ;
3840let Shape ;
3941let Surface ;
4042let TestComponent ;
4143
44+ let waitFor ;
45+
4246const Missing = { } ;
4347
4448function testDOMNodeStructure ( domNode , expectedStructure ) {
@@ -76,6 +80,8 @@ describe('ReactART', () => {
7680 Shape = ReactART . Shape ;
7781 Surface = ReactART . Surface ;
7882
83+ ( { waitFor} = require ( 'internal-test-utils' ) ) ;
84+
7985 TestComponent = class extends React . Component {
8086 group = React . createRef ( ) ;
8187
@@ -357,6 +363,58 @@ describe('ReactART', () => {
357363 doClick ( instance ) ;
358364 expect ( onClick2 ) . toBeCalled ( ) ;
359365 } ) ;
366+
367+ // @gate !enableSyncDefaultUpdates
368+ it ( 'can concurrently render with a "primary" renderer while sharing context' , async ( ) => {
369+ const CurrentRendererContext = React . createContext ( null ) ;
370+
371+ function Yield ( props ) {
372+ Scheduler . log ( props . value ) ;
373+ return null ;
374+ }
375+
376+ let ops = [ ] ;
377+ function LogCurrentRenderer ( ) {
378+ return (
379+ < CurrentRendererContext . Consumer >
380+ { currentRenderer => {
381+ ops . push ( currentRenderer ) ;
382+ return null ;
383+ } }
384+ </ CurrentRendererContext . Consumer >
385+ ) ;
386+ }
387+
388+ // Using test renderer instead of the DOM renderer here because async
389+ // testing APIs for the DOM renderer don't exist.
390+ ReactNoop . render (
391+ < CurrentRendererContext . Provider value = "Test" >
392+ < Yield value = "A" />
393+ < Yield value = "B" />
394+ < LogCurrentRenderer />
395+ < Yield value = "C" />
396+ </ CurrentRendererContext . Provider > ,
397+ ) ;
398+
399+ await waitFor ( [ 'A' ] ) ;
400+
401+ ReactDOM . render (
402+ < Surface >
403+ < LogCurrentRenderer />
404+ < CurrentRendererContext . Provider value = "ART" >
405+ < LogCurrentRenderer />
406+ </ CurrentRendererContext . Provider >
407+ </ Surface > ,
408+ container ,
409+ ) ;
410+
411+ expect ( ops ) . toEqual ( [ null , 'ART' ] ) ;
412+
413+ ops = [ ] ;
414+ await waitFor ( [ 'B' , 'C' ] ) ;
415+
416+ expect ( ops ) . toEqual ( [ 'Test' ] ) ;
417+ } ) ;
360418} ) ;
361419
362420describe ( 'ReactARTComponents' , ( ) => {
0 commit comments