// @vitest-environment jsdom import { act, cleanup, render } from '@testing-library/react'; import React, { StrictMode } from 'react'; import { describe, expect, test } from 'vitest'; import { manage } from '../src'; import { auto, Component } from '../src/react'; describe('React strict mode', () => { let id = 0; class Bullet { public id: number; public speed = 10; public constructor() { this.id = id++; } } class Store { public bullets: { [key: number]: Bullet } = {}; } const testCases = [ { name: 'functional component', createComponents: () => { const BulletComponent = auto((props: { bullet: Bullet }) => { const { bullet } = props; return bullet.speed; }); const App = auto((props: { store: Store }) => { const { store } = props; return Object.values(store.bullets).map((bullet) => ( )); }); return { BulletComponent, App }; } }, { name: 'class component', createComponents: () => { class BulletComponent extends Component<{ bullet: Bullet }> { render() { const { bullet } = this.props; return bullet.speed; } } class App extends Component<{ store: Store }> { render() { const { store } = this.props; return Object.values(store.bullets).map((bullet) => ( )); } } return { BulletComponent, App }; } } ]; testCases.forEach(({ name, createComponents }) => { test(`Update children props - ${ name }`, async () => { let bulletCount = 0; let appCount = 0; const { App } = createComponents(); const store = manage(new Store()); store.bullets[0] = new Bullet(); render( ); appCount += 2; bulletCount += 2; expect(appCount).toBe(2); expect(bulletCount).toBe(2); act(() => { store.bullets[0].speed = 20; }); bulletCount += 2; expect(appCount).toBe(2); expect(bulletCount).toBe(4); act(() => { store.bullets[0].speed = 30; }); bulletCount += 2; expect(appCount).toBe(2); expect(bulletCount).toBe(6); act(() => { store.bullets[1] = new Bullet(); }); appCount += 2; bulletCount += 2; expect(appCount).toBe(4); expect(bulletCount).toBe(8); cleanup(); }); }); });