improvements

This commit is contained in:
2026-09-28 23:22:53 +02:00
parent 3206b1b3f1
commit 2bae0c3946
4 changed files with 196 additions and 45 deletions
+24 -2
View File
@@ -1,5 +1,6 @@
const assert = require('node:assert/strict');
const fs = require('node:fs');
const os = require('node:os');
const path = require('node:path');
const test = require('node:test');
const vm = require('node:vm');
@@ -83,7 +84,7 @@ function harness() {
on(names, listener) { for (const name of names.split(' ')) events.set(name, listener); },
addCSS() { return { delete() {} }; },
showQuickMessage() {}, showMessageBox(options) { errors.push(options.message); } },
console,
Buffer, requireNativeModule: require, console,
};
vm.runInNewContext(source, context);
return { ...context.blockTest, context, project, dialogs, exports, errors, edits, events, previewEvents, timers, previewUpdates, menus, Group, Cube };
@@ -173,13 +174,15 @@ test('import prefills generator fields, builds guides and retains fields without
test('import maps explicit labels before positional fallbacks and updates actor references', () => {
const h = harness();
const source = { actors: [{ label: 'wolf', injector: 'V', injects_into: 'bottom' },
{ label: 'bottom', receiver: true }], stages: [{ stage: 1 }, { stage: 2 }], position_anchor_actor: 'bottom' };
{ label: 'bottom', receiver: true }], stages: [{ stage: 1, props: { bottom: { prop_right: 'minecraft:carrot' } } },
{ stage: 2 }], position_anchor_actor: 'bottom' };
const definition = h.prepareAnimationDefinitionImport(source, importAnalysis());
assert.equal(definition.actors[0].label, 'player');
assert.equal(definition.actors[0].receiver, true);
assert.equal(definition.actors[1].label, 'wolf');
assert.deepEqual(Array.from(definition.actors[1].injects_into), ['player']);
assert.equal(definition.position_anchor_actor, 'player');
assert.equal(definition.stages[0].props.player.prop_right, 'minecraft:carrot');
assert.equal(source.actors[1].label, 'bottom', 'Input JSON is not mutated');
const positional = h.prepareAnimationDefinitionImport({ actors: [{ receiver: true }, { injector: 'V' }],
stages: [{ stage: 1 }, { stage: 2 }] }, importAnalysis());
@@ -187,6 +190,25 @@ test('import maps explicit labels before positional fallbacks and updates actor
assert.equal(positional.actors[1].label, 'wolf');
});
test('manual definition import embeds item prop previews in the same undoable edit', (t) => {
const h = harness(), root = fs.mkdtempSync(path.join(os.tmpdir(),'ad-manual-props-'));
t.after(() => fs.rmSync(root,{recursive:true,force:true}));
const write=(relative,data)=>{ const file=path.join(root,relative); fs.mkdirSync(path.dirname(file),{recursive:true});
fs.writeFileSync(file,typeof data==='string'?data:JSON.stringify(data)); };
write('assets/minecraft/items/carrot.json',{model:{type:'minecraft:model',model:'minecraft:item/carrot'}});
write('assets/minecraft/models/item/carrot.json',{parent:'minecraft:builtin/generated',textures:{layer0:'minecraft:item/carrot'}});
write('assets/minecraft/textures/item/carrot.png','image');
h.applyAnimationDefinitionImport({id:'test'},importAnalysis(),{
actors:[{label:'player',prop_right:'minecraft:carrot'},{label:'wolf'}],
stages:[{stage:1},{stage:2,props:{player:{prop_right:null}}}],
},[root]);
const previews=JSON.parse(h.project.animationdirector_prop_previews);
assert.equal(previews['["test","player","right",0]'].item,'minecraft:carrot');
assert.equal(previews['["test","player","right",2]'].mode,'hidden');
assert.equal(h.edits.at(-1).aspects.prop_preview_edit,true);
assert.equal(h.edits.at(-1).post.prop_preview_edit,true);
});
test('invalid imports leave definitions and guides unchanged', () => {
const h = harness();
h.rebuildBlockRequirementGuides('test', h.readBlockRequirementForm(wallForm()));