/* * Copyright 2007 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 com.google.gwt.user.client.ui; import com.google.gwt.dom.client.Document; import com.google.gwt.event.dom.client.ClickEvent; import com.google.gwt.event.dom.client.ClickHandler; import com.google.gwt.event.logical.shared.ValueChangeEvent; import com.google.gwt.event.logical.shared.ValueChangeHandler; import com.google.gwt.junit.client.GWTTestCase; import com.google.gwt.safehtml.shared.SafeHtmlUtils; import com.google.gwt.user.client.DOM; import com.google.gwt.user.client.Event; import com.google.gwt.user.client.ui.CustomButton.Face; import java.util.ArrayList; import java.util.HashMap; import java.util.Iterator; import java.util.Map; import java.util.Map.Entry; /** * Test for <code>PushButton</code> as most of this widget's functionality is UI * based, the primary test will be in the new UI testing framework once it is * released. */ public class CustomButtonTest extends GWTTestCase { private static class Handler implements ValueChangeHandler<Boolean> { Boolean received = null; public void onValueChange(ValueChangeEvent<Boolean> event) { received = event.getValue(); } } private static final String html = "<b>hello</b><i>world</i>"; public String getModuleName() { return "com.google.gwt.user.User"; } public void testCleanupOnRemoval() { PushButton pb = new PushButton(); ToggleButton tb = new ToggleButton(); RootPanel.get().add(pb); RootPanel.get().add(tb); // Synthesize mouse-over events to get both buttons into the 'hover' state. pb.getElement().dispatchEvent( Document.get().createMouseOverEvent(1, 0, 0, 0, 0, false, false, false, false, Event.BUTTON_LEFT, null)); tb.getElement().dispatchEvent( Document.get().createMouseOverEvent(1, 0, 0, 0, 0, false, false, false, false, Event.BUTTON_LEFT, null)); assertTrue(pb.isHovering()); assertTrue(tb.isHovering()); // Remove the buttons. The hover state should be cleared. pb.removeFromParent(); tb.removeFromParent(); assertFalse(pb.isHovering()); assertFalse(tb.isHovering()); } public void testCSS() { ToggleButton b = new ToggleButton("up", "down"); b.setStyleName("random"); b.setDown(true); assertEquals(b.getStylePrimaryName(), "random"); Map faces = new HashMap(); faces.put("downDisabled", b.getDownDisabledFace()); faces.put("upDisabled", b.getUpDisabledFace()); faces.put("down", b.getDownFace()); faces.put("up", b.getUpFace()); faces.put("upHovering", b.getUpHoveringFace()); faces.put("downHovering", b.getDownHoveringFace()); Iterator entries = faces.entrySet().iterator(); // Set all faces as text. while (entries.hasNext()) { Map.Entry entry = (Entry) entries.next(); Face f = (Face) entry.getValue(); b.setCurrentFace(f); assertEquals("random", b.getStylePrimaryName()); assertTrue(b.getStyleName().indexOf("random-" + f.getName()) != -1); } entries = faces.entrySet().iterator(); b.addStyleName("fobar"); // Set all faces as text. while (entries.hasNext()) { Map.Entry entry = (Entry) entries.next(); Face f = (Face) entry.getValue(); b.setCurrentFace(f); String computedStyleName = DOM.getElementProperty(b.getElement(), "className"); assertTrue(computedStyleName.indexOf("random") == 0); assertTrue(computedStyleName.indexOf("random-" + f.getName()) >= 0); assertTrue(computedStyleName.indexOf("fobar") >= 0); } } public void testSettingFaces() { PushButton b = new PushButton(); Map faces = new HashMap(); faces.put("downDisabled", b.getDownDisabledFace()); faces.put("upDisabled", b.getUpDisabledFace()); faces.put("down", b.getDownFace()); faces.put("up", b.getUpFace()); faces.put("upHovering", b.getUpHoveringFace()); faces.put("downHovering", b.getDownHoveringFace()); Iterator entries = faces.entrySet().iterator(); // Set all faces as text. while (entries.hasNext()) { Map.Entry entry = (Entry) entries.next(); Face f = (Face) entry.getValue(); String faceName = (String) entry.getKey(); f.setText(faceName); } entries = faces.entrySet().iterator(); while (entries.hasNext()) { Map.Entry entry = (Entry) entries.next(); Face f = (Face) entry.getValue(); String faceName = (String) entry.getKey(); assertEquals(f.getText(), faceName); } // Set all faces as HTML entries = faces.entrySet().iterator(); while (entries.hasNext()) { Map.Entry entry = (Entry) entries.next(); Face f = (Face) entry.getValue(); String faceName = (String) entry.getKey(); f.setHTML("<b>" + faceName + "</b>"); } entries = faces.entrySet().iterator(); while (entries.hasNext()) { Map.Entry entry = (Entry) entries.next(); Face f = (Face) entry.getValue(); String faceName = (String) entry.getKey(); assertEquals(f.getText(), faceName); assertEquals(f.getHTML().toLowerCase(), "<b>" + faceName.toLowerCase() + "</b>"); } } public void testSetSafeHtml() { PushButton button = new PushButton(); button.setHTML(SafeHtmlUtils.fromSafeConstant(html)); assertEquals(html, button.getHTML().toLowerCase()); } public void testSyntheticClick() { ToggleButton b = new ToggleButton(); final ArrayList<String> events = new ArrayList<String>(); Handler h = new Handler(); b.addClickHandler(new ClickHandler() { public void onClick(ClickEvent event) { events.add(event.getNativeEvent().getType()); } }); b.addValueChangeHandler(h); RootPanel.get().add(b); // Synthesize over/down/up events, which should kick off CustomButton's // internal machinery to synthesize a click. b.getElement().dispatchEvent( Document.get().createMouseOverEvent(1, 0, 0, 0, 0, false, false, false, false, Event.BUTTON_LEFT, null)); b.getElement().dispatchEvent( Document.get().createMouseDownEvent(1, 0, 0, 0, 0, false, false, false, false, Event.BUTTON_LEFT)); b.getElement().dispatchEvent( Document.get().createMouseUpEvent(1, 0, 0, 0, 0, false, false, false, false, Event.BUTTON_LEFT)); assertEquals("Expecting one click event", 1, events.size()); assertEquals("Expecting one click event", "click", events.get(0)); assertNotNull("Expecting a value change event", h.received); } public void testTransitions() { ToggleButton b = new ToggleButton("transitions"); b.setDown(true); assertTrue(b.isDown()); assertFalse(b.isHovering()); assertTrue(b.isEnabled()); b.setHovering(true); assertTrue(b.isDown()); assertTrue(b.isHovering()); assertTrue(b.isEnabled()); b.setEnabled(false); assertTrue(b.isDown()); assertFalse(b.isHovering()); assertFalse(b.isEnabled()); b.setDown(false); assertFalse(b.isHovering()); assertFalse(b.isEnabled()); assertFalse(b.isDown()); b.setEnabled(false); assertFalse(b.isHovering()); assertFalse(b.isEnabled()); assertFalse(b.isDown()); b.setEnabled(false); b.setHovering(true); assertTrue(b.isHovering()); assertFalse(b.isDown()); assertFalse(b.isEnabled()); } public void testToogleButtonHasValue() { ToggleButton tb = new ToggleButton(); Handler h = new Handler(); tb.addValueChangeHandler(h); tb.setDown(false); assertNull(h.received); tb.setDown(true); assertNull(h.received); tb.setValue(false); assertNull(h.received); tb.setValue(true); assertNull(h.received); tb.setValue(true, true); assertNull(h.received); tb.setValue(false, true); assertFalse(h.received); tb.setValue(true, true); assertTrue(h.received); } }