package me.eater.test.threedom.dom import io.kotest.core.spec.style.StringSpec import io.kotest.matchers.sequences.shouldHaveCount import io.kotest.matchers.sequences.shouldHaveSingleElement import io.kotest.matchers.shouldBe import me.eater.threedom.dom.Document import me.eater.threedom.dom.PlainNode import me.eater.threedom.dom.createNode import me.eater.threedom.dom.event.DOMTreeUpdate import me.eater.threedom.dom.event.NodeIDUpdate class DocumentTest : StringSpec({ "test insert event" { val document = Document() var triggered = 0; document.on { triggered++ } document.on { triggered++ } val newNode = document.createNode() document.addNode(newNode) triggered shouldBe 2 } "test move event" { val document = Document() val newNode = document.createNode() document.addNode(newNode) val secondNode = document.createNode() document.addNode(secondNode) var triggered = 0 document.on { (data) -> data.newParent shouldBe secondNode data.oldParent shouldBe document.root data.child shouldBe newNode triggered++ } secondNode.addNode(newNode) triggered shouldBe 1 } "test remove event" { val document = Document() var triggered = 0 document.on { triggered++ } document.on { triggered++ } val newNode = document.createNode() document.addNode(newNode) document.removeNode(newNode) triggered shouldBe 3 } "test byId" { val doc = Document() val newNode = doc.createNode() val secondNewNode = doc.createNode() val thirdNewNode = doc.createNode() var triggered = 0 doc.on { triggered++ } newNode.id = ":3" doc.addNode(secondNewNode) doc.addNode(thirdNewNode) doc.getNodeById(":3") shouldBe null thirdNewNode.addNode(newNode) doc.getNodeById(":3") shouldBe newNode secondNewNode.getNodeById(":3") shouldBe null thirdNewNode.getNodeById(":3") shouldBe newNode thirdNewNode.removeAll() thirdNewNode.getNodeById(":3") shouldBe null doc.getNodeById(":3") shouldBe null doc.addNode(newNode) doc.getNodeById(":3") shouldBe newNode newNode.id = ":/" doc.getNodeById(":3") shouldBe null doc.getNodeById(":/") shouldBe newNode } "test byClass" { val doc = Document() val newNode = doc.createNode() val secondNewNode = doc.createNode() val thirdNewNode = doc.createNode() var triggered = 0 doc.on { triggered++ } newNode.classList.add(":3") doc.addNode(secondNewNode) doc.addNode(thirdNewNode) doc.getNodesByClassName(":3") shouldHaveCount 0 thirdNewNode.addNode(newNode) doc.getNodesByClassName(":3") shouldHaveSingleElement newNode secondNewNode.getNodesByClassName(":3") shouldHaveCount 0 thirdNewNode.getNodesByClassName(":3") shouldHaveSingleElement newNode thirdNewNode.removeAll() thirdNewNode.getNodesByClassName(":3") shouldHaveCount 0 doc.getNodesByClassName(":3") shouldHaveCount 0 newNode.classList.clear() newNode.classList.add(":/") doc.addNode(newNode) doc.getNodesByClassName(":3") shouldHaveCount 0 doc.getNodesByClassName(":/") shouldHaveSingleElement newNode newNode.classList.clear() newNode.classList.add(":3") doc.getNodesByClassName(":/") shouldHaveCount 0 doc.getNodesByClassName(":3") shouldHaveSingleElement newNode } })