algorithms-sandbox/datastructures/java/test/be/brainbaking/datastructures/trees/NodeTest.java

148 lines
4.3 KiB
Java

package be.brainbaking.datastructures.trees;
import org.junit.jupiter.api.Test;
import java.util.Arrays;
import static org.junit.jupiter.api.Assertions.assertArrayEquals;
import static org.junit.jupiter.api.Assertions.assertEquals;
import static org.junit.jupiter.api.Assertions.assertSame;
public class NodeTest {
@Test
public void merge_addsKeysAndChildren() {
Node child = new Node(true);
child.addKey("I");
Node node = new Node(false);
node.addKey("G");
node.addKey("H");
node.addChild(new Node(true));
Node siblingToMergeWith = new Node(false);
siblingToMergeWith.addKey("K");
siblingToMergeWith.addKey("L");
Node siblingChild = new Node(true);
siblingChild.addKey("X");
siblingToMergeWith.addChild(siblingChild);
node.mergeWith(siblingToMergeWith);
assertArrayEquals(Arrays.asList("G", "H", "K", "L").toArray(), node.getKeys().toArray());
assertEquals(2, node.getChildren().size());
}
@Test
public void getKeyBetweenChildren_basedOnChildIndex() {
Node parent = new Node(false);
parent.addKey("J");
parent.addKey("M");
Node child1 = new Node(true);
child1.addKey("G");
child1.addKey("H");
parent.addChild(child1);
Node child2 = new Node(true);
child2.addKey("K");
child2.addKey("L");
parent.addChild(child2);
Node child3 = new Node(true);
child3.addKey("O");
child3.addKey("P");
child3.addKey("R");
parent.addChild(child3);
assertEquals("J", parent.getKeyBetweenChildren(child1, child2));
assertEquals("M", parent.getKeyBetweenChildren(child2, child3));
}
@Test
public void getExtremeKey_returnsFirstKeyBiggerThanParentKey_leftSide() {
Node parent = new Node(false);
parent.addKey("J");
parent.addKey("M");
Node child = new Node(true);
child.addKey("O");
child.addKey("P");
child.addKey("R");
parent.addChild(child);
assertEquals("O", child.getExtremeKeyComparedTo("M"));
}
@Test
public void getExtremeKey_returnsLastKeySmallerThanParentKey_rightSide() {
Node parent = new Node(false);
parent.addKey("J");
parent.addKey("M");
Node child = new Node(true);
child.addKey("K");
child.addKey("L");
parent.addChild(child);
assertEquals("L", child.getExtremeKeyComparedTo("M"));
}
@Test
public void createFromSplitResult_nodeALeftAndBRight() {
Node root = new Node(false);
root.addKey("R");
Node node = new Node(true);
node.addKey("A");
NodeSplitResult result = new NodeSplitResult(node, "B");
Node newRoot = Node.createFromSplitResult(root, result);
assertSame(root, newRoot.getChildren().get(0));
assertSame(node, newRoot.getChildren().get(1));
}
@Test
public void addKey_addsToCorrectPositionAutomatically() {
Node node = new Node(true);
node.addKey("A");
node.addKey("C");
node.addKey("B");
assertArrayEquals(Arrays.asList("A", "B", "C").toArray(), node.getKeys().toArray());
}
@Test
public void split() {
Node node = new Node(false);
Node child = new Node(true);
node.addChild(child);
node.addKey("N");
node.addKey("W");
child.addKey("P");
child.addChild(new Node(true));
child.addKey("Q");
child.addChild(new Node(true));
child.addKey("R");
child.addChild(new Node(true));
child.addKey("S");
child.addChild(new Node(true));
child.addKey("T");
child.addChild(new Node(true));
child.addKey("U");
child.addChild(new Node(true));
child.addKey("V");
child.addChild(new Node(true));
NodeSplitResult result = child.split(4);
assertEquals(3, result.getNewNode().getNumberOfKeys());
assertEquals(3, child.getNumberOfKeys());
assertEquals("S", result.getSplitKey());
assertArrayEquals(Arrays.asList("P", "Q", "R").toArray(), child.getKeys().toArray());
assertArrayEquals(Arrays.asList("T", "U", "V").toArray(), result.getNewNode().getKeys().toArray());
}
}