blob: cd9082f5115481f1e6f27affc40b4449c851328c [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.apache.jorphan.gui;
import static java.lang.String.format;
import static org.junit.jupiter.api.Assertions.assertEquals;
import static org.junit.jupiter.api.Assertions.assertSame;
import java.util.ArrayDeque;
import java.util.ArrayList;
import java.util.Deque;
import java.util.List;
import java.util.function.ObjIntConsumer;
import java.util.function.ToIntFunction;
import javax.swing.event.TableModelEvent;
import javax.swing.event.TableModelListener;
/**
* Listener implementation that stores {@link TableModelEvent} and can make assertions against them.
*/
public class TableModelEventBacker implements TableModelListener {
/**
* Makes assertions for a single {@link TableModelEvent}.
*/
public static class EventAssertion {
private List<ObjIntConsumer<TableModelEvent>> assertions = new ArrayList<>();
/**
* Adds an assertion first args is table model event, second one is event index.
* @param assertion assertion to add
* @return <code>this</code>
*/
public EventAssertion add(ObjIntConsumer<TableModelEvent> assertion) {
assertions.add(assertion);
return this;
}
/**
* Adds assertion based on a {@link ToIntFunction to-int} transformation (examples: <code>TableModelEvent::getType</code>).
* @param name Label for assertion reason
* @param expected Expected value.
* @param f {@link ToIntFunction to-int} transformation (examples: <code>TableModelEvent::getType</code>).
* @return <code>this</code>
*/
public EventAssertion addInt(String name, int expected, ToIntFunction<TableModelEvent> f) {
return add((e,i) -> assertEquals(expected, f.applyAsInt(e), () -> format("%s[%d]", name, i)));
}
/**
* Adds {@link TableModelEvent#getSource()} assertion.
* @param expected Object to compare against the source of the event
* @return <code>this</code>
*/
public EventAssertion source(Object expected) {
return add((e,i) -> assertSame(expected, e.getSource(), () -> format("source[%d]",i)));
}
/**
* Adds {@link TableModelEvent#getType()} assertion.
* @param expected int value of the type to compare against
* @return <code>this</code>
*/
public EventAssertion type(int expected) {
return addInt("type", expected, TableModelEvent::getType);
}
/**
* Adds {@link TableModelEvent#getColumn()} assertion.
* @param expected int value of the column to compare against
* @return <code>this</code>
*/
public EventAssertion column(int expected) {
return addInt("column", expected, TableModelEvent::getColumn);
}
/**
* Adds {@link TableModelEvent#getFirstRow()} assertion.
* @param expected int value of the first row that should have changed
* @return <code>this</code>
*/
public EventAssertion firstRow(int expected) {
return addInt("firstRow", expected, TableModelEvent::getFirstRow);
}
/**
* Adds {@link TableModelEvent#getLastRow()} assertion.
* @param expected int value of the last row that should have changed
* @return <code>this</code>
*/
public EventAssertion lastRow(int expected) {
return addInt("lastRow", expected, TableModelEvent::getLastRow);
}
/**
* Check assertion against provided value.
* @param event Event to check
* @param index Index.
*/
protected void assertEvent(TableModelEvent event, int index) {
assertions.forEach(a -> a.accept(event, index));
}
}
private Deque<TableModelEvent> events = new ArrayDeque<>();
/**
* Stores event.
*/
@Override
public void tableChanged(TableModelEvent e) {
if (e != null) {
events.add(e);
}
}
public Deque<TableModelEvent> getEvents() {
return events;
}
/**
* Creates a new event assertion.
* @return a newly created {@link EventAssertion}
* @see #assertEvents(EventAssertion...)
*/
public EventAssertion assertEvent() {
return new EventAssertion();
}
/**
* Checks each event assertion against each backed event in order. Event storage is cleared after it.
* @param assertions a collection if {@link EventAssertion}s to check
*/
public void assertEvents(EventAssertion... assertions) {
try {
int i = 0;
for (TableModelEvent event : events) {
assertions[i].assertEvent(event, i++);
}
assertEquals(assertions.length, events.size(), "event count");
} finally {
events.clear();
}
}
}