62 lines
2.9 KiB
JavaScript
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']);
|
|
});
|