diff --git a/test/unit/core/EventDispatcher.js b/test/unit/core/EventDispatcher.js
new file mode 100644
index 0000000000000000000000000000000000000000..1d9250c3a7cdac8c1709b606834e5ee4978deaa0
--- /dev/null
+++ b/test/unit/core/EventDispatcher.js
@@ -0,0 +1,88 @@
+/**
+ * @author simonThiele / https://github.com/simonThiele
+ */
+
+module( "EventDispatcher" );
+
+test( "apply", function() {
+ var innocentObject = {};
+ var eventDispatcher = new THREE.EventDispatcher();
+
+ eventDispatcher.apply( innocentObject );
+
+ ok( innocentObject.addEventListener !== undefined &&
+ innocentObject.hasEventListener !== undefined &&
+ innocentObject.removeEventListener !== undefined &&
+ innocentObject.dispatchEvent !== undefined, "events where added to object" );
+});
+
+test( "addEventListener", function() {
+ var eventDispatcher = new THREE.EventDispatcher();
+
+ var listener = {};
+ eventDispatcher.addEventListener( 'anyType', listener );
+
+ ok( eventDispatcher._listeners.anyType.length === 1, "listener with unknown type was added" );
+ ok( eventDispatcher._listeners.anyType[0] === listener, "listener with unknown type was added" );
+
+ eventDispatcher.addEventListener( 'anyType', listener );
+
+ ok( eventDispatcher._listeners.anyType.length === 1, "can't add one listener twice to same type" );
+ ok( eventDispatcher._listeners.anyType[0] === listener, "listener is still there" );
+});
+
+test( "hasEventListener", function() {
+ var eventDispatcher = new THREE.EventDispatcher();
+
+ var listener = {};
+ eventDispatcher.addEventListener( 'anyType', listener );
+
+ ok( eventDispatcher.hasEventListener( 'anyType', listener ), "listener was found" );
+ ok( !eventDispatcher.hasEventListener( 'anotherType', listener ), "listener was not found which is good" );
+});
+
+test( "removeEventListener", function() {
+ var eventDispatcher = new THREE.EventDispatcher();
+
+ var listener = {};
+
+ ok ( eventDispatcher._listeners === undefined, "there are no listeners by default" );
+
+ eventDispatcher.addEventListener( 'anyType', listener );
+ 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 );
+ ok ( eventDispatcher._listeners.anyType.length === 0, "listener was deleted" );
+
+ eventDispatcher.removeEventListener( 'unknownType', listener );
+ ok ( eventDispatcher._listeners.unknownType === undefined, "unknown types will be ignored" );
+
+ eventDispatcher.removeEventListener( 'anyType', undefined );
+ ok ( eventDispatcher._listeners.anyType.length === 0, "undefined listeners are ignored" );
+});
+
+test( "dispatchEvent", function() {
+ var eventDispatcher = new THREE.EventDispatcher();
+
+ var callCount = 0;
+ var listener = function() { callCount++; };
+
+ eventDispatcher.addEventListener( 'anyType', listener );
+ ok( callCount === 0, "no event, no call" );
+
+ eventDispatcher.dispatchEvent( { type: 'anyType' } );
+ ok( callCount === 1, "one event, one call" );
+
+ eventDispatcher.dispatchEvent( { type: 'anyType' } );
+ ok( callCount === 2, "two events, two calls" );
+});
+
+
+
+
+
+
+
+
+//
diff --git a/test/unit/unittests_three.html b/test/unit/unittests_three.html
index 5ce51592763eb7ab8387a7ec5baa16a37e08eff6..4a46509d706506c9abecf752ce0ab157abf1fcbb 100644
--- a/test/unit/unittests_three.html
+++ b/test/unit/unittests_three.html
@@ -25,6 +25,7 @@
+