/* global QUnit */

import { EventDispatcher } from '../../../../src/core/EventDispatcher.js';

export default QUnit.module( 'Core', () => {

	QUnit.module( 'EventDispatcher', () => {

		// INSTANCING
		QUnit.test( 'Instancing', ( assert ) => {

			const object = new EventDispatcher();
			assert.ok( object, 'Can instantiate an EventDispatcher.' );

		} );

		// PUBLIC
		QUnit.test( 'addEventListener', ( assert ) => {

			const eventDispatcher = new EventDispatcher();

			const listener = {};
			eventDispatcher.addEventListener( 'anyType', listener );

			assert.ok( eventDispatcher._listeners.anyType.length === 1, 'listener with unknown type was added' );
			assert.ok( eventDispatcher._listeners.anyType[ 0 ] === listener, 'listener with unknown type was added' );

			eventDispatcher.addEventListener( 'anyType', listener );

			assert.ok( eventDispatcher._listeners.anyType.length === 1, 'can\'t add one listener twice to same type' );
			assert.ok( eventDispatcher._listeners.anyType[ 0 ] === listener, 'listener is still there' );

		} );

		QUnit.test( 'hasEventListener', ( assert ) => {

			const eventDispatcher = new EventDispatcher();

			const listener = {};
			eventDispatcher.addEventListener( 'anyType', listener );

			assert.ok( eventDispatcher.hasEventListener( 'anyType', listener ), 'listener was found' );
			assert.ok( ! eventDispatcher.hasEventListener( 'anotherType', listener ), 'listener was not found which is good' );

		} );

		QUnit.test( 'removeEventListener', ( assert ) => {

			const eventDispatcher = new EventDispatcher();

			const listener = {};

			assert.ok( eventDispatcher._listeners === undefined, 'there are no listeners by default' );

			eventDispatcher.addEventListener( 'anyType', listener );
			assert.ok( Object.keys( eventDispatcher._listeners ).length === 1 &&
				eventDispatcher._listeners.anyType.length === 1, 'if a listener was added, there is a new key' );

			eventDispatcher.removeEventListener( 'anyType', listener );
			assert.ok( eventDispatcher._listeners.anyType.length === 0, 'listener was deleted' );

			eventDispatcher.removeEventListener( 'unknownType', listener );
			assert.ok( eventDispatcher._listeners.unknownType === undefined, 'unknown types will be ignored' );

			eventDispatcher.removeEventListener( 'anyType', undefined );
			assert.ok( eventDispatcher._listeners.anyType.length === 0, 'undefined listeners are ignored' );

		} );

		QUnit.test( 'dispatchEvent', ( assert ) => {

			const eventDispatcher = new EventDispatcher();

			let callCount = 0;
			const listener = function () {

				callCount ++;

			};

			eventDispatcher.addEventListener( 'anyType', listener );
			assert.ok( callCount === 0, 'no event, no call' );

			eventDispatcher.dispatchEvent( { type: 'anyType' } );
			assert.ok( callCount === 1, 'one event, one call' );

			eventDispatcher.dispatchEvent( { type: 'anyType' } );
			assert.ok( callCount === 2, 'two events, two calls' );

		} );

	} );

} );