const { Runner } = require('../');
describe('PIXI.Runner', function ()
{
it('should should exist', function ()
{
expect(Runner).to.be.defined;
expect(typeof Runner).to.equal('function');
});
it('should implement emit', function ()
{
const complete = new Runner('complete');
expect(complete.name).to.equal('complete');
const callback = sinon.spy();
complete.add({ complete: callback });
complete.emit();
expect(callback.called).to.be.true;
expect(callback.calledOnce).to.be.true;
complete.emit();
expect(callback.calledTwice).to.be.true;
complete.emit();
expect(callback.calledThrice).to.be.true;
complete.destroy();
expect(!complete.items).to.be.true;
expect(!complete.name).to.be.true;
});
it('should implement emit with arguments', function ()
{
const update = new Runner('update');
const callback = sinon.spy(function (time, delta)
{
let len = 0;
// Count the number of non-undefined arguments
for (let i = 0; i < arguments.length; i++)
{
if (arguments[i] !== undefined)
{
len++;
}
}
expect(len).to.equal(2);
expect(time).to.equal(1);
expect(delta).to.equal(2);
});
update.add({ update: callback });
update.emit(1, 2);
expect(callback.called).to.be.true;
expect(callback.calledOnce).to.be.true;
});
it('should throw an error with too many arguments', function ()
{
const complete = new Runner('complete');
complete.add({
// eslint-disable-next-line no-unused-vars, no-empty-function
complete(a, b, c, d, e, f, g, h, i) {},
});
try
{
complete.emit(1, 2, 3, 4, 5, 6, 7, 8, 9);
throw new Error('failed too many args');
}
catch (e)
{
expect(!!e).to.equal.true;
expect(e.message).to.equal('max arguments reached');
}
});
it('should implement multiple targets', function ()
{
const complete = new Runner('complete');
const obj = { complete: sinon.spy() };
const obj2 = { complete: sinon.spy() };
expect(complete.empty).to.be.true;
complete.add(obj);
expect(complete.contains(obj)).to.be.true;
complete.add(obj2);
expect(complete.contains(obj2)).to.be.true;
complete.emit();
expect(!complete.empty).to.be.true;
expect(complete.items.length).to.equal(2);
expect(obj.complete.called).to.be.true;
expect(obj.complete.calledOnce).to.be.true;
expect(obj2.complete.called).to.be.true;
expect(obj2.complete.calledOnce).to.be.true;
complete.remove(obj);
expect(complete.items.length).to.equal(1);
complete.remove(obj2);
expect(complete.items.length).to.equal(0);
expect(complete.empty).to.be.true;
});
it('should implement removeAll', function ()
{
const complete = new Runner('complete');
// eslint-disable-next-line no-empty-function
const obj = { complete() {} };
// eslint-disable-next-line no-empty-function
const obj2 = { complete() {} };
const obj3 = {};
complete
.add(obj)
.add(obj2)
.add(obj3);
expect(complete.items.length).to.equal(2);
complete.removeAll();
expect(complete.empty).to.be.true;
});
it('should not add items more than once', function ()
{
const complete = new Runner('complete');
// eslint-disable-next-line no-empty-function
const obj = { complete() {} };
complete.add(obj).add(obj);
expect(complete.items.length).to.equal(1);
});
});