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 type { Binding } from '../../../binding/types/binding'; import { useBinding } from '../../../binding/use-binding.js'; import { BindingsConsumer } from '../index.js'; describe('BindingsConsumer', () => { it('with detectInputChanges=true should only rerender if the binding value really changes', () => runInDom(({ onMount }) => { let b: Binding; const consumerRenderer = jest.fn(({ b }: { b: number }) => {b}); const MyComponent: ComponentType = jest.fn(() => { b = useBinding(() => 0, { id: 'test' }); return ( {consumerRenderer} ); }); onMount(async (rootElement) => { expect(MyComponent).toHaveBeenCalledTimes(1); expect(consumerRenderer).toHaveBeenCalledTimes(1); expect(rootElement.innerHTML).toBe('
0
'); b.set(1); await waitFor(() => expect(rootElement.innerHTML).toBe('
1
')); expect(MyComponent).toHaveBeenCalledTimes(1); expect(consumerRenderer).toHaveBeenCalledTimes(2); b.set(1); await waitFor(() => expect(rootElement.innerHTML).toBe('
1
')); expect(MyComponent).toHaveBeenCalledTimes(1); expect(consumerRenderer).toHaveBeenCalledTimes(2); b.set(2); await waitFor(() => expect(rootElement.innerHTML).toBe('
2
')); expect(MyComponent).toHaveBeenCalledTimes(1); expect(consumerRenderer).toHaveBeenCalledTimes(3); }); return ; })); it("with detectInputChanges=true and makeComparableInputValue=evenness checker should only rerender if the binding value's evenness changes", () => runInDom(({ onMount }) => { let b: Binding; const consumerRenderer = jest.fn(({ b }: { b: number }) => {b}); const MyComponent: ComponentType = jest.fn(() => { b = useBinding(() => 0, { id: 'test' }); return ( b.get() % 2 === 0}> {consumerRenderer} ); }); onMount(async (rootElement) => { expect(MyComponent).toHaveBeenCalledTimes(1); expect(consumerRenderer).toHaveBeenCalledTimes(1); expect(rootElement.innerHTML).toBe('
0
'); b.set(1); await waitFor(() => expect(rootElement.innerHTML).toBe('
1
')); expect(MyComponent).toHaveBeenCalledTimes(1); expect(consumerRenderer).toHaveBeenCalledTimes(2); b.set(3); await waitFor(() => expect(rootElement.innerHTML).toBe('
1
')); expect(MyComponent).toHaveBeenCalledTimes(1); expect(consumerRenderer).toHaveBeenCalledTimes(2); b.set(2); await waitFor(() => expect(rootElement.innerHTML).toBe('
2
')); expect(MyComponent).toHaveBeenCalledTimes(1); expect(consumerRenderer).toHaveBeenCalledTimes(3); }); return ; })); });