/* * 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 java.util.ArrayList; import java.util.Collections; import java.util.LinkedList; import java.util.List; import java.util.Random; import javax.swing.MutableComboBoxModel; import net.sourceforge.transfile.tools.MutableModelAdapter; import org.junit.*; /** * <p>Tests net.sourceforge.transfile.ui.swing.PeerURLBar.PeerURLBarModel.</p> * * <p>Does not cover persistence or the firing of events at this time.</p> * * @author Martin Riedel * */ public class PeerURLBarModelTest { private static final int maxRetainedItems = 6; private PeerURLBar bar; private MutableComboBoxModel model; private final MutableModelAdapter modelAdapter = new MutableModelAdapter() { /** * {@inheritDoc} */ @Override public <T> void addElement(final T newElement) { PeerURLBarModelTest.this.getModel().addElement(newElement); } }; @Before public void setup() { this.bar = new PeerURLBar(maxRetainedItems); this.model = (MutableComboBoxModel) this.bar.getModel(); } @After public void cleanup() { this.bar = null; this.model = null; } @Test(expected=IndexOutOfBoundsException.class) public void emptyOnInitialization() { assertEquals(0, this.model.getSize()); assertNull(this.model.getSelectedItem()); this.model.getElementAt(0); } @Test public void addElementObject() { final Object e = new Object(); this.model.addElement(e); assertEquals(1, this.model.getSize()); assertArrayEquals(new Object[] { e }, modelToArray(this.model)); assertEquals(e, this.model.getElementAt(0)); assertSame(e, this.model.getElementAt(0)); assertNull(this.model.getSelectedItem()); } @Test public void addElementInteger() { final Integer e = 42; this.model.addElement(e); assertEquals(1, this.model.getSize()); assertArrayEquals(new Integer[] { e }, modelToArray(this.model)); assertEquals(e, this.model.getElementAt(0)); assertSame(e, this.model.getElementAt(0)); assertNull(this.model.getSelectedItem()); } @Test public void addElementString() { final String e = "The answer is 42."; this.model.addElement(e); assertEquals(1, this.model.getSize()); assertArrayEquals(new String[] { e }, modelToArray(this.model)); assertEquals(e, this.model.getElementAt(0)); assertSame(e, this.model.getElementAt(0)); assertNull(this.model.getSelectedItem()); } @Test public void addExcessiveElement() { final List<Integer> elements = new LinkedList<Integer>(); int i = 0; for (; i < maxRetainedItems; i++) { this.model.addElement(i); elements.add(i); } Collections.reverse(elements); assertEquals(maxRetainedItems, this.model.getSize()); assertArrayEquals(elements.toArray(), modelToArray(this.model)); this.model.addElement(i); elements.add(0, i); elements.remove(maxRetainedItems); assertEquals(maxRetainedItems, this.model.getSize()); assertArrayEquals(elements.toArray(), modelToArray(this.model)); i++; this.model.addElement(i); elements.add(0, i); elements.remove(maxRetainedItems); assertEquals(maxRetainedItems, this.model.getSize()); assertArrayEquals(elements.toArray(), modelToArray(this.model)); } @Test public void addElements() { final Random randomElements = new Random(); final List<Integer> elements = new ArrayList<Integer>(maxRetainedItems + 1); for (int i = 0; i < new Random().nextInt(maxRetainedItems) + maxRetainedItems; i++) { Integer e = randomElements.nextInt(1000); if (!elements.contains(e)) elements.add(e); this.model.addElement(e); while (elements.size() > maxRetainedItems) elements.remove(0); } Collections.reverse(elements); assertEquals(maxRetainedItems, this.model.getSize()); assertArrayEquals(elements.toArray(), modelToArray(this.model)); } @Test public void addElementAt() { try { this.model.addElement(1); this.model.addElement(3); this.model.insertElementAt(0, 2); this.model.addElement(4); } catch (final UnsupportedOperationException exception) { assertEquals(2, this.model.getSize()); assertArrayEquals(new Integer[] { 3, 1 }, modelToArray(this.model)); return; } fail("expected UnsupportedOperationException was not thrown"); } @Test public void addDuplicateElement() { final Integer e1 = new Integer(4); final Integer e2 = new Integer(4); addElementsToModel(this.modelAdapter, 1, 2, 3, e1, e2, 5); assertEquals(5, this.model.getSize()); assertArrayEquals(new Integer[] { 5, e1, 3, 2, 1 }, modelToArray(this.model)); assertSame(e1, this.model.getElementAt(1)); assertNotSame(e2, this.model.getElementAt(1)); assertEquals(e1, this.model.getElementAt(1)); assertEquals(e2, this.model.getElementAt(1)); } @Test public void removeElement() { final Integer e = 42; this.model.addElement(e); this.model.addElement(24); try { this.model.removeElement(e); } catch (final UnsupportedOperationException exception) { assertEquals(2, this.model.getSize()); assertSame(e, this.model.getElementAt(1)); assertArrayEquals(new Integer[] { 24, 42 }, modelToArray(this.model)); return; } fail("expected UnsupportedOperationException was not thrown"); } @Test public void removeElementAt() { final String e = new String("test"); this.model.addElement(e); try { this.model.removeElementAt(0); this.model.addElement("another test"); } catch (final UnsupportedOperationException exception) { assertEquals(1, this.model.getSize()); assertSame(e, this.model.getElementAt(0)); assertArrayEquals(new String[] { e }, modelToArray(this.model)); return; } fail("expected UnsupportedOperationException was not thrown"); } @Test public void setExistingSelectedItem() { final String e = "e"; addElementsToModel(this.modelAdapter, "a", "b", "c", "d", "e", "f"); this.model.setSelectedItem(e); assertEquals(6, this.model.getSize()); assertArrayEquals(new String[] { e, "f", "d", "c", "b", "a" }, modelToArray(this.model)); assertSame(e, this.model.getElementAt(0)); assertSame(e, this.model.getSelectedItem()); assertEquals(e, this.model.getSelectedItem()); } @Test public void setExistingSelectedItemAt0() { final Double e = 0.3; addElementsToModel(this.modelAdapter, 0.1, 0.2, 0.3); this.model.setSelectedItem(e); assertEquals(3, this.model.getSize()); assertArrayEquals(new Double[] { e, 0.2, 0.1 }, modelToArray(this.model)); assertSame(e, this.model.getSelectedItem()); assertEquals(e, this.model.getSelectedItem()); } @Test public void reselectSelectedItem() { final Integer e = -2; addElementsToModel(this.modelAdapter, -1, -2, -3); this.model.setSelectedItem(e); assertEquals(3, this.model.getSize()); assertArrayEquals(new Integer[] { e, -3, -1 }, modelToArray(this.model)); assertSame(e, this.model.getElementAt(0)); assertSame(e, this.model.getSelectedItem()); assertEquals(e, this.model.getSelectedItem()); this.model.setSelectedItem(e); assertEquals(3, this.model.getSize()); assertArrayEquals(new Integer[] { -2, -3, -1 }, modelToArray(this.model)); assertEquals(-2, this.model.getSelectedItem()); } @Test public void setNewSelectedItem() { final Integer e = 2; addElementsToModel(this.modelAdapter, 1, 3, 4, 5); this.model.setSelectedItem(e); assertEquals(4, this.model.getSize()); assertArrayEquals(new Integer[] { 5, 4, 3, 1 }, modelToArray(this.model)); } @Test public void clearSelection() { addElementsToModel(this.modelAdapter, 10, 20, 30, 40, 50); this.model.setSelectedItem(30); this.model.setSelectedItem(null); assertNull(this.model.getSelectedItem()); assertEquals(5, this.model.getSize()); assertArrayEquals(new Integer[] { 30, 50, 40, 20, 10 }, modelToArray(this.model)); } MutableComboBoxModel getModel() { return this.model; } }