/* * Copyright 2010 Google Inc. * * Licensed under the Apache License, Version 2.0 (the "License"); you may not * use this file except in compliance with the License. You may obtain a copy of * the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the * License for the specific language governing permissions and limitations under * the License. */ package elemental.events; import com.google.gwt.core.client.GWT; import com.google.gwt.core.client.GWT.UncaughtExceptionHandler; import com.google.gwt.junit.client.GWTTestCase; import elemental.client.Browser; import elemental.dom.Document; import elemental.dom.Element; import elemental.html.ButtonElement; import elemental.html.TestUtils; /** * Tests for {@link EventTarget}. */ public class EventTargetTest extends GWTTestCase { private static class ListenerDidFire implements EventListener { private boolean didFire; public boolean didFire() { return didFire; } @Override public void handleEvent(Event evt) { didFire = true; } } @Override public String getModuleName() { return "elemental.Elemental"; } /** * Tests that addEventListener() correctly adds a listener. */ public void testAddEventListener() { final Element body = Browser.getDocument().getBody(); final ListenerDidFire a = new ListenerDidFire(); final ListenerDidFire b = new ListenerDidFire(); // Ensure that addEventListener works. body.addEventListener("click", a, false); // Ensure that setOnClick also works. body.setOnclick(b); assertEquals(b, body.getOnclick()); TestUtils.click(body); assertTrue(a.didFire()); assertTrue(b.didFire()); } /** * Tests that removeEventListener() correctly removes the listener, so that no * events are fired afterwards. */ @SuppressWarnings("deprecation") public void testRemoveEventListener() { final Element body = Browser.getDocument().getBody(); final ListenerDidFire listener = new ListenerDidFire(); // Ensure that EventRemover works. body.addEventListener("click", listener, false).remove(); TestUtils.click(body); assertFalse(listener.didFire()); // Ensure that removeEventListener works. body.addEventListener("click", listener, false); body.removeEventListener("click", listener, false); TestUtils.click(body); assertFalse(listener.didFire()); // Ensure that onclick = null works. body.setOnclick(listener); body.setOnclick(null); TestUtils.click(body); assertFalse(listener.didFire()); } /** * Tests that the {@link UncaughtExceptionHandler} gets called correctly when * events are fired from a subinterface of {@link EventTarget}. */ public void testUncaughtException() { // Create a button with an event handler that will throw an exception. Document doc = Browser.getDocument(); ButtonElement btn = doc.createButtonElement(); doc.getBody().appendChild(btn); btn.addEventListener(Event.CLICK, new EventListener() { @Override public void handleEvent(Event evt) { throw new RuntimeException("w00t!"); } }, false); // Setup the UncaughtExceptionHandler. final Throwable[] ex = new Throwable[1]; GWT.setUncaughtExceptionHandler(new UncaughtExceptionHandler() { @Override public void onUncaughtException(Throwable e) { ex[0] = e; } }); // Click it and make sure the exception got caught. TestUtils.click(btn); assertNotNull(ex[0]); assertEquals("w00t!", ex[0].getMessage()); // Clean up. GWT.setUncaughtExceptionHandler(null); doc.getBody().removeChild(btn); } }