package io.trygvis.btree; import org.junit.Test; import java.io.File; import java.nio.ByteBuffer; import java.util.ArrayList; import java.util.List; 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 { List persons = new ArrayList(); 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(); persons.add(p); 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()); int counter = 0; for (int i = 0; i < file.pageCount(); i++) { System.out.println("page #" + i); page = file.loadPage(i); for (ByteBuffer buffer : page.items()) { Person p = Person.fromBytes(buffer); System.out.println("p = " + p); assertEquals(persons.get(counter++), 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 + '}'; } @Override public boolean equals(Object o) { if (this == o) return true; if (!(o instanceof Person)) return false; Person person = (Person) o; return age == person.age && name.equals(person.name); } @Override public int hashCode() { int result = name.hashCode(); result = 31 * result + age; return result; } 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); } } }