/* This program 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 2 of the License, or
* (at your option) any later version.
*
* This program 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 this program; if not, write to the Free Software
* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
*/
package freenet.support;
import java.util.ArrayList;
import java.util.Random;
import junit.framework.TestCase;
/**
* Test case for {@link freenet.support.ListUtils} class.
*
*/
public class ListUtilsTest extends TestCase {
public void testRemoveByObject() {
ArrayList<Integer> list = new ArrayList<Integer>();
for(int i = 0; i < 10; i++)
list.add(Integer.valueOf(i));
// 0 1 2 3 4 5 6 7 8 9
assertEquals(list.size(), 10);
{
int oldSize = list.size();
// remove non-existing element
assertFalse(ListUtils.removeBySwapLast(list, Integer.valueOf(oldSize+1)));
assertEquals(list.size(), oldSize);
}
// 0 1 2 3 4 5 6 7 8 9
for(int i = 0; i < list.size(); i++)
assertEquals(list.get(i), Integer.valueOf(i));
{
// remove last element
int oldSize = list.size();
Integer oldTop = list.get(oldSize-1);
assertTrue(ListUtils.removeBySwapLast(list, oldTop));
// 0 1 2 3 4 5 6 7 8
assertFalse(list.contains(oldTop));
assertEquals(list.size(), oldSize-1);
}
for(int i = 0; i < list.size(); i++)
assertEquals(list.get(i), Integer.valueOf(i));
{
// remove first element
int oldSize = list.size();
Integer oldFirst = list.get(0);
Integer oldTop = list.get(oldSize-1);
assertTrue(ListUtils.removeBySwapLast(list, oldFirst));
// 8 1 2 3 4 5 6 7
assertFalse(list.contains(oldFirst));
assertEquals(list.size(), oldSize-1);
assertEquals(list.get(0), oldTop);
for(int i = 1; i < list.size(); i++)
assertEquals(list.get(i), Integer.valueOf(i));
}
}
public void testRemoveByIndex() {
ArrayList<Integer> list = new ArrayList<Integer>();
for(int i = 0; i < 10; i++)
list.add(Integer.valueOf(i));
// 0 1 2 3 4 5 6 7 8 9
assertEquals(list.size(), 10);
{
// remove last element
int oldSize = list.size();
Integer oldTop = list.get(oldSize-1);
assertEquals(ListUtils.removeBySwapLast(list, oldSize-1), oldTop);
// 0 1 2 3 4 5 6 7 8
assertEquals(list.size(), oldSize-1);
assertFalse(list.contains(oldTop));
}
for(int i = 0; i < list.size(); i++)
assertEquals(list.get(i), Integer.valueOf(i));
{
int oldSize = list.size();
Integer oldFirst = list.get(0);
Integer oldTop = list.get(oldSize-1);
// remove first element
assertEquals(ListUtils.removeBySwapLast(list, 0), oldTop);
// 8 1 2 3 4 5 6 7
assertFalse(list.contains(oldFirst));
assertEquals(list.size(), oldSize-1);
assertEquals(list.get(0), oldTop);
}
for(int i = 1; i < list.size(); i++)
assertEquals(list.get(i), Integer.valueOf(i));
}
static class NotRandomAlwaysTop extends Random {
// Fake random, always remove highest possible value in nextInt
@Override
public int nextInt(int top) {
return top - 1;
}
}
static class NotRandomAlwaysZero extends Random {
// Fake random, always remove lowest possible value in nextInt
@Override
public int nextInt(int top) {
return 0;
}
}
public void testRemoveByRandom() {
ArrayList<Integer> list = new ArrayList<Integer>();
Random rand = new Random();
for(int i = 0; i < 10; i++)
list.add(Integer.valueOf(i));
ListUtils.RandomRemoveResult<Integer> res;
for(int i = 0; i < 10; i++) {
assertEquals(list.size(), 10-i);
Integer oldTop = list.get(list.size()-1);
assertNotNull(oldTop);
res = ListUtils.removeRandomBySwapLast(rand, list);
assertNotNull(res);
assertEquals(list.size(), 10-i-1);
assertFalse(list.contains(res.removed));
assertTrue(res.removed.equals(res.moved) || list.contains(res.moved));
}
assertNull(ListUtils.removeRandomBySwapLast(rand, list));
assertEquals(list.size(), 0);
for(int i = 0; i < 10; i++)
list.add(Integer.valueOf(i));
assertEquals(list.size(), 10);
rand = new NotRandomAlwaysTop();
assertEquals(rand.nextInt(1000), 999);
assertEquals(rand.nextInt(100), 99);
assertEquals(rand.nextInt(10), 9);
// fake random will always remove last element
// (actually, this test relies on current implementation,
// not enforced by specification)
{
int oldSize = list.size();
Integer oldTop = list.get(oldSize-1);
res = ListUtils.removeRandomBySwapLast(rand, list);
assertEquals(list.size(), oldSize-1);
assertNotNull(res);
assertEquals(res.moved, oldTop);
assertEquals(res.moved, res.removed);
}
for(int i = 0; i < list.size(); i++)
assertEquals(list.get(i), Integer.valueOf(i));
rand = new NotRandomAlwaysZero();
assertEquals(rand.nextInt(1000), 0);
assertEquals(rand.nextInt(100), 0);
assertEquals(rand.nextInt(10), 0);
// fake random will always remove first element
// (actually, this test relies on current implementation,
// not enforced by specification)
{
int oldSize = list.size();
Integer oldFirst = list.get(0);
Integer oldTop = list.get(oldSize-1);
res = ListUtils.removeRandomBySwapLast(rand, list);
assertEquals(list.size(), oldSize-1);
assertNotNull(res);
assertEquals(res.removed, oldFirst);
assertEquals(res.moved, oldTop);
assertEquals(list.get(0), oldTop);
}
for(int i = 1; i < list.size(); i++)
assertEquals(list.get(i), Integer.valueOf(i));
}
public void testRemoveByRandomSimple() {
ArrayList<Integer> list = new ArrayList<Integer>();
Random rand = new Random();
for(int i = 0; i < 10; i++)
list.add(Integer.valueOf(i));
Integer res;
for(int i = 0; i < 10; i++) {
assertEquals(list.size(), 10-i);
Integer oldTop = list.get(list.size()-1);
assertNotNull(oldTop);
res = ListUtils.removeRandomBySwapLastSimple(rand, list);
assertNotNull(res);
assertEquals(list.size(), 10-i-1);
assertFalse(list.contains(res));
}
assertNull(ListUtils.removeRandomBySwapLastSimple(rand, list));
assertEquals(list.size(), 0);
for(int i = 0; i < 10; i++)
list.add(Integer.valueOf(i));
rand = new NotRandomAlwaysTop();
assertEquals(rand.nextInt(1000), 999);
assertEquals(rand.nextInt(100), 99);
assertEquals(rand.nextInt(10), 9);
assertEquals(list.size(), 10);
// fake random will always remove last element
// (actually, this test relies on current implementation,
// not enforced by specification)
{
int oldSize = list.size();
Integer oldTop = list.get(oldSize-1);
res = ListUtils.removeRandomBySwapLastSimple(rand, list);
assertEquals(list.size(), oldSize-1);
assertNotNull(res);
assertEquals(res, oldTop);
}
for(int i = 0; i < list.size(); i++)
assertEquals(list.get(i), Integer.valueOf(i));
rand = new NotRandomAlwaysZero();
assertEquals(rand.nextInt(1000), 0);
assertEquals(rand.nextInt(100), 0);
assertEquals(rand.nextInt(10), 0);
// fake random will always remove first element
// (actually, this test relies on current implementation,
// not enforced by specification)
{
int oldSize = list.size();
Integer oldFirst = list.get(0);
Integer oldTop = list.get(oldSize-1);
res = ListUtils.removeRandomBySwapLastSimple(rand, list);
assertEquals(list.size(), oldSize-1);
assertNotNull(res);
assertEquals(res, oldFirst);
assertEquals(list.get(0), oldTop);
}
for(int i = 1; i < list.size(); i++)
assertEquals(list.get(i), Integer.valueOf(i));
}
}