diff --git a/.eslintrc.json b/.eslintrc.json index ab96dd5..37bea7a 100644 --- a/.eslintrc.json +++ b/.eslintrc.json @@ -72,8 +72,13 @@ } ], "@typescript-eslint/require-await": ["error"], - "react-hooks/rules-of-hooks": "error", - "react-hooks/exhaustive-deps": "error" + "jest/expect-expect": ["error", { + "assertFunctionNames": [ + "expect*", + "checkImageData", + "testCode" + ] + }] }, "env": { "builtin": true, @@ -86,6 +91,7 @@ }, "extends": [ "eslint:recommended", + "plugin:jest/recommended", "plugin:react/recommended", "plugin:react-hooks/recommended" ], diff --git a/package-lock.json b/package-lock.json index 7a1b01e..d94822e 100644 --- a/package-lock.json +++ b/package-lock.json @@ -32,6 +32,7 @@ "babel-jest": "^27.2.4", "canvas": "^2.8.0", "eslint": "^8.16.0", + "eslint-plugin-jest": "^26.4.3", "eslint-plugin-react": "^7.30.0", "eslint-plugin-react-hooks": "^4.5.0", "file-loader": "^6.0.0", @@ -5669,6 +5670,30 @@ "url": "https://opencollective.com/eslint" } }, + "node_modules/eslint-plugin-jest": { + "version": "26.4.3", + "resolved": "https://registry.npmjs.org/eslint-plugin-jest/-/eslint-plugin-jest-26.4.3.tgz", + "integrity": "sha512-eb4sIRLy7hBdBphCBttE1Gx3Go6GsCYXRfy1xtuSg56UBlLLuFpbA79jPipbUfz7AwuDJ+j9UShN7AOi6VDEuQ==", + "dev": true, + "dependencies": { + "@typescript-eslint/utils": "^5.10.0" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "peerDependencies": { + "@typescript-eslint/eslint-plugin": "^5.0.0", + "eslint": "^6.0.0 || ^7.0.0 || ^8.0.0" + }, + "peerDependenciesMeta": { + "@typescript-eslint/eslint-plugin": { + "optional": true + }, + "jest": { + "optional": true + } + } + }, "node_modules/eslint-plugin-react": { "version": "7.30.0", "resolved": "https://registry.npmjs.org/eslint-plugin-react/-/eslint-plugin-react-7.30.0.tgz", @@ -18916,6 +18941,15 @@ } } }, + "eslint-plugin-jest": { + "version": "26.4.3", + "resolved": "https://registry.npmjs.org/eslint-plugin-jest/-/eslint-plugin-jest-26.4.3.tgz", + "integrity": "sha512-eb4sIRLy7hBdBphCBttE1Gx3Go6GsCYXRfy1xtuSg56UBlLLuFpbA79jPipbUfz7AwuDJ+j9UShN7AOi6VDEuQ==", + "dev": true, + "requires": { + "@typescript-eslint/utils": "^5.10.0" + } + }, "eslint-plugin-react": { "version": "7.30.0", "resolved": "https://registry.npmjs.org/eslint-plugin-react/-/eslint-plugin-react-7.30.0.tgz", diff --git a/package.json b/package.json index 59e979c..619bc6d 100644 --- a/package.json +++ b/package.json @@ -41,6 +41,7 @@ "babel-jest": "^27.2.4", "canvas": "^2.8.0", "eslint": "^8.16.0", + "eslint-plugin-jest": "^26.4.3", "eslint-plugin-react": "^7.30.0", "eslint-plugin-react-hooks": "^4.5.0", "file-loader": "^6.0.0", diff --git a/test/components/FileChooser.spec.tsx b/test/components/FileChooser.spec.tsx index 210c061..03b178f 100644 --- a/test/components/FileChooser.spec.tsx +++ b/test/components/FileChooser.spec.tsx @@ -2,7 +2,6 @@ * @jest-environment ./test/env/jsdom-with-backdoors */ -import 'jest'; import { h } from 'preact'; import { fireEvent, render, screen, waitFor } from '@testing-library/preact'; @@ -79,7 +78,9 @@ describe('FileChooser', () => { const mockFilePicker = jest.fn, Parameters>(); beforeEach(() => { - expect(window.showOpenFilePicker).not.toBeDefined(); + if (typeof window.showOpenFilePicker !== 'undefined') { + throw new Error('window.showOpenFilePicker not undefined'); + } window.showOpenFilePicker = mockFilePicker as unknown as ShowOpenFilePicker; mockFilePicker.mockReset(); }); @@ -126,4 +127,4 @@ describe('FileChooser', () => { }); }); }); -}); \ No newline at end of file +}); diff --git a/test/js/formats/util.ts b/test/js/formats/util.ts index 47f2193..8b4d368 100644 --- a/test/js/formats/util.ts +++ b/test/js/formats/util.ts @@ -7,7 +7,7 @@ export function skipGap(track: memory, start: number = 0): number { i++; } if (i === end) { - fail(`found more than 0x100 0xFF bytes after ${start}`); + throw new Error(`found more than 0x100 0xFF bytes after ${start}`); } return i; } @@ -24,7 +24,7 @@ export function compareSequences(track: memory, bytes: number[], pos: number): b export function expectSequence(track: memory, pos: number, bytes: number[]): number { if (!compareSequences(track, bytes, pos)) { const track_slice = track.slice(pos, Math.min(track.length, pos + bytes.length)); - fail(`expected ${bytes} got ${track_slice}`); + throw new Error(`expected ${bytes} got ${track_slice}`); } return pos + bytes.length; } diff --git a/test/js/rom.test.ts b/test/js/rom.test.ts index 59599e8..2f00f31 100644 --- a/test/js/rom.test.ts +++ b/test/js/rom.test.ts @@ -18,7 +18,7 @@ const roms: { [name: string]: { new(): ROM } } = { for (const rom of Object.keys(roms)) { describe(`${rom}`, () => { it('is constructable', () => { - new roms[rom](); + expect(new roms[rom]()).not.toBeNull(); }); }); } diff --git a/test/js/util.test.ts b/test/js/util.test.ts index cfdb1df..133e0f0 100644 --- a/test/js/util.test.ts +++ b/test/js/util.test.ts @@ -25,16 +25,17 @@ describe('allocMem', () => { }); it('has garbage in the right places', () => { const memory = allocMem(0x800); + let passed = false; for (let i = 0; i < 0x800; i += 0x200) { - const passed = memory[i + 0x28] !== 0xff + passed = memory[i + 0x28] !== 0xff && memory[i + 0x29] !== 0xff && memory[i + 0x68] !== 0xff && memory[i + 0x69] !== 0xff; if (passed) { - return; + break; } } - fail('garbage not found'); + expect(passed).toBe(true); }); });