2021-02-19 04:12:43 +00:00
|
|
|
|
package net.shadowfacts.cacao.util
|
|
|
|
|
|
|
|
|
|
import org.junit.jupiter.api.Assertions.assertEquals
|
|
|
|
|
import org.junit.jupiter.api.Assertions.assertNull
|
|
|
|
|
import org.junit.jupiter.api.Test
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* @author shadowfacts
|
|
|
|
|
*/
|
|
|
|
|
class LCATest {
|
|
|
|
|
|
|
|
|
|
class Node(val name: String, val parent: Node?)
|
|
|
|
|
|
|
|
|
|
@Test
|
|
|
|
|
fun testDirectParent() {
|
|
|
|
|
val parent = Node("parent", null)
|
|
|
|
|
val child = Node("child", parent)
|
|
|
|
|
assertEquals(parent, LowestCommonAncestor.find(parent, child, Node::parent))
|
|
|
|
|
assertEquals(parent, LowestCommonAncestor.find(child, parent, Node::parent))
|
|
|
|
|
}
|
|
|
|
|
|
2021-02-27 18:24:29 +00:00
|
|
|
|
@Test
|
|
|
|
|
fun testNestedParent() {
|
|
|
|
|
val parent = Node("parent", null)
|
|
|
|
|
val middle = Node("middle", parent)
|
|
|
|
|
val child = Node("child", middle)
|
|
|
|
|
assertEquals(parent, LowestCommonAncestor.find(parent, child, Node::parent))
|
|
|
|
|
}
|
|
|
|
|
|
2021-02-19 04:12:43 +00:00
|
|
|
|
@Test
|
|
|
|
|
fun testSiblings() {
|
|
|
|
|
val root = Node("root", null)
|
|
|
|
|
val a = Node("a", root)
|
|
|
|
|
val b = Node("b", root)
|
|
|
|
|
assertEquals(root, LowestCommonAncestor.find(a, b, Node::parent))
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
@Test
|
|
|
|
|
fun testBetweenSubtrees() {
|
|
|
|
|
// ┌────┐
|
|
|
|
|
// │root│
|
|
|
|
|
// └────┘
|
|
|
|
|
// ╱ ╲
|
|
|
|
|
// ╱ ╲
|
|
|
|
|
// ┌─┐ ┌─┐
|
|
|
|
|
// │A│ │B│
|
|
|
|
|
// └─┘ └─┘
|
|
|
|
|
// ╱ ╲ ╱ ╲
|
|
|
|
|
// ╱ ╲ ╱ ╲
|
|
|
|
|
// ┌─┐ ┌─┐┌─┐ ┌─┐
|
|
|
|
|
// │C│ │D││E│ │F│
|
|
|
|
|
// └─┘ └─┘└─┘ └─┘
|
|
|
|
|
val root = Node("root", null)
|
|
|
|
|
|
|
|
|
|
val a = Node("a", root)
|
|
|
|
|
val c = Node("c", a)
|
|
|
|
|
val d = Node("d", a)
|
|
|
|
|
|
|
|
|
|
val b = Node("b", root)
|
|
|
|
|
val e = Node("e", b)
|
|
|
|
|
val f = Node("f", b)
|
|
|
|
|
|
|
|
|
|
assertEquals(a, LowestCommonAncestor.find(c, d, Node::parent))
|
|
|
|
|
assertEquals(root, LowestCommonAncestor.find(c, b, Node::parent))
|
|
|
|
|
assertEquals(root, LowestCommonAncestor.find(d, e, Node::parent))
|
|
|
|
|
assertEquals(root, LowestCommonAncestor.find(c, root, Node::parent))
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
@Test
|
|
|
|
|
fun testBetweenDisjointTrees() {
|
|
|
|
|
val a = Node("a", null)
|
|
|
|
|
val b = Node("b", a)
|
|
|
|
|
|
|
|
|
|
val c = Node("c", null)
|
|
|
|
|
val d = Node("d", c)
|
|
|
|
|
|
|
|
|
|
assertNull(LowestCommonAncestor.find(a, d, Node::parent))
|
|
|
|
|
assertNull(LowestCommonAncestor.find(b, c, Node::parent))
|
|
|
|
|
}
|
|
|
|
|
|
2021-02-27 18:24:29 +00:00
|
|
|
|
}
|