diff --git a/src/hooks/useTick.ts b/src/hooks/useTick.ts index befc3581..f5478dd1 100644 --- a/src/hooks/useTick.ts +++ b/src/hooks/useTick.ts @@ -38,7 +38,7 @@ export function useTick( { callback = options.callback; context = options.context; - isEnabled = options.isEnabled; + isEnabled = options.isEnabled ?? true; priority = options.priority; } diff --git a/src/typedefs/UseTickOptions.ts b/src/typedefs/UseTickOptions.ts index 895fd551..bf9fba38 100644 --- a/src/typedefs/UseTickOptions.ts +++ b/src/typedefs/UseTickOptions.ts @@ -9,7 +9,7 @@ export interface UseTickOptions context?: T /** @description Whether this callback is currently enabled. */ - isEnabled: true, + isEnabled?: true, /** @description The priority of this callback compared to other callbacks on the ticker. */ priority?: number diff --git a/test/e2e/hooks/useTick.test.tsx b/test/e2e/hooks/useTick.test.tsx new file mode 100644 index 00000000..5ff08482 --- /dev/null +++ b/test/e2e/hooks/useTick.test.tsx @@ -0,0 +1,61 @@ +import { + describe, + expect, + it, + vi, +} from 'vitest'; +import { + render, + renderHook, +} from '@testing-library/react' +import { Ticker } from 'pixi.js'; + +import { Application } from '../../../src/components/Application' +import { useTick } from '../../../src/hooks/useTick' +import { wait } from '../../utils/wait' + +describe('useTick', () => +{ + describe('with a function', () => { + it('runs the callback', async () => { + const useTickSpy = vi.fn() + + const TestComponent = () => { + useTick(useTickSpy) + + return null + } + + render(, { wrapper: Application }) + + await wait(100) + + expect(useTickSpy.mock.lastCall?.[0]).to.be.instanceOf(Ticker) + }); + }) + + describe('with an options hash', () => { + it('runs the callback', async () => { + const useTickSpy = vi.fn() + + const TestComponent = () => { + useTick({ callback: useTickSpy }) + + return null + } + + render(, { wrapper: Application }) + + await wait(100) + + expect(useTickSpy.mock.lastCall?.[0]).to.be.instanceOf(Ticker) + }); + }) + + it('throws when not in a React Pixi tree', () => + { + const result = () => renderHook(() => useTick(() => {})) + + expect(result).to.throw(Error, /no context found/i) + }); +}); diff --git a/test/utils/wait.ts b/test/utils/wait.ts new file mode 100644 index 00000000..a2aeccde --- /dev/null +++ b/test/utils/wait.ts @@ -0,0 +1,7 @@ +export function wait(waitMS: number, rejectOnComplete: boolean = false) +{ + return new Promise((resolve, reject) => + { + setTimeout(rejectOnComplete ? reject : resolve, waitMS); + }); +}