Files
Ra3ModXmlExt/test/manifestParser.test.mjs
2026-08-01 14:00:17 +02:00

62 lines
2.0 KiB
JavaScript

import { test } from "node:test";
import assert from "node:assert/strict";
import { parseManifest } from "../out/indexer/manifestParser.js";
function u32(v) {
const b = Buffer.alloc(4);
b.writeUInt32LE(v >>> 0);
return b;
}
function u16(v) {
const b = Buffer.alloc(2);
b.writeUInt16LE(v >>> 0);
return b;
}
test("parses a minimal version 5 manifest", () => {
const name = Buffer.from("VanillaTank\0", "ascii");
const src = Buffer.from("DATA:globaldata/armor.xml\0", "ascii");
const parts = [
Buffer.from([0, 1]), // isBigEndian=false, isLinked=true (one byte each)
u16(5), // version
u32(0x1234), // streamChecksum
u32(0), // allTypesHash
u32(1), // assetCount
u32(0), // totalInstanceDataSize
u32(0), // maxInstanceChunkSize
u32(0), // maxRelocationChunkSize
u32(0), // maxImportsChunkSize
u32(0), // assetReferenceBufferSize
u32(0), // referencedManifestNameBufferSize
u32(name.length), // assetNameBufferSize
u32(src.length), // sourceFileNameBufferSize
// one asset entry (version 5 = 44 bytes, no tokenized flag)
u32(0x942fff2d), // typeId (GameObject)
u32(0), // instanceId
u32(0), // typeHash
u32(0), // instanceHash
u32(0), // assetReferenceOffset
u32(0), // assetReferenceCount
u32(0), // nameOffset
u32(0), // sourceFileNameOffset
u32(0), // instanceDataSize
u32(0), // relocationDataSize
u32(0), // importsDataSize
name,
src,
];
const info = parseManifest(new Uint8Array(Buffer.concat(parts)));
assert.equal(info.version, 5);
assert.equal(info.assetCount, 1);
assert.equal(info.assets.length, 1);
assert.equal(info.assets[0].name, "VanillaTank");
assert.equal(info.assets[0].typeName, "GameObject");
assert.equal(info.assets[0].sourceFileName, "DATA:globaldata/armor.xml");
});
test("reports an error for garbage input", () => {
const info = parseManifest(new Uint8Array([1, 2, 3, 4, 5, 6, 7, 8]));
assert.ok(info.error);
assert.equal(info.assets.length, 0);
});