UNPKG

sku-pg

Version:

Skulpt is a Javascript implementation of Python 2.x. Python that runs in your browser!

423 lines (323 loc) 12 kB
<!DOCTYPE html> <html> <!-- Copyright 2006 The Closure Library Authors. All Rights Reserved. Use of this source code is governed by an Apache 2.0 License. See the COPYING file for details. --> <head> <title>Closure Unit Tests - goog.events.EventTarget</title> <script src="../base.js"></script> <script> goog.require('goog.events.Event'); goog.require('goog.events.EventTarget'); goog.require('goog.testing.jsunit'); </script> </head> <body> <script> /** * Class that implements EventTarget and dispatches a custom event 'count' */ function TargetClass() { this.count = 0; }; goog.inherits(TargetClass, goog.events.EventTarget); TargetClass.prototype.increment = function() { this.count++; return this.dispatchEvent(new MyEvent()); }; TargetClass.prototype.reset = function() { this.count = 0; }; /** * Class that is set up to listen to the target */ function ListenerClass() { this.count = 0; }; ListenerClass.prototype.reset = function() { this.count = 0; }; ListenerClass.prototype.justListen1 = function(e) { this.count++; }; ListenerClass.prototype.justListen2 = function(e) { this.count++; }; ListenerClass.prototype.justListen3 = function(e) { this.count++; }; ListenerClass.prototype.preventDefault = function(e) { this.count++; e.preventDefault(); }; ListenerClass.prototype.stopPropagation = function(e) { this.count++; e.stopPropagation(); }; ListenerClass.prototype.returnFalse = function(e) { this.count++; return false; }; ListenerClass.prototype.handleEvent = function(e) { if (e.type == 'count') { this.count++; } }; function MyEvent(obj) { this.type = 'count'; } goog.inherits(MyEvent, goog.events.Event); /** * No listeners */ function testNoListeners() { var target = new TargetClass(); var listener = new ListenerClass(); var result = target.increment(); assertEquals(0, listener.count); assertTrue(result); assertEquals('0 listeners should be removed', 0, goog.events.removeAll(target)); } /** * Basic test of listeners */ function testBasicEventTarget() { var target = new TargetClass(); var listener = new ListenerClass(); goog.events.listen(target, 'count', listener.justListen1, false, listener); goog.events.listen(target, 'count', listener.justListen2, false, listener); goog.events.listen(target, 'count', listener.justListen3, false, listener); var result = target.increment(); assertEquals(3, listener.count); assertTrue(result); assertEquals('3 listeners should be removed', 3, goog.events.removeAll(target)); } /** * Just Capture */ function testJustCapture() { var target = new TargetClass(); var listener = new ListenerClass(); goog.events.listen(target, 'count', listener.justListen1, true, listener); var result = target.increment(); assertEquals(1, listener.count); assertTrue(result); assertEquals('1 listeners should be removed', 1, goog.events.removeAll(target)); } /** * Just Bubble */ function testJustBubble() { var target = new TargetClass(); var listener = new ListenerClass(); goog.events.listen(target, 'count', listener.justListen1, false, listener); var result = target.increment(); assertEquals(1, listener.count); assertTrue(result); assertEquals('1 listeners should be removed', 1, goog.events.removeAll(target)); } /** * Basic test of listeners */ function testCaptureAndBubble() { var target = new TargetClass(); var listener = new ListenerClass(); goog.events.listen(target, 'count', listener.justListen1, true, listener); goog.events.listen(target, 'count', listener.justListen2, true, listener); goog.events.listen(target, 'count', listener.justListen3, true, listener); goog.events.listen(target, 'count', listener.justListen1, false, listener); goog.events.listen(target, 'count', listener.justListen2, false, listener); goog.events.listen(target, 'count', listener.justListen3, false, listener); var result = target.increment(); assertEquals(6, listener.count); assertTrue(result); assertEquals('6 listeners should be removed', 6, goog.events.removeAll(target)); } /** * Test of prevent default */ function testPreventDefault() { var target = new TargetClass(); var listener = new ListenerClass(); goog.events.listen(target, 'count', listener.justListen1, false, listener); goog.events.listen(target, 'count', listener.justListen2, false, listener); goog.events.listen(target, 'count', listener.preventDefault, false, listener); var result = target.increment(); assertEquals(3, listener.count); assertFalse(result); assertEquals('3 listeners should be removed', 3, goog.events.removeAll(target)); } /** * Test of stop propagation */ function testStopPropagation() { var target = new TargetClass(); var listener = new ListenerClass(); goog.events.listen(target, 'count', listener.justListen1, true, listener); goog.events.listen(target, 'count', listener.stopPropagation, true, listener); goog.events.listen(target, 'count', listener.justListen1, false, listener); goog.events.listen(target, 'count', listener.justListen2, false, listener); var result = target.increment(); assertEquals(2, listener.count); assertTrue(result); assertEquals('4 listeners should be removed', 4, goog.events.removeAll(target)); } /** * Test of stop propagation and prevent default */ function testStopPropagationAndPreventDefaultAtCapture() { var target = new TargetClass(); var listener = new ListenerClass(); goog.events.listen(target, 'count', listener.preventDefault, true, listener); goog.events.listen(target, 'count', listener.stopPropagation, true, listener); goog.events.listen(target, 'count', listener.justListen1, false, listener); goog.events.listen(target, 'count', listener.justListen2, false, listener); var result = target.increment(); assertEquals(2, listener.count); assertFalse(result); assertEquals('4 listeners should be removed', 4, goog.events.removeAll(target)); } /** * Test of stop propagation and prevent default */ function testStopPropagationAndPreventDefaultAtBubble() { var target = new TargetClass(); var listener = new ListenerClass(); goog.events.listen(target, 'count', listener.justListen2, true, listener); goog.events.listen(target, 'count', listener.stopPropagation, true, listener); goog.events.listen(target, 'count', listener.justListen1, false, listener); goog.events.listen(target, 'count', listener.preventDefault, false, listener); var result = target.increment(); assertEquals(2, listener.count); // Should be true because stop propagation cancelled the listener that // prevented default assertTrue(result); assertEquals('4 listeners should be removed', 4, goog.events.removeAll(target)); } /** * Test return false */ function testReturnFalse() { var target = new TargetClass(); var listener = new ListenerClass(); goog.events.listen(target, 'count', listener.justListen1, false, listener); goog.events.listen(target, 'count', listener.returnFalse, false, listener); goog.events.listen(target, 'count', listener.justListen3, false, listener); var result = target.increment(); assertEquals(3, listener.count); assertFalse(result); assertEquals('3 listeners should be removed', 3, goog.events.removeAll(target)); } function testHandleEvent() { var target = new TargetClass(); var listener1 = new ListenerClass(); var listener2 = new ListenerClass(); var listener3 = new ListenerClass(); goog.events.listen(target, 'count', listener1, false); goog.events.listen(target, 'count', listener2, false); goog.events.listen(target, 'count', listener3, false); target.increment(); target.increment(); var result = target.increment(); assertEquals(3, listener1.count); assertEquals(3, listener2.count); assertEquals(3, listener3.count); assertTrue(result); assertEquals('3 listeners should be removed', 3, goog.events.removeAll(target)); } function testListenOnce() { var target = new TargetClass(); var listener = new ListenerClass(); goog.events.listenOnce(target, 'count', listener.justListen1, false, listener); goog.events.listenOnce(target, 'count', listener.justListen2, false, listener); goog.events.listenOnce(target, 'count', listener.justListen3, false, listener); var result = target.increment(); assertEquals('listener count', 3, listener.count); assertTrue(result); // Increment again. This time all the listeners should have been removed result = target.increment(); assertEquals(3, listener.count); assertTrue(result); assertEquals('0 listeners should be removed', 0, goog.events.removeAll(target)); // Increment again to make sure that unlisten works goog.events.listenOnce(target, 'count', listener.justListen1, false, listener); goog.events.unlisten(target, 'count', listener.justListen1, false, listener); result = target.increment(); assertEquals(3, listener.count); assertTrue(result); assertEquals('0 listeners should be removed', 0, goog.events.removeAll(target)); // We now test that we can unlisten in the listener without breaking things var f = function(e) { goog.events.unlisten(target, 'count', f, false); return listener.justListen1(e); }; goog.events.listenOnce(target, 'count', f, false); result = target.increment(); assertEquals(4, listener.count); assertTrue(result); assertEquals('0 listeners should be removed', 0, goog.events.removeAll(target)); } function testUnlistenInListen() { var target = new TargetClass(); var listener = new ListenerClass(); var f = function(e) { goog.events.unlisten(target, 'count', listener.justListen1, false, listener); goog.events.unlisten(target, 'count', f, false); goog.events.unlisten(target, 'count', listener.justListen3, false, listener); listener.justListen2(e); }; goog.events.listen(target, 'count', listener.justListen1, false, listener); goog.events.listen(target, 'count', f, false); goog.events.listen(target, 'count', listener.justListen3, false, listener); var result = target.increment(); assertEquals('justListen3 should not be called', 2, listener.count); assertTrue(result); assertEquals('0 listeners should be removed', 0, goog.events.removeAll(target)); } function testParentEventTarget() { var child = new TargetClass(); var parent = new TargetClass(); assertNull('Parent event target should default to null', child.getParentEventTarget()); child.setParentEventTarget(parent); assertEquals('Parent event target should be set', parent, child.getParentEventTarget()); var listener = new ListenerClass(); goog.events.listen(parent, 'count', listener.justListen1, false, listener); child.increment(); assertEquals('Event should have bubbled to the parent', 1, listener.count); } </script> </body> </html>