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("

test

", 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("

Here is official Kotlin site

", 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("") }