package org.robotframework.swing.table;
import java.awt.Component;
import java.awt.Point;
import java.util.Enumeration;
import java.util.Vector;
import javax.swing.JPopupMenu;
import javax.swing.table.JTableHeader;
import javax.swing.table.TableColumn;
import javax.swing.table.TableColumnModel;
import jdave.Block;
import jdave.junit4.JDaveRunner;
import org.hamcrest.Matcher;
import org.hamcrest.core.IsInstanceOf;
import org.jmock.Expectations;
import org.junit.runner.RunWith;
import org.netbeans.jemmy.operators.JTableOperator;
import org.netbeans.jemmy.operators.JTableOperator.TableCellChooser;
import org.robotframework.jdave.mock.MockSupportSpecification;
import org.robotframework.swing.comparator.EqualsStringComparator;
@RunWith(JDaveRunner.class)
public class TableOperatorSpec extends MockSupportSpecification<TableOperator> {
private String row = "2";
private JTableOperator jTableOperator;
private Point coordinates = new Point(2, 3);
public class Any {
public void requiresExactMatchWhenComparesValues() {
jTableOperator = mock(JTableOperator.class);
checking(new Expectations() {
{
one(jTableOperator).setComparator(
with(any(EqualsStringComparator.class)));
}
});
new TableOperator(jTableOperator);
}
}
public class OperatingOnRowsAndColumn {
public TableOperator create() {
jTableOperator = mock(JTableOperator.class);
checking(new Expectations() {
{
ignoring(jTableOperator).setComparator(
with(any(EqualsStringComparator.class)));
}
});
return new TableOperator(jTableOperator);
}
public void clearsSelection() {
checking(new Expectations() {
{
one(jTableOperator).clearSelection();
}
});
context.clearSelection();
}
public void findsCellRow() {
checking(new Expectations() {
{
one(jTableOperator).findCellRow("someValue");
will(returnValue(3));
}
});
specify(context.findCellRow("someValue"), 3);
}
public void getsRowCount() {
checking(new Expectations() {
{
one(jTableOperator).getRowCount();
will(returnValue(3));
}
});
specify(context.getRowCount(), 3);
}
public void getsColumnCount() {
checking(new Expectations() {
{
one(jTableOperator).getColumnCount();
will(returnValue(3));
}
});
specify(context.getColumnCount(), 3);
}
public void getsSource() {
final Component source = dummy(Component.class);
checking(new Expectations() {
{
one(jTableOperator).getSource();
will(returnValue(source));
}
});
specify(context.getSource(), source);
}
public void selectingNonexistentCellFails() {
checking(new Expectations() {
{
one(jTableOperator).findCell(
with(any(TableCellChooser.class)));
will(returnValue(new Point(-1, -1)));
}
});
specify(new Block() {
public void run() throws Throwable {
context.selectCell("12", "nonexisting");
}
}, should.raise(InvalidCellException.class));
}
public void getsTableHeaders() {
final JTableHeader tableHeader = mock(JTableHeader.class);
final TableColumnModel columnModel = mock(TableColumnModel.class);
Vector<TableColumn> columnVector = new Vector<TableColumn>();
for (int i = 0; i < 3; ++i) {
final String header = "column" + i;
final TableColumn col = mock(TableColumn.class, header);
checking(new Expectations() {
{
one(col).getHeaderValue();
will(returnValue(header));
}
});
columnVector.add(col);
}
final Enumeration<TableColumn> columns = columnVector.elements();
checking(new Expectations() {
{
one(jTableOperator).getTableHeader();
will(returnValue(tableHeader));
one(tableHeader).getColumnModel();
will(returnValue(columnModel));
one(columnModel).getColumns();
will(returnValue(columns));
}
});
specify(context.getTableHeaders(),
containsInOrder("column0", "column1", "column2"));
}
}
public class OperatingOnTableWithColumnIndex extends OperatingOnTable {
protected JTableOperator createMockJTableOperator() {
column = "2";
jTableOperator = mock(JTableOperator.class);
checking(new Expectations() {
{
one(jTableOperator)
.findCell(
with(instanceOf(ColumnIndexTableCellChooser.class)));
will(returnValue(coordinates));
ignoring(jTableOperator).setComparator(
with(any(EqualsStringComparator.class)));
}
});
return jTableOperator;
}
}
public class OperatingOnTableWithColumnHeaderName extends OperatingOnTable {
protected JTableOperator createMockJTableOperator() {
column = "someColumn";
jTableOperator = mock(JTableOperator.class);
checking(new Expectations() {
{
one(jTableOperator).findCell(
with(instanceOf(ColumnNameTableCellChooser.class)));
will(returnValue(coordinates));
ignoring(jTableOperator).setComparator(
with(any(EqualsStringComparator.class)));
}
});
return jTableOperator;
}
}
@SuppressWarnings("unchecked")
private <T> Matcher<T> instanceOf(Class<T> type) {
return (Matcher<T>) new IsInstanceOf(type);
}
public abstract class OperatingOnTable {
protected String column;
protected abstract JTableOperator createMockJTableOperator();
public TableOperator create() {
return new TableOperator(createMockJTableOperator());
}
public void checksCellIsSelected() {
checking(new Expectations() {
{
one(jTableOperator).isCellSelected(coordinates.y,
coordinates.x);
will(returnValue(true));
}
});
specify(context.isCellSelected(row, column));
}
public void selectsCell() {
checking(new Expectations() {
{
one(jTableOperator)
.selectCell(coordinates.y, coordinates.x);
}
});
context.selectCell(row, column);
}
public void setsCellValue() {
final Object newValue = new Object();
checking(new Expectations() {
{
one(jTableOperator).setValueAt(newValue, coordinates.y,
coordinates.x);
}
});
context.setCellValue(newValue, row, column);
}
public void typesIntoCell() {
final Object newValue = new Object();
checking(new Expectations() {
{
one(jTableOperator).changeCellObject(coordinates.y,
coordinates.x, newValue);
one(jTableOperator).getSource();
}
});
context.typeIntoCell(newValue, row, column);
}
public void clearsCell() {
checking(new Expectations() {
{
one(jTableOperator).setValueAt("", coordinates.y,
coordinates.x);
}
});
context.clearCell(row, column);
}
public void callsPopupOnCell() {
final JPopupMenu popupMenu = dummy(JPopupMenu.class);
checking(new Expectations() {
{
one(jTableOperator).callPopupOnCell(coordinates.y,
coordinates.x);
will(returnValue(popupMenu));
}
});
specify(context.callPopupOnCell(row, column).getSource(), popupMenu);
}
}
}