package com.jadekler.sarah;
import org.junit.*;
import java.util.Arrays;
import static org.hamcrest.CoreMatchers.equalTo;
import static org.hamcrest.MatcherAssert.assertThat;
public class HeapTest {
private HeapSort sorter;
@Before
public void setup() {
int[] baseHeap = new int[]{1492, 1783, 1776, 1804, 1865, 1945, 1963, 1918, 2001, 1941};
sorter = new HeapSort(baseHeap, baseHeap.length);
}
@Test
public void testInsert() {
doTestInsert(new int[]{1, 3, 5, 10}, new int[]{1, 3, 5, 10});
doTestInsert(new int[]{11, 10}, new int[]{10, 11});
doTestInsert(new int[]{5}, new int[]{5});
doTestInsert(new int[]{5, 9}, new int[]{5, 9});
doTestInsert(new int[]{5, 9, 4}, new int[]{4, 9, 5});
doTestInsert(new int[]{5, 9, 4, 33}, new int[]{4, 9, 5, 33});
doTestInsert(new int[]{5, 9, 4, 33, 1}, new int[]{1, 4, 5, 33, 9});
doTestInsert(new int[]{5, 9, 4, 33, 1, 7}, new int[]{1, 4, 5, 33, 9, 7});
doTestInsert(new int[]{5, 9, 4, 33, 1, 7, 14}, new int[]{1, 4, 5, 33, 9, 7, 14});
doTestInsert(new int[]{5}, new int[]{5});
doTestInsert(new int[]{5, 9}, new int[]{5, 9});
doTestInsert(new int[]{5, 9, 11}, new int[]{5, 9, 11});
doTestInsert(new int[]{5, 9, 11, 3}, new int[]{3, 5, 11, 9});
doTestInsert(new int[]{5, 9, 11, 3, 18}, new int[]{3, 5, 11, 9, 18});
doTestInsert(new int[]{5, 9, 11, 3, 18, 1}, new int[]{1, 5, 3, 9, 18, 11});
doTestInsert(new int[]{5, 9, 11, 3, 18, 1, 2}, new int[]{1, 5, 2, 9, 18, 11, 3});
}
public void doTestInsert(int[] itemsToInsert, int[] expectedResult) {
sorter = new HeapSort(new int[itemsToInsert.length], 0);
for (int i = 0; i < itemsToInsert.length; i++) {
sorter.insert(itemsToInsert[i]);
}
assertThat(sorter.getHeap(), equalTo(expectedResult));
}
@Test
public void testExtractMin() {
doTestExtractMin(1492);
doTestExtractMin(1776);
doTestExtractMin(1783);
doTestExtractMin(1804);
doTestExtractMin(1865);
doTestExtractMin(1918);
doTestExtractMin(1941);
doTestExtractMin(1945);
doTestExtractMin(1963);
doTestExtractMin(2001);
for (int i = 0; i < 10; i++) {
assertThat(sorter.getHeap()[i], equalTo(0));
}
}
private void doTestExtractMin(int expectedMin) {
assertThat(sorter.extractMin(), equalTo(expectedMin));
}
@Test
public void testGetParent() {
assertThat(sorter.getParent(0), equalTo(-1));
assertThat(sorter.getParent(1), equalTo(1492));
assertThat(sorter.getParent(2), equalTo(1492));
assertThat(sorter.getParent(3), equalTo(1783));
assertThat(sorter.getParent(4), equalTo(1783));
assertThat(sorter.getParent(5), equalTo(1776));
assertThat(sorter.getParent(6), equalTo(1776));
assertThat(sorter.getParent(7), equalTo(1804));
assertThat(sorter.getParent(8), equalTo(1804));
assertThat(sorter.getParent(9), equalTo(1865));
}
@Test
public void testGetParentIndex() {
assertThat(sorter.getParentIndex(0), equalTo(-1));
assertThat(sorter.getParentIndex(1), equalTo(0));
assertThat(sorter.getParentIndex(2), equalTo(0));
assertThat(sorter.getParentIndex(3), equalTo(1));
assertThat(sorter.getParentIndex(4), equalTo(1));
assertThat(sorter.getParentIndex(5), equalTo(2));
assertThat(sorter.getParentIndex(6), equalTo(2));
assertThat(sorter.getParentIndex(7), equalTo(3));
assertThat(sorter.getParentIndex(8), equalTo(3));
assertThat(sorter.getParentIndex(9), equalTo(4));
}
@Test
public void testGetLeftChildIndex() {
assertThat(sorter.getLeftChildIndex(0), equalTo(1));
assertThat(sorter.getLeftChildIndex(1), equalTo(3));
assertThat(sorter.getLeftChildIndex(2), equalTo(5));
assertThat(sorter.getLeftChildIndex(3), equalTo(7));
assertThat(sorter.getLeftChildIndex(4), equalTo(9));
assertThat(sorter.getLeftChildIndex(5), equalTo(-1));
assertThat(sorter.getLeftChildIndex(6), equalTo(-1));
assertThat(sorter.getLeftChildIndex(7), equalTo(-1));
assertThat(sorter.getLeftChildIndex(8), equalTo(-1));
assertThat(sorter.getLeftChildIndex(9), equalTo(-1));
sorter = new HeapSort(new int[]{1, 2, 3, 4}, 1);
assertThat(sorter.getLeftChildIndex(1), equalTo(-1));
}
}