import com.google.common.collect.Lists;
import org.junit.Test;
import java.io.IOException;
import java.net.URISyntaxException;
import java.nio.file.Paths;
import static org.junit.Assert.assertEquals;
public class PathSumTest {
@Test
public void
the_max_sum_of_tree_with_no_node_is_zero_top_down() {
assertTreeTopDownComputation(0, Tree.Builder.aTreeBuilder());
}
@Test
public void
the_max_sum_of_tree_with_no_node_is_zero_bottom_up() {
assertTreeBottomUpComputation(0, Tree.Builder.aTreeBuilder());
}
@Test
public void
the_max_sum_of_tree_with_one_node_is_the_node_value_top_down() {
assertTreeTopDownComputation(7,
Tree.Builder.aTreeBuilder().withRow(Lists.newArrayList(7)));
}
@Test
public void
the_max_sum_of_tree_with_one_node_is_the_node_value_bottom_up() {
Tree.Builder.aTreeBuilder().withRow(Lists.newArrayList(7));
}
@Test(expected = IllegalArgumentException.class)
public void
building_a_tree_with_one_row_and_2_elements_should_throw_an_exception() {
Tree.Builder.aTreeBuilder().withRow(Lists.newArrayList(2, 3));
}
@Test
public void
the_total_of_two_rows_should_be_the_correct_result_top_bottom() {
assertTreeTopDownComputation(10,
Tree.Builder.aTreeBuilder()
.withRow(Lists.newArrayList(3))
.withRow(Lists.newArrayList(7, 4)));
}
@Test
public void
the_total_of_two_rows_should_be_the_correct_result_bottom_up() {
assertTreeBottomUpComputation(10,
Tree.Builder.aTreeBuilder()
.withRow(Lists.newArrayList(3))
.withRow(Lists.newArrayList(7, 4)));
}
@Test
public void
big_tree_test() throws URISyntaxException, IOException {
long startTime = System.nanoTime();
assertEquals(1074,
TreeParser.parseTree(Paths.get(ClassLoader.getSystemResource("BigTree.txt").toURI())).computeTopDownMaxSum());
long midTime = System.nanoTime();
assertEquals(1074,
TreeParser.parseTree(Paths.get(ClassLoader.getSystemResource("BigTree.txt").toURI())).computeBottomUpMaxSum());
long endTime = System.nanoTime();
System.out.println("Top Down:" + (midTime-startTime));
System.out.println("Bottom up:" + (endTime-midTime));
}
@Test
public void
acceptanceTestSmallData_Top_Down() {
assertTreeTopDownComputation(23,
Tree.Builder.aTreeBuilder()
.withRow(Lists.newArrayList(3))
.withRow(Lists.newArrayList(7, 4))
.withRow(Lists.newArrayList(2, 4, 6))
.withRow(Lists.newArrayList(8, 5, 9, 3)));
}
@Test
public void
acceptanceTestSmallData_Bottom_Up() {
assertTreeBottomUpComputation(23,
Tree.Builder.aTreeBuilder()
.withRow(Lists.newArrayList(3))
.withRow(Lists.newArrayList(7, 4))
.withRow(Lists.newArrayList(2, 4, 6))
.withRow(Lists.newArrayList(8, 5, 9, 3)));
}
@Test
public void
very_big_tree_test() throws URISyntaxException, IOException {
long startTime = System.nanoTime();
assertEquals(7273,
TreeParser.parseTree(Paths.get(ClassLoader.getSystemResource("VeryBigTree.txt").toURI())).computeBottomUpMaxSum());
System.out.println("Time: " + (System.nanoTime() - startTime));
}
private void assertTreeTopDownComputation(int expected, Tree.Builder builder) {
assertEquals(expected, builder.build().computeTopDownMaxSum());
}
private void assertTreeBottomUpComputation(int expected, Tree.Builder builder) {
assertEquals(expected, builder.build().computeBottomUpMaxSum());
}
}