/*
* Beanfabrics Framework Copyright (C) by Michael Karneim, beanfabrics.org
* Use is subject to license terms. See license.txt.
*/
package org.beanfabrics.swing.table;
import static org.junit.Assert.assertArrayEquals;
import static org.junit.Assert.assertEquals;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.HashSet;
import java.util.LinkedList;
import java.util.List;
import java.util.Set;
import javax.swing.ListSelectionModel;
import junit.framework.JUnit4TestAdapter;
import org.beanfabrics.ModelProvider;
import org.beanfabrics.Path;
import org.beanfabrics.event.ElementChangedEvent;
import org.beanfabrics.event.ElementsAddedEvent;
import org.beanfabrics.event.ElementsDeselectedEvent;
import org.beanfabrics.event.ElementsRemovedEvent;
import org.beanfabrics.event.ElementsReplacedEvent;
import org.beanfabrics.event.ElementsSelectedEvent;
import org.beanfabrics.event.ListEvent;
import org.beanfabrics.event.ListListener;
import org.beanfabrics.model.AbstractPM;
import org.beanfabrics.model.MapPM;
import org.beanfabrics.model.PMManager;
import org.beanfabrics.model.TextPM;
import org.junit.Before;
import org.junit.Test;
public class ListModelSelectionModelComplexTest {
public static junit.framework.Test suite() {
return new JUnit4TestAdapter(ListModelSelectionModelComplexTest.class);
}
private int NUM = 10;
private OwnerModel ownerModel;
private BnColumn[] columns;
private List<BnColumn> defsList;
private Set<Integer> keySetToRemove;
private EventCounter eventCounter;
@Before
public void setUp()
throws Exception {
ownerModel = new OwnerModel();
columns = new BnColumn[] { new BnColumn(new Path("text"), "Text") };
defsList = Arrays.asList(columns);
keySetToRemove = new HashSet<Integer>();
for (int i = 0; i < NUM; ++i) {
if (i == 8)
continue;
keySetToRemove.add(i);
}
eventCounter = new EventCounter();
ownerModel.elements.addListListener(eventCounter);
}
@Test
public void testWithSelectionModelBefore() {
BnTableSelectionModel selModel = new BnTableSelectionModel(ownerModel.elements);
doAssertionsBeforeTest();
ownerModel.elements.removeAllKeys(keySetToRemove);
doAssertionsAfterTest(selModel);
}
@Test
public void testWithSelectionModelAfter() {
doAssertionsBeforeTest();
ownerModel.elements.removeAllKeys(keySetToRemove);
BnTableSelectionModel selModel = new BnTableSelectionModel(ownerModel.elements);
doAssertionsAfterTest(selModel);
}
@Test
public void testWithSelectionModelAndTableModel() {
// BnTableModel tblModel = new BnTableModel( ownerModel.elements, defsList);
BnTableSelectionModel selModel = new BnTableSelectionModel(ownerModel.elements);
doAssertionsBeforeTest();
ownerModel.elements.removeAllKeys(keySetToRemove);
doAssertionsAfterTest(selModel);
}
@Test
public void testWithTable() {
BnTable bnTable = new BnTable();
ModelProvider provider = new ModelProvider();
bnTable.setModelProvider(provider);
bnTable.setPath(new Path("elements"));
bnTable.setColumns(columns);
provider.setPresentationModel(ownerModel);
doAssertionsBeforeTest();
ownerModel.elements.removeAllKeys(keySetToRemove);
doAssertionsAfterTest(bnTable.getSelectionModel());
}
private void doAssertionsBeforeTest() {
assertEquals("ownerModel.elements.size()", NUM, ownerModel.elements.size());
assertEquals("ownerModel.elements.getSelection().size()", NUM, ownerModel.elements.getSelection().size());
}
private void doAssertionsAfterTest(ListSelectionModel selModel) {
assertEquals("ownerModel.elements.size()", 1, ownerModel.elements.size());
assertEquals("ownerModel.elements.getSelection().size()", 1, ownerModel.elements.getSelection().size());
assertEquals("ownerModel.elements.getSelectedKeys().contains(8)", true, ownerModel.elements.getSelectedKeys().contains(8));
assertEquals("eventCounter.elementChangedEvents", 0, eventCounter.elementChangedEvents);
assertEquals("eventCounter.elementReplacedEvents", 0, eventCounter.elementReplacedEvents);
assertEquals("eventCounter.elementsAddedEvents", 0, eventCounter.elementsAddedEvents);
assertEquals("eventCounter.elementsDeselectedEvents", 2, eventCounter.elementsDeselectedEvents);
assertEquals("eventCounter.elementsRemovedEvents", 2, eventCounter.elementsRemovedEvents);
assertEquals("eventCounter.elementsSelectedEvents", 0, eventCounter.elementsSelectedEvents);
List<ElementsDeselectedEvent> deselectionEvents = eventCounter.getEventsOfType(ElementsDeselectedEvent.class);
assertEquals("deselectionEvents.get(1).getBeginIndex()", 0, deselectionEvents.get(1).getBeginIndex());
assertEquals("deselectionEvents.get(1).getLength()", 8, deselectionEvents.get(1).getLength());
assertEquals("deselectionEvents.get(0).getBeginIndex()", 9, deselectionEvents.get(0).getBeginIndex());
assertEquals("deselectionEvents.get(0).getLength()", 1, deselectionEvents.get(0).getLength());
List<ElementsRemovedEvent> removedEvents = eventCounter.getEventsOfType(ElementsRemovedEvent.class);
assertEquals("removedEvents.get(1).getBeginIndex()", 0, removedEvents.get(1).getBeginIndex());
assertEquals("removedEvents.get(1).getLength()", 8, removedEvents.get(1).getLength());
assertEquals("removedEvents.get(0).getBeginIndex()", 9, removedEvents.get(0).getBeginIndex());
assertEquals("removedEvents.get(0).getLength()", 1, removedEvents.get(0).getLength());
// check order of events
{
ListEvent[] expectedOrder = new ListEvent[] { deselectionEvents.get(0), removedEvents.get(0), deselectionEvents.get(1), removedEvents.get(1) };
List<ListEvent> expectedOrderList = Arrays.asList(expectedOrder);
List<ListEvent> actualOrderList = new ArrayList<ListEvent>(eventCounter.events);
actualOrderList.retainAll(expectedOrderList);
ListEvent[] actualOrder = actualOrderList.toArray(new ListEvent[4]);
assertArrayEquals("actualOrder", expectedOrder, actualOrder);
}
assertEquals("selModel.getMinSelectionIndex()", 0, selModel.getMinSelectionIndex());
assertEquals("selModel.getMaxSelectionIndex()", 0, selModel.getMaxSelectionIndex());
assertEquals("selModel.isSelectedIndex(0)", true, selModel.isSelectedIndex(0));
}
private static class EventCounter implements ListListener {
private int elementChangedEvents;
private int elementReplacedEvents;
private int elementsAddedEvents;
private int elementsDeselectedEvents;
private int elementsRemovedEvents;
private int elementsSelectedEvents;
private List<ListEvent> events = new LinkedList<ListEvent>();
public void elementChanged(ElementChangedEvent evt) {
events.add(evt);
elementChangedEvents++;
}
public void elementsReplaced(ElementsReplacedEvent evt) {
events.add(evt);
elementReplacedEvents++;
}
public void elementsAdded(ElementsAddedEvent evt) {
events.add(evt);
elementsAddedEvents++;
}
public void elementsDeselected(ElementsDeselectedEvent evt) {
events.add(evt);
elementsDeselectedEvents++;
}
public void elementsRemoved(ElementsRemovedEvent evt) {
events.add(evt);
elementsRemovedEvents++;
}
public void elementsSelected(ElementsSelectedEvent evt) {
events.add(evt);
elementsSelectedEvents++;
}
@SuppressWarnings("unchecked")
public <T extends ListEvent> List<T> getEventsOfType(Class<T> type) {
List<T> result = new LinkedList<T>();
for (ListEvent evt : events) {
if (type.isInstance(evt)) {
result.add((T)evt);
}
}
return result;
}
}
private static class MyModel extends AbstractPM {
protected final TextPM text = new TextPM();
public MyModel() {
PMManager.setup(this);
}
}
private class OwnerModel extends AbstractPM {
MapPM<Integer, MyModel> elements = new MapPM<Integer, MyModel>();
public OwnerModel() {
PMManager.setup(this);
for (int i = 0; i < NUM; ++i) {
elements.put(i, new MyModel());
}
elements.getSelection().addAll();
}
}
}