package net.yadan.banana.list; import static org.junit.Assert.assertArrayEquals; import static org.junit.Assert.assertEquals; import static org.junit.Assert.fail; import net.yadan.banana.memory.Buffer; import net.yadan.banana.memory.IBuffer; import org.junit.Test; public class LinkedListTest { public ILinkedList createList(int maxBlocks, int blockSize, double growthFactor) { LinkedList list = new LinkedList(maxBlocks, blockSize, growthFactor); list.getAllocator(); return list; } public ILinkedList createList(int maxBlocks, int sizes[], double growthFactor) { return new LinkedList(maxBlocks, sizes, growthFactor); } @Test public void testInsertHead() { ILinkedList list = createList(2, 1, 0); assertEquals(-1, list.getHead()); int pointer = list.insertHead(1); list.setInt(pointer, 0, 10); assertEquals(pointer, list.getHead()); assertEquals(10, list.getInt(pointer, 0)); } @Test public void testRemoveHead() { ILinkedList list = createList(2, 1, 0); int link1 = list.insertHead(1); list.setInt(link1, 0, 10); int link2 = list.insertHead(1); list.setInt(link2, 0, 11); assertEquals(link2, list.getHead()); assertEquals(11, list.getInt(list.getHead(), 0)); list.removeHead(); assertEquals(link1, list.getHead()); assertEquals(10, list.getInt(list.getHead(), 0)); list.removeHead(); assertEquals(-1, list.getHead()); } @Test public void testAppendTail() { ILinkedList list = createList(2, 1, 0); assertEquals(-1, list.getTail()); int link1 = list.appendTail(1); assertEquals(link1, list.getHead()); assertEquals(link1, list.getTail()); assertEquals(-1, list.getNext(list.getTail())); int link2 = list.appendTail(1); assertEquals(link1, list.getHead()); assertEquals(link2, list.getNext(link1)); assertEquals(link2, list.getTail()); assertEquals(-1, list.getNext(list.getTail())); } @Test public void testRemove() { ILinkedList list = createList(3, 1, 0); int link1 = list.insertHead(1); list.setInt(link1, 0, 10); int link2 = list.insertHead(1); list.setInt(link2, 0, 11); int link3 = list.insertHead(1); list.setInt(link3, 0, 12); assertEquals(link3, list.getHead()); assertEquals(link2, list.getNext(link3)); assertEquals(link1, list.getNext(link2)); assertEquals(-1, list.getNext(link1)); list.remove(link2); assertEquals(link3, list.getHead()); assertEquals(link1, list.getNext(link3)); assertEquals(-1, list.getNext(link1)); list.remove(link1); assertEquals(link3, list.getHead()); assertEquals(-1, list.getNext(link3)); list.remove(link3); assertEquals(-1, list.getHead()); } @Test public void testGetInt() { ILinkedList list = createList(3, 2, 0); int link = list.insertHead(2); list.setInt(link, 0, 10); list.setInt(link, 1, 11); assertEquals(10, list.getInt(link, 0)); assertEquals(11, list.getInt(link, 1)); } @Test public void testFloat() { ILinkedList list = createList(3, 2, 0); int link = list.insertHead(2); list.setFloat(link, 0, 10); list.setFloat(link, 1, 11); assertEquals(10, list.getFloat(link, 0), Float.MIN_VALUE); assertEquals(11, list.getFloat(link, 1), Float.MIN_VALUE); } @Test public void testDouble() { ILinkedList list = createList(3, 4, 0); int link = list.insertHead(2); list.setDouble(link, 0, 10); list.setDouble(link, 2, 11); assertEquals(10, list.getDouble(link, 0), Double.MIN_VALUE); assertEquals(11, list.getDouble(link, 2), Double.MIN_VALUE); } @Test public void testSetInts() { ILinkedList list = createList(3, 5, 0); int link1 = list.insertHead(5); int[] data = new int[] { 1, 2, 3, 4, 5 }; list.setInts(link1, 0, data, 0, data.length); int res[] = new int[data.length]; list.getInts(link1, 0, res, 0, data.length); assertArrayEquals(data, res); } @Test public void testGetLong() { ILinkedList list = createList(3, 4, 0); int link = list.insertHead(4); list.setLong(link, 0, 10L); list.setLong(link, 2, 11L); assertEquals(10, list.getLong(link, 0)); assertEquals(11, list.getLong(link, 2)); } @Test public void testVarBlockList() { ILinkedList list = createList(10, new int[] { 5, 10 }, 0); try { list.appendTail(200); fail(); } catch (Exception e) { } int n1 = list.appendTail(1); list.setInt(n1, 0, 10); int n2 = list.appendTail(10); for (int i = 0; i < 10; i++) { list.setInt(n2, i, i); } for (int i = 0; i < 10; i++) { assertEquals(i, list.getInt(n2, i)); } } @Test public void testInsert() { ILinkedList list = createList(5, 1, 0); int n1 = list.insert(1, list.getHead()); assertEquals(n1, list.getHead()); assertEquals(n1, list.getTail()); assertEquals(-1, list.getNext(n1)); int n2 = list.insert(1, n1); assertEquals(n1, list.getHead()); assertEquals(n2, list.getTail()); assertEquals(n2, list.getNext(n1)); assertEquals(-1, list.getNext(n2)); int n3 = list.insert(1, n1); assertEquals(n1, list.getHead()); assertEquals(n2, list.getTail()); assertEquals(n3, list.getNext(n1)); assertEquals(n2, list.getNext(n3)); assertEquals(-1, list.getNext(n2)); } @Test public void testSize() { ILinkedList list = createList(5, 1, 0); assertEquals(0, list.size()); int n1 = list.appendTail(1); assertEquals(1, list.size()); int n2 = list.insert(1, n1); assertEquals(2, list.size()); list.insertHead(1); assertEquals(3, list.size()); list.removeHead(); assertEquals(2, list.size()); list.remove(n1); assertEquals(1, list.size()); list.remove(n2); assertEquals(0, list.size()); } @Test public void testInsert_buffer(){ ILinkedList list = createList(5, 5, 0); char[] chars = "Hello world".toCharArray(); IBuffer buffer = new Buffer(10); IBuffer outBuffer = new Buffer(10); buffer.appendChars(chars); int node = list.insertHead(buffer); list.getBuffer(node, 0, outBuffer, buffer.size()); assertEquals(buffer.size(), outBuffer.size()); assertArrayEquals(buffer.array(), outBuffer.array()); } @Test public void testInsertHead_buffer() { ILinkedList list = createList(5, 5, 0); char[] chars = "Hello world".toCharArray(); IBuffer buffer = new Buffer(10); IBuffer outBuffer = new Buffer(10); buffer.appendChars(chars); int node = list.insertHead(buffer); list.getBuffer(node, 0, outBuffer, buffer.size()); assertEquals(buffer.size(), outBuffer.size()); assertArrayEquals(buffer.array(), outBuffer.array()); } @Test public void testappendTail_buffer() { ILinkedList list = createList(5, 5, 0); char[] chars = "Hello world".toCharArray(); IBuffer buffer = new Buffer(10); IBuffer outBuffer = new Buffer(10); buffer.appendChars(chars); int node = list.appendTail(buffer); list.getBuffer(node, 0, outBuffer, buffer.size()); assertEquals(buffer.size(), outBuffer.size()); assertArrayEquals(buffer.array(), outBuffer.array()); } @Test public void testClear() { ILinkedList list = createList(5, 1, 0); assertEquals(0, list.size()); int n1 = list.appendTail(1); assertEquals(1, list.size()); list.insert(1, n1); assertEquals(2, list.size()); list.clear(); assertEquals(0, list.size()); assertEquals(0, list.getAllocator().usedBlocks()); } }