This commit is contained in:
cha0s 2022-03-21 23:16:22 -05:00
parent c4e9cc9cd2
commit 42a6c18948
3 changed files with 103 additions and 15 deletions

View File

@ -204,10 +204,11 @@ export default (flecks) => {
}
toJSON() {
const {Entity} = flecks.get('$avocado/resource.resources');
const json = [];
for (let i = 0; i < this.#flatEntities.length; i++) {
const entity = this.#flatEntities[i];
json.push(entity.mergeDiff(entity.toJSON()));
json.push(Entity.withoutDefaults(entity.toJSON()));
}
return json;
}

View File

@ -378,28 +378,37 @@ export default (flecks) => {
json[type] = trait.toJSON();
}
return {
...(this.uri ? {extends: this.uri} : {}),
traits: json,
};
}
toNetwork(informed) {
const pristine = {traits: {}};
const json = {
traits: {},
};
const traits = Object.entries(this.#traits);
for (let i = 0; i < traits.length; i++) {
const [type, trait] = traits[i];
pristine.traits[type] = trait.constructor.withDefaults(
this.#originalJson ? this.#originalJson.traits[type] : {},
);
json.traits[type] = trait.toNetwork(informed);
let output;
if (this.uri) {
const pristine = {traits: {}};
const json = {
traits: {},
};
const traits = Object.entries(this.#traits);
for (let i = 0; i < traits.length; i++) {
const [type, trait] = traits[i];
pristine.traits[type] = trait.constructor.withDefaults(
this.#originalJson ? this.#originalJson.traits[type] : {},
);
json.traits[type] = trait.toNetwork(informed);
}
output = {
extends: this.uri,
...(mergeDiff(pristine, json) || {}),
};
}
else {
output = this.toJSON();
}
const merged = mergeDiff(pristine, json) || {};
return {
instanceUuid: this.instanceUuid,
...(this.uri ? {extends: this.uri} : {}),
...merged,
...output,
};
}

View File

@ -0,0 +1,78 @@
import {Flecks} from '@flecks/core/server';
import {expect} from 'chai';
let flecks;
let Entity;
beforeEach(async () => {
flecks = Flecks.bootstrap({
config: {
'@avocado/behavior': {},
'@avocado/entity:./src': {},
'@avocado/graphics': {},
'@avocado/resource': {},
'@avocado/traits': {},
'@flecks/core': {},
'@flecks/react': {},
},
});
await Promise.all(flecks.invokeFlat('@flecks/core.starting'));
({Entity} = flecks.get('$avocado/resource.resources'));
});
it('outputs JSON', () => {
const entity = new Entity();
expect(entity.toJSON()).to.deep.equal({traits: {}});
entity.uri = '/foo/bar';
expect(entity.toJSON()).to.deep.equal({extends: entity.uri, traits: {}});
});
it('can trim defaults from JSON', async () => {
const entity = new Entity();
await entity.addTrait('Alive');
expect(Entity.withoutDefaults(entity.toJSON()))
.to.deep.equal({traits: {Alive: {}}});
entity.life = 40;
expect(Entity.withoutDefaults(entity.toJSON()))
.to.deep.equal({traits: {Alive: {state: {life: 40}}}});
entity.maxLife = 420;
expect(Entity.withoutDefaults(entity.toJSON()))
.to.deep.equal({traits: {Alive: {state: {life: 40, maxLife: 420}}}});
entity.maxLife = 100;
expect(Entity.withoutDefaults(entity.toJSON()))
.to.deep.equal({traits: {Alive: {state: {life: 40}}}});
});
it('can add defaults to JSON', async () => {
expect(Entity.withDefaults({traits: {Directional: {}}}))
.to.deep.equal({
traits: {
Directional: {params: {directionCount: 1, trackMovement: true}, state: {direction: 0}},
},
});
});
it('can output JSON optimized for network', async () => {
const entity = new Entity();
entity.uri = '/foo/bar';
await entity.addTrait('Directional', {directionCount: 4});
entity.direction = 1;
expect(entity.toNetwork())
.to.deep.equal({
extends: '/foo/bar',
instanceUuid: entity.instanceUuid,
traits: {Directional: {state: {direction: 1}}},
});
});
it('can fallback to sending whole info when there is no base', async () => {
const entity = new Entity();
await entity.addTrait('Directional', {directionCount: 4});
entity.direction = 1;
expect(entity.toNetwork())
.to.deep.equal({
instanceUuid: entity.instanceUuid,
traits: {
Directional: {params: {directionCount: 1, trackMovement: true}, state: {direction: 1}},
},
});
});