/*
* Copyright © 2010 Martin Riedel
*
* This file is part of TransFile.
*
* TransFile is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* TransFile is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with TransFile. If not, see <http://www.gnu.org/licenses/>.
*/
package net.sourceforge.transfile.ui.swing;
import static org.junit.Assert.*;
import static net.sourceforge.transfile.tools.UnitTestingTools.*;
import static net.sourceforge.jenerics.collections.CollectionsTools.arrayConcat;
import java.util.Collections;
import java.util.LinkedList;
import java.util.List;
import java.util.Random;
import net.sourceforge.transfile.tools.MutableModelAdapter;
import net.sourceforge.transfile.ui.swing.StatusList.StatusListModel;
import net.sourceforge.transfile.ui.swing.StatusService.StatusMessage;
import org.junit.*;
/**
* <p>Tests net.sourceforge.transfile.ui.swing.StatusList.StatusListModel.</p>
*
* <p>Does not cover locale changes / autotranslation or the firing of events at this time.</p>
*
* @author Martin Riedel
*
*/
public class StatusListModelTest {
private final static int minRows = 5;
private StatusListModel model;
private final MutableModelAdapter modelAdapter = new MutableModelAdapter() {
@Override
public <T> void addElement(T newElement) {
if (!(newElement instanceof StatusMessage))
throw new Error("StatusListModel exclusively stores StatusMessages");
StatusListModelTest.this.getModel().addMessage((StatusMessage) newElement);
}
};
@Before
public void setup() {
this.model = new StatusListModel(minRows);
}
@After
public void cleanup() {
this.model = null;
}
@Test
public void equalDummies() {
final StatusList.StatusDummy a = new StatusList.StatusDummy();
final StatusList.StatusDummy b = new StatusList.StatusDummy();
assertEquals(a, b);
assertEquals(b, a);
assertEquals(a.hashCode(), b.hashCode());
}
@Test
public void dummyVsMessage() {
final StatusList.StatusDummy dummy = new StatusList.StatusDummy();
final StatusMessage message = new StatusMessage(StatusList.StatusDummy.DUMMY_TEXT);
assertFalse(dummy.equals(message));
assertFalse(message.equals(dummy));
assertFalse(dummy.hashCode() == message.hashCode());
}
@Test
public void emptyOnInitialization() {
assertEquals(minRows, this.model.getSize());
assertArrayEquals(makeDummyArray(minRows), modelToArray(this.model));
}
@Test
public void addMessage() {
final StatusMessage e = new StatusMessage("test");
this.model.addMessage(e);
assertEquals(minRows, this.model.getSize());
assertArrayEquals(arrayConcat(e, makeDummyArray(minRows - 1)), modelToArray(this.model));
assertSame(e, this.model.getElementAt(0));
}
@Test
public void addDuplicateMessage() {
final StatusMessage e = new StatusMessage("The Answer is 42");
addElementsToModel(this.modelAdapter, e, e);
assertEquals(Math.max(minRows, 2), this.model.getSize());
assertArrayEquals(arrayConcat(new StatusMessage[] { e, e }, makeDummyArray(minRows - 2)), modelToArray(this.model));
assertSame(e, this.model.getElementAt(0));
assertSame(e, this.model.getElementAt(1));
}
@Test
public void addMessages() {
final List<StatusMessage> elements = new LinkedList<StatusMessage>();
final Random randomElements = new Random();
for (int i = 0; i <= minRows; i++) {
final StatusMessage e = new StatusMessage(Integer.toString(randomElements.nextInt()));
elements.add(e);
this.model.addMessage(e);
}
Collections.reverse(elements);
assertEquals(elements.size(), this.model.getSize());
assertArrayEquals(elements.toArray(), modelToArray(this.model));
}
StatusListModel getModel() {
return this.model;
}
/**
* Creates an array of {@link StatusList.StatusDummy}s.
*
* @param numDummies
* <br />The number of dummies to put in the array
* <br />May be any integer (see below)
* <br />Should not be null
* @return
* An empty array of {@code StatusDummy}s if {@code numDummies} is smaller than 1<br />
* Otherwise an array of {@code numDummies} {@code StatusDummy}ss
*
*/
private static StatusList.StatusDummy[] makeDummyArray(final int numDummies) {
if (numDummies < 1)
return new StatusList.StatusDummy[] { };
StatusList.StatusDummy[] dummies = new StatusList.StatusDummy[numDummies];
for (int i = 0; i < dummies.length; i++)
dummies[i] = new StatusList.StatusDummy();
return dummies;
}
}