Newer
Older
pixi.js / test / unit / pixi-v2 / utils / EventTarget.js
@Dr. Kibtiz Dr. Kibtiz on 21 Mar 2015 8 KB Moved old tests to pixi-v2 dir
describe('pixi/utils/EventTarget', function () {
    'use strict';

    var expect = chai.expect;

    var Clazz, PClazz, obj, pobj, obj2;
    beforeEach(function () {
        Clazz = function () {};
        PClazz = function () {};

        PIXI.EventTarget.mixin(Clazz.prototype);
        PIXI.EventTarget.mixin(PClazz.prototype);

        obj = new Clazz();
        obj2 = new Clazz();
        pobj = new PClazz();

        obj.parent = pobj;
        obj2.parent = obj;
    });

    it('Module exists', function () {
        expect(PIXI.EventTarget).to.be.an('object');
    });

    it('Confirm new instance', function () {
        pixi_utils_EventTarget_confirm(obj);
    });

    it('simple on/emit case works', function () {
        var myData = {};

        obj.on('myevent', function (event) {
            pixi_utils_EventTarget_Event_confirm(event, obj, myData);
        });

        obj.emit('myevent', myData);
    });

    it('simple once case works', function () {
        var called = 0;

        obj.once('myevent', function() { called++; });

        obj.emit('myevent');
        obj.emit('myevent');
        obj.emit('myevent');
        obj.emit('myevent');
        obj.emit('myevent');

        expect(called).to.equal(1);
    });

    it('simple off case works', function (done) {
        function onMyEvent() {
            done(new Error('Event listener should not have been called'));
        }

        obj.on('myevent', onMyEvent);
        obj.off('myevent', onMyEvent);
        obj.emit('myevent');

        done();
    });

    it('simple propagation case works', function (done) {
        var myData = {};

        pobj.on('myevent', function () {
            done();
        });

        obj.emit('myevent');
    });

    it('simple stopPropagation case works', function (done) {
        var myData = {};

        pobj.on('myevent', function () {
            done(new Error('Event listener should not have been called on the parent element'));
        });

        obj.on('myevent', function (evt) {
            evt.stopPropagation();
        });

        obj.emit('myevent');

        done();
    });

    it('simple stopImmediatePropagation case works', function (done) {
        var myData = {};

        pobj.on('myevent', function () {
            done(new Error('Event listener should not have been called on the parent'));
        });

        obj.on('myevent', function (evt) {
            evt.stopImmediatePropagation();
        });

        obj.on('myevent', function () {
            done(new Error('Event listener should not have been called on the second'));
        });

        obj.emit('myevent');

        done();
    });

    it('multiple dispatches work properly', function () {
        var called = 0;

        function onMyEvent() {
            called++;
        }

        obj.on('myevent', onMyEvent);
        obj.emit('myevent');
        obj.emit('myevent');
        obj.emit('myevent');
        obj.emit('myevent');

        expect(called).to.equal(4);
    });

    it('multiple events work properly', function () {
        var called = 0;

        function onMyEvent() {
            called++;
        }

        obj.on('myevent1', onMyEvent);
        obj.on('myevent2', onMyEvent);
        obj.on('myevent3', onMyEvent);
        obj.emit('myevent1');
        obj.emit('myevent2');
        obj.emit('myevent3');

        expect(called).to.equal(3);
    });

    it('multiple events one removed works properly', function () {
        var called = 0;

        function onMyEvent() {
            called++;
        }

        obj.on('myevent1', onMyEvent);
        obj.on('myevent2', onMyEvent);
        obj.on('myevent3', onMyEvent);

        obj.emit('myevent1');
        obj.emit('myevent2');
        obj.emit('myevent3');

        obj.off('myevent2', onMyEvent);

        obj.emit('myevent1');
        obj.emit('myevent2');
        obj.emit('myevent3');

        expect(called).to.equal(5);
    });

    it('multiple handlers for one event with some removed', function () {
        var called = 0;

        var onMyEvent = function () {
                called++;
            },
            onMyEvent2 = function () {
                called++;
            };

        // add 2 handlers and confirm they both get called
        obj.on('myevent', onMyEvent);
        obj.on('myevent', onMyEvent);
        obj.on('myevent', onMyEvent2);
        obj.on('myevent', onMyEvent2);

        obj.emit('myevent');

        expect(called).to.equal(4);

        // remove one of the handlers, emit again, then ensure 1 more call is made
        obj.off('myevent', onMyEvent);

        obj.emit('myevent');

        expect(called).to.equal(6);
    });

    it('calls to off without a handler do nothing', function () {
        var called = 0;

        var onMyEvent = function () {
            called++;
        };

        obj.on('myevent', onMyEvent);
        obj.on('myevent', onMyEvent);

        obj.emit('myevent');

        expect(called).to.equal(2);

        obj.off('myevent');

        obj.emit('myevent');

        expect(called).to.equal(4);

        obj.off('myevent', onMyEvent);

        obj.emit('myevent');

        expect(called).to.equal(4);
    });

    it('handles multiple instances with the same prototype', function () {
        var called = 0;

        function onMyEvent(e) {
            called++;
        }

        obj.on('myevent1', onMyEvent);
        obj.on('myevent2', onMyEvent);

        obj2.istwo = true;
        obj2.on('myevent1', onMyEvent);
        obj2.on('myevent2', onMyEvent);

        obj.emit('myevent1');
        obj.emit('myevent2');
        obj2.emit('myevent1');
        obj2.emit('myevent2');

        //we emit 4 times, but since obj2 is a child of obj the event should bubble
        //up to obj and show up there as well. So the obj2.emit() calls each increment
        //the counter twice.
        expect(called).to.equal(6);
    });

    it('is backwards compatible with older .dispatchEvent({})', function () {
        var called = 0,
            data = {
                some: 'thing',
                hello: true
            };

        function onMyEvent(event) {
            pixi_utils_EventTarget_Event_confirm(event, obj, data);

            called++;
        }

        obj.on('myevent1', onMyEvent);
        obj.on('myevent2', onMyEvent);
        obj.on('myevent3', onMyEvent);

        data.type = 'myevent1';
        obj.emit(data);

        data.type = 'myevent2';
        obj.emit(data);

        data.type = 'myevent3';
        obj.emit(data);

        obj.off('myevent2', onMyEvent);

        data.type = 'myevent1';
        obj.emit(data);

        data.type = 'myevent2';
        obj.emit(data);

        data.type = 'myevent3';
        obj.emit(data);

        expect(called).to.equal(5);
    });

    it('is backwards compatible with older .call(this)', function () {
        var Fn = function() {
                PIXI.EventTarget.call(this);
            },
            o = new Fn();

        pixi_utils_EventTarget_confirm(o);
    });

    it('is backwards compatible with older .addEventListener("")', function () {
        var called = 0,
            data = {
                some: 'thing',
                hello: true
            };

        function onMyEvent(event) {
            pixi_utils_EventTarget_Event_confirm(event, obj, data);

            called++;
        }

        obj.addEventListener('myevent1', onMyEvent);
        obj.addEventListener('myevent2', onMyEvent);
        obj.addEventListener('myevent3', onMyEvent);

        data.type = 'myevent1';
        obj.emit(data);

        data.type = 'myevent2';
        obj.emit(data);

        data.type = 'myevent3';
        obj.emit(data);

        obj.off('myevent2', onMyEvent);

        data.type = 'myevent1';
        obj.emit(data);

        data.type = 'myevent2';
        obj.emit(data);

        data.type = 'myevent3';
        obj.emit(data);

        expect(called).to.equal(5);
    });

    it('event remove during emit call properly', function () {
        var called = 0;

        function cb1() {
            called++;
            obj.off('myevent', cb1);
        }
        function cb2() {
            called++;
            obj.off('myevent', cb2);
        }
        function cb3() {
            called++;
            obj.off('myevent', cb3);
        }

        obj.on('myevent', cb1);
        obj.on('myevent', cb2);
        obj.on('myevent', cb3);
        obj.emit('myevent', '');

        expect(called).to.equal(3);
    });
});