test('does not override set data with mixin', function (done) { var el; var mixinEl; el = helpers.entityFactory(); registerComponent('dummy', { schema: { color: {default: 'blue'}, size: {default: 5} } }); mixinEl = document.createElement('a-mixin'); mixinEl.setAttribute('id', 'mixindummy'); mixinEl.setAttribute('dummy', 'size: 1'); el.addEventListener('loaded', () => { el.sceneEl.appendChild(mixinEl); el.setAttribute('mixin', 'mixindummy'); el.setAttribute('dummy', 'size', 20); el.setAttribute('dummy', 'color', 'red'); assert.equal(el.getAttribute('dummy').color, 'red'); assert.equal(el.getAttribute('dummy').size, 20); done(); }); });
test('updates the properties with a null value', function () { var TestComponent = registerComponent('dummy', { schema: {color: {default: 'red'}} }); var component = new TestComponent(this.el); component.updateProperties({color: 'blue'}); assert.equal(component.data.color, 'blue'); });
setup(function () { components.dummy = undefined; var pauseStub = this.pauseStub = sinon.stub(); registerComponent('dummy', { schema: {color: {default: 'red'}}, pause: pauseStub }); });
test('updates the properties with the new value', function () { var TestComponent = registerComponent('dummy', { schema: {color: {default: 'red'}} }); var el = document.createElement('a-entity'); var component = new TestComponent(el); component.updateProperties(null); assert.equal(component.data.color, 'red'); });
test('parses single value component', function () { var TestComponent = registerComponent('dummy', { schema: {default: '0 0 1', type: 'vec3'} }); var el = document.createElement('a-entity'); var component = new TestComponent(el); var componentObj = component.parseAttrValueForCache('1 2 3'); assert.deepEqual(componentObj, {x: 1, y: 2, z: 3}); });
test('uses default values for single-property schema', function () { registerComponent('dummy', { schema: {default: 'blue'} }); var el = document.createElement('a-entity'); el.setAttribute('dummy', ''); var data = el.components.dummy.buildData(undefined, null); assert.equal(data, 'blue'); });
test('stringifies single value component', function () { var TestComponent = registerComponent('dummy', { schema: {default: '0 0 1', type: 'vec3'} }); var el = document.createElement('a-entity'); var component = new TestComponent(el); var componentString = component.stringify({x: 1, y: 2, z: 3}); assert.deepEqual(componentString, '1 2 3'); });
'when the attribute is empty string', function () { var data; var TestComponent = registerComponent('dummy', { schema: {default: 'red'} }); var el = document.createElement('a-entity'); el.setAttribute('dummy', ''); data = buildData(el, 'dummy', TestComponent.prototype.schema, 'red'); assert.equal(data, 'red'); });
test('extends the schema', function () { var TestComponent = registerComponent('dummy', { schema: {color: {default: 'red'}} }); var el = document.createElement('a-entity'); var component = new TestComponent(el); component.extendSchema({size: {default: 5}}); assert.ok(component.schema.size); assert.ok(component.schema.color); });
test('a selector property default is not cloned into data', function () { registerComponent('dummy', { schema: {type: 'selector', default: document.body} }); var el = document.createElement('a-entity'); el.hasLoaded = true; el.setAttribute('dummy', 'head'); el.components.dummy.updateProperties(''); assert.equal(el.components.dummy.data, el.components.dummy.schema.default); });
test('updates component DOM attribute', function () { registerComponent('dummy', { schema: {color: {default: 'red'}} }); var el = document.createElement('a-entity'); el.setAttribute('dummy', {color: 'blue'}); assert.equal(HTMLElement.prototype.getAttribute.call(el, 'dummy'), ''); el.components.dummy.flushToDOM(); assert.equal(HTMLElement.prototype.getAttribute.call(el, 'dummy'), 'color:blue'); });
test('returns default for single-prop schema when attr is empty string', function () { var data; registerComponent('dummy', { schema: {default: 'red'} }); var el = document.createElement('a-entity'); el.setAttribute('dummy', ''); data = el.components.dummy.buildData('red'); assert.equal(data, 'red'); });
test('returns data for single-prop if default is null', function () { var el = document.createElement('a-entity'); registerComponent('test', { schema: {default: null} }); el.setAttribute('test', ''); assert.equal(el.components.test.buildData(), null); assert.equal(el.components.test.buildData(null), null); assert.equal(el.components.test.buildData('foo'), 'foo'); });
test('parses component properties vec3', function () { var TestComponent = registerComponent('dummy', { schema: { position: {type: 'vec3', default: '0 0 1'} } }); var el = document.createElement('a-entity'); var component = new TestComponent(el); var componentObj = component.parse({position: '0 1 0'}); assert.deepEqual(componentObj.position, {x: 0, y: 1, z: 0}); });
test('clones plain object schema default into data', function () { registerComponent('dummy', { schema: {type: 'vec3', default: {x: 1, y: 1, z: 1}} }); var el = document.createElement('a-entity'); el.hasLoaded = true; el.setAttribute('dummy', '2 2 2'); el.components.dummy.updateProperties(''); assert.notEqual(el.components.dummy.data, el.components.dummy.schema.default); assert.deepEqual(el.components.dummy.data, {x: 1, y: 1, z: 1}); });
test('clones array property type', function () { var array = ['a']; var data; var el; registerComponent('test', {schema: {default: array}}); el = document.createElement('a-entity'); el.setAttribute('test', ''); data = el.components.test.buildData(); assert.equal(data[0], 'a'); assert.notEqual(data, array); });
test('does not parse properties that parse to another string', function () { var TestComponent = registerComponent('dummy', { schema: { url: {type: 'src', default: ''} } }); var el = document.createElement('a-entity'); var component = new TestComponent(el); var componentObj = component.parseAttrValueForCache({url: 'url(www.mozilla.com)'}); assert.equal(componentObj.url, 'url(www.mozilla.com)'); });
test('oldData is empty object on the first call when a single property component with an object as default initializes', function () { var updateStub = sinon.stub(); registerComponent('dummy', { schema: {type: 'vec3'}, update: updateStub }); this.el.setAttribute('dummy', ''); sinon.assert.calledOnce(updateStub); // old Data passed to the update method assert.deepEqual(updateStub.getCalls()[0].args[0], {}); });
test('oldData is undefined on the first call when a single property component initializes', function () { var updateStub = sinon.stub(); registerComponent('dummy', { schema: {default: 0}, update: updateStub }); this.el.setAttribute('dummy', ''); sinon.assert.calledOnce(updateStub); // old Data passed to the update method assert.equal(updateStub.getCalls()[0].args[0], undefined); });
test('supports array properties', function () { var updateStub = sinon.stub(); var TestComponent = registerComponent('dummy', { schema: {list: {default: ['a']}} }); var component = new TestComponent(this.el); component.update = updateStub; component.updateProperties({list: ['b']}); component.updateProperties({list: ['b']}); sinon.assert.calledOnce(updateStub); });
test('not called if component data does not change', function () { var updateStub = sinon.stub(); var TestComponent = registerComponent('dummy', { schema: {color: {default: 'red'}} }); var component = new TestComponent(this.el); component.update = updateStub; component.updateProperties({color: 'blue'}); component.updateProperties({color: 'blue'}); assert.ok(updateStub.calledOnce); });
test('uses defined values for single-property schema', function () { var data; var TestComponent = registerComponent('dummy', { schema: {default: 'red'} }); var el = document.createElement('a-entity'); var mixinEl = document.createElement('a-mixin'); mixinEl.setAttribute('dummy', 'blue'); el.mixinEls = [mixinEl]; data = buildData(el, 'dummy', TestComponent.prototype.schema, 'green', 'green'); assert.equal(data, 'green'); });
test('not called if component data does not change', function () { var updateStub = sinon.stub(); var TestComponent = registerComponent('dummy', { schema: {color: {default: 'red'}}, update: updateStub }); var el = document.createElement('a-entity'); var component = new TestComponent(el); component.updateProperties({color: 'blue'}); component.updateProperties({color: 'blue'}); assert.ok(updateStub.calledOnce); });
test('can change behavior of entity', function (done) { registerComponent('clone', CloneComponent); el.addEventListener('loaded', function () { assert.notOk('clone' in el.components); assert.notOk(el.object3D.children.length); el.setAttribute('clone', ''); assert.ok('clone' in el.components); assert.equal(el.object3D.children[0].uuid, 'Bubble Fett'); done(); }); });
test('stringifies component property vec3', function () { var TestComponent = registerComponent('dummy', { schema: { position: {type: 'vec3', default: '0 0 1'} } }); var el = document.createElement('a-entity'); var component = new TestComponent(el); var componentObj = {position: {x: 1, y: 2, z: 3}}; var componentString = component.stringify(componentObj); assert.deepEqual(componentString, 'position:1 2 3'); });
test('parses component using the style parser for a complex schema', function () { var TestComponent = registerComponent('dummy', { schema: { position: {type: 'vec3', default: '0 0 1'}, color: {default: 'red'} } }); var el = document.createElement('a-entity'); var component = new TestComponent(el); var componentObj = component.parseAttrValueForCache({position: '0 1 0', color: 'red'}); assert.deepEqual(componentObj, {position: '0 1 0', color: 'red'}); });
test('uses default values', function () { registerComponent('dummy', { schema: { color: {default: 'blue'}, size: {default: 5} } }); var el = document.createElement('a-entity'); el.setAttribute('dummy', ''); var data = el.components.dummy.buildData({}, null); assert.equal(data.color, 'blue'); assert.equal(data.size, 5); });
test('emit componentchanged when update calls setAttribute', function (done) { var TestComponent = registerComponent('dummy', { schema: {color: {default: 'red'}}, update: function () { this.el.setAttribute('dummy', 'color', 'blue'); } }); this.el.addEventListener('componentchanged', evt => { assert.equal(evt.detail.name, 'dummy'); assert.equal(this.el.getAttribute('dummy').color, 'blue'); done(); }); var component = new TestComponent(this.el); assert.equal(component.data.color, 'blue'); });
test('updates the schema of a component', function () { var TestComponent = registerComponent('dummy', { schema: {color: {default: 'red'}}, updateSchema: function (data) { this.extendSchema({energy: {default: 100}}); } }); var component = new TestComponent(this.el); component.updateProperties(null); assert.equal(component.schema.color.default, 'red'); assert.equal(component.schema.energy.default, 100); assert.equal(component.data.color, 'red'); });
test('returns data for multi-prop if default is null with previousData', function () { var el = document.createElement('a-entity'); registerComponent('test', { schema: { foo: {default: null} } }); el.setAttribute('test', ''); el.components.test.attrValue = {foo: null}; assert.equal(el.components.test.buildData().foo, null); assert.equal(el.components.test.buildData({foo: null}).foo, null); assert.equal(el.components.test.buildData({foo: 'foo'}).foo, 'foo'); });