/*
* 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.apache.jorphan.gui;
import static java.lang.String.format;
import static java.util.stream.IntStream.range;
import static org.junit.Assert.assertEquals;
import java.util.Arrays;
import java.util.stream.IntStream;
import javax.swing.event.TableModelEvent;
import org.apache.jorphan.reflect.Functor;
import org.junit.Before;
import org.junit.Test;
public class ObjectTableModelTest {
public static class Dummy {
String a;
String b;
String c;
Dummy(String a, String b, String c) {
this.a = a;
this.b = b;
this.c = c;
}
public String getA() {
return a;
}
public String getB() {
return b;
}
public String getC() {
return c;
}
}
ObjectTableModel model;
TableModelEventBacker events;
@Before
public void init() {
String[] headers = { "a", "b", "c" };
Functor[] readFunctors = Arrays.stream(headers).map(name -> "get" + name.toUpperCase()).map(Functor::new).toArray(n -> new Functor[n]);
Functor[] writeFunctors = new Functor[headers.length];
Class<?>[] editorClasses = new Class<?>[headers.length];
Arrays.fill(editorClasses, String.class);
model = new ObjectTableModel(headers, readFunctors, writeFunctors, editorClasses);
events = new TableModelEventBacker();
}
@Test
public void checkAddRow() {
model.addTableModelListener(events);
assertModel();
model.addRow(new Dummy("1", "1", "1"));
assertModel("1");
events.assertEvents(
events.assertEvent()
.source(model)
.type(TableModelEvent.INSERT)
.column(TableModelEvent.ALL_COLUMNS)
.firstRow(0)
.lastRow(0)
);
model.addRow(new Dummy("2", "1", "1"));
assertModel("1", "2");
events.assertEvents(
events.assertEvent()
.source(model)
.type(TableModelEvent.INSERT)
.column(TableModelEvent.ALL_COLUMNS)
.firstRow(1)
.lastRow(1)
);
}
@Test
public void checkClear() {
// Arrange
for (int i = 0; i < 5; i++) {
model.addRow(new Dummy("" + i, "" + i%2, "" + i%3));
}
assertModelRanges(range(0,5));
// Act
model.addTableModelListener(events);
model.clearData();
// Assert
assertModelRanges();
events.assertEvents(
events.assertEvent()
.source(model)
.type(TableModelEvent.UPDATE)
.column(TableModelEvent.ALL_COLUMNS)
.firstRow(0)
.lastRow(Integer.MAX_VALUE)
);
}
@Test
public void checkInsertRow() {
assertModel();
model.addRow(new Dummy("3", "1", "1"));
assertModel("3");
model.addTableModelListener(events);
model.insertRow(new Dummy("1", "1", "1"), 0);
assertModel("1", "3");
events.assertEvents(
events.assertEvent()
.source(model)
.type(TableModelEvent.INSERT)
.column(TableModelEvent.ALL_COLUMNS)
.firstRow(0)
.lastRow(0)
);
model.insertRow(new Dummy("2", "1", "1"), 1);
assertModel("1", "2", "3");
events.assertEvents(
events.assertEvent()
.source(model)
.type(TableModelEvent.INSERT)
.column(TableModelEvent.ALL_COLUMNS)
.firstRow(1)
.lastRow(1)
);
}
@Test
public void checkMoveRow_from_5_11_to_0() {
// Arrange
for (int i = 0; i < 20; i++) {
model.addRow(new Dummy("" + i, "" + i%2, "" + i%3));
}
assertModelRanges(range(0, 20));
// Act
model.addTableModelListener(events);
model.moveRow(5, 11, 0);
// Assert
assertModelRanges(range(5, 11), range(0, 5), range(11, 20));
events.assertEvents(
events.assertEvent()
.source(model)
.type(TableModelEvent.UPDATE)
.column(TableModelEvent.ALL_COLUMNS)
.firstRow(0)
.lastRow(Integer.MAX_VALUE)
);
}
@Test
public void checkMoveRow_from_0_6_to_0() {
// Arrange
for (int i = 0; i < 20; i++) {
model.addRow(new Dummy("" + i, "" + i%2, "" + i%3));
}
assertModelRanges(range(0, 20));
// Act
model.addTableModelListener(events);
model.moveRow(0, 6, 0);
// Assert
assertModelRanges(range(0, 20));
events.assertEvents(
events.assertEvent()
.source(model)
.type(TableModelEvent.UPDATE)
.column(TableModelEvent.ALL_COLUMNS)
.firstRow(0)
.lastRow(Integer.MAX_VALUE)
);
}
@Test
public void checkMoveRow_from_0_6_to_10() {
// Arrange
for (int i = 0; i < 20; i++) {
model.addRow(new Dummy("" + i, "" + i%2, "" + i%3));
}
assertModelRanges(range(0, 20));
// Act
model.addTableModelListener(events);
model.moveRow(0, 6, 10);
// Assert
assertModelRanges(range(6, 16), range(0, 6), range(16, 20));
events.assertEvents(
events.assertEvent()
.source(model)
.type(TableModelEvent.UPDATE)
.column(TableModelEvent.ALL_COLUMNS)
.firstRow(0)
.lastRow(Integer.MAX_VALUE)
);
}
private void assertModelRanges(IntStream... ranges) {
IntStream ints = IntStream.empty();
for (IntStream range : ranges) {
ints = IntStream.concat(ints, range);
}
assertModel(ints.mapToObj(i -> "" + i).toArray(n -> new String[n]));
}
private void assertModel(String... as) {
assertEquals("model row count", as.length, model.getRowCount());
for (int row = 0; row < as.length; row++) {
assertEquals(format("model[%d,0]", row), as[row], model.getValueAt(row, 0));
}
}
}