import { jest } from '@jest/globals';
import { waitFor } from '@testing-library/react';
import type { ComponentType } from 'react';
import React from 'react';
import { runInDom } from '../../__test_dependency__/run-in-dom.js';
import { useBinding } from '../../binding/use-binding.js';
import { BindingsConsumer } from '../../components/BindingsConsumer/index.js';
import { useStableValue } from '../use-stable-value.js';
describe('useStableValue', () => {
it('stable values should only change when they change according to areEqual', () =>
runInDom(({ onMount }) => {
const value = useBinding(() => 0, { id: 'value' });
let stabilized:
| {
value: number;
somethingElse: number;
}
| undefined;
const MyComponent: ComponentType<{ value: number }> = jest.fn(({ value }: { value: number }) => {
stabilized = useStableValue({ value, somethingElse: 3 });
return {value};
});
onMount(async () => {
expect(MyComponent).toHaveBeenCalledTimes(1);
const firstStabilized = stabilized;
expect(stabilized).toMatchObject({ value: 0, somethingElse: 3 });
value.set(0);
await waitFor(() => expect(MyComponent).toHaveBeenCalledTimes(2));
expect(stabilized).toBe(firstStabilized);
expect(stabilized).toMatchObject({ value: 0, somethingElse: 3 });
value.set(1);
await waitFor(() => expect(MyComponent).toHaveBeenCalledTimes(3));
expect(stabilized).not.toBe(firstStabilized);
expect(stabilized).toMatchObject({ value: 1, somethingElse: 3 });
});
return {({ value }) => };
}));
});