package io.trygvis.btree; import org.junit.Test; import java.io.File; import java.nio.ByteBuffer; import java.util.Random; import static io.trygvis.btree.HeapTest.Person.randomPerson; import static io.trygvis.btree.TestUtils.deleteFile; import static org.junit.Assert.assertEquals; public class HeapTest { @Test public void testHeap() throws Exception { File f = new File("target/heapTest"); HeapFile file = new HeapFile(128, deleteFile(f)); HeapPage page = file.blankPage(); int pageNo = 0; for (int i = 0; i < 10; i++) { Person p = randomPerson(); byte[] bytes = p.toBytes(); System.out.println("p = " + p + ", size = " + bytes.length); if (page.bytesFree() < bytes.length) { System.out.println("Flushing page"); long actualPageNo = file.writePage(page); assertEquals(pageNo++, actualPageNo); page = file.blankPage(); } page.append(bytes); } long actualPageNo = file.writePage(page); assertEquals(pageNo, actualPageNo); file.close(); System.out.println("-------------------------------------------------------"); file = new HeapFile(128, f); System.out.println("file.pageCount() = " + file.pageCount()); for (int i = 0; i < file.pageCount(); i++) { System.out.println("page #" + i); page = file.loadPage(i); for (ByteBuffer buffer : page.bufferIterator()) { Person p = Person.fromBytes(buffer); System.out.println("p = " + p); } } } public static class Person { private final String name; private final int age; public Person(String name, int age) { this.name = name; this.age = age; } public byte[] toBytes() { byte[] s = name.getBytes(); ByteBuffer buffer = ByteBuffer.allocate(s.length + 8); buffer.putInt(s.length); buffer.put(s); buffer.putInt(age); return buffer.array(); } public static Person fromBytes(ByteBuffer buffer) { int stringSize = buffer.getInt(); byte[] s = new byte[stringSize]; buffer.get(s); return new Person(new String(s), buffer.getInt()); } @Override public String toString() { return "Person{" + "name='" + name + '\'' + ", age=" + age + '}'; } private final static Random r = new Random(0); private final static String[] names = new String[]{ "Lukas", "Emil", "Mathias", "Jonas", "Aleksander", "William", "Oskar", "Magnus", "Markus", "Oliver", "Nora", "Emma", "Sofie", "Linnea", "Sara", "Emilie", "Ingrid", "Thea", "Leah", "Sofia"}; public static Person randomPerson() { return new Person(names[r.nextInt(names.length)], r.nextInt(80) + 20); } } }