/*
* 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.cell.client;
import com.google.gwt.cell.client.Cell.Context;
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.user.client.DOM;
import com.google.gwt.user.client.Event;
import com.google.gwt.user.client.EventListener;
import java.util.ArrayList;
import java.util.List;
/**
* Tests for {@link CompositeCell}.
*/
public class CompositeCellTest extends CellTestBase<String> {
/**
* Test dependsOnSelection and handlesSelection when one inner cell returns
* true for each of these.
*/
public void testDependsOnSelectionTrue() {
// Add one cell that consumes events.
List<HasCell<String, ?>> cells = createHasCells(3);
final MockCell<String> mock = new MockCell<String>(true, null);
addCell(mock, cells);
CompositeCell<String> cell = new CompositeCell<String>(cells);
assertNull(cell.getConsumedEvents());
assertTrue(cell.dependsOnSelection());
}
/**
* Test getConsumedEvents when one inner cell consumes events.
*/
public void testGetConsumedEventsTrue() {
// Add one cell that consumes events.
List<HasCell<String, ?>> cells = createHasCells(3);
final MockCell<String> mock = new MockCell<String>(false, null, "click");
addCell(mock, cells);
CompositeCell<String> cell = new CompositeCell<String>(cells);
assertEquals(1, cell.getConsumedEvents().size());
assertTrue(cell.getConsumedEvents().contains("click"));
assertFalse(cell.dependsOnSelection());
}
public void testIsEditingFalse() {
List<HasCell<String, ?>> cells = createHasCells(3);
CompositeCell<String> cell = new CompositeCell<String>(cells);
Element parent = Document.get().createDivElement();
parent.setInnerHTML(getExpectedInnerHtml());
assertFalse(cell.isEditing(new Context(0, 0, null), parent, "test"));
}
public void testIsEditingTrue() {
List<HasCell<String, ?>> cells = createHasCells(3);
// Add a cell that is being edited.
final MockCell<String> mock = new MockCell<String>(false, null) {
@Override
public boolean isEditing(Context context, Element parent, String value) {
return true;
}
};
addCell(mock, cells);
CompositeCell<String> cell = new CompositeCell<String>(cells);
Element parent = Document.get().createDivElement();
parent.setInnerHTML(getExpectedInnerHtml());
assertTrue(cell.isEditing(new Context(0, 0, null), parent, "test"));
}
/**
* Fire an event to no cell in particular.
*/
public void testOnBrowserEventNoCell() {
NativeEvent event = Document.get().createClickEvent(0, 0, 0, 0, 0, false,
false, false, false);
testOnBrowserEvent(getExpectedInnerHtml(), event, "test", null);
}
/**
* Fire an event to a specific cell.
*/
@SuppressWarnings("unchecked")
public void testOnBrowserEventCell() {
// Setup the parent element.
final Element parent = Document.get().createDivElement();
parent.setInnerHTML(getExpectedInnerHtml());
Document.get().getBody().appendChild(parent);
// Create the composite cell and updater.
List<HasCell<String, ?>> cells = createHasCells(2);
MockCell<String> innerCell = new MockCell<String>(false, "fromCell2", "click");
addCell(innerCell, cells);
final CompositeCell<String> cell = new CompositeCell<String>(cells);
// Add an event listener.
EventListener listener = new EventListener() {
@Override
public void onBrowserEvent(Event event) {
Context context = new Context(3, 4, "key");
cell.onBrowserEvent(context, parent, "test-x", event, null);
}
};
DOM.sinkEvents(parent, Event.ONCLICK);
DOM.setEventListener(parent, listener);
// Fire the event on one of the inner cells.
NativeEvent event = Document.get().createClickEvent(0, 0, 0, 0, 0, false,
false, false, false);
Element.as(parent.getChild(2)).dispatchEvent(event);
innerCell.assertLastEventValue("test-x");
innerCell.assertLastParentElement(Element.as(parent.getChild(2)));
Context innerContext = innerCell.getLastContext();
assertEquals("key", innerContext.getKey());
assertEquals(3, innerContext.getIndex());
assertEquals(4, innerContext.getColumn());
// Fire the event to another cell that doesn't consume this event. Shouldn't respond
// to the event
MockCell<String> innerCell2 = (MockCell<String>) cells.get(1).getCell();
Element.as(parent.getChild(1)).dispatchEvent(event);
innerCell2.assertLastEventValue(null);
// Remove the element and event listener.
DOM.setEventListener(parent, null);
Document.get().getBody().removeChild(parent);
}
public void testSetValue() {
Cell<String> cell = createCell();
Element parent = Document.get().createDivElement();
parent.setInnerHTML(getExpectedInnerHtml());
Context context = new Context(0, 0, null);
cell.setValue(context, parent, "test");
assertEquals(3, parent.getChildCount());
assertEquals("test-0", Element.as(parent.getChild(0)).getInnerHTML());
assertEquals("test-1", Element.as(parent.getChild(1)).getInnerHTML());
assertEquals("test-2", Element.as(parent.getChild(2)).getInnerHTML());
}
@Override
protected CompositeCell<String> createCell() {
return new CompositeCell<String>(createHasCells(3));
}
@Override
protected String createCellValue() {
return "helloworld";
}
@Override
protected boolean dependsOnSelection() {
return false;
}
@Override
protected String[] getConsumedEvents() {
return null;
}
@Override
protected String getExpectedInnerHtml() {
return "<span>helloworld-0</span><span>helloworld-1</span><span>helloworld-2</span>";
}
@Override
protected String getExpectedInnerHtmlNull() {
return "<span></span><span></span><span></span>";
}
/**
* Add a cell to a {@link HasCell} list.
*/
private void addCell(final Cell<String> cell, List<HasCell<String, ?>> cells) {
cells.add(new HasCell<String, String>() {
@Override
public Cell<String> getCell() {
return cell;
}
@Override
public FieldUpdater<String, String> getFieldUpdater() {
return null;
}
@Override
public String getValue(String object) {
return object;
}
});
}
/**
* Create an array of {@link HasCell}.
*
* @param count the number of cells to create
* @return the list of cells
*/
private List<HasCell<String, ?>> createHasCells(int count) {
List<HasCell<String, ?>> cells = new ArrayList<HasCell<String, ?>>();
for (int i = 0; i < count; i++) {
final int index = i;
final MockCell<String> inner = new MockCell<String>(false, "fromCell" + i);
cells.add(new HasCell<String, String>() {
@Override
public Cell<String> getCell() {
return inner;
}
@Override
public FieldUpdater<String, String> getFieldUpdater() {
return null;
}
@Override
public String getValue(String object) {
return object == null ? null : object + "-" + index;
}
});
}
return cells;
}
}