package kotlinx.html.tests
import kotlinx.html.*
import kotlinx.html.consumers.*
import kotlinx.html.dom.*
import kotlinx.html.js.*
import org.w3c.dom.*
import kotlin.browser.*
import kotlin.dom.*
import kotlin.test.*
import org.junit.Test as test
class DomTreeImplTest {
@test fun simpleTree() {
val node = document.body!!.append.div {
p {
+"test"
}
}
assertEquals("DIV", node.tagName)
assertEquals(1, node.childNodes.length)
assertEquals("P", node.children[0]?.tagName)
assertTrue(document.body!!.children.length > 0)
assertEquals(node, document.body!!.children.asList().last())
}
@test fun appendSingleNode() {
val myDiv: HTMLDivElement = document.body!!.append.div {
p {
+"test"
}
}
assertEquals("DIV", myDiv.tagName)
assertEquals(document.body, myDiv.parentNode)
assertEquals("
", myDiv.outerHTML.replace("\\s+".toRegex(), ""))
}
@test fun appendNodeWithEventHandler() {
var clicked = false
document.body!!.append.div {
onClickFunction = {
clicked = true
}
}
document.create.div("a b c ") {
a("http://kotlinlang.org") { +"official Kotlin site" }
}
document.getElementsByTagName("div").asList().forEach {
if (it is HTMLElement) {
val clickHandler = it.onclick
if (clickHandler != null) {
clickHandler(uninitialized())
}
}
}
assertTrue(clicked)
}
@test fun testAtMainPage() {
val containerCreated = document.body!!.append.div {
id = "container"
}
val myDiv = document.create.div("panel") {
p {
+"Here is "
a("http://kotlinlang.org") { +"official Kotlin site" }
}
}
val container = document.getElementById("container")
if (container == null) {
fail("container not found")
}
container.appendChild(myDiv)
assertEquals("", container.innerHTML)
}
@test fun appendMultipleNodes() {
val wrapper = wrapper()
val nodes = wrapper.append {
div {
+"div1"
}
div {
+"div2"
}
}
assertEquals(2, nodes.size)
nodes.forEach {
assertTrue(it in wrapper.children.asList())
}
assertEquals("div1
div2
", wrapper.innerHTML)
}
@test fun appendEntity() {
val wrapper = wrapper()
wrapper.append.span {
+Entities.nbsp
}
assertEquals(" ", wrapper.innerHTML)
}
@test fun pastTagAttributeChangedShouldBeProhibited() {
try {
document.body!!.append.trace().div {
p {
span {
this@div.id = "d1"
}
}
}
fail("We shouldn't be able to modify attribute for outer tag")
} catch (expected: Throwable) {
assertTrue(true)
}
}
@test fun buildBiggerPage() {
val wrapper = wrapper()
wrapper.append {
h1 {
+"kotlin"
}
p {
+"Here we are"
}
div {
classes = setOf("root")
div {
classes = setOf("menu")
ul {
li { +"item1" }
li { +"item2" }
li { +"item3" }
}
}
div {
classes = setOf("content")
}
}
}
assertEquals("""
kotlin
Here we are
""".trimLines(), wrapper.innerHTML)
}
@test fun testAppendAndRemoveClass() {
val wrapper = wrapper()
wrapper.append {
span("class1") {
classes += "class2"
classes -= "class1"
}
}
assertEquals("", wrapper.innerHTML)
}
@test fun testSvg() {
val wrapper = wrapper()
wrapper.append.svg {
}
@Suppress("UNCHECKED_CAST")
assertEquals("http://www.w3.org/2000/svg", (wrapper.childNodes.asList() as List).first { it.tagName.toLowerCase() == "svg" }.namespaceURI)
}
private fun wrapper() = document.body!!.append.div {}
private fun uninitialized(): T = null as T
private fun String.trimLines() = trimIndent().lines().filter { it.isNotBlank() }.joinToString("")
}