blob: c96a0a706f6fd02262f0ed078e1df9fa7693f527 [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.AbstractEditableCell;
import com.google.gwt.cell.client.FieldUpdater;
import com.google.gwt.cell.client.TextCell;
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.junit.client.GWTTestCase;
import com.google.gwt.safehtml.shared.SafeHtmlBuilder;
import com.google.gwt.user.client.Timer;
/**
* Tests for {@link Column}.
*/
public class ColumnTest extends GWTTestCase {
/**
* A mock cell used for testing.
*/
private static class MockEditableCell extends
AbstractEditableCell<String, String> {
@Override
public boolean isEditing(Element parent, String value, Object key) {
return false;
}
@Override
public void render(String value, Object key, SafeHtmlBuilder sb) {
sb.appendEscaped(value);
}
}
/**
* A mock {@link FieldUpdater} used for testing.
*
* @param <T> the field type
* @param <C> the value type
*/
private static class MockFieldUpdater<T, C> implements FieldUpdater<T, C> {
private int index;
private T object;
private boolean updateCalled;
private C value;
public void assertIndex(int expected) {
assertEquals(expected, index);
}
public void assertObject(T expected) {
assertEquals(expected, object);
}
public void assertUpdateCalled(boolean expected) {
assertEquals(expected, updateCalled);
}
public void assertValue(C expected) {
assertEquals(expected, value);
}
public void update(int index, T object, C value) {
assertFalse("Update called twice", updateCalled);
this.updateCalled = true;
this.index = index;
this.object = object;
this.value = value;
}
}
@Override
public String getModuleName() {
return "com.google.gwt.user.cellview.CellView";
}
/**
* Test that a cell can hold onto the {@link ValueUpdater} and update it
* later.
*/
public void testDelayedValueUpdaer() {
final Element theElem = Document.get().createDivElement();
final NativeEvent theEvent = Document.get().createClickEvent(0, 0, 0, 0, 0,
false, false, false, false);
final MockEditableCell cell = new MockEditableCell() {
@Override
public void onBrowserEvent(Element parent, String value, Object key,
NativeEvent event, final ValueUpdater<String> valueUpdater) {
setViewData("test", "newViewData");
new Timer() {
@Override
public void run() {
valueUpdater.update("newValue");
}
}.schedule(200);
}
};
final Column<String, String> column = new IdentityColumn<String>(cell);
final MockFieldUpdater<String, String> fieldUpdater = new MockFieldUpdater<String, String>() {
@Override
public void update(int index, String object, String value) {
assertEquals("newViewData", cell.getViewData("test"));
super.update(index, object, value);
finishTest();
}
};
column.setFieldUpdater(fieldUpdater);
// Fire the event to the cell.
delayTestFinish(5000);
cell.setViewData("test", "oldViewData");
column.onBrowserEvent(theElem, 3, "test", theEvent, null);
}
public void testGetCell() {
TextCell cell = new TextCell();
Column<String, String> column = new IdentityColumn<String>(cell);
assertEquals(cell, column.getCell());
}
public void testOnBrowserEventWithFieldUpdater() {
final Element theElem = Document.get().createDivElement();
final NativeEvent theEvent = Document.get().createClickEvent(0, 0, 0, 0, 0,
false, false, false, false);
final MockEditableCell cell = new MockEditableCell() {
@Override
public void onBrowserEvent(Element parent, String value, Object key,
NativeEvent event, ValueUpdater<String> valueUpdater) {
assertEquals(theElem, parent);
assertEquals("test", value);
assertEquals("oldViewData", getViewData("test"));
assertEquals(theEvent, event);
assertNotNull(valueUpdater);
setViewData("test", "newViewData");
valueUpdater.update("newValue");
}
};
final Column<String, String> column = new IdentityColumn<String>(cell);
final MockFieldUpdater<String, String> fieldUpdater = new MockFieldUpdater<String, String>() {
@Override
public void update(int index, String object, String value) {
// The new view data should already be set.
assertEquals("newViewData", cell.getViewData("test"));
super.update(index, object, value);
}
};
column.setFieldUpdater(fieldUpdater);
cell.setViewData("test", "oldViewData");
column.onBrowserEvent(theElem, 3, "test", theEvent, null);
fieldUpdater.assertUpdateCalled(true);
fieldUpdater.assertIndex(3);
fieldUpdater.assertObject("test");
fieldUpdater.assertValue("newValue");
}
public void testOnBrowserEventWithoutFieldUpdater() {
final Element theElem = Document.get().createDivElement();
final NativeEvent theEvent = Document.get().createClickEvent(0, 0, 0, 0, 0,
false, false, false, false);
final MockEditableCell cell = new MockEditableCell() {
@Override
public void onBrowserEvent(Element parent, String value, Object key,
NativeEvent event, ValueUpdater<String> valueUpdater) {
assertEquals(theElem, parent);
assertEquals("test", value);
assertEquals("oldViewData", getViewData("test"));
assertEquals(theEvent, event);
assertNull(valueUpdater);
setViewData("test", "newViewData");
}
};
Column<String, String> column = new IdentityColumn<String>(cell);
cell.setViewData("test", "oldViewData");
column.onBrowserEvent(theElem, 3, "test", theEvent, null);
}
public void testRender() {
TextCell cell = new TextCell();
Column<String, String> column = new IdentityColumn<String>(cell);
SafeHtmlBuilder sb = new SafeHtmlBuilder();
column.render("test", null, sb);
assertEquals("test", sb.toSafeHtml().asString());
}
}