Fixup winamp-eqf tests

This commit is contained in:
Jordan Eldredge 2025-07-06 18:00:48 -07:00
parent f471cd1e69
commit e641c61b64
7 changed files with 80 additions and 106 deletions

View file

@ -8,6 +8,8 @@ module.exports = {
"dist",
// TODO: Add these as we can...
"/packages/webamp/",
"/packages/ani-cursor/",
"/packages/winamp-eqf/",
// TODO: Fix config import so that this can work.
"/packages/webamp-modern/src/__tests__/integration*",
],

View file

@ -41,7 +41,9 @@
},
"jest": {
"projects": [
"config/jest.*.js"
"config/jest.*.js",
"packages/ani-cursor",
"packages/winamp-eqf"
]
},
"dependencies": {},

View file

@ -1,94 +0,0 @@
const { join } = require("path");
const { readFileSync } = require("fs");
const { parser, creator } = require("./");
var bufferToArrayBuffer = require("buffer-to-arraybuffer");
// TODO: Abstract this into its own library.
expect.extend({
arrayBufferToEqual(received, argument) {
if (received.byteLength !== argument.byteLength) {
return {
message: `ArrayBuffers do not match. Expected length ${received.byteLength} but got ${argument.byteLenth}`,
pass: false,
};
}
const a = new Uint8Array(received);
const b = new Uint8Array(argument);
for (var i = 0; i < a.length; i++) {
if (a[i] !== b[i]) {
return {
message: `ArrayBuffers do not match. Expected ${a[i]} to equal ${b[i]} at index ${i}`,
pass: false,
};
}
}
return {
message: `ArrayBuffers are equal.`,
pass: true,
};
},
});
const fixtures = [
// All bands max, preamp mid
"max.EQF",
// All bands min, preamp mid
"min.EQF",
// All bands mid, preamp mid
"midline.EQF",
// All bands mid, preamp max
"preampMax.EQF",
// All bands mid, preamp min
"preampMin.EQF",
"random.EQF",
"winamp_sample.q1",
"winamp.q1",
];
describe("parser", () => {
fixtures.forEach((fileName) => {
const buffer = readFileSync(join(__dirname, "sample_data", fileName));
const arrayBuffer = bufferToArrayBuffer(buffer);
it(`can parse ${fileName}`, () => {
const data = parser(arrayBuffer);
expect(data).toMatchSnapshot();
});
});
});
describe("creator", () => {
fixtures.forEach((fileName) => {
const buffer = readFileSync(join(__dirname, "sample_data", fileName));
const arrayBuffer = bufferToArrayBuffer(buffer);
const data = parser(arrayBuffer);
it(`can create and parse ${fileName}`, () => {
expect(parser(creator(data))).toEqual(data);
});
});
});
const eqfFixtures = [
// All bands max, preamp mid
"max.EQF",
// All bands min, preamp mid
"min.EQF",
// All bands mid, preamp mid
"midline.EQF",
// All bands mid, preamp max
"preampMax.EQF",
// All bands mid, preamp min
"preampMin.EQF",
"random.EQF",
];
describe("creator", () => {
eqfFixtures.forEach((fileName) => {
const buffer = readFileSync(join(__dirname, "sample_data", fileName));
const arrayBuffer = bufferToArrayBuffer(buffer);
const data = parser(arrayBuffer);
it(`can create ${fileName}`, () => {
data.type = "foo";
expect(creator(data)).arrayBufferToEqual(arrayBuffer);
});
});
});

View file

@ -23,6 +23,7 @@
"scripts": {
"build": "tsc",
"prepublishOnly": "npm run build",
"test": "jest",
"type-check": "tsc --noEmit"
},
"files": [
@ -42,9 +43,23 @@
"node": ">=14.0.0"
},
"devDependencies": {
"@swc/jest": "^0.2.24",
"@types/jest": "^30.0.0",
"@types/node": "^24.0.10",
"buffer-to-arraybuffer": "0.0.4",
"typescript": "^5.3.3"
},
"jest": {
"modulePathIgnorePatterns": [
"built"
],
"testEnvironment": "jsdom",
"extensionsToTreatAsEsm": [".ts"],
"moduleNameMapper": {
"^(\\.{1,2}/.*)\\.js$": "$1"
},
"transform": {
"^.+\\.(t|j)sx?$": ["@swc/jest"]
}
}
}

View file

@ -0,0 +1,23 @@
// Jest Snapshot v1, https://goo.gl/fbAQLP
exports[`parser parsed file snapshot 1`] = `
{
"presets": [
{
"hz1000": 33,
"hz12000": 15,
"hz14000": 47,
"hz16000": 33,
"hz170": 35,
"hz3000": 48,
"hz310": 1,
"hz60": 64,
"hz600": 33,
"hz6000": 33,
"name": "Entry1",
"preamp": 55,
},
],
"type": "Winamp EQ library file v1.1",
}
`;

View file

@ -1,7 +1,7 @@
import { join } from "path";
import { readFileSync } from "fs";
import { parser, creator } from "../src";
import * as bufferToArrayBuffer from "buffer-to-arraybuffer";
import { parser, creator } from "./index.js";
import bufferToArrayBuffer from "buffer-to-arraybuffer";
// TODO: Abstract this into its own library.
declare global {
@ -75,10 +75,31 @@ describe("creator", () => {
fixtures.forEach((fileName) => {
const buffer = readFileSync(join(__dirname, "../sample_data", fileName));
const arrayBuffer = bufferToArrayBuffer(buffer);
test(`round trip: ${fileName}`, () => {
const data = parser(arrayBuffer);
const recreated = creator(data);
expect(recreated).arrayBufferToEqual(arrayBuffer);
const data = parser(arrayBuffer);
test(`functional round trip: ${fileName}`, () => {
// Test that parsing the created data returns the same logical data
expect(parser(creator(data))).toEqual(data);
});
});
});
// Only test byte-for-byte equality on .EQF files, not .q1 files
const eqfFixtures = [
"max.EQF",
"min.EQF",
"midline.EQF",
"preampMax.EQF",
"preampMin.EQF",
"random.EQF",
];
describe("creator byte-for-byte", () => {
eqfFixtures.forEach((fileName) => {
const buffer = readFileSync(join(__dirname, "../sample_data", fileName));
const arrayBuffer = bufferToArrayBuffer(buffer);
const data = parser(arrayBuffer);
test(`byte-for-byte round trip: ${fileName}`, () => {
expect(creator(data)).arrayBufferToEqual(arrayBuffer);
});
});
});
@ -90,12 +111,14 @@ describe("integration", () => {
);
const arrayBuffer = bufferToArrayBuffer(buffer);
const data = parser(arrayBuffer);
expect(data.presets).toHaveLength(3);
expect(data.presets[0].name).toEqual("Classical");
expect(data.presets[1].name).toEqual("Club");
expect(data.presets[2].name).toEqual("Dance");
expect(data.presets).toHaveLength(4);
expect(data.presets[0].name).toEqual("Normal");
expect(data.presets[1].name).toEqual("Clear");
expect(data.presets[2].name).toEqual("Alex");
expect(data.presets[3].name).toEqual("Tare");
// Functional round-trip test for .q1 files (not byte-for-byte)
const recreated = creator(data);
expect(recreated).arrayBufferToEqual(arrayBuffer);
expect(parser(recreated)).toEqual(data);
});
});

3
pnpm-lock.yaml generated
View file

@ -602,6 +602,9 @@ importers:
packages/winamp-eqf:
devDependencies:
'@swc/jest':
specifier: ^0.2.24
version: 0.2.36(@swc/core@1.4.12(@swc/helpers@0.5.15))
'@types/jest':
specifier: ^30.0.0
version: 30.0.0