package io.trygvis.btree; import org.junit.Test; import java.nio.ByteBuffer; import java.util.ArrayList; import java.util.Iterator; import java.util.List; import static io.trygvis.btree.HeapPage.*; import static org.junit.Assert.*; public class HeapPageTest { int pageSize = 128; @Test public void testBasic() { ByteBuffer buffer = ByteBuffer.allocate(pageSize); HeapPage page = HeapPage.blankHeapPage(buffer); assertEquals(pageSize - headerSize, page.bytesFree()); List objects = new ArrayList<>(); byte[] appendObject = new byte[]{0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 0xa, 0xb, 0xc, 0xd, 0xe, 0xf}; int objectSize = 16; for (int i = 0; i < 5; i++) { page.append(appendObject); objects.add(appendObject); assertEquals("i=" + i, pageSize - headerSize - (appendObject.length + itemSize) * (i + 1), page.bytesFree()); } byte[] prependObject = new byte[]{0xf, 0xe, 0xd, 0xc, 0xb, 0xa, 9, 8, 7, 6, 5, 4, 3, 2, 1, 0}; page.prepend(prependObject); objects.add(0, prependObject); // try { // page.append(object); // fail("Expected PageOverflowException"); // } catch (PageOverflowException e) { // assertEquals(pageSize - headerSize - objects.size() * (object.length + objects.size()), e.bytesFree); // assertEquals(object.length, e.bytesRequested); // } for (byte[] object : objects) { for (byte b : object) { System.out.print(Integer.toHexString(b)); } System.out.println(); } { ByteBuffer expectedBuffer = ByteBuffer.allocate(pageSize); int position = pageSize - objects.size() * (objectSize + itemSize); expectedBuffer.putInt(position); expectedBuffer.position(position); for (byte[] o : objects) { expectedBuffer.put(o); expectedBuffer.putInt(objectSize); } assertEquals(pageSize, expectedBuffer.position()); byte[] expectedArray = expectedBuffer.array(); byte[] actualArray = buffer.array(); assertArrayEquals(expectedArray, actualArray); } { Iterator it = page.items().iterator(); for (byte[] o : objects) { assertTrue(it.hasNext()); ByteBuffer bb = it.next(); assertArrayEquals(o, toArray(bb)); } assertFalse(it.hasNext()); } } private byte[] toArray(ByteBuffer bb) { byte[] bytes = new byte[bb.limit()]; bb.get(bytes); return bytes; } }