networked-aframe
Version:
A web framework for building multi-user virtual reality experiences.
174 lines (147 loc) • 4.47 kB
JavaScript
/* global NAF, assert, setup, suite, test, sinon, teardown */
var sinonTest = require("sinon-test");
sinon.test = sinonTest(sinon);
require('aframe');
var helpers = require('./helpers');
var naf = require('../../src/NafIndex');
require('../../src/components/networked');
suite('networked_remote', function() {
var scene;
var el;
var component;
function initScene(done) {
var opts = {
assets: [
"<template id='t1'><a-entity><a-entity class='template-child'></a-entity></a-entity></template>"
],
entity: '<a-entity id="test-entity" networked="template:#t1;networkId:nid1;owner:network1;" position="1 2 3" rotation="4 3 2"><a-box class="head"></a-box></a-entity>'
};
scene = helpers.sceneFactory(opts);
NAF.schemas.add({
template: '#t1',
components: [
'position',
'rotation',
'scale',
'visible',
{
component: 'visible',
selector: '.head'
}
]
});
naf.options.useLerp = false;
naf.utils.whenEntityLoaded(scene, done);
}
setup(function(done) {
initScene(function() {
el = document.querySelector('#test-entity');
component = el.components.networked;
done();
});
});
teardown(function() {
scene.parentElement.removeChild(scene);
});
suite('Setup', function() {
test('creates entity', function() {
assert.isOk(el);
});
test('creates component', function() {
assert.isOk(component);
});
});
suite('init', function() {
test('attaches template', function() {
var templateChild = el.querySelector('.template-child');
assert.isOk(templateChild);
});
test('updates root immediately', sinon.test(function() {
this.stub(component, 'networkUpdate');
var testData = {test: "testing"};
el.firstUpdateData = testData;
component.init();
assert.isTrue(component.networkUpdate.calledWith(testData));
}));
});
suite('networkUpdate', function() {
test('sets correct data', sinon.test(function() {
var entityData = {
networkId: 'nid1',
owner: 'network1',
persistent: false,
parent: null,
template: '',
components: {
0: { x: 10, y: 20, z: 30 },
1: { x: 40, y: 30, z: 20 },
2: { x: 5, y: 12, z: 1 },
3: false
}
}
component.networkUpdate(entityData);
component.tick(15, 15);
setTimeout(()=> {
var position = el.getAttribute('position');
assert.equal(position.x, 10, 'Position');
assert.equal(position.y, 20, 'Position');
assert.equal(position.z, 30, 'Position');
var rotation = el.getAttribute('rotation');
assert.equal(rotation.x, 40, 'Rotation');
assert.equal(rotation.y, 30, 'Rotation');
assert.equal(rotation.z, 20, 'Rotation');
var scale = el.getAttribute('scale');
assert.equal(scale.x, 1, 'Scale');
assert.equal(scale.y, 1, 'Scale');
assert.equal(scale.z, 1, 'Scale');
assert.equal(el.getAttribute('visible'), false, 'Visible');
}, 1);
}));
test('sets correct data with child components', sinon.test(function() {
// Setup
var entityData = {
networkId: 'network1',
owner: 'owner1',
persistent: false,
parent: null,
template: '',
components: {
0: { x: 10, y: 20, z: 30 },
1: { x: 40, y: 30, z: 20 },
2: { x: 5, y: 12, z: 1 },
3: false,
4: true
}
};
// SUT
component.networkUpdate(entityData);
// Assert
var visible = el.querySelector('.head').getAttribute('visible');
assert.equal(visible, true);
}));
test('sets correct data with before child components exist', sinon.test(function() {
// Setup
var entityData = {
networkId: 'network2',
owner: 'owner1',
persistent: false,
parent: null,
template: '',
components: {
0: { x: 10, y: 20, z: 30 },
1: { x: 40, y: 30, z: 20 },
2: { x: 5, y: 12, z: 1 },
3: false,
4: true
}
};
while (el.firstChild) { // Remove children
el.removeChild(el.firstChild);
}
// SUT
component.networkUpdate(entityData);
// Assert
// Just checking for error
}));
});
});