/*
* 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.TextCell;
import com.google.gwt.safehtml.shared.SafeHtmlBuilder;
import com.google.gwt.user.client.ui.RootPanel;
import com.google.gwt.view.client.ListDataProvider;
import com.google.gwt.view.client.TreeViewModel;
import java.util.ArrayList;
import java.util.List;
/**
* Tests for {@link CellTree}.
*/
public class CellTreeTest extends AbstractCellTreeTestBase {
public CellTreeTest() {
super(false);
}
public void testRefreshEmptyNode() {
// An empty data provider.
final ListDataProvider<String> provider = new ListDataProvider<String>();
TreeViewModel model = new TreeViewModel() {
@Override
public NodeInfo<?> getNodeInfo(Object value) {
TextCell cell = new TextCell();
return new DefaultNodeInfo<String>(provider, cell);
}
@Override
public boolean isLeaf(Object value) {
return false;
}
};
// Create the tree.
CellTree tree = createAbstractCellTree(model, null);
tree.rootNode.listView.presenter.flush();
// Refresh the empty list.
provider.refresh();
provider.flush();
tree.rootNode.listView.presenter.flush();
}
/**
* Test that CellTree handles rendering the same content, but with a different
* underlying value.
*/
public void testRenderSameContent() {
final AbstractCell<Integer> intCell = new AbstractCell<Integer>() {
@Override
public void render(Context context, Integer value, SafeHtmlBuilder sb) {
sb.append(value % 10); // Render the units digit only.
}
};
// Create a data provider for the root node.
final ListDataProvider<Integer> root = new ListDataProvider<Integer>();
for (int i = 0; i < 9; i++) {
root.getList().add(i);
}
TreeViewModel model = new TreeViewModel() {
@Override
public NodeInfo<?> getNodeInfo(Object value) {
if (value == null) {
// Return the root node.
return new DefaultNodeInfo<Integer>(root, intCell);
} else {
// Return a child node.
return new DefaultNodeInfo<String>(new ListDataProvider<String>(), new TextCell());
}
}
@Override
public boolean isLeaf(Object value) {
return false;
}
};
CellTree tree = createAbstractCellTree(model, null);
RootPanel.get().add(tree);
tree.rootNode.listView.presenter.flush();
// Open the first child.
TreeNode rootNode = tree.getRootTreeNode();
assertEquals(1, rootNode.getChildValue(1));
TreeNode child1 = rootNode.setChildOpen(1, true);
assertFalse(child1.isDestroyed());
assertTrue(rootNode.isChildOpen(1));
// Replace all values in the list.
List<Integer> oldData = root.getList();
List<Integer> newData = new ArrayList<Integer>();
for (int l : oldData) {
newData.add(l + 100); // renders the same as the current value.
}
root.setList(newData);
root.flush();
tree.rootNode.listView.presenter.flush();
// Child1 is closed and destroyed.
assertFalse(rootNode.isChildOpen(1));
assertTrue(child1.isDestroyed());
RootPanel.get().remove(tree);
}
/**
* Test that replacing a subset of children updates both the TreeNode value
* and the underlying DOM correctly.
*/
public void testReplaceChildren() {
CellTree cellTree = (CellTree) tree;
TreeNode root = cellTree.getRootTreeNode();
// Open a couple of child nodes.
TreeNode a = root.setChildOpen(0, true);
TreeNode b = root.setChildOpen(1, true);
assertEquals("a", a.getValue());
assertEquals("ab", a.getChildValue(1));
assertEquals("b", b.getValue());
assertEquals("bc", b.getChildValue(2));
// Replace "b" with a "new" value.
model.getRootDataProvider().getList().set(1, "new");
model.getRootDataProvider().flush();
assertFalse(a.isDestroyed());
assertTrue(b.isDestroyed());
TreeNode newNode = root.setChildOpen(1, true);
assertEquals("a", a.getValue());
assertEquals("ab", a.getChildValue(1));
assertEquals("new", newNode.getValue());
assertEquals("newc", newNode.getChildValue(2));
// Check the underlying DOM values.
CellTreeNodeView<?> aImpl = cellTree.rootNode.getChildNode(0);
CellTreeNodeView<?> newNodeImpl = cellTree.rootNode.getChildNode(1);
assertEquals("a", aImpl.getCellParent().getInnerText());
assertEquals(10, aImpl.ensureChildContainer().getChildCount());
assertEquals("new", newNodeImpl.getCellParent().getInnerText());
}
public void testSetDefaultNodeSize() {
CellTree cellTree = (CellTree) tree;
TreeNode root = cellTree.getRootTreeNode();
assertEquals(10, root.getChildCount());
TreeNode b = root.setChildOpen(1, true);
assertEquals(10, b.getChildCount());
// Change the default size.
cellTree.setDefaultNodeSize(5);
assertEquals(5, cellTree.getDefaultNodeSize());
assertEquals(10, b.getChildCount());
TreeNode d = root.setChildOpen(3, true);
assertEquals(5, d.getChildCount());
}
@Override
protected <T> CellTree createAbstractCellTree(TreeViewModel model, T rootValue) {
return new CellTree(model, rootValue);
}
}