/*
* Copyright (C) 2006 Joe Walnes.
* Copyright (C) 2007, 2008 XStream Committers.
* All rights reserved.
*
* The software in this package is published under the terms of the BSD
* style license a copy of which has been included with this distribution in
* the LICENSE.txt file.
*
* Created on 06. July 2006 by Guilherme Silveira
*/
package com.thoughtworks.xstream.persistence;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.HashSet;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
import java.util.Set;
import junit.framework.TestCase;
public class XmlArrayListTest extends TestCase {
private MockedStrategy strategy;
public void setUp() throws Exception {
super.setUp();
strategy = new MockedStrategy();
}
public void testWritesASingleObject() {
XmlArrayList xmlList = new XmlArrayList(this.strategy);
xmlList.add("guilherme");
assertTrue(strategy.map.containsValue("guilherme"));
}
public void testWritesASingleObjectInANegativePosition() {
XmlArrayList xmlList = new XmlArrayList(this.strategy);
try {
xmlList.add(-1, "guilherme");
fail();
} catch (IndexOutOfBoundsException ex) {
// ok
}
}
public void testWritesASingleObjectInFirstPosition() {
XmlArrayList xmlList = new XmlArrayList(this.strategy);
xmlList.add("guilherme");
assertTrue(strategy.map.containsKey(new Integer(0)));
}
public void testWritesTwoObjects() {
XmlArrayList xmlList = new XmlArrayList(this.strategy);
xmlList.add("guilherme");
xmlList.add("silveira");
assertTrue(strategy.map.containsValue("guilherme"));
assertTrue(strategy.map.containsValue("silveira"));
assertTrue(strategy.map.containsKey(new Integer(0)));
assertTrue(strategy.map.containsKey(new Integer(1)));
}
public void testWritesTwoObjectsGuaranteesItsEnumerationOrder() {
XmlArrayList xmlList = new XmlArrayList(this.strategy);
xmlList.add("guilherme");
xmlList.add("silveira");
assertEquals("guilherme", strategy.map.get(new Integer(0)));
assertEquals("silveira", strategy.map.get(new Integer(1)));
}
public void testWritesASecondObjectInAPositionHigherThanTheListsSize() {
XmlArrayList xmlList = new XmlArrayList(this.strategy);
try {
xmlList.add("silveira");
xmlList.add(3, "guilherme");
fail();
} catch (IndexOutOfBoundsException ex) {
// ok
}
}
public void testRemovesAWrittenObject() {
XmlArrayList xmlList = new XmlArrayList(this.strategy);
xmlList.add("guilherme");
boolean changed = xmlList.remove("guilherme");
assertFalse(strategy.map.containsValue("guilherme"));
}
public void testRemovesAWrittenObjectImplyingInAChangeInTheList() {
XmlArrayList xmlList = new XmlArrayList(this.strategy);
xmlList.add("guilherme");
boolean changed = xmlList.remove("guilherme");
assertTrue(changed);
}
public void testRemovesAnInvalidObjectWithoutAffectingTheList() {
XmlArrayList xmlList = new XmlArrayList(this.strategy);
boolean removed = xmlList.remove("guilherme");
assertFalse(removed);
}
public void testHasZeroLengthWhenInstantiated() {
XmlArrayList xmlList = new XmlArrayList(this.strategy);
assertEquals(0, xmlList.size());
}
public void testHasOneItem() {
XmlArrayList xmlList = new XmlArrayList(this.strategy);
xmlList.add("guilherme");
assertEquals(1, xmlList.size());
}
public void testHasTwoItems() {
XmlArrayList xmlList = new XmlArrayList(this.strategy);
xmlList.add("guilherme");
xmlList.add("silveira");
assertEquals(2, xmlList.size());
}
public void testIsNotEmpty() {
XmlArrayList xmlList = new XmlArrayList(this.strategy);
xmlList.add("guilherme");
assertFalse(xmlList.isEmpty());
}
public void testDoesNotContainKey() {
XmlArrayList xmlList = new XmlArrayList(this.strategy);
assertFalse(xmlList.contains("guilherme"));
}
public void testContainsKey() {
XmlArrayList xmlList = new XmlArrayList(this.strategy);
xmlList.add("guilherme");
assertTrue(xmlList.contains("guilherme"));
}
public void testGetsAnObject() {
XmlArrayList xmlList = new XmlArrayList(this.strategy);
xmlList.add("guilherme");
Object onlyValue = xmlList.iterator().next();
assertEquals("guilherme", onlyValue);
}
public void testGetsTheFirstObject() {
XmlArrayList xmlList = new XmlArrayList(this.strategy);
xmlList.add("guilherme");
assertEquals("guilherme", xmlList.get(0));
}
public void testGetsTheSecondObject() {
XmlArrayList xmlList = new XmlArrayList(this.strategy);
xmlList.add("guilherme");
xmlList.add("silveira");
assertEquals("silveira", xmlList.get(1));
}
public void testInsertsAnObjectInTheMiddleOfTheList() {
XmlArrayList xmlList = new XmlArrayList(this.strategy);
xmlList.add("guilherme");
xmlList.add("silveira");
xmlList.add(1, "de azevedo");
assertEquals("guilherme", xmlList.get(0));
assertEquals("de azevedo", xmlList.get(1));
assertEquals("silveira", xmlList.get(2));
}
public void testIteratingGuaranteesItsEnumeration() {
XmlArrayList xmlList = new XmlArrayList(this.strategy);
xmlList.add("guilherme");
xmlList.add("silveira");
Iterator it = xmlList.iterator();
assertEquals("guilherme", it.next());
assertEquals("silveira", it.next());
}
public void testIsEmpty() {
XmlArrayList xmlList = new XmlArrayList(this.strategy);
assertTrue(xmlList.isEmpty());
}
public void testClearsItsObjects() {
XmlArrayList xmlList = new XmlArrayList(this.strategy);
xmlList.add("guilherme");
xmlList.add("silveira");
xmlList.clear();
assertEquals(0, xmlList.size());
}
public void testPutsAllAddsTwoItems() {
Set original = new HashSet();
original.add("guilherme");
original.add("silveira");
XmlArrayList xmlList = new XmlArrayList(this.strategy);
xmlList.addAll(original);
assertEquals(2, xmlList.size());
}
public void testContainsASpecificValue() {
XmlArrayList xmlList = new XmlArrayList(this.strategy);
xmlList.add("guilherme");
assertTrue(xmlList.contains("guilherme"));
}
public void testDoesNotContainASpecificValue() {
XmlArrayList xmlList = new XmlArrayList(this.strategy);
assertFalse(xmlList.contains("zzzz"));
}
public void testEntrySetContainsAllItems() {
Set original = new HashSet();
original.add("guilherme");
original.add("silveira");
XmlArrayList xmlList = new XmlArrayList(this.strategy);
xmlList.add("guilherme");
xmlList.add("silveira");
assertTrue(xmlList.containsAll(original));
}
// actually an acceptance test?
public void testIteratesOverEntryAndChecksWithAnotherInstance() {
XmlArrayList xmlList = new XmlArrayList(this.strategy);
xmlList.add("guilherme");
xmlList.add("silveira");
XmlArrayList built = new XmlArrayList(this.strategy);
for (Iterator iter = xmlList.iterator(); iter.hasNext();) {
Object entry = iter.next();
assertTrue(built.contains(entry));
}
}
public void testIteratesOverEntrySetContainingTwoItems() {
XmlArrayList xmlList = new XmlArrayList(this.strategy);
xmlList.add("guilherme");
xmlList.add("silveira");
List built = new ArrayList();
for (Iterator iter = xmlList.iterator(); iter.hasNext();) {
Object entry = iter.next();
built.add(entry);
}
assertEquals(xmlList, built);
}
public void testRemovesAnItemThroughIteration() {
XmlArrayList xmlList = new XmlArrayList(this.strategy);
xmlList.add("guilherme");
xmlList.add("silveira");
for (Iterator iter = xmlList.iterator(); iter.hasNext();) {
Object entry = iter.next();
if (entry.equals("guilherme")) {
iter.remove();
}
}
assertFalse(xmlList.contains("guilherme"));
}
private static class MockedStrategy implements PersistenceStrategy {
private Map map = new HashMap();
public Iterator iterator() {
return map.entrySet().iterator();
}
public int size() {
return map.size();
}
public Object get(Object key) {
return map.get(key);
}
public Object put(Object key, Object value) {
return map.put(key, value);
}
public Object remove(Object key) {
return map.remove(key);
}
}
}