/** * Copyright (c) Meta Platforms, Inc. and 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 ReactNoop; let waitForAll; // This is a new feature in Fiber so I put it in its own test file. It could // probably move to one of the other test files once it is official. describe('ReactTopLevelFragment', function () { beforeEach(function () { jest.resetModules(); React = require('react'); ReactNoop = require('react-noop-renderer'); const InternalTestUtils = require('internal-test-utils'); waitForAll = InternalTestUtils.waitForAll; }); it('should render a simple fragment at the top of a component', async function () { function Fragment() { return [
Hello
,
World
]; } ReactNoop.render(); await waitForAll([]); }); it('should preserve state when switching from a single child', async function () { let instance = null; class Stateful extends React.Component { render() { instance = this; return
Hello
; } } function Fragment({condition}) { return condition ? ( ) : ( [,
World
] ); } ReactNoop.render(); await waitForAll([]); const instanceA = instance; expect(instanceA).not.toBe(null); ReactNoop.render(); await waitForAll([]); const instanceB = instance; expect(instanceB).toBe(instanceA); }); it('should not preserve state when switching to a nested array', async function () { let instance = null; class Stateful extends React.Component { render() { instance = this; return
Hello
; } } function Fragment({condition}) { return condition ? ( ) : ( [[,
World
],
] ); } ReactNoop.render(); await waitForAll([]); const instanceA = instance; expect(instanceA).not.toBe(null); ReactNoop.render(); await waitForAll([]); const instanceB = instance; expect(instanceB).not.toBe(instanceA); }); it('preserves state if an implicit key slot switches from/to null', async function () { let instance = null; class Stateful extends React.Component { render() { instance = this; return
World
; } } function Fragment({condition}) { return condition ? [null, ] : [
Hello
, ]; } ReactNoop.render(); await waitForAll([]); const instanceA = instance; expect(instanceA).not.toBe(null); ReactNoop.render(); await waitForAll([]); const instanceB = instance; expect(instanceB).toBe(instanceA); ReactNoop.render(); await waitForAll([]); const instanceC = instance; expect(instanceC === instanceA).toBe(true); }); it('should preserve state in a reorder', async function () { let instance = null; class Stateful extends React.Component { render() { instance = this; return
Hello
; } } function Fragment({condition}) { return condition ? [[
World
, ]] : [[,
World
],
]; } ReactNoop.render(); await waitForAll([]); const instanceA = instance; expect(instanceA).not.toBe(null); ReactNoop.render(); await waitForAll([]); const instanceB = instance; expect(instanceB).toBe(instanceA); }); });