bc-minecraft-bedrock-project
Version:
The typescript library responsible for reading/parsing minecraft bedrock data
394 lines • 15.7 kB
JavaScript
"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