Files
MatchMaster/tools/test-wechat-build-postprocess.cjs
2026-11-03 20:41:22 +08:00

62 lines
2.9 KiB
JavaScript

const test = require('node:test');
const assert = require('node:assert/strict');
const fs = require('node:fs');
const vm = require('node:vm');
function fixture(failure) {
const events = [], errors = [], modules = {}, cache = {};
for (const name of ['./pack', '../level-resources/pack', '../level-resources/validation']) {
cache[name] = { stale: true };
modules[name] = { pack(dest) {
assert.equal(dest, 'output');
events.push(name);
if (name === failure) throw new Error('pack failed: ' + name);
return { publishDir: name };
} };
}
const requireModule = name => {
assert.equal(cache[name], undefined, 'postprocessor must be reloaded');
return modules[name];
};
requireModule.cache = cache;
requireModule.resolve = name => name;
let handler;
const Editor = { log() {}, error: error => errors.push(error), Builder: {
on(event, fn) { assert.equal(event, 'build-finished'); assert.equal(handler, undefined); handler = fn; },
removeListener(event, fn) { assert.equal(event, 'build-finished'); assert.equal(fn, handler); handler = undefined; },
} };
const module = { exports: {} };
vm.runInNewContext(fs.readFileSync('packages/activity-bundles/main.js', 'utf8'),
{ module, require: requireModule, Editor });
module.exports.load();
const legacy = { exports: {} };
vm.runInNewContext(fs.readFileSync('packages/level-resources/main.js', 'utf8'), { module: legacy, Editor });
legacy.exports.load(); // Must not install a second writer.
return { events, errors, extension: module.exports,
run(options) { const calls = []; handler(options, error => calls.push(error)); return calls; } };
}
for (const options of [{ platform: 'wechatgame' }, { platform: 'mini-game', actualPlatform: 'wechatgame' }])
test(`WeChat build runs both postprocessors in order (${JSON.stringify(options)})`, () => {
const f = fixture();
assert.deepEqual(f.run({ ...options, dest: 'output' }), [undefined]);
assert.deepEqual(f.events, ['./pack', '../level-resources/pack']);
assert.deepEqual(f.errors, []);
f.extension.unload();
});
test('other platforms do not run WeChat postprocessing', () => {
const f = fixture();
assert.deepEqual(f.run({ platform: 'mini-game', actualPlatform: 'bytedance' }), [undefined]);
assert.deepEqual(f.events, []);
});
for (const failure of ['./pack', '../level-resources/pack'])
test(`failure in ${failure} rejects the build exactly once`, () => {
const f = fixture(failure), calls = f.run({ platform: 'wechatgame', dest: 'output' });
assert.equal(calls.length, 1);
assert.match(calls[0].message, /pack failed/);
assert.equal(f.errors[0], calls[0]);
assert.deepEqual(f.events, failure === './pack' ? ['./pack'] : ['./pack', '../level-resources/pack']);
});