Adding some tests for the Node class

This commit is contained in:
Jeff Avallone 2014-12-19 10:07:56 -05:00
parent d976aba381
commit 0d6e272216
1 changed files with 286 additions and 0 deletions

View File

@ -0,0 +1,286 @@
import Node from 'src/js/parser/javascript/node.js';
import Q from 'q';
import Snap from 'snapsvg';
describe('parser/javascript/node.js', function() {
beforeEach(function() {
Node.state = {};
this.node = new Node();
});
it('references the state from Node.state', function() {
Node.state.example = 'example state';
expect(this.node.state.example).toEqual('example state');
});
describe('module setter', function() {
it('extends the node with the module', function() {
this.node.module = { example: 'value' };
expect(this.node.example).toEqual('value');
});
it('calls the module #setup method', function() {
var setup = jasmine.createSpy('setup');
this.node.module = { setup };
expect(setup).toHaveBeenCalled();
});
it('sets up any defined properties', function() {
this.node.module = {
definedProperties: {
example: {
get: function() { return 'value'; }
}
}
};
expect(this.node.example).toEqual('value');
});
});
describe('container setter', function() {
it('adds a class to the container element', function() {
var container = jasmine.createSpyObj('container', ['addClass']);
this.node.type = 'example type';
this.node.container = container;
expect(container.addClass).toHaveBeenCalledWith('example type');
});
});
describe('anchor getter', function() {
describe('when a proxy node is used', function() {
it('returns the anchor from the proxy', function() {
this.node.proxy = { anchor: 'example anchor' };
expect(this.node.anchor).toEqual('example anchor');
});
});
describe('when a proxy node is not used', function() {
it('returns anchor data from the bbox of the container merged _anchor of the node', function() {
this.node._anchor = { example: 'value' };
this.node.container = jasmine.createSpyObj('container', ['addClass', 'getBBox']);
this.node.container.getBBox.and.returnValue({
x: 'bbox x',
x2: 'bbox x2',
cy: 'bbox cy'
});
expect(this.node.anchor).toEqual({
ax: 'bbox x',
ax2: 'bbox x2',
ay: 'bbox cy',
example: 'value'
});
});
});
});
describe('#getBBox', function() {
it('returns the bbox of the container merged with the anchor', function() {
this.node.proxy = {
anchor: {
anchor: 'example anchor'
}
};
this.node.container = jasmine.createSpyObj('container', ['addClass', 'getBBox']);
this.node.container.getBBox.and.returnValue({
bbox: 'example bbox'
});
expect(this.node.getBBox()).toEqual({
bbox: 'example bbox',
anchor: 'example anchor'
});
});
});
describe('#normalizeBBox', function() {
it('defaults the anchor keys to values from the bbox', function() {
expect(this.node.normalizeBBox({
x: 'bbox x',
x2: 'bbox x2',
cy: 'bbox cy',
ay: 'bbox ay'
})).toEqual({
x: 'bbox x',
x2: 'bbox x2',
cy: 'bbox cy',
ax: 'bbox x',
ax2: 'bbox x2',
ay: 'bbox ay'
});
});
});
describe('#transform', function() {
it('returns the result of calling transform on the container', function() {
this.node.container = jasmine.createSpyObj('container', ['addClass', 'transform']);
this.node.container.transform.and.returnValue('transform result');
expect(this.node.transform('matrix')).toEqual('transform result');
expect(this.node.container.transform).toHaveBeenCalledWith('matrix');
});
});
describe('#deferredStep', function() {
it('resolves the returned promise when the render is not canceled', function(done) {
var resolve = jasmine.createSpy('resolve'),
reject = jasmine.createSpy('reject');
this.node.deferredStep('result')
.then(resolve, reject)
.then(() => {
expect(resolve).toHaveBeenCalledWith('result');
expect(reject).not.toHaveBeenCalled();
})
.then(done);
});
it('rejects the returned promise when the render is canceled', function(done) {
var resolve = jasmine.createSpy('resolve'),
reject = jasmine.createSpy('reject');
this.node.state.cancelRender = true;
this.node.deferredStep('result', 'value')
.then(resolve, reject)
.then(() => {
expect(resolve).not.toHaveBeenCalled();
expect(reject).toHaveBeenCalledWith('Render cancelled');
})
.then(done);
});
});
describe('#renderLabel', function() {
pending();
});
describe('#startRender', function() {
it('increments the renderCounter', function() {
this.node.state.renderCounter = 0;
this.node.startRender();
expect(this.node.state.renderCounter).toEqual(1);
});
});
describe('#doneRender', function() {
pending();
});
describe('#render', function() {
beforeEach(function() {
this.container = jasmine.createSpyObj('container', ['addClass']);
});
describe('when a proxy node is used', function() {
beforeEach(function() {
this.node.proxy = jasmine.createSpyObj('proxy', ['render']);
this.node.proxy.render.and.returnValue('example proxy result');
});
it('sets the container', function() {
this.node.render(this.container);
expect(this.node.container).toEqual(this.container);
});
it('calls the proxy render method', function() {
expect(this.node.render(this.container)).toEqual('example proxy result');
expect(this.node.proxy.render).toHaveBeenCalledWith(this.container);
});
});
describe('when a proxy node is not used', function() {
beforeEach(function() {
this.deferred = Q.defer();
this.node._render = jasmine.createSpy('_render').and.returnValue(this.deferred.promise);
spyOn(this.node, 'startRender');
spyOn(this.node, 'doneRender');
});
it('sets the container', function() {
this.node.render(this.container);
expect(this.node.container).toEqual(this.container);
});
it('calls #startRender', function() {
this.node.render(this.container);
expect(this.node.startRender).toHaveBeenCalled();
});
it('calls #_render', function() {
this.node.render(this.container);
expect(this.node._render).toHaveBeenCalled();
});
describe('when #_render is complete', function() {
beforeEach(function() {
this.deferred.resolve();
});
it('calls #doneRender', function(done) {
this.node.render(this.container)
.then(() => {
expect(this.node.doneRender).toHaveBeenCalled();
})
.then(done);
});
it('ultimately resolves with the node instance', function(done) {
this.node.render(this.container)
.then(result => {
expect(result).toEqual(this.node);
})
.then(done);
});
});
});
});
describe('#spaceHorizontally', function() {
pending();
});
describe('#spaceVertically', function() {
pending();
});
describe('#renderLabeledBox', function() {
pending();
});
});