| /* |
| * 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.TextCell; |
| import com.google.gwt.cell.client.ValueUpdater; |
| 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.regexp.shared.MatchResult; |
| import com.google.gwt.regexp.shared.RegExp; |
| import com.google.gwt.safehtml.shared.SafeHtmlBuilder; |
| import com.google.gwt.user.client.Window; |
| import com.google.gwt.view.client.ListDataProvider; |
| import com.google.gwt.view.client.Range; |
| |
| import java.util.ArrayList; |
| import java.util.List; |
| |
| /** |
| * Base tests for {@link AbstractHasData}. |
| */ |
| public abstract class AbstractHasDataTestBase extends GWTTestCase { |
| |
| /** |
| * A mock cell that tests the index specified in each method. |
| * |
| * @param <C> the cell type |
| */ |
| protected static class IndexCell<C> extends AbstractCell<C> { |
| private int lastBrowserEventIndex = -1; |
| private int lastEditingIndex = -1; |
| private int lastRenderIndex = -1; |
| private int lastResetFocusIndex = -1; |
| |
| public IndexCell(String... consumedEvents) { |
| super(consumedEvents); |
| } |
| |
| public void assertLastBrowserEventIndex(int expected) { |
| assertEquals(expected, lastBrowserEventIndex); |
| } |
| |
| public void assertLastEditingIndex(int expected) { |
| assertEquals(expected, lastEditingIndex); |
| } |
| |
| public void assertLastRenderIndex(int expected) { |
| assertEquals(expected, lastRenderIndex); |
| } |
| |
| public void assertLastResetFocusIndex(int expected) { |
| assertEquals(expected, lastResetFocusIndex); |
| } |
| |
| @Override |
| public boolean isEditing(Context context, Element parent, C value) { |
| this.lastEditingIndex = context.getIndex(); |
| return false; |
| } |
| |
| @Override |
| public void onBrowserEvent(Context context, Element parent, C value, |
| NativeEvent event, ValueUpdater<C> valueUpdater) { |
| this.lastBrowserEventIndex = context.getIndex(); |
| } |
| |
| @Override |
| public void render(Context context, C value, SafeHtmlBuilder sb) { |
| this.lastRenderIndex = context.getIndex(); |
| sb.appendEscaped("index " + this.lastRenderIndex); |
| } |
| |
| @Override |
| public boolean resetFocus(Context context, Element parent, C value) { |
| this.lastResetFocusIndex = context.getIndex(); |
| return false; |
| } |
| } |
| |
| @Override |
| public String getModuleName() { |
| return "com.google.gwt.user.cellview.CellView"; |
| } |
| |
| public void testGetVisibleItem() { |
| AbstractHasData<String> display = createAbstractHasData(new TextCell()); |
| ListDataProvider<String> provider = new ListDataProvider<String>( |
| createData(0, 13)); |
| provider.addDataDisplay(display); |
| display.setVisibleRange(10, 10); |
| |
| // No items when no data is present. |
| assertEquals("test 10", display.getVisibleItem(0)); |
| assertEquals("test 11", display.getVisibleItem(1)); |
| assertEquals("test 12", display.getVisibleItem(2)); |
| |
| // Out of range. |
| try { |
| assertEquals("test 10", display.getVisibleItem(-1)); |
| fail("Expected IndexOutOfBoundsException"); |
| } catch (IndexOutOfBoundsException e) { |
| // Expected. |
| } |
| |
| // Within page range, but out of data range. |
| try { |
| assertEquals("test 10", display.getVisibleItem(4)); |
| fail("Expected IndexOutOfBoundsException"); |
| } catch (IndexOutOfBoundsException e) { |
| // Expected. |
| } |
| } |
| |
| public void testGetVisibleItems() { |
| AbstractHasData<String> display = createAbstractHasData(new TextCell()); |
| ListDataProvider<String> provider = new ListDataProvider<String>(); |
| provider.addDataDisplay(display); |
| display.setVisibleRange(10, 3); |
| |
| // No items when no data is present. |
| assertEquals(0, display.getVisibleItems().size()); |
| |
| // Set some data. |
| provider.setList(createData(0, 13)); |
| List<String> items = display.getVisibleItems(); |
| assertEquals(3, items.size()); |
| assertEquals("test 10", items.get(0)); |
| assertEquals("test 11", items.get(1)); |
| assertEquals("test 12", items.get(2)); |
| } |
| |
| public void testResetFocus() { |
| IndexCell<String> cell = new IndexCell<String>(); |
| AbstractHasData<String> display = createAbstractHasData(cell); |
| display.setRowData(createData(0, 10)); |
| display.getPresenter().flush(); |
| |
| cell.assertLastResetFocusIndex(-1); |
| display.getPresenter().setKeyboardSelectedRow(5, false, false); |
| display.resetFocusOnCell(); |
| cell.assertLastResetFocusIndex(5); |
| } |
| |
| public void testSetRowData() { |
| IndexCell<String> cell = new IndexCell<String>(); |
| AbstractHasData<String> display = createAbstractHasData(cell); |
| |
| // Set exact data. |
| List<String> values = createData(0, 62); |
| display.setRowData(values); |
| assertEquals(62, display.getRowCount()); |
| assertTrue(display.isRowCountExact()); |
| assertEquals(values, display.getVisibleItems()); |
| assertEquals(new Range(0, 62), display.getVisibleRange()); |
| |
| // Add some data. |
| List<String> moreValues = createData(62, 10); |
| display.setVisibleRange(0, 100); |
| display.setRowData(62, moreValues); |
| assertEquals(72, display.getRowCount()); |
| assertTrue(display.isRowCountExact()); |
| assertEquals("test 62", display.getVisibleItem(62)); |
| assertEquals("test 71", display.getVisibleItem(71)); |
| assertEquals(72, display.getVisibleItems().size()); |
| assertEquals(new Range(0, 100), display.getVisibleRange()); |
| |
| // Push the exact data again. |
| display.setRowData(values); |
| assertEquals(62, display.getRowCount()); |
| assertTrue(display.isRowCountExact()); |
| assertEquals(values, display.getVisibleItems()); |
| assertEquals(new Range(0, 62), display.getVisibleRange()); |
| display.getPresenter().flush(); |
| |
| // Render one row and verify the index. |
| display.setRowData(5, createData(100, 1)); |
| display.getPresenter().flush(); |
| assertEquals("test 100", display.getVisibleItem(5)); |
| cell.assertLastRenderIndex(5); |
| } |
| |
| public void testSetTabIndex() { |
| // Skip this test on Safari 3 because it does not support focusable divs. |
| String userAgent = Window.Navigator.getUserAgent(); |
| if (userAgent.contains("Safari")) { |
| RegExp versionRegExp = RegExp.compile("Version/[0-3]", "ig"); |
| MatchResult result = versionRegExp.exec(userAgent); |
| if (result != null && result.getGroupCount() > 0) { |
| return; |
| } |
| } |
| |
| AbstractHasData<String> display = createAbstractHasData(new TextCell()); |
| ListDataProvider<String> provider = new ListDataProvider<String>( |
| createData(0, 10)); |
| provider.addDataDisplay(display); |
| display.getPresenter().flush(); |
| |
| // Default tab index is 0. |
| assertEquals(0, display.getTabIndex()); |
| assertEquals(0, display.getKeyboardSelectedElement().getTabIndex()); |
| |
| // Set tab index to 2. |
| display.setTabIndex(2); |
| assertEquals(2, display.getTabIndex()); |
| assertEquals(2, display.getKeyboardSelectedElement().getTabIndex()); |
| |
| // Push new data. |
| provider.refresh(); |
| display.getPresenter().flush(); |
| assertEquals(2, display.getTabIndex()); |
| assertEquals(2, display.getKeyboardSelectedElement().getTabIndex()); |
| } |
| |
| /** |
| * Create an {@link AbstractHasData} to test. |
| * |
| * @param cell the cell to use |
| * @return the widget to test |
| */ |
| protected abstract AbstractHasData<String> createAbstractHasData( |
| Cell<String> cell); |
| |
| /** |
| * Create a list of data for testing. |
| * |
| * @param start the start index |
| * @param length the length |
| * @return a list of data |
| */ |
| protected 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; |
| } |
| } |