// @vitest-environment jsdom
import { act, cleanup, render } from '@testing-library/react';
import React from 'react';
import { describe, expect, test, afterEach } from 'vitest';
import { manage } from '../src';
import { auto, Component } from '../src/react';
let id = 0;
class Bullet {
public id: number;
public constructor() {
this.id = id++;
}
}
class Store {
public bullets: { [key: number]: Bullet } = {};
}
let count = 0;
const BulletComponent = auto(
(props: { bullet: Bullet; position: [number, number, number] }) => {
count += 1;
const { bullet, position } = props;
return String(bullet.id) + position.join('-');
},
);
const position: [number, number, number] = [0, 0, 0];
// Functional App component
const FunctionalApp = auto((props: { store: Store }) => {
const { store } = props;
return Object.values(store.bullets).map((bullet) => (
));
});
// Class App component
class ClassApp extends Component<{ store: Store }> {
render() {
const { store } = this.props;
return Object.values(store.bullets).map((bullet) => (
));
}
}
const store = manage(new Store());
describe('React Game', () => {
const testCases = [
{ name: 'Functional component', Component: FunctionalApp },
{ name: 'Class component', Component: ClassApp },
];
afterEach(() => {
cleanup();
count = 0;
store.bullets = {};
});
testCases.forEach(({ name, Component }) => {
test(name, async () => {
render(
);
expect(count).toBe(0);
for (let i = 0; i < 4; i++) {
act(() => {
store.bullets[i] = new Bullet();
});
expect(count).toBe(i + 1);
}
});
});
});