UNPKG

bc-minecraft-bedrock-project

Version:

The typescript library responsible for reading/parsing minecraft bedrock data

394 lines 15.7 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); const bc_minecraft_bedrock_shared_1 = require("bc-minecraft-bedrock-shared"); const bc_minecraft_molang_1 = require("bc-minecraft-molang"); const bc_minecraft_project_1 = require("bc-minecraft-project"); const utility_1 = require("../test/utility"); const references_1 = require("../types/references"); const behavior_pack_1 = require("./behavior-pack"); const project_data_1 = require("./project-data"); const resource_pack_1 = require("./resource-pack"); /** A context that returns a document with the given fixed content for any URI */ class FixedContentContext { content; constructor(content) { this.content = content; } getDocument(uri) { return { uri, getText: () => this.content }; } getFiles() { return []; } } /** A context that returns undefined for every document request */ class NoDocumentContext { getDocument(_uri) { return undefined; } getFiles() { return []; } } describe('ProjectData', () => { describe('Sanity Check', () => { const P = new project_data_1.ProjectData(new utility_1.TextProjectContext()); it('P is not undefined', () => { expect(P).toBeDefined(); }); describe('BehaviorPacks', () => { it('Is not undefined', () => { expect(P.behaviorPacks).toBeDefined(); }); it('Has packs', () => { expect(P.behaviorPacks.packs).toBeDefined(); }); }); describe('ResourcePacks', () => { it('Is not undefined', () => { expect(P.resourcePacks).toBeDefined(); }); it('Has packs', () => { expect(P.resourcePacks.packs).toBeDefined(); }); }); describe('General', () => { it('Is not undefined', () => { expect(P.general).toBeDefined(); }); it('has fakeEntities', () => { expect(P.general.fakeEntities).toBeDefined(); }); it('has objectives', () => { expect(P.general.objectives).toBeDefined(); }); it('has tags', () => { expect(P.general.tags).toBeDefined(); }); it('has tickingAreas', () => { expect(P.general.tickingAreas).toBeDefined(); }); }); }); describe('Behaviourpack', () => { let P; let pack; beforeEach(() => { P = new project_data_1.ProjectData(new utility_1.TextProjectContext()); pack = P.behaviorPacks.add('c:\\temp\\bp', bc_minecraft_project_1.MCProject.createEmpty(), {}); }); it('Has 1 bp', () => { expect(P.behaviorPacks.count()).toEqual(1); }); describe('get', () => { const uri = 'c:\\temp\\bp\\loot_tables\\empty.loot.json'; beforeEach(() => { pack.lootTables.set({ id: 'empty.loot.json', location: bc_minecraft_bedrock_shared_1.Location.create(uri), }); }); it('not undefined', () => { const data = P.get(uri); expect(data).toBeDefined(); }); it('Is behaviorpack', () => { const data = P.get(uri); expect(behavior_pack_1.BehaviorPack.is(data)).toBeTruthy(); }); it('Has loot_tables', () => { const data = P.get(uri); if (!behavior_pack_1.BehaviorPack.is(data)) throw new Error(); expect(data.lootTables.has('empty.loot.json')).toBeTruthy(); }); }); it('Remove File', () => { const uri = 'c:\\temp\\bp\\loot_tables\\empty.loot.json'; pack.lootTables.set({ id: 'empty.loot.json', location: bc_minecraft_bedrock_shared_1.Location.create(uri), }); expect(P.behaviorPacks.packs).toBeDefined(); expect(P.behaviorPacks.lootTables).toBeDefined(); expect(P.behaviorPacks.lootTables.has('empty.loot.json')).toBeTruthy(); expect(P.deleteFile(uri)).toBeTruthy(); expect(P.behaviorPacks.packs).toBeDefined(); expect(P.behaviorPacks.lootTables.has('empty.loot.json')).toBeFalsy(); }); it('Remove Folder', () => { const uri = 'c:\\temp\\bp\\loot_tables\\empty.loot.json'; pack.lootTables.set({ id: 'empty.loot.json', location: bc_minecraft_bedrock_shared_1.Location.create(uri), }); expect(P.behaviorPacks.lootTables).toBeDefined(); expect(P.behaviorPacks.lootTables.has('empty.loot.json')).toBeTruthy(); expect(P.deleteFolder('c:\\temp\\bp\\loot_tables')).toBeTruthy(); expect(P.behaviorPacks.lootTables.has('empty.loot.json')).toBeFalsy(); }); it('Remove Folder - Entire Pack', () => { const pack = P.behaviorPacks.add('c:\\temp\\bp', bc_minecraft_project_1.MCProject.createEmpty(), {}); const uri = 'c:\\temp\\bp\\loot_tables\\empty.loot.json'; pack.lootTables.set({ id: 'empty.loot.json', location: bc_minecraft_bedrock_shared_1.Location.create(uri), }); expect(P.behaviorPacks.lootTables.has('empty.loot.json')).toBeTruthy(); expect(P.deleteFolder('c:\\temp\\bp')).toBeTruthy(); expect(P.behaviorPacks.lootTables.has('empty.loot.json')).toBeFalsy(); expect(P.behaviorPacks.count()).toEqual(0); }); }); describe('Resourcepack', () => { let P; let pack; beforeEach(() => { P = new project_data_1.ProjectData(new utility_1.TextProjectContext()); pack = P.resourcePacks.add('c:\\temp\\rp', bc_minecraft_project_1.MCProject.createEmpty(), {}); }); it('add', () => { expect(P.resourcePacks.count()).toEqual(1); }); it('get', () => { const uri = 'c:\\temp\\rp\\sounds\\sound_definitions.json'; const id = 'random.pop'; pack.sounds.set({ id: id, location: bc_minecraft_bedrock_shared_1.Location.create(uri), }); const data = P.get(uri); if (!data) { throw new Error('expacted a pack'); } else { if (resource_pack_1.ResourcePack.is(data)) { expect(data.sounds.has(id)).toBeTruthy(); } else { throw new Error('expacted a rp pack'); } } }); it('Remove File', () => { const uri = 'c:\\temp\\rp\\sounds\\sound_definitions.json'; const id = 'random.pop'; pack.sounds.set({ id: id, location: bc_minecraft_bedrock_shared_1.Location.create(uri), }); expect(P.resourcePacks.sounds.has(id)).toBeTruthy(); expect(P.deleteFile(uri)).toBeTruthy(); expect(P.resourcePacks.sounds.has(id)).toBeFalsy(); }); it('Remove Folder', () => { const uri = 'c:\\temp\\rp\\sounds\\sound_definitions.json'; const id = 'random.pop'; pack.sounds.set({ id: id, location: bc_minecraft_bedrock_shared_1.Location.create(uri), }); expect(P.resourcePacks.sounds.has(id)).toBeTruthy(); expect(P.deleteFolder('c:\\temp\\rp\\sounds')).toBeTruthy(); expect(P.resourcePacks.sounds.has(id)).toBeFalsy(); }); it('Remove Folder - Entire Pack', () => { const uri = 'c:\\temp\\rp\\sounds\\sound_definitions.json'; const id = 'random.pop'; pack.sounds.set({ id: id, location: bc_minecraft_bedrock_shared_1.Location.create(uri), }); expect(P.resourcePacks.sounds.has(id)).toBeTruthy(); expect(P.deleteFolder('c:\\temp\\rp')).toBeTruthy(); expect(P.resourcePacks.sounds.has(id)).toBeFalsy(); expect(P.resourcePacks.count()).toEqual(0); }); }); describe('General', () => { let P; beforeEach(() => { P = new project_data_1.ProjectData(new utility_1.TextProjectContext()); }); it('Remove File', () => { const uri = 'c:\\temp\\rp\\sounds\\sound_definitions.json'; const id = 'init'; P.general.tags.set({ id: id, location: bc_minecraft_bedrock_shared_1.Location.create(uri) }); expect(P.general.tags.has(id)).toBeTruthy(); expect(P.deleteFile(uri)).toBeTruthy(); expect(P.general.tags.has(id)).toBeFalsy(); }); }); describe('find', () => { const data = new project_data_1.ProjectData(new utility_1.TextProjectContext()); const bp = data.behaviorPacks.add('c:\\bp', bc_minecraft_project_1.MCProject.createEmpty(), {}); const rp = data.resourcePacks.add('c:\\rp', bc_minecraft_project_1.MCProject.createEmpty(), {}); const loc = { uri: '', position: 0 }; const molang = new bc_minecraft_molang_1.MolangSet(); const doc = 'Documentation'; const emptyDefinedUsing = references_1.References.create(); bp.animationControllers.set({ animations: emptyDefinedUsing, id: 'bp.animation_controller', location: loc, molang: molang, documentation: doc, events: references_1.Using.create(), }); bp.animations.set({ id: 'bp.animation', location: loc, molang: molang, documentation: doc, events: references_1.Using.create(), }); bp.blocks.set({ id: 'bp.block', location: loc, molang: molang, documentation: doc, states: [], }); bp.entities.set({ id: 'bp.entity', animations: references_1.References.create(), documentation: doc, events: references_1.Defined.create(), families: references_1.Defined.create(), groups: references_1.Defined.create(), location: loc, molang: molang, properties: [], runtime_identifier: '', }); bp.functions.set({ id: 'bp.function', location: loc, documentation: doc }); bp.items.set({ id: 'bp.item', location: loc, molang: molang, documentation: doc, isFood: false, }); bp.lootTables.set({ id: 'bp.loot_table', location: loc, documentation: doc, }); bp.structures.set({ id: 'bp.structure', location: loc, documentation: doc, }); bp.trading.set({ id: 'bp.trading', location: loc, documentation: doc }); rp.animationControllers.set({ animations: emptyDefinedUsing, id: 'rp.animation_controller', location: loc, molang: molang, documentation: doc, particles: emptyDefinedUsing, sounds: emptyDefinedUsing, }); rp.animations.set({ id: 'rp.animation', location: loc, molang: molang, documentation: doc, particles: emptyDefinedUsing, sounds: emptyDefinedUsing, }); rp.attachables.set({ animations: emptyDefinedUsing, id: 'rp.attachable', location: loc, molang: molang, documentation: doc, }); rp.blockCullingRules.set({ id: 'rp.blockCullingRules', location: loc, documentation: doc, affected_bones: references_1.Defined.create(), }); rp.entities.set({ animations: emptyDefinedUsing, id: 'rp.entity', location: loc, molang: molang, documentation: doc, }); rp.fogs.set({ id: 'rp.fog', location: loc, documentation: doc }); rp.materials.set({ id: 'rp.material', location: loc, documentation: doc }); rp.models.set({ id: 'rp.model', location: loc, documentation: doc, bones: references_1.Defined.create(), root_bone_uses_binding: false, locators: references_1.Defined.create(), }); rp.particles.set({ id: 'rp.particle', location: loc, documentation: doc }); rp.renderControllers.set({ id: 'rp.render_controller', location: loc, documentation: doc, molang: molang, }); rp.sounds.set({ id: 'rp.sound', location: loc, documentation: doc }); rp.textures.set({ id: 'rp.texture', location: loc, documentation: doc }); const ids = [ 'bp.animation_controller', 'bp.animation', 'bp.block', 'bp.entity', 'bp.function', 'bp.item', 'bp.loot_table', 'bp.structure', 'bp.trading', 'rp.animation_controller', 'rp.animation', 'rp.attachable', 'rp.entity', 'rp.fog', 'rp.material', 'rp.model', 'rp.particle', 'rp.render_controller', 'rp.sound', 'rp.texture', ]; test.each(ids)(`find id %s`, (id) => { const item = data.find((item) => item.id === id); expect(item).toBeDefined(); }); }); describe('addPack', () => { const context = bc_minecraft_project_1.MCProject.createEmpty(); it('registers behavior pack when manifest is empty (path-based detection)', () => { const P = new project_data_1.ProjectData(new FixedContentContext('')); const pack = P.addPack('file:///workspace/behavior_packs/manifest.json', context); expect(pack).toBeDefined(); expect(P.behaviorPacks.count()).toEqual(1); }); it('registers resource pack when manifest is empty (path-based detection)', () => { const P = new project_data_1.ProjectData(new FixedContentContext('')); const pack = P.addPack('file:///workspace/resource_packs/manifest.json', context); expect(pack).toBeDefined(); expect(P.resourcePacks.count()).toEqual(1); }); it('registers behavior pack when manifest cannot be read (path-based detection)', () => { const P = new project_data_1.ProjectData(new NoDocumentContext()); const pack = P.addPack('file:///workspace/behavior_packs/manifest.json', context); expect(pack).toBeDefined(); expect(P.behaviorPacks.count()).toEqual(1); }); it('returns undefined for unknown pack type even when manifest is missing', () => { const P = new project_data_1.ProjectData(new NoDocumentContext()); const pack = P.addPack('file:///workspace/unknown_folder/manifest.json', context); expect(pack).toBeUndefined(); expect(P.behaviorPacks.count()).toEqual(0); }); }); }); //# sourceMappingURL=project-data.test.js.map