blob: adaa5c41a498bb12778e15c89681f1732f4661d9 [file] [log] [blame]
/*
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. The ASF licenses this file
* to you 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 org.netbeans.swing.etable;
import java.awt.event.InputEvent;
import java.awt.event.KeyEvent;
import java.beans.PropertyChangeEvent;
import java.beans.PropertyChangeListener;
import java.util.Properties;
import javax.swing.table.AbstractTableModel;
import javax.swing.table.DefaultTableModel;
import javax.swing.table.TableColumn;
import javax.swing.table.TableColumnModel;
import javax.swing.table.TableModel;
import org.netbeans.junit.NbTestCase;
/**
* Tests for class ETable.
* @author David Strupl
*/
public class ETableTest extends NbTestCase {
public ETableTest(String testName) {
super(testName);
}
@Override
protected boolean runInEQ () {
return true;
}
/**
* Test of isCellEditable method, of class org.netbeans.swing.etable.ETable.
*/
public void testIsCellEditable() {
System.out.println("testIsCellEditable");
ETable t = createTestingTable(true);
assertTrue("Should be editable according to the model", t.isCellEditable(0, 0));
t.setFullyNonEditable(true);
assertFalse("Should be non-editable when in fully non-ed mode" , t.isCellEditable(0, 0));
t.setFullyEditable(true);
assertTrue("Should be editable after fully editable", t.isCellEditable(0, 0));
}
/**
* Test of convertRowIndexToModel method, of class org.netbeans.swing.etable.ETable.
*/
public void testConvertRowIndexToModel() {
System.out.println("testConvertRowIndexToModel");
ETable t = createTestingTable(true);
t.setQuickFilter(0, "b");
assertEquals("Filter should hide rows", 3, t.convertRowIndexToModel(1));
t.unsetQuickFilter();
assertEquals("Unsetting filter should return original value", 1, t.convertRowIndexToModel(1));
ETableColumnModel etcm = (ETableColumnModel)t.getColumnModel();
ETableColumn etc = (ETableColumn)etcm.getColumn(3);
etcm.toggleSortedColumn(etc, true);
t.sortingPermutation = null; // because that is what we do after calling toggleSortedColumn
assertEquals("Sort reorder (3) not ok", 3, t.convertRowIndexToModel(0));
assertEquals("Sort reorder (4) not ok", 4, t.convertRowIndexToModel(5));
}
/**
* Test that table can be sorted just after a column has been removed. See
* bug 239045.
*/
public void testRemoveSortedColumn() {
ETable t = new ETable();
final int[] size = new int[]{10, 4};
TableModel tm = new AbstractTableModel() {
@Override
public int getRowCount() {
return size[0];
}
@Override
public int getColumnCount() {
return size[1];
}
@Override
public Object getValueAt(int rowIndex, int columnIndex) {
if (rowIndex < size[0] && columnIndex < size[1]) {
return rowIndex;
} else {
throw new IndexOutOfBoundsException();
}
}
};
t.setModel(tm);
ETableColumnModel etcm = (ETableColumnModel) t.getColumnModel();
ETableColumn etc = (ETableColumn) etcm.getColumn(3);
etcm.toggleSortedColumn(etc, true);
size[1] = 3;
t.sortAndFilter();
}
public void testFirePropertyChangeForQuickFilter() {
ETable t = new ETable();
class L implements PropertyChangeListener {
int cnt;
@Override
public void propertyChange(PropertyChangeEvent evt) {
assertEquals("quickFilter", evt.getPropertyName());
cnt++;
}
}
L listener = new L();
t.addPropertyChangeListener(listener);
t.setQuickFilter(1, new Object());
assertEquals("One filter change", 1, listener.cnt);
t.unsetQuickFilter();
assertEquals("Second change", 2, listener.cnt);
}
/**
* Test of getFullyEditable method, of class org.netbeans.swing.etable.ETable.
*/
public void testGetFullyEditable() {
System.out.println("testGetFullyEditable");
ETable t = createTestingTable(true);
assertFalse("False after creation ", t.isFullyEditable());
t.setFullyEditable(true);
assertTrue("Should be editable after setting" , t.isFullyEditable());
t.setFullyNonEditable(true);
assertFalse("Should be false if fully non-editable", t.isFullyEditable());
}
/**
* Test of getFullyNonEditable method, of class org.netbeans.swing.etable.ETable.
*/
public void testGetFullyNonEditable() {
System.out.println("testGetFullyNonEditable");
ETable t = createTestingTable(true);
assertFalse("False after creation ", t.isFullyNonEditable());
t.setFullyNonEditable(true);
assertTrue("Should be non-editable after setting" , t.isFullyNonEditable());
t.setFullyEditable(true);
assertFalse("Should be false if fully editable", t.isFullyNonEditable());
}
/**
* Tests passing a QuickFilter object as a parameter to setQuickFilter method.
*/
public void testSetQuickFilter() {
System.out.println("testSetQuickFilter");
ETable t = createTestingTable(true);
QuickFilter quick = new QuickFilter() {
public boolean accept(Object object) {
return "x".equals(object);
}
};
t.setQuickFilter(1, quick);
assertEquals(1, t.getRowCount());
}
/**
* Test of createDefaultColumnsFromModel method, of class org.netbeans.swing.etable.ETable.
*/
public void testCreateDefaultColumnsFromModel() {
System.out.println("testCreateDefaultColumnsFromModel");
ETable t = createTestingTable(true);
assertTrue("Should create ETableColumnModel", t.createDefaultColumnModel() instanceof ETableColumnModel);
}
/**
* Test of createColumn method, of class org.netbeans.swing.etable.ETable.
*/
public void testCreateColumn() {
System.out.println("testCreateColumn");
final boolean [] called = new boolean[1];
ETable t = new ETable(1, 1) {
public TableColumn createColumn(int index){
TableColumn tc = super.createColumn(index);
called[0] = tc instanceof ETableColumn;
return tc;
}
};
assertTrue("createColumn should have been called and returned correct type", called[0]);
}
/**
* Test of createDefaultColumnModel method, of class org.netbeans.swing.etable.ETable.
*/
public void testCreateDefaultColumnModel() {
System.out.println("testCreateDefaultColumnModel");
final boolean [] called = new boolean[1];
ETable t = new ETable(1, 1) {
protected TableColumnModel createDefaultColumnModel() {
TableColumnModel tcm = super.createDefaultColumnModel();
called[0] = tcm instanceof ETableColumnModel;
return tcm;
}
};
assertTrue("createColumn should have been called and created correct type", called[0]);
}
/**
* Test of getValueAt method, of class org.netbeans.swing.etable.ETable.
*/
public void testGetValueAt() {
System.out.println("testGetValueAt");
System.out.println("testSetValueAt");
ETable t = createTestingTable(true);
t.setQuickFilter(0, "b");
assertEquals("Filter should hide rows", t.getValueAt(1,1), t.getModel().getValueAt(3, 1));
t.unsetQuickFilter();
ETableColumnModel etcm = (ETableColumnModel)t.getColumnModel();
ETableColumn etc = (ETableColumn)etcm.getColumn(3);
etcm.toggleSortedColumn(etc, true);
t.sortingPermutation = null; // because that is what we do after calling toggleSortedColumn
assertEquals("Sort reorder (3) not ok", t.getValueAt(0,1), t.getModel().getValueAt(3, 1));
assertEquals("Sort reorder (4) not ok", t.getValueAt(5,1), t.getModel().getValueAt(4, 1));
}
/**
* Test of setValueAt method, of class org.netbeans.swing.etable.ETable.
*/
public void testSetValueAt() {
System.out.println("testSetValueAt");
ETable t = createTestingTable(true);
t.setQuickFilter(0, "b");
t.setValueAt("ahoj", 1, 1);
assertEquals("Filter should hide rows", "ahoj", t.getModel().getValueAt(3, 1));
t.unsetQuickFilter();
ETableColumnModel etcm = (ETableColumnModel)t.getColumnModel();
ETableColumn etc = (ETableColumn)etcm.getColumn(3);
etcm.toggleSortedColumn(etc, true);
t.sortingPermutation = null; // because that is what we do after calling toggleSortedColumn
t.setValueAt("ahoj1", 0, 1);
t.setValueAt("ahoj2", 5, 1);
assertEquals("Sort reorder (3) not ok", "ahoj1", t.getModel().getValueAt(3, 1));
assertEquals("Sort reorder (4) not ok", "ahoj2", t.getModel().getValueAt(4, 1));
}
/**
* Test of getRowCount method, of class org.netbeans.swing.etable.ETable.
*/
public void testGetRowCount() {
System.out.println("testGetRowCount");
ETable t = createTestingTable(true);
t.setQuickFilter(0, "b");
assertEquals("Filter should hide rows", 2, t.getRowCount());
}
/**
* Test of setModel method, of class org.netbeans.swing.etable.ETable.
*/
public void testSetModel() {
System.out.println("testSetModel");
ETable t = createTestingTable(true);
t.setQuickFilter(0, "b");
t.setModel(new DefaultTableModel(100, 100));
assertEquals("row count should be according to the new model", 100, t.getRowCount());
}
/**
* Test of initializeLocalVars method, of class org.netbeans.swing.etable.ETable.
*/
public void testInitializeLocalVars() {
System.out.println("testInitializeLocalVars");
ETable t = createTestingTable(true);
for (int i = 0; i < t.getColumnCount(); i++) {
int pw = t.getColumnModel().getColumn(i).getPreferredWidth();
if ((pw == 0) || (pw == 75)) { // the default values
fail("PreferredWidth is " + pw);
}
}
}
/**
* Test of processKeyBinding method, of class org.netbeans.swing.etable.ETable.
*/
public void testProcessKeyBinding() {
System.out.println("testProcessKeyBinding");
final boolean []called = new boolean[1];
ETable t = new ETable() {
void updatePreferredWidths() {
super.updatePreferredWidths();
called[0] = true;
}
};
KeyEvent ke = new KeyEvent(t, 0, System.currentTimeMillis(), InputEvent.CTRL_MASK, 0, '+');
t.processKeyBinding(null, ke, 0, true);
assertTrue("update pref size not called", called[0]);
}
/**
* Test of readSettings and writeSettings methods,
* of class org.netbeans.swing.etable.ETable.
*/
public void testWriteReadSettings() {
System.out.println("testWriteReadSettings");
ETable t = createTestingTable(false);
ETableColumnModel etcm = (ETableColumnModel) t.getColumnModel();
ETableColumn etc = (ETableColumn)etcm.getColumn(3);
etcm.setColumnHidden(etcm.getColumn(0), true);
etcm.toggleSortedColumn(etc, true);
assertEquals("One column should be hidden", 3, t.getColumnCount());
assertEquals("Sort reorder (3) not ok", 3, t.convertRowIndexToModel(0));
assertEquals("Sort reorder (4) not ok", 4, t.convertRowIndexToModel(5));
assertEquals("Sort reorder (3) not ok", t.getValueAt(0, 0), t.getModel().getValueAt(3, 1));
assertEquals("Sort reorder (4) not ok", t.getValueAt(5, 0), t.getModel().getValueAt(4, 1));
Properties p = new Properties();
t.writeSettings(p, "blabla");
ETable t2 = createTestingTable(false);
t2.readSettings(p, "blabla");
assertEquals("One column should be hidden", 3, t2.getColumnCount());
assertEquals("Sort reorder (3) not ok", 3, t2.convertRowIndexToModel(0));
assertEquals("Sort reorder (4) not ok", 4, t2.convertRowIndexToModel(5));
assertEquals("Sort reorder (3) not ok", t2.getValueAt(0, 0), t2.getModel().getValueAt(3, 1));
assertEquals("Sort reorder (4) not ok", t2.getValueAt(5, 0), t2.getModel().getValueAt(4, 1));
}
public void testWriteReadSettings2() {
ETable t = createTestingTable(false);
assertEquals("All columns visible", 4, t.getColumnCount());
Properties p = new Properties();
t.writeSettings(p, "table");
t = new ETable();
t.readSettings(p, "table");
assertEquals("All columns visible", 4, t.getColumnCount());
ETableColumn etc = (ETableColumn) t.getColumn("CC");
((ETableColumnModel) t.getColumnModel()).setColumnHidden(etc, true);
assertEquals("3 visible columns", 3, t.getColumnCount());
t.writeSettings(p, "table");
t = new ETable();
t.readSettings(p, "table");
assertEquals("3 visible columns", 3, t.getColumnCount());
ETableColumnModel etcm = (ETableColumnModel) t.getColumnModel();
new ColumnSelectionPanel(t);
}
public void testTableColumnSelector() {
ETable t = createTestingTable(false);
t.setColumnSelector(new TableColumnSelector() {
public String[] selectVisibleColumns(TableColumnSelector.TreeNode root, String[] selected) {
return new String[] { "DD", "BB", "AA" };
}
public String[] selectVisibleColumns(String[] available, String[] selected) {
return new String[] { "CC" };
}
});
ColumnSelectionPanel.showColumnSelectionDialog(t);
assertEquals(1, t.getColumnCount());
ETableColumnModel etcm = (ETableColumnModel) t.getColumnModel();
etcm.setColumnHierarchyRoot(new TableColumnSelector.TreeNode() {
public String getText() {
return "Root";
}
public boolean isLeaf() {
return false;
}
public TableColumnSelector.TreeNode[] getChildren() {
return new TableColumnSelector.TreeNode[0];
}
} );
ColumnSelectionPanel.showColumnSelectionDialog(t);
assertEquals(3, t.getColumnCount());
// The columns should be also re-sorted:
assertEquals("DD", t.getColumnModel().getColumn(0).getIdentifier());
assertEquals("BB", t.getColumnModel().getColumn(1).getIdentifier());
assertEquals("AA", t.getColumnModel().getColumn(2).getIdentifier());
}
public void testDefaultTableColumnSelector() {
ETable t = createTestingTable(false);
ETable.setDefaultColumnSelector(new TableColumnSelector() {
public String[] selectVisibleColumns(TableColumnSelector.TreeNode root, String[] selected) {
return new String[] { "AA", "BB" };
}
public String[] selectVisibleColumns(String[] available, String[] selected) {
return new String[] { "CC" };
}
});
ColumnSelectionPanel.showColumnSelectionDialog(t);
assertEquals(1, t.getColumnCount());
ETableColumnModel etcm = (ETableColumnModel) t.getColumnModel();
etcm.setColumnHierarchyRoot(new TableColumnSelector.TreeNode() {
public String getText() {
return "Root";
}
public boolean isLeaf() {
return false;
}
public TableColumnSelector.TreeNode[] getChildren() {
return new TableColumnSelector.TreeNode[0];
}
} );
ColumnSelectionPanel.showColumnSelectionDialog(t);
assertEquals(2, t.getColumnCount());
}
/**
* Create a test ETable instance with some dummy data. BUT please
* be aware that the tests result depend on this data so if you do
* any change here make sure you fix all the tests.
*/
private ETable createTestingTable(final boolean cellsEditable) {
ETable eTable1 = new ETable();
eTable1.setModel(new javax.swing.table.DefaultTableModel(
new Object [][] {
{"a", "x", "tttttttt", new Integer(5)},
{"a", "y", "ggggggggg", new Integer(10)},
{"b", "z", "nnnnnnnn", new Integer(7)},
{"b", "w", "mmmmmm", new Integer(1)},
{"c", "m", "kkkkkkkkkk", new Integer(10000)},
{"c", "n", "kkkkk", new Integer(4)}
},
new String [] { "AA", "BB", "CC", "DD"}
) {
Class[] types = new Class [] {
java.lang.Object.class, java.lang.Object.class, java.lang.Object.class, java.lang.Integer.class
};
boolean[] canEdit = new boolean [] {
cellsEditable, cellsEditable, cellsEditable, cellsEditable
};
public Class getColumnClass(int columnIndex) {
return types [columnIndex];
}
public boolean isCellEditable(int rowIndex, int columnIndex) {
return canEdit [columnIndex];
}
});
return eTable1;
}
}