blob: 2b825f1d15ae3304c6ea827fa6dc7e0d363fd7bf [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.dom.client.Element;
import com.google.gwt.event.shared.EventHandler;
import com.google.gwt.event.shared.GwtEvent.Type;
import com.google.gwt.event.shared.HandlerRegistration;
import com.google.gwt.safehtml.shared.SafeHtml;
import com.google.gwt.safehtml.shared.SafeHtmlBuilder;
import com.google.gwt.user.cellview.client.HasDataPresenter.ElementIterator;
import com.google.gwt.user.cellview.client.HasDataPresenter.LoadingState;
import com.google.gwt.user.cellview.client.HasDataPresenter.View;
import com.google.gwt.user.cellview.client.HasKeyboardPagingPolicy.KeyboardPagingPolicy;
import com.google.gwt.user.cellview.client.HasKeyboardSelectionPolicy.KeyboardSelectionPolicy;
import com.google.gwt.view.client.HasData;
import com.google.gwt.view.client.MockHasData;
import com.google.gwt.view.client.MockHasData.MockRangeChangeHandler;
import com.google.gwt.view.client.MockHasData.MockRowCountChangeHandler;
import com.google.gwt.view.client.MockSelectionModel;
import com.google.gwt.view.client.Range;
import com.google.gwt.view.client.RangeChangeEvent;
import com.google.gwt.view.client.SelectionModel;
import junit.framework.TestCase;
import java.util.ArrayList;
import java.util.HashSet;
import java.util.List;
import java.util.NoSuchElementException;
import java.util.Set;
/**
* Tests for {@link HasDataPresenter}.
*/
public class HasDataPresenterTest extends TestCase {
/**
* Mock iterator over DOM elements.
*/
private static class MockElementIterator implements ElementIterator {
private final int count;
private int next = 0;
private final MockView<?> view;
public MockElementIterator(MockView<?> view, int count) {
this.view = view;
this.count = count;
}
public boolean hasNext() {
return next < count;
}
public Element next() {
if (!hasNext()) {
throw new NoSuchElementException();
}
next++;
return null;
}
public void remove() {
throw new UnsupportedOperationException();
}
/**
* Set the selection state of the current element.
*
* @param selected the selection state
* @throws IllegalStateException if {@link #next()} has not been called
*/
public void setSelected(boolean selected) throws IllegalStateException {
if (next == 0) {
throw new IllegalStateException();
}
view.setSelected(next - 1, selected);
}
}
/**
* A mock view used for testing.
*
* @param <T> the data type
*/
private static class MockView<T> implements View<T> {
private int childCount;
private boolean dependsOnSelection;
private List<Integer> keyboardSelectedRow = new ArrayList<Integer>();
private List<Boolean> keyboardSelectedRowState = new ArrayList<Boolean>();
private SafeHtml lastHtml;
private LoadingState loadingState;
private boolean onUpdateSelectionFired;
private boolean replaceAllChildrenCalled;
private boolean replaceChildrenCalled;
private Set<Integer> selectedRows = new HashSet<Integer>();
public <H extends EventHandler> HandlerRegistration addHandler(H handler,
Type<H> type) {
throw new UnsupportedOperationException();
}
/**
* Assert the value of the oldest keyboard selected row and pop it.
*
* @param row the row index
* @param selected true if selected, false if not
*/
public void assertKeyboardSelectedRow(int row, boolean selected) {
int actualRow = keyboardSelectedRow.remove(0);
boolean actualSelected = keyboardSelectedRowState.remove(0);
assertEquals(row, actualRow);
assertEquals(selected, actualSelected);
}
/**
* Assert that the keyboard selected row queue is empty.
*/
public void assertKeyboardSelectedRowEmpty() {
assertEquals(0, keyboardSelectedRow.size());
}
public void assertLastHtml(String html) {
if (html == null) {
assertNull(lastHtml);
} else {
assertEquals(html, lastHtml.asString());
}
lastHtml = null;
}
public void assertLoadingState(LoadingState expected) {
assertEquals(expected, loadingState);
}
public void assertOnUpdateSelectionFired(boolean expected) {
assertEquals(expected, onUpdateSelectionFired);
onUpdateSelectionFired = false;
}
public void assertReplaceAllChildrenCalled(boolean expected) {
assertEquals(expected, replaceAllChildrenCalled);
replaceAllChildrenCalled = false;
}
public void assertReplaceChildrenCalled(boolean expected) {
assertEquals(expected, replaceChildrenCalled);
replaceChildrenCalled = false;
}
/**
* Assert that {@link #setSelected(int, boolean)} was called for the
* specified rows.
*
* @param rows the rows
*/
public void assertSelectedRows(Integer... rows) {
assertEquals(rows.length, selectedRows.size());
for (Integer row : rows) {
assertTrue("Row " + row + "is not selected", selectedRows.contains(row));
}
}
public boolean dependsOnSelection() {
return dependsOnSelection;
}
public int getChildCount() {
return childCount;
}
public MockElementIterator getChildIterator() {
return new MockElementIterator(this, 10);
}
public void onUpdateSelection() {
onUpdateSelectionFired = true;
}
public void render(SafeHtmlBuilder sb, List<T> values, int start,
SelectionModel<? super T> selectionModel) {
sb.appendHtmlConstant("start=").append(start);
sb.appendHtmlConstant(",size=").append(values.size());
}
public void replaceAllChildren(List<T> values, SafeHtml html) {
childCount = values.size();
replaceAllChildrenCalled = true;
lastHtml = html;
}
public void replaceChildren(List<T> values, int start, SafeHtml html) {
childCount = Math.max(childCount, start + values.size());
replaceChildrenCalled = true;
lastHtml = html;
}
public void resetFocus() {
}
public void setDependsOnSelection(boolean dependsOnSelection) {
this.dependsOnSelection = dependsOnSelection;
}
public void setKeyboardSelected(int index, boolean selected,
boolean stealFocus) {
keyboardSelectedRow.add(index);
keyboardSelectedRowState.add(selected);
}
public void setLoadingState(LoadingState state) {
this.loadingState = state;
}
public void setSelected(Element elem, boolean selected) {
// Not used in this mock.
throw new UnsupportedOperationException();
}
protected void setSelected(int index, boolean selected) {
if (selected) {
selectedRows.add(index);
} else {
selectedRows.remove(index);
}
}
}
public void testAddRowCountChangeHandler() {
HasData<String> listView = new MockHasData<String>();
MockView<String> view = new MockView<String>();
HasDataPresenter<String> presenter = new HasDataPresenter<String>(listView,
view, 10, null);
MockRowCountChangeHandler handler = new MockRowCountChangeHandler();
// Adding a handler should not invoke the handler.
// Add the handler to the view because it is the source of events.
HandlerRegistration reg = listView.addRowCountChangeHandler(handler);
assertEquals(-1, handler.getLastRowCount());
handler.reset();
// Change the row count.
presenter.setRowCount(100, true);
assertEquals(100, handler.getLastRowCount());
assertTrue(handler.isLastRowCountExact());
handler.reset();
// Set the same row count and verify no event is fired.
presenter.setRowCount(100, true);
assertEquals(-1, handler.getLastRowCount());
handler.reset();
// Change the row count again.
presenter.setRowCount(110, false);
assertEquals(110, handler.getLastRowCount());
assertFalse(handler.isLastRowCountExact());
handler.reset();
// Change only the isExact param and verify an event is fired.
presenter.setRowCount(110, true);
assertEquals(110, handler.getLastRowCount());
assertTrue(handler.isLastRowCountExact());
handler.reset();
// Remove the handler and verify it no longer receives events.
reg.removeHandler();
presenter.setRowCount(200, true);
assertEquals(-1, handler.getLastRowCount());
}
public void testAddRangeChangeHandler() {
HasData<String> listView = new MockHasData<String>();
MockView<String> view = new MockView<String>();
HasDataPresenter<String> presenter = new HasDataPresenter<String>(listView,
view, 10, null);
MockRangeChangeHandler handler = new MockRangeChangeHandler();
// Adding a handler should not invoke the handler.
// Add the handler to the view because it is the source of events.
HandlerRegistration reg = listView.addRangeChangeHandler(handler);
assertNull(handler.getLastRange());
handler.reset();
// Change the pageStart.
presenter.setVisibleRange(new Range(10, 10));
assertEquals(new Range(10, 10), handler.getLastRange());
handler.reset();
// Change the pageSize.
presenter.setVisibleRange(new Range(10, 20));
assertEquals(new Range(10, 20), handler.getLastRange());
handler.reset();
// Reuse the same range and verify an event is not fired.
presenter.setVisibleRange(new Range(10, 20));
assertNull(handler.getLastRange());
handler.reset();
// Remove the handler and verify it no longer receives events.
reg.removeHandler();
presenter.setVisibleRange(new Range(20, 100));
assertNull(handler.getLastRange());
handler.reset();
}
public void testClearSelectionModel() {
HasData<String> listView = new MockHasData<String>();
MockView<String> view = new MockView<String>();
view.setDependsOnSelection(true);
HasDataPresenter<String> presenter = new HasDataPresenter<String>(listView,
view, 10, null);
assertNull(presenter.getSelectionModel());
// Initialize some data.
populatePresenter(presenter);
view.assertReplaceAllChildrenCalled(true);
view.assertReplaceChildrenCalled(false);
view.assertLastHtml("start=0,size=10");
// Set the selection model.
SelectionModel<String> model = new MockSelectionModel<String>(null);
model.setSelected("test 0", true);
presenter.setSelectionModel(model);
view.assertReplaceAllChildrenCalled(true);
view.assertReplaceChildrenCalled(false);
view.assertLastHtml("start=0,size=10");
view.assertOnUpdateSelectionFired(true);
view.assertSelectedRows();
// Clear the selection model without updating the view.
presenter.clearSelectionModel();
view.assertReplaceAllChildrenCalled(false);
view.assertReplaceChildrenCalled(false);
view.assertLastHtml(null);
view.assertOnUpdateSelectionFired(false);
view.assertSelectedRows();
}
public void testDefaults() {
HasData<String> listView = new MockHasData<String>();
MockView<String> view = new MockView<String>();
HasDataPresenter<String> presenter = new HasDataPresenter<String>(listView,
view, 10, null);
assertEquals(0, presenter.getRowCount());
assertFalse(presenter.isRowCountExact());
assertEquals(0, presenter.getCurrentPageSize());
assertEquals(new Range(0, 10), presenter.getVisibleRange());
}
public void testGetCurrentPageSize() {
HasData<String> listView = new MockHasData<String>();
MockView<String> view = new MockView<String>();
HasDataPresenter<String> presenter = new HasDataPresenter<String>(listView,
view, 10, null);
presenter.setRowCount(35, true);
// First page.
assertEquals(10, presenter.getCurrentPageSize());
// Last page.
presenter.setVisibleRange(new Range(30, 10));
assertEquals(5, presenter.getCurrentPageSize());
}
public void testKeyboardNavigationChangePage() {
HasData<String> listView = new MockHasData<String>();
MockView<String> view = new MockView<String>();
HasDataPresenter<String> presenter = new HasDataPresenter<String>(listView,
view, 10, null);
presenter.setRowCount(100, true);
presenter.setVisibleRange(new Range(50, 10));
populatePresenter(presenter);
presenter.setKeyboardPagingPolicy(KeyboardPagingPolicy.CHANGE_PAGE);
// keyboardPrev in middle.
presenter.setKeyboardSelectedRow(1, false);
view.assertKeyboardSelectedRow(0, false);
view.assertKeyboardSelectedRow(1, true);
assertTrue(presenter.hasKeyboardPrev());
presenter.keyboardPrev();
assertEquals(0, presenter.getKeyboardSelectedRow());
view.assertKeyboardSelectedRow(1, false);
view.assertKeyboardSelectedRow(0, true);
// keyboardPrev at beginning.
assertTrue(presenter.hasKeyboardPrev());
presenter.keyboardPrev();
assertEquals(9, presenter.getKeyboardSelectedRow());
view.assertKeyboardSelectedRow(0, false);
assertEquals(new Range(40, 10), presenter.getVisibleRange());
populatePresenter(presenter);
// keyboardNext in middle.
presenter.setKeyboardSelectedRow(8, false);
view.assertKeyboardSelectedRow(9, false);
view.assertKeyboardSelectedRow(8, true);
assertTrue(presenter.hasKeyboardNext());
presenter.keyboardNext();
assertEquals(9, presenter.getKeyboardSelectedRow());
view.assertKeyboardSelectedRow(8, false);
view.assertKeyboardSelectedRow(9, true);
// keyboardNext at end.
assertTrue(presenter.hasKeyboardNext());
presenter.keyboardNext();
assertEquals(0, presenter.getKeyboardSelectedRow());
view.assertKeyboardSelectedRow(9, false);
assertEquals(new Range(50, 10), presenter.getVisibleRange());
populatePresenter(presenter);
// keyboardPrevPage.
presenter.setKeyboardSelectedRow(5, false);
view.assertKeyboardSelectedRow(0, false);
view.assertKeyboardSelectedRow(5, true);
presenter.keyboardPrevPage();
assertEquals(0, presenter.getKeyboardSelectedRow());
view.assertKeyboardSelectedRow(5, false);
assertEquals(new Range(40, 10), presenter.getVisibleRange());
populatePresenter(presenter);
// keyboardNextPage.
presenter.setKeyboardSelectedRow(5, false);
view.assertKeyboardSelectedRow(0, false);
view.assertKeyboardSelectedRow(5, true);
presenter.keyboardNextPage();
assertEquals(0, presenter.getKeyboardSelectedRow());
view.assertKeyboardSelectedRow(5, false);
assertEquals(new Range(50, 10), presenter.getVisibleRange());
populatePresenter(presenter);
// keyboardHome.
presenter.keyboardHome();
assertEquals(0, presenter.getKeyboardSelectedRow());
view.assertKeyboardSelectedRow(0, false);
assertEquals(new Range(0, 10), presenter.getVisibleRange());
populatePresenter(presenter);
// keyboardPrev at first row.
assertFalse(presenter.hasKeyboardPrev());
presenter.keyboardPrev();
view.assertKeyboardSelectedRowEmpty();
// keyboardEnd.
presenter.keyboardEnd();
assertEquals(9, presenter.getKeyboardSelectedRow());
view.assertKeyboardSelectedRow(0, false);
assertEquals(new Range(90, 10), presenter.getVisibleRange());
populatePresenter(presenter);
// keyboardNext at last row.
assertFalse(presenter.hasKeyboardNext());
presenter.keyboardNext();
view.assertKeyboardSelectedRowEmpty();
}
public void testKeyboardNavigationCurrentPage() {
HasData<String> listView = new MockHasData<String>();
MockView<String> view = new MockView<String>();
HasDataPresenter<String> presenter = new HasDataPresenter<String>(listView,
view, 10, null);
presenter.setVisibleRange(new Range(50, 10));
populatePresenter(presenter);
presenter.setKeyboardPagingPolicy(KeyboardPagingPolicy.CURRENT_PAGE);
// keyboardPrev in middle.
presenter.setKeyboardSelectedRow(1, false);
view.assertKeyboardSelectedRow(0, false);
view.assertKeyboardSelectedRow(1, true);
assertTrue(presenter.hasKeyboardPrev());
presenter.keyboardPrev();
assertEquals(0, presenter.getKeyboardSelectedRow());
view.assertKeyboardSelectedRow(1, false);
view.assertKeyboardSelectedRow(0, true);
// keyboardPrev at beginning.
assertFalse(presenter.hasKeyboardPrev());
presenter.keyboardPrev();
assertEquals(0, presenter.getKeyboardSelectedRow());
view.assertKeyboardSelectedRowEmpty();
// keyboardNext in middle.
presenter.setKeyboardSelectedRow(8, false);
view.assertKeyboardSelectedRow(0, false);
view.assertKeyboardSelectedRow(8, true);
assertTrue(presenter.hasKeyboardNext());
presenter.keyboardNext();
assertEquals(9, presenter.getKeyboardSelectedRow());
view.assertKeyboardSelectedRow(8, false);
view.assertKeyboardSelectedRow(9, true);
// keyboardNext at end.
assertFalse(presenter.hasKeyboardNext());
presenter.keyboardNext();
assertEquals(9, presenter.getKeyboardSelectedRow());
view.assertKeyboardSelectedRowEmpty();
// keyboardPrevPage.
presenter.keyboardPrevPage();
view.assertKeyboardSelectedRowEmpty();
// keyboardNextPage.
presenter.keyboardNextPage();
view.assertKeyboardSelectedRowEmpty();
// keyboardHome.
presenter.keyboardHome();
view.assertKeyboardSelectedRowEmpty();
// keyboardEnd.
presenter.keyboardEnd();
view.assertKeyboardSelectedRowEmpty();
}
public void testKeyboardNavigationIncreaseRange() {
int pageStart = 150;
int pageSize = 10;
int increment = HasDataPresenter.PAGE_INCREMENT;
HasData<String> listView = new MockHasData<String>();
MockView<String> view = new MockView<String>();
HasDataPresenter<String> presenter = new HasDataPresenter<String>(listView,
view, 10, null);
presenter.setRowCount(300, true);
presenter.setVisibleRange(new Range(pageStart, pageSize));
populatePresenter(presenter);
presenter.setKeyboardPagingPolicy(KeyboardPagingPolicy.INCREASE_RANGE);
// keyboardPrev in middle.
presenter.setKeyboardSelectedRow(1, false);
view.assertKeyboardSelectedRow(0, false);
view.assertKeyboardSelectedRow(1, true);
assertTrue(presenter.hasKeyboardPrev());
presenter.keyboardPrev();
assertEquals(0, presenter.getKeyboardSelectedRow());
view.assertKeyboardSelectedRow(1, false);
view.assertKeyboardSelectedRow(0, true);
// keyboardPrev at beginning.
assertTrue(presenter.hasKeyboardPrev());
presenter.keyboardPrev();
view.assertKeyboardSelectedRow(0, false);
pageStart -= increment;
pageSize += increment;
assertEquals(increment - 1, presenter.getKeyboardSelectedRow());
assertEquals(new Range(pageStart, pageSize), presenter.getVisibleRange());
populatePresenter(presenter);
// keyboardNext in middle.
presenter.setKeyboardSelectedRow(pageSize - 2, false);
view.assertKeyboardSelectedRow(increment - 1, false);
view.assertKeyboardSelectedRow(pageSize - 2, true);
assertTrue(presenter.hasKeyboardNext());
presenter.keyboardNext();
assertEquals(pageSize - 1, presenter.getKeyboardSelectedRow());
view.assertKeyboardSelectedRow(pageSize - 2, false);
view.assertKeyboardSelectedRow(pageSize - 1, true);
// keyboardNext at end.
assertTrue(presenter.hasKeyboardNext());
presenter.keyboardNext();
view.assertKeyboardSelectedRow(pageSize - 1, false);
pageSize += increment;
assertEquals(pageSize - increment, presenter.getKeyboardSelectedRow());
assertEquals(new Range(pageStart, pageSize), presenter.getVisibleRange());
populatePresenter(presenter);
// keyboardPrevPage within range.
presenter.setKeyboardSelectedRow(increment, false);
view.assertKeyboardSelectedRow(pageSize - increment, false);
view.assertKeyboardSelectedRow(increment, true);
presenter.keyboardPrevPage();
assertEquals(0, presenter.getKeyboardSelectedRow());
view.assertKeyboardSelectedRow(increment, false);
view.assertKeyboardSelectedRow(0, true);
assertEquals(new Range(pageStart, pageSize), presenter.getVisibleRange());
// keyboardPrevPage outside range.
presenter.keyboardPrevPage();
assertEquals(0, presenter.getKeyboardSelectedRow());
view.assertKeyboardSelectedRow(0, false);
pageStart -= increment;
pageSize += increment;
assertEquals(new Range(pageStart, pageSize), presenter.getVisibleRange());
populatePresenter(presenter);
// keyboardNextPage inside range.
presenter.keyboardNextPage();
assertEquals(increment, presenter.getKeyboardSelectedRow());
view.assertKeyboardSelectedRow(0, false);
view.assertKeyboardSelectedRow(increment, true);
assertEquals(new Range(pageStart, pageSize), presenter.getVisibleRange());
populatePresenter(presenter);
// keyboardNextPage outside range.
presenter.setKeyboardSelectedRow(pageSize - 1, false);
view.assertKeyboardSelectedRow(increment, false);
view.assertKeyboardSelectedRow(pageSize - 1, true);
presenter.keyboardNextPage();
view.assertKeyboardSelectedRow(pageSize - 1, false);
pageSize += increment;
assertEquals(pageSize - 1, presenter.getKeyboardSelectedRow());
assertEquals(new Range(pageStart, pageSize), presenter.getVisibleRange());
populatePresenter(presenter);
// keyboardHome.
presenter.keyboardHome();
view.assertKeyboardSelectedRow(pageSize - 1, false);
pageSize += pageStart;
pageStart = 0;
assertEquals(0, presenter.getKeyboardSelectedRow());
assertEquals(new Range(pageStart, pageSize), presenter.getVisibleRange());
populatePresenter(presenter);
// keyboardPrev at first row.
assertFalse(presenter.hasKeyboardPrev());
presenter.keyboardPrev();
view.assertKeyboardSelectedRowEmpty();
// keyboardEnd.
presenter.keyboardEnd();
view.assertKeyboardSelectedRow(0, false);
assertEquals(299, presenter.getKeyboardSelectedRow());
assertEquals(new Range(0, 300), presenter.getVisibleRange());
populatePresenter(presenter);
// keyboardNext at last row.
assertFalse(presenter.hasKeyboardNext());
presenter.keyboardNext();
view.assertKeyboardSelectedRowEmpty();
}
public void testRedraw() {
HasData<String> listView = new MockHasData<String>();
MockView<String> view = new MockView<String>();
HasDataPresenter<String> presenter = new HasDataPresenter<String>(listView,
view, 10, null);
// Initialize some data.
presenter.setRowCount(10, true);
populatePresenter(presenter);
assertEquals(10, presenter.getRowData().size());
assertEquals("test 0", presenter.getRowData().get(0));
view.assertReplaceAllChildrenCalled(true);
view.assertReplaceChildrenCalled(false);
view.assertLastHtml("start=0,size=10");
view.assertLoadingState(LoadingState.LOADED);
// Redraw.
presenter.redraw();
view.assertReplaceAllChildrenCalled(true);
view.assertReplaceChildrenCalled(false);
view.assertLastHtml("start=0,size=10");
view.assertLoadingState(LoadingState.LOADED);
}
public void testSetKeyboardSelectedRowBound() {
HasData<String> listView = new MockHasData<String>();
MockView<String> view = new MockView<String>();
HasDataPresenter<String> presenter = new HasDataPresenter<String>(listView,
view, 10, null);
presenter.setVisibleRange(new Range(0, 10));
populatePresenter(presenter);
// The default is ENABLED.
assertEquals(KeyboardSelectionPolicy.ENABLED,
presenter.getKeyboardSelectionPolicy());
// Change to bound with paging.
presenter.setKeyboardSelectionPolicy(KeyboardSelectionPolicy.BOUND_TO_SELECTION);
presenter.setKeyboardPagingPolicy(KeyboardPagingPolicy.CHANGE_PAGE);
// Add a selection model.
MockSelectionModel<String> model = new MockSelectionModel<String>(null);
presenter.setSelectionModel(model);
assertEquals(0, model.getSelectedSet().size());
// Select an element.
presenter.setKeyboardSelectedRow(5, false);
assertEquals(1, model.getSelectedSet().size());
assertTrue(model.isSelected("test 5"));
// Select another element.
presenter.setKeyboardSelectedRow(9, false);
assertEquals(1, model.getSelectedSet().size());
assertTrue(model.isSelected("test 9"));
// Select an element on another page.
presenter.setKeyboardSelectedRow(11, false);
// Nothing is selected yet because we don't have data.
assertEquals(0, model.getSelectedSet().size());
populatePresenter(presenter);
// Once data is pushed, the selection model should be populated.
assertEquals(1, model.getSelectedSet().size());
assertTrue(model.isSelected("test 11"));
}
public void testSetKeyboardSelectedRowChangePage() {
HasData<String> listView = new MockHasData<String>();
MockView<String> view = new MockView<String>();
HasDataPresenter<String> presenter = new HasDataPresenter<String>(listView,
view, 10, null);
presenter.setVisibleRange(new Range(10, 10));
populatePresenter(presenter);
// Default policy is CHANGE_PAGE.
assertEquals(KeyboardPagingPolicy.CHANGE_PAGE,
presenter.getKeyboardPagingPolicy());
// Default to row 0.
assertEquals(0, presenter.getKeyboardSelectedRow());
view.assertKeyboardSelectedRowEmpty();
// Move to middle.
presenter.setKeyboardSelectedRow(1, false);
assertEquals(1, presenter.getKeyboardSelectedRow());
view.assertKeyboardSelectedRow(0, false);
view.assertKeyboardSelectedRow(1, true);
// Move to same row (should not early out).
presenter.setKeyboardSelectedRow(1, false);
assertEquals(1, presenter.getKeyboardSelectedRow());
view.assertKeyboardSelectedRow(1, false);
view.assertKeyboardSelectedRow(1, true);
// Move to last row.
presenter.setKeyboardSelectedRow(9, false);
assertEquals(9, presenter.getKeyboardSelectedRow());
view.assertKeyboardSelectedRow(1, false);
view.assertKeyboardSelectedRow(9, true);
assertEquals(10, presenter.getVisibleRange().getStart());
assertEquals(10, presenter.getVisibleRange().getLength());
// Move to next page.
presenter.setKeyboardSelectedRow(10, false);
assertEquals(0, presenter.getKeyboardSelectedRow());
view.assertKeyboardSelectedRow(9, false);
// Select is not fired because there is no row data yet.
view.assertKeyboardSelectedRowEmpty();
assertEquals(20, presenter.getVisibleRange().getStart());
assertEquals(10, presenter.getVisibleRange().getLength());
populatePresenter(presenter);
// Negative index.
presenter.setKeyboardSelectedRow(-1, false);
assertEquals(9, presenter.getKeyboardSelectedRow());
view.assertKeyboardSelectedRow(0, false);
// Select is not fired because there is no row data yet.
assertEquals(10, presenter.getVisibleRange().getStart());
assertEquals(10, presenter.getVisibleRange().getLength());
}
public void testSetKeyboardSelectedRowCurrentPage() {
HasData<String> listView = new MockHasData<String>();
MockView<String> view = new MockView<String>();
HasDataPresenter<String> presenter = new HasDataPresenter<String>(listView,
view, 10, null);
presenter.setVisibleRange(new Range(10, 10));
populatePresenter(presenter);
presenter.setKeyboardPagingPolicy(KeyboardPagingPolicy.CURRENT_PAGE);
// Default to row 0.
assertEquals(0, presenter.getKeyboardSelectedRow());
view.assertKeyboardSelectedRowEmpty();
// Negative index (should remain at index 0).
presenter.setKeyboardSelectedRow(-1, false);
assertEquals(0, presenter.getKeyboardSelectedRow());
view.assertKeyboardSelectedRow(0, false);
view.assertKeyboardSelectedRow(0, true);
// Move to middle.
presenter.setKeyboardSelectedRow(1, false);
assertEquals(1, presenter.getKeyboardSelectedRow());
view.assertKeyboardSelectedRow(0, false);
view.assertKeyboardSelectedRow(1, true);
// Move to same row (should not early out).
presenter.setKeyboardSelectedRow(1, false);
assertEquals(1, presenter.getKeyboardSelectedRow());
view.assertKeyboardSelectedRow(1, false);
view.assertKeyboardSelectedRow(1, true);
// Move to last row.
presenter.setKeyboardSelectedRow(9, false);
assertEquals(9, presenter.getKeyboardSelectedRow());
view.assertKeyboardSelectedRow(1, false);
view.assertKeyboardSelectedRow(9, true);
// Move to next page (confined to page).
presenter.setKeyboardSelectedRow(10, false);
assertEquals(9, presenter.getKeyboardSelectedRow());
view.assertKeyboardSelectedRow(9, false);
view.assertKeyboardSelectedRow(9, true);
view.assertKeyboardSelectedRowEmpty();
assertEquals(10, presenter.getVisibleRange().getStart());
assertEquals(10, presenter.getVisibleRange().getLength());
}
public void testSetKeyboardSelectedRowDisabled() {
HasData<String> listView = new MockHasData<String>();
MockView<String> view = new MockView<String>();
HasDataPresenter<String> presenter = new HasDataPresenter<String>(listView,
view, 10, null);
presenter.setVisibleRange(new Range(10, 10));
populatePresenter(presenter);
presenter.setKeyboardSelectionPolicy(KeyboardSelectionPolicy.DISABLED);
assertEquals(-1, presenter.getKeyboardSelectedRow());
view.assertKeyboardSelectedRowEmpty();
presenter.setKeyboardSelectedRow(1, false);
assertEquals(-1, presenter.getKeyboardSelectedRow());
view.assertKeyboardSelectedRowEmpty();
}
public void testSetKeyboardSelectedRowIncreaseRange() {
HasData<String> listView = new MockHasData<String>();
MockView<String> view = new MockView<String>();
HasDataPresenter<String> presenter = new HasDataPresenter<String>(listView,
view, 10, null);
presenter.setVisibleRange(new Range(10, 10));
populatePresenter(presenter);
presenter.setKeyboardPagingPolicy(KeyboardPagingPolicy.INCREASE_RANGE);
int pageSize = presenter.getVisibleRange().getLength();
// Default to row 0.
assertEquals(0, presenter.getKeyboardSelectedRow());
view.assertKeyboardSelectedRowEmpty();
// Move to middle.
presenter.setKeyboardSelectedRow(1, false);
assertEquals(1, presenter.getKeyboardSelectedRow());
view.assertKeyboardSelectedRow(0, false);
view.assertKeyboardSelectedRow(1, true);
// Move to same row (should not early out).
presenter.setKeyboardSelectedRow(1, false);
assertEquals(1, presenter.getKeyboardSelectedRow());
view.assertKeyboardSelectedRow(1, false);
view.assertKeyboardSelectedRow(1, true);
// Move to last row.
presenter.setKeyboardSelectedRow(9, false);
assertEquals(9, presenter.getKeyboardSelectedRow());
view.assertKeyboardSelectedRow(1, false);
view.assertKeyboardSelectedRow(9, true);
assertEquals(10, presenter.getVisibleRange().getStart());
assertEquals(pageSize, presenter.getVisibleRange().getLength());
// Move to next page.
presenter.setKeyboardSelectedRow(10, false);
assertEquals(10, presenter.getKeyboardSelectedRow());
view.assertKeyboardSelectedRow(9, false);
// Select is not fired because there is no row data yet.
view.assertKeyboardSelectedRowEmpty();
assertEquals(10, presenter.getVisibleRange().getStart());
pageSize += HasDataPresenter.PAGE_INCREMENT;
assertEquals(pageSize, presenter.getVisibleRange().getLength());
populatePresenter(presenter);
// Negative index near index 0.
presenter.setKeyboardSelectedRow(-1, false);
assertEquals(9, presenter.getKeyboardSelectedRow());
view.assertKeyboardSelectedRow(10, false);
// Select is not fired because there is no row data yet.
assertEquals(0, presenter.getVisibleRange().getStart());
pageSize += 10;
assertEquals(pageSize, presenter.getVisibleRange().getLength());
}
public void testSetRowCount() {
HasData<String> listView = new MockHasData<String>();
MockView<String> view = new MockView<String>();
HasDataPresenter<String> presenter = new HasDataPresenter<String>(listView,
view, 10, null);
view.assertLoadingState(null);
// Set size to 100.
presenter.setRowCount(100, true);
assertEquals(100, presenter.getRowCount());
assertTrue(presenter.isRowCountExact());
view.assertLoadingState(LoadingState.LOADING);
// Set size to 0, but not exact. The state is loading until we know there is
// no data.
presenter.setRowCount(0, false);
assertEquals(0, presenter.getRowCount());
assertFalse(presenter.isRowCountExact());
view.assertLoadingState(LoadingState.LOADING);
// Set size to 0 and exact. Now we know the list is empty.
presenter.setRowCount(0, true);
assertEquals(0, presenter.getRowCount());
assertTrue(presenter.isRowCountExact());
view.assertLoadingState(LoadingState.EMPTY);
}
public void testSetRowCountNoBoolean() {
HasData<String> listView = new MockHasData<String>();
MockView<String> view = new MockView<String>();
HasDataPresenter<String> presenter = new HasDataPresenter<String>(listView,
view, 10, null);
try {
presenter.setRowCount(100);
fail("Expected UnsupportedOperationException");
} catch (UnsupportedOperationException e) {
// Expected.
}
}
public void testSetRowCountTrimsCurrentPage() {
HasData<String> listView = new MockHasData<String>();
MockView<String> view = new MockView<String>();
HasDataPresenter<String> presenter = new HasDataPresenter<String>(listView,
view, 10, null);
view.assertLoadingState(null);
// Initialize some data.
presenter.setRowCount(10, true);
presenter.setVisibleRange(new Range(0, 10));
assertEquals(new Range(0, 10), presenter.getVisibleRange());
populatePresenter(presenter);
assertEquals(10, presenter.getRowData().size());
assertEquals("test 0", presenter.getRowData().get(0));
view.assertReplaceAllChildrenCalled(true);
view.assertReplaceChildrenCalled(false);
view.assertLastHtml("start=0,size=10");
view.assertLoadingState(LoadingState.LOADED);
// Trim the size.
presenter.setRowCount(8, true);
assertEquals(8, presenter.getRowCount());
assertTrue(presenter.isRowCountExact());
assertEquals(new Range(0, 10), presenter.getVisibleRange());
assertEquals(8, presenter.getRowData().size());
view.assertReplaceAllChildrenCalled(true);
view.assertReplaceChildrenCalled(false);
view.assertLastHtml("start=0,size=8");
view.assertLoadingState(LoadingState.LOADED);
}
public void testSetRowData() {
HasData<String> listView = new MockHasData<String>();
MockView<String> view = new MockView<String>();
HasDataPresenter<String> presenter = new HasDataPresenter<String>(listView,
view, 10, null);
presenter.setVisibleRange(new Range(5, 10));
view.assertLoadingState(LoadingState.LOADING);
// Page range same as data range.
List<String> expectedData = createData(5, 10);
presenter.setRowData(5, createData(5, 10));
assertEquals(10, presenter.getRowData().size());
assertEquals(expectedData, presenter.getRowData());
view.assertReplaceAllChildrenCalled(true);
view.assertReplaceChildrenCalled(false);
view.assertLastHtml("start=5,size=10");
assertEquals(10, view.getChildCount());
view.assertLoadingState(LoadingState.LOADED);
// Page range contains data range.
expectedData.set(2, "test 100");
expectedData.set(3, "test 101");
presenter.setRowData(7, createData(100, 2));
assertEquals(10, presenter.getRowData().size());
assertEquals(expectedData, presenter.getRowData());
view.assertReplaceAllChildrenCalled(false);
view.assertReplaceChildrenCalled(true);
view.assertLastHtml("start=7,size=2");
assertEquals(10, view.getChildCount());
view.assertLoadingState(LoadingState.LOADED);
// Data range overlaps page start.
expectedData.set(0, "test 202");
expectedData.set(1, "test 203");
presenter.setRowData(3, createData(200, 4));
assertEquals(10, presenter.getRowData().size());
assertEquals(expectedData, presenter.getRowData());
view.assertReplaceAllChildrenCalled(false);
view.assertReplaceChildrenCalled(true);
view.assertLastHtml("start=5,size=2");
assertEquals(10, view.getChildCount());
view.assertLoadingState(LoadingState.LOADED);
// Data range overlaps page end.
expectedData.set(8, "test 300");
expectedData.set(9, "test 301");
presenter.setRowData(13, createData(300, 4));
assertEquals(10, presenter.getRowData().size());
assertEquals(expectedData, presenter.getRowData());
view.assertReplaceAllChildrenCalled(false);
view.assertReplaceChildrenCalled(true);
view.assertLastHtml("start=13,size=2");
assertEquals(10, view.getChildCount());
view.assertLoadingState(LoadingState.LOADED);
// Data range contains page range.
expectedData = createData(400, 20).subList(2, 12);
presenter.setRowData(3, createData(400, 20));
assertEquals(10, presenter.getRowData().size());
assertEquals(expectedData, presenter.getRowData());
view.assertReplaceAllChildrenCalled(true);
view.assertReplaceChildrenCalled(false);
view.assertLastHtml("start=5,size=10");
assertEquals(10, view.getChildCount());
view.assertLoadingState(LoadingState.LOADED);
}
/**
* Setting data outside of the data size should update the data size.
*/
public void testSetRowValuesChangesDataSize() {
HasData<String> listView = new MockHasData<String>();
MockView<String> view = new MockView<String>();
HasDataPresenter<String> presenter = new HasDataPresenter<String>(listView,
view, 10, null);
// Set the initial data size.
presenter.setRowCount(10, true);
view.assertLoadingState(LoadingState.LOADING);
// Set the data within the range.
presenter.setRowData(0, createData(0, 10));
view.assertLoadingState(LoadingState.LOADED);
// Set the data past the range.
presenter.setRowData(5, createData(5, 10));
assertEquals(15, presenter.getRowCount());
view.assertLoadingState(LoadingState.LOADED);
}
/**
* Setting an empty list that starts on the page start should pass through to
* the view.
*/
public void testSetRowValuesEmptySet() {
HasData<String> listView = new MockHasData<String>();
MockView<String> view = new MockView<String>();
HasDataPresenter<String> presenter = new HasDataPresenter<String>(listView,
view, 10, null);
// Set the initial data size.
presenter.setRowCount(10, true);
view.assertLoadingState(LoadingState.LOADING);
// Set an empty list of row values.
presenter.setRowData(0, createData(0, 0));
view.assertLoadingState(LoadingState.LOADING);
view.assertReplaceAllChildrenCalled(true);
view.assertReplaceChildrenCalled(false);
}
public void testSetRowValuesOutsideRange() {
HasData<String> listView = new MockHasData<String>();
MockView<String> view = new MockView<String>();
HasDataPresenter<String> presenter = new HasDataPresenter<String>(listView,
view, 10, null);
presenter.setVisibleRange(new Range(5, 10));
view.assertLoadingState(LoadingState.LOADING);
// Page range same as data range.
List<String> expectedData = createData(5, 10);
presenter.setRowData(5, createData(5, 10));
assertEquals(10, presenter.getRowData().size());
assertEquals(expectedData, presenter.getRowData());
view.assertReplaceAllChildrenCalled(true);
view.assertReplaceChildrenCalled(false);
view.assertLastHtml("start=5,size=10");
view.assertLoadingState(LoadingState.LOADED);
// Data range past page end.
presenter.setRowData(15, createData(15, 5));
assertEquals(10, presenter.getRowData().size());
assertEquals(expectedData, presenter.getRowData());
view.assertReplaceAllChildrenCalled(false);
view.assertReplaceChildrenCalled(false);
view.assertLastHtml(null);
view.assertLoadingState(LoadingState.LOADED);
// Data range before page start.
presenter.setRowData(0, createData(0, 5));
assertEquals(10, presenter.getRowData().size());
assertEquals(expectedData, presenter.getRowData());
view.assertReplaceAllChildrenCalled(false);
view.assertReplaceChildrenCalled(false);
view.assertLastHtml(null);
view.assertLoadingState(LoadingState.LOADED);
}
/**
* As an optimization, the presenter does not replace the rendered string if
* the rendered string is identical to the previously rendered string. This is
* useful for tables that refresh on an interval.
*/
public void testSetRowValuesSameContents() {
HasData<String> listView = new MockHasData<String>();
MockView<String> view = new MockView<String>();
HasDataPresenter<String> presenter = new HasDataPresenter<String>(listView,
view, 10, null);
view.assertLoadingState(null);
// Initialize some data.
presenter.setVisibleRange(new Range(0, 10));
presenter.setRowData(0, createData(0, 10));
view.assertReplaceAllChildrenCalled(true);
view.assertReplaceChildrenCalled(false);
view.assertLastHtml("start=0,size=10");
view.assertLoadingState(LoadingState.LOADED);
// Set the same data over the entire range.
presenter.setRowData(0, createData(0, 10));
view.assertReplaceAllChildrenCalled(false);
view.assertReplaceChildrenCalled(false);
view.assertLastHtml(null);
view.assertLoadingState(LoadingState.LOADED);
}
/**
* Set data at the end of the page only.
*/
public void testSetRowValuesSparse() {
HasData<String> listView = new MockHasData<String>();
MockView<String> view = new MockView<String>();
HasDataPresenter<String> presenter = new HasDataPresenter<String>(listView,
view, 10, null);
view.assertLoadingState(null);
List<String> expectedData = createData(5, 3);
expectedData.add(0, null);
expectedData.add(0, null);
expectedData.add(0, null);
expectedData.add(0, null);
expectedData.add(0, null);
presenter.setVisibleRange(new Range(0, 10));
presenter.setRowData(5, createData(5, 3));
assertEquals(8, presenter.getRowData().size());
assertEquals(expectedData, presenter.getRowData());
view.assertReplaceAllChildrenCalled(true);
view.assertReplaceChildrenCalled(false);
view.assertLastHtml("start=0,size=8");
view.assertLoadingState(LoadingState.PARTIALLY_LOADED);
}
public void testSetVisibleRange() {
HasData<String> listView = new MockHasData<String>();
MockView<String> view = new MockView<String>();
HasDataPresenter<String> presenter = new HasDataPresenter<String>(listView,
view, 10, null);
// Set the range the first time.
presenter.setVisibleRange(new Range(0, 100));
assertEquals(new Range(0, 100), presenter.getVisibleRange());
assertEquals(0, presenter.getRowData().size());
view.assertReplaceAllChildrenCalled(false);
view.assertReplaceChildrenCalled(false);
view.assertLastHtml(null);
view.assertLoadingState(LoadingState.LOADING);
// Set the range to the same value.
presenter.setVisibleRange(new Range(0, 100));
assertEquals(new Range(0, 100), presenter.getVisibleRange());
assertEquals(0, presenter.getRowData().size());
view.assertReplaceAllChildrenCalled(false);
view.assertReplaceChildrenCalled(false);
view.assertLastHtml(null);
view.assertLoadingState(LoadingState.LOADING);
}
public void testSetVisibleRangeAndClearDataDifferentRange() {
HasData<String> listView = new MockHasData<String>();
MockView<String> view = new MockView<String>();
HasDataPresenter<String> presenter = new HasDataPresenter<String>(listView,
view, 10, null);
// Add a range change handler.
final List<Range> events = new ArrayList<Range>();
listView.addRangeChangeHandler(new RangeChangeEvent.Handler() {
public void onRangeChange(RangeChangeEvent event) {
events.add(event.getNewRange());
}
});
// Set some initial data.
presenter.setVisibleRange(new Range(5, 10));
presenter.setRowData(5, createData(5, 10));
assertEquals(new Range(5, 10), presenter.getVisibleRange());
assertEquals(10, presenter.getRowData().size());
view.assertReplaceAllChildrenCalled(true);
view.assertReplaceChildrenCalled(false);
view.assertLastHtml("start=5,size=10");
view.assertLoadingState(LoadingState.LOADED);
assertEquals(1, events.size());
// Set a different range.
presenter.setVisibleRangeAndClearData(new Range(0, 10), false);
assertEquals(new Range(0, 10), presenter.getVisibleRange());
assertEquals(0, presenter.getRowData().size());
view.assertReplaceAllChildrenCalled(true);
view.assertReplaceChildrenCalled(false);
view.assertLastHtml("start=0,size=0");
view.assertLoadingState(LoadingState.LOADING);
assertEquals(2, events.size());
}
public void testSetVisibleRangeAndClearDataSameRange() {
HasData<String> listView = new MockHasData<String>();
MockView<String> view = new MockView<String>();
HasDataPresenter<String> presenter = new HasDataPresenter<String>(listView,
view, 10, null);
// Add a range change handler.
final List<Range> events = new ArrayList<Range>();
listView.addRangeChangeHandler(new RangeChangeEvent.Handler() {
public void onRangeChange(RangeChangeEvent event) {
events.add(event.getNewRange());
}
});
// Set some initial data.
presenter.setRowData(0, createData(0, 10));
assertEquals(new Range(0, 10), presenter.getVisibleRange());
assertEquals(10, presenter.getRowData().size());
view.assertReplaceAllChildrenCalled(true);
view.assertReplaceChildrenCalled(false);
view.assertLastHtml("start=0,size=10");
view.assertLoadingState(LoadingState.LOADED);
assertEquals(0, events.size());
// Set the same range.
presenter.setVisibleRangeAndClearData(new Range(0, 10), false);
assertEquals(new Range(0, 10), presenter.getVisibleRange());
assertEquals(0, presenter.getRowData().size());
view.assertReplaceAllChildrenCalled(true);
view.assertReplaceChildrenCalled(false);
view.assertLastHtml("start=0,size=0");
view.assertLoadingState(LoadingState.LOADING);
assertEquals(0, events.size());
}
public void testSetVisibleRangeAndClearDataSameRangeForceEvent() {
HasData<String> listView = new MockHasData<String>();
MockView<String> view = new MockView<String>();
HasDataPresenter<String> presenter = new HasDataPresenter<String>(listView,
view, 10, null);
// Add a range change handler.
final List<Range> events = new ArrayList<Range>();
listView.addRangeChangeHandler(new RangeChangeEvent.Handler() {
public void onRangeChange(RangeChangeEvent event) {
events.add(event.getNewRange());
}
});
// Set some initial data.
presenter.setRowData(0, createData(0, 10));
assertEquals(new Range(0, 10), presenter.getVisibleRange());
assertEquals(10, presenter.getRowData().size());
view.assertReplaceAllChildrenCalled(true);
view.assertReplaceChildrenCalled(false);
view.assertLastHtml("start=0,size=10");
view.assertLoadingState(LoadingState.LOADED);
assertEquals(0, events.size());
// Set the same range.
presenter.setVisibleRangeAndClearData(new Range(0, 10), true);
assertEquals(new Range(0, 10), presenter.getVisibleRange());
assertEquals(0, presenter.getRowData().size());
view.assertReplaceAllChildrenCalled(true);
view.assertReplaceChildrenCalled(false);
view.assertLastHtml("start=0,size=0");
view.assertLoadingState(LoadingState.LOADING);
assertEquals(1, events.size());
}
public void testSetVisibleRangeDecreasePageSize() {
HasData<String> listView = new MockHasData<String>();
MockView<String> view = new MockView<String>();
HasDataPresenter<String> presenter = new HasDataPresenter<String>(listView,
view, 10, null);
// Initialize some data.
presenter.setVisibleRange(new Range(0, 10));
assertEquals(new Range(0, 10), presenter.getVisibleRange());
presenter.setRowData(0, createData(0, 10));
assertEquals(10, presenter.getRowData().size());
assertEquals("test 0", presenter.getRowData().get(0));
view.assertReplaceAllChildrenCalled(true);
view.assertReplaceChildrenCalled(false);
view.assertLastHtml("start=0,size=10");
view.assertLoadingState(LoadingState.LOADED);
// Decrease the page size.
presenter.setVisibleRange(new Range(0, 8));
assertEquals(new Range(0, 8), presenter.getVisibleRange());
assertEquals(8, presenter.getRowData().size());
assertEquals("test 0", presenter.getRowData().get(0));
view.assertReplaceAllChildrenCalled(true);
view.assertReplaceChildrenCalled(false);
view.assertLastHtml("start=0,size=8");
view.assertLoadingState(LoadingState.LOADED);
}
public void testSetVisibleRangeDecreasePageStart() {
HasData<String> listView = new MockHasData<String>();
MockView<String> view = new MockView<String>();
HasDataPresenter<String> presenter = new HasDataPresenter<String>(listView,
view, 10, null);
// Initialize some data.
presenter.setVisibleRange(new Range(10, 30));
assertEquals(new Range(10, 30), presenter.getVisibleRange());
presenter.setRowData(10, createData(0, 10));
assertEquals(10, presenter.getRowData().size());
assertEquals("test 0", presenter.getRowData().get(0));
view.assertReplaceAllChildrenCalled(true);
view.assertReplaceChildrenCalled(false);
view.assertLastHtml("start=10,size=10");
view.assertLoadingState(LoadingState.PARTIALLY_LOADED);
// Decrease the start index.
presenter.setVisibleRange(new Range(8, 30));
assertEquals(new Range(8, 30), presenter.getVisibleRange());
assertEquals(12, presenter.getRowData().size());
assertEquals(null, presenter.getRowData().get(0));
assertEquals(null, presenter.getRowData().get(1));
assertEquals("test 0", presenter.getRowData().get(2));
view.assertReplaceAllChildrenCalled(true);
view.assertReplaceChildrenCalled(false);
view.assertLastHtml("start=8,size=12");
view.assertLoadingState(LoadingState.PARTIALLY_LOADED);
}
public void testSetVisibleRangeIncreasePageSize() {
HasData<String> listView = new MockHasData<String>();
MockView<String> view = new MockView<String>();
HasDataPresenter<String> presenter = new HasDataPresenter<String>(listView,
view, 10, null);
// Initialize some data.
presenter.setVisibleRange(new Range(0, 10));
assertEquals(new Range(0, 10), presenter.getVisibleRange());
presenter.setRowData(0, createData(0, 10));
assertEquals(10, presenter.getRowData().size());
assertEquals("test 0", presenter.getRowData().get(0));
view.assertReplaceAllChildrenCalled(true);
view.assertReplaceChildrenCalled(false);
view.assertLastHtml("start=0,size=10");
view.assertLoadingState(LoadingState.LOADED);
// Increase the page size.
presenter.setVisibleRange(new Range(0, 20));
assertEquals(new Range(0, 20), presenter.getVisibleRange());
assertEquals(10, presenter.getRowData().size());
assertEquals("test 0", presenter.getRowData().get(0));
view.assertReplaceAllChildrenCalled(false);
view.assertReplaceChildrenCalled(false);
view.assertLastHtml(null);
view.assertLoadingState(LoadingState.PARTIALLY_LOADED);
}
public void testSetVisibleRangeIncreasePageStart() {
HasData<String> listView = new MockHasData<String>();
MockView<String> view = new MockView<String>();
HasDataPresenter<String> presenter = new HasDataPresenter<String>(listView,
view, 10, null);
// Initialize some data.
presenter.setVisibleRange(new Range(0, 20));
assertEquals(new Range(0, 20), presenter.getVisibleRange());
presenter.setRowData(0, createData(0, 10));
assertEquals(10, presenter.getRowData().size());
assertEquals("test 0", presenter.getRowData().get(0));
view.assertReplaceAllChildrenCalled(true);
view.assertReplaceChildrenCalled(false);
view.assertLastHtml("start=0,size=10");
view.assertLoadingState(LoadingState.PARTIALLY_LOADED);
// Increase the start index.
presenter.setVisibleRange(new Range(2, 20));
assertEquals(new Range(2, 20), presenter.getVisibleRange());
assertEquals(8, presenter.getRowData().size());
assertEquals("test 2", presenter.getRowData().get(0));
view.assertReplaceAllChildrenCalled(true);
view.assertReplaceChildrenCalled(false);
view.assertLastHtml("start=2,size=8");
view.assertLoadingState(LoadingState.PARTIALLY_LOADED);
}
public void testSetVisibleRangeInts() {
HasData<String> listView = new MockHasData<String>();
MockView<String> view = new MockView<String>();
HasDataPresenter<String> presenter = new HasDataPresenter<String>(listView,
view, 10, null);
try {
presenter.setVisibleRange(0, 100);
fail("Expected UnsupportedOperationException");
} catch (UnsupportedOperationException e) {
// Expected.
}
}
/**
* If the cells depend on selection, the cells should be replaced.
*/
public void testSetSelectionModelDependOnSelection() {
HasData<String> listView = new MockHasData<String>();
MockView<String> view = new MockView<String>();
view.setDependsOnSelection(true);
HasDataPresenter<String> presenter = new HasDataPresenter<String>(listView,
view, 10, null);
assertNull(presenter.getSelectionModel());
// Initialize some data.
presenter.setVisibleRange(new Range(0, 10));
populatePresenter(presenter);
view.assertReplaceAllChildrenCalled(true);
view.assertReplaceChildrenCalled(false);
view.assertLastHtml("start=0,size=10");
// Set the selection model.
SelectionModel<String> model = new MockSelectionModel<String>(null);
model.setSelected("test 0", true);
presenter.setSelectionModel(model);
view.assertReplaceAllChildrenCalled(true);
view.assertReplaceChildrenCalled(false);
view.assertLastHtml("start=0,size=10");
view.assertOnUpdateSelectionFired(true);
view.assertSelectedRows();
// Select something.
model.setSelected("test 2", true);
view.assertReplaceAllChildrenCalled(true);
view.assertReplaceChildrenCalled(false);
view.assertLastHtml("start=0,size=10");
view.assertOnUpdateSelectionFired(true);
view.assertSelectedRows();
// Set selection model to null.
presenter.setSelectionModel(null);
view.assertReplaceAllChildrenCalled(true);
view.assertReplaceChildrenCalled(false);
view.assertLastHtml("start=0,size=10");
view.assertOnUpdateSelectionFired(true);
view.assertSelectedRows();
}
/**
* If the cells do not depend on selection, the view should be told to update
* the cell container element.
*/
public void testSetSelectionModelDoesNotDependOnSelection() {
HasData<String> listView = new MockHasData<String>();
MockView<String> view = new MockView<String>();
HasDataPresenter<String> presenter = new HasDataPresenter<String>(listView,
view, 10, null);
assertNull(presenter.getSelectionModel());
// Initialize some data.
presenter.setVisibleRange(new Range(0, 10));
populatePresenter(presenter);
view.assertReplaceAllChildrenCalled(true);
view.assertReplaceChildrenCalled(false);
view.assertLastHtml("start=0,size=10");
// Set the selection model.
SelectionModel<String> model = new MockSelectionModel<String>(null);
model.setSelected("test 0", true);
presenter.setSelectionModel(model);
view.assertReplaceAllChildrenCalled(false);
view.assertReplaceChildrenCalled(false);
view.assertLastHtml(null);
view.assertOnUpdateSelectionFired(true);
view.assertSelectedRows(0);
// Select something.
model.setSelected("test 2", true);
view.assertReplaceAllChildrenCalled(false);
view.assertReplaceChildrenCalled(false);
view.assertLastHtml(null);
view.assertOnUpdateSelectionFired(true);
view.assertSelectedRows(0, 2);
// Set selection model to null.
presenter.setSelectionModel(null);
view.assertReplaceAllChildrenCalled(false);
view.assertReplaceChildrenCalled(false);
view.assertLastHtml(null);
view.assertOnUpdateSelectionFired(true);
view.assertSelectedRows();
}
/**
* Create a list of data for testing.
*
* @param start the start index
* @param length the length
* @return a list of data
*/
private List<String> createData(int start, int length) {
List<String> toRet = new ArrayList<String>();
for (int i = 0; i < length; i++) {
toRet.add("test " + (i + start));
}
return toRet;
}
/**
* Populate the entire range of a presenter.
*
* @param presenter the presenter
*/
private void populatePresenter(HasDataPresenter<String> presenter) {
Range range = presenter.getVisibleRange();
int start = range.getStart();
int length = range.getLength();
presenter.setRowData(start, createData(start, length));
}
}