/*
* Beanfabrics Framework Copyright (C) by Michael Karneim, beanfabrics.org
* Use is subject to license terms. See license.txt.
*/
package org.beanfabrics.model;
import static org.junit.Assert.assertArrayEquals;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertNotNull;
import static org.junit.Assert.assertSame;
import static org.junit.Assert.assertTrue;
import java.util.ArrayList;
import java.util.Collection;
import java.util.Iterator;
import java.util.List;
import java.util.Random;
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.junit.Before;
import org.junit.BeforeClass;
import org.junit.Test;
/**
* @author Michael Karneim
*/
public abstract class IListPMInterfaceAbstractTest {
static int INITIAL_NUMBER_OF_ELEMENTS;
static int[] INITIAL_SELECTED_ELEMENT_INDEXES;
@BeforeClass
public static void setUpClass()
throws Exception {
INITIAL_NUMBER_OF_ELEMENTS = 10;
INITIAL_SELECTED_ELEMENT_INDEXES = new int[] { 0, 1, 2, 3, 4 };
}
public static class RowPM extends AbstractPM {
IntegerPM id = new IntegerPM();
TextPM name = new TextPM();
IntegerPM section = new IntegerPM();
public RowPM() {
PMManager.setup(this);
}
}
static class MyListListener implements ListListener {
final List<ListEvent> events = new ArrayList<ListEvent>();
/** {@inheritDoc} */
public void elementChanged(ElementChangedEvent evt) {
events.add(evt);
}
/** {@inheritDoc} */
public void elementsAdded(ElementsAddedEvent evt) {
events.add(evt);
}
/** {@inheritDoc} */
public void elementsDeselected(ElementsDeselectedEvent evt) {
events.add(evt);
}
/** {@inheritDoc} */
public void elementsRemoved(ElementsRemovedEvent evt) {
events.add(evt);
}
/** {@inheritDoc} */
public void elementsReplaced(ElementsReplacedEvent evt) {
events.add(evt);
}
/** {@inheritDoc} */
public void elementsSelected(ElementsSelectedEvent evt) {
events.add(evt);
}
@SuppressWarnings("unchecked")
public <T extends ListEvent> List<T> getEventsOfType(Class<T> type) {
List<T> result = new ArrayList<T>();
for (ListEvent evt : events) {
if (type.isInstance(evt)) {
result.add((T)evt);
}
}
return result;
}
public void clear() {
events.clear();
}
}
MyListListener listListener;
IListPM<RowPM> list;
List<RowPM> elements;
@Before
public void setUp()
throws Exception {
Random rnd = new Random(3341);
elements = new ArrayList<RowPM>(INITIAL_NUMBER_OF_ELEMENTS);
for (int i = 0; i < INITIAL_NUMBER_OF_ELEMENTS; ++i) {
RowPM row = new RowPM();
row.id.setInteger(i);
row.name.setText(createRandomText(rnd));
row.section.setInteger(i % 2);
elements.add(row);
}
list = create(elements, INITIAL_SELECTED_ELEMENT_INDEXES);
listListener = new MyListListener();
list.addListListener(listListener);
}
private String createRandomText(Random rnd) {
final int len = 4;
StringBuffer buf = new StringBuffer();
for (int i = 0; i < len; ++i) {
double rndNum = rnd.nextDouble();
int index = (int)(24.0d * rndNum) + 'a';
buf.append(Character.toString((char)index));
}
return buf.toString();
}
protected abstract IListPM<RowPM> create(Collection<RowPM> elements, int[] selectedIndexes)
throws Exception;
@Test
public void testSetUp() {
assertNotNull("elements", elements);
assertNotNull("list", list);
assertEquals("elements.size()", INITIAL_NUMBER_OF_ELEMENTS, elements.size());
assertEquals("list.size()", INITIAL_NUMBER_OF_ELEMENTS, list.size());
RowPM[] elementsArray = elements.toArray(new RowPM[elements.size()]);
RowPM[] listElementsArray = list.toCollection().toArray(new RowPM[elements.size()]);
assertArrayEquals("elementsArray", elementsArray, listElementsArray);
assertEquals("list.getSelection().size()", INITIAL_SELECTED_ELEMENT_INDEXES.length, list.getSelection().size());
for (int index : INITIAL_SELECTED_ELEMENT_INDEXES) {
assertEquals("list.getSelection().contains(index='" + index + "')", true, list.getSelection().contains(index));
}
}
@Test
public void size() {
assertEquals("list.size()", INITIAL_NUMBER_OF_ELEMENTS, list.size());
}
@Test
public void isEmpty() {
assertEquals("list.isEmpty()", INITIAL_NUMBER_OF_ELEMENTS == 0, list.isEmpty());
}
@Test
public void contains() {
for (RowPM cell : elements) {
assertEquals("list.contains(pM)", true, list.contains(cell));
}
}
@Test
public void indexOf() {
for (int index = 0; index < elements.size(); ++index) {
RowPM cell = elements.get(index);
assertEquals("list.indexOf(pM)", index, list.indexOf(cell));
}
}
@Test
public void getAt() {
for (int index = 0; index < elements.size(); ++index) {
RowPM cell = elements.get(index);
assertEquals("list.getAt(index='" + index + "')", cell, list.getAt(index));
}
}
@Test
public void toCollection() {
Collection<RowPM> col = list.toCollection();
assertNotNull("col", col);
assertEquals("col.size()", elements.size(), col.size());
Iterator<RowPM> it = col.iterator();
for (int i = 0; i < elements.size(); ++i) {
assertEquals("[i='" + i + "'] it.hasNext()", true, it.hasNext());
RowPM element = it.next();
assertSame("[i='" + i + "'] element", elements.get(i), element);
}
}
@Test
public void getSelection() {
assertNotNull("list.getSelection()", list.getSelection());
assertEquals("list.getSelection().size()", INITIAL_SELECTED_ELEMENT_INDEXES.length, list.getSelection().size());
}
@Test
public void iterable() {
Iterator<RowPM> it = list.iterator();
assertNotNull("it", it);
for (int i = 0; i < elements.size(); ++i) {
assertEquals("[i='" + i + "'] it.hasNext()", true, it.hasNext());
RowPM element = it.next();
assertSame("[i='" + i + "'] element", elements.get(i), element);
}
}
@Test
public void sortIsStable() {
list.sortBy(true, new Path("name"));
list.sortBy(true, new Path("section"));
Iterator<RowPM> it = list.iterator();
RowPM curr = null;
RowPM last = null;
for (int i = 0; i < elements.size(); ++i) {
curr = it.next();
if (last != null && last.section.getText().equals(curr.section.getText())) {
assertTrue("Element #" + i + " '" + curr.name.getText() + "' should be after element #" + (i - 1) + " '" + last.name.getText() + "'", curr.name.getText().compareTo(last.name.getText()) >= 0);
}
last = curr;
}
}
@Test
public void test1() {
list.getSelection().addAll();
assertEquals("list.getSelection().size()", elements.size(), list.getSelection().size());
assertEquals("listListener.events.size()", 1, listListener.events.size());
assertEquals("listListener.getEventsOfType(ElementsSelectedEvent.class).size()", 1, listListener.getEventsOfType(ElementsSelectedEvent.class).size());
listListener.clear();
List<RowPM> old = new ArrayList<RowPM>(elements);
old.remove(0);
list.getSelection().retainAll(old);
assertEquals("list.getSelection().size()", old.size(), list.getSelection().size());
assertEquals("listListener.getEventsOfType(ElementsSelectedEvent.class).size()", 1, listListener.getEventsOfType(ElementsDeselectedEvent.class).size());
}
}