blob: 5b400f856cb53af221861d11ab6e0b073c235738 [file] [log] [blame]
/*
* 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 com.google.gwt.user.cellview.client;
import com.google.gwt.cell.client.AbstractCell;
import com.google.gwt.cell.client.Cell;
import com.google.gwt.cell.client.TextButtonCell;
import com.google.gwt.cell.client.ValueUpdater;
import com.google.gwt.dom.client.Document;
import com.google.gwt.dom.client.Element;
import com.google.gwt.dom.client.NativeEvent;
import com.google.gwt.dom.client.Style;
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.SafeHtmlBuilder;
import com.google.gwt.user.client.Event;
import com.google.gwt.view.client.ProvidesKey;
/**
* Tests for {@link CellWidget}.
*/
public class CellWidgetTest extends GWTTestCase {
/**
* A custom cell used for testing.
*/
private static class CustomCell extends AbstractCell<String> {
private String lastEventValue;
private Object lastEventKey;
public CustomCell() {
super("change");
}
public void assertLastEventKey(String expected) {
assertEquals(expected, lastEventKey);
lastEventKey = null;
}
public void assertLastEventValue(String expected) {
assertEquals(expected, lastEventValue);
lastEventValue = null;
}
@Override
public void onBrowserEvent(Context context, Element parent, String value, NativeEvent event,
ValueUpdater<String> valueUpdater) {
lastEventValue = value;
lastEventKey = context.getKey();
if (valueUpdater != null) {
valueUpdater.update("newValue");
}
}
@Override
public void render(Context context, String value, SafeHtmlBuilder sb) {
if (value != null) {
sb.appendEscaped(value);
}
}
}
/**
* A mock value change handler used for testing.
*
* @param <C> the data type
*/
private static class MockValueChangeHandler<C> implements ValueChangeHandler<C> {
private boolean onValueChangeCalled = false;
private C lastValue;
public void assertOnValueChangeNotCalled() {
assertFalse(onValueChangeCalled);
}
public void assertLastValue(C expected) {
assertTrue(onValueChangeCalled);
assertEquals(expected, lastValue);
lastValue = null;
onValueChangeCalled = false;
}
public void onValueChange(ValueChangeEvent<C> event) {
assertFalse("ValueChangeEvent fired twice", onValueChangeCalled);
onValueChangeCalled = true;
lastValue = event.getValue();
}
}
@Override
public String getModuleName() {
return "com.google.gwt.user.cellview.CellView";
}
public void testOnBrowserEvent() {
CustomCell cell = new CustomCell();
CellWidget<String> cw = new CellWidget<String>(cell, "test");
assertEquals("test", cw.getValue());
Event event = Document.get().createChangeEvent().cast();
cw.onBrowserEvent(event);
cell.assertLastEventKey("test");
cell.assertLastEventValue("test");
assertEquals("newValue", cw.getValue());
}
public void testOnBrowserEventWithKeyProvider() {
ProvidesKey<String> keyProvider = new ProvidesKey<String>() {
public Object getKey(String item) {
// Return the first character as the key.
return (item == null) ? null : item.substring(0, 1);
}
};
CustomCell cell = new CustomCell();
final CellWidget<String> cw = new CellWidget<String>(cell, "test", keyProvider);
assertEquals("test", cw.getValue());
assertEquals(keyProvider, cw.getKeyProvider());
Event event = Document.get().createChangeEvent().cast();
cw.onBrowserEvent(event);
cell.assertLastEventKey("t");
cell.assertLastEventValue("test");
assertEquals("newValue", cw.getValue());
}
public void testOnBrowserEventWithValueChangeHandler() {
CustomCell cell = new CustomCell();
final CellWidget<String> cw = new CellWidget<String>(cell, "test");
assertEquals("test", cw.getValue());
// Add a ValueChangeHandler.
MockValueChangeHandler<String> handler = new MockValueChangeHandler<String>();
cw.addValueChangeHandler(handler);
// Fire an native event that will trigger a value change event.
Event event = Document.get().createChangeEvent().cast();
cw.onBrowserEvent(event);
cell.assertLastEventKey("test");
cell.assertLastEventValue("test");
handler.assertLastValue("newValue");
assertEquals("newValue", cw.getValue());
}
/**
* Test that a cell that defines an HTML elment can be rendered.
*/
public void testRedrawWithMultipleInnerChildren() {
Cell<String> cell = new AbstractCell<String>() {
@Override
public void render(com.google.gwt.cell.client.Cell.Context context, String value,
SafeHtmlBuilder sb) {
sb.appendHtmlConstant("<div>").appendEscaped(value).appendHtmlConstant("</div>");
sb.appendHtmlConstant("<div>child2</div>");
}
};
CellWidget<String> cw = new CellWidget<String>(cell);
// Set value without redrawing.
cw.setValue("test123", false, false);
assertEquals("", cw.getElement().getInnerText());
// Redraw.
cw.redraw();
assertTrue(cw.getElement().getInnerText().contains("test123"));
Style firstChildStyle = cw.getElement().getFirstChildElement().getStyle();
assertFalse(firstChildStyle.getHeight().matches("100(.0)?%"));
assertFalse(firstChildStyle.getWidth().matches("100(.0)?%"));
}
/**
* Test that a cell that defines an HTML elment can be rendered.
*/
public void testRedrawWithOneInnerChild() {
CellWidget<String> cw = new CellWidget<String>(new TextButtonCell());
// Set value without redrawing.
cw.setValue("test123", false, false);
assertEquals("", cw.getElement().getInnerText());
// Redraw.
cw.redraw();
assertTrue(cw.getElement().getInnerText().contains("test123"));
Style firstChildStyle = cw.getElement().getFirstChildElement().getStyle();
assertTrue(firstChildStyle.getHeight().matches("100(.0)?%"));
assertTrue(firstChildStyle.getWidth().matches("100(.0)?%"));
}
/**
* Test that a cell that defines no HTML elments can be rendered.
*/
public void testRedrawWithoutInnerChild() {
CellWidget<String> cw = new CellWidget<String>(new CustomCell());
// Set value without redrawing.
cw.setValue("test", false, false);
assertEquals("", cw.getElement().getInnerText());
// Redraw.
cw.redraw();
assertEquals("test", cw.getElement().getInnerText());
}
public void testSetValue() {
CustomCell cell = new CustomCell();
CellWidget<String> cw = new CellWidget<String>(cell, "initial");
MockValueChangeHandler<String> handler = new MockValueChangeHandler<String>();
cw.addValueChangeHandler(handler);
// Check the intial value.
assertEquals("initial", cw.getValue());
assertEquals("initial", cw.getElement().getInnerText());
// Set value without firing events.
cw.setValue("test0");
assertEquals("test0", cw.getValue());
assertEquals("test0", cw.getElement().getInnerText());
handler.assertOnValueChangeNotCalled();
// Set value to the existing value, shouldn't fire events.
cw.setValue("test0", true);
handler.assertOnValueChangeNotCalled();
// Set value and fire events.
cw.setValue("test1", true);
assertEquals("test1", cw.getValue());
assertEquals("test1", cw.getElement().getInnerText());
handler.assertLastValue("test1");
// Set value, fire events, but do not redraw.
cw.setValue("test no redraw", true, false);
assertEquals("test no redraw", cw.getValue());
assertEquals("test1", cw.getElement().getInnerText());
handler.assertLastValue("test no redraw");
}
}