diff --git a/mpp-idea/mpp-idea-lang/javascript/src/main/resources/cc.unitmesh.javascript.xml b/mpp-idea/mpp-idea-lang/javascript/src/main/resources/cc.unitmesh.javascript.xml index 795fed1b6a..c1d8c04bc3 100644 --- a/mpp-idea/mpp-idea-lang/javascript/src/main/resources/cc.unitmesh.javascript.xml +++ b/mpp-idea/mpp-idea-lang/javascript/src/main/resources/cc.unitmesh.javascript.xml @@ -1,6 +1,10 @@ + + + + diff --git a/mpp-idea/mpp-idea-lang/javascript/src/test/kotlin/cc/unitmesh/ide/javascript/JavaScriptPluginDescriptorTest.kt b/mpp-idea/mpp-idea-lang/javascript/src/test/kotlin/cc/unitmesh/ide/javascript/JavaScriptPluginDescriptorTest.kt new file mode 100644 index 0000000000..4fc6f5c68d --- /dev/null +++ b/mpp-idea/mpp-idea-lang/javascript/src/test/kotlin/cc/unitmesh/ide/javascript/JavaScriptPluginDescriptorTest.kt @@ -0,0 +1,40 @@ +package cc.unitmesh.ide.javascript + +import org.junit.Test +import javax.xml.XMLConstants +import javax.xml.parsers.DocumentBuilderFactory +import kotlin.test.assertTrue + +class JavaScriptPluginDescriptorTest { + @Test + fun testDescriptorDeclaresRequiredJavaScriptV2Modules() { + val dependencies = parseDependencies("/cc.unitmesh.javascript.xml") + + assertTrue("intellij.javascript.backend" in dependencies, "Missing required module: intellij.javascript.backend") + assertTrue("intellij.javascript.common" in dependencies, "Missing required module: intellij.javascript.common") + assertTrue("intellij.javascript.psi.impl" in dependencies, "Missing required module: intellij.javascript.psi.impl") + assertTrue("intellij.javascript.testing" in dependencies, "Missing required module: intellij.javascript.testing") + } + + private fun parseDependencies(resourcePath: String): Set { + val stream = checkNotNull(javaClass.getResourceAsStream(resourcePath)) { + "Missing resource: $resourcePath" + } + + stream.use { input -> + val document = documentBuilderFactory().newDocumentBuilder().parse(input) + return document.getElementsByTagName("module") + .let { nodes -> (0 until nodes.length).map { index -> nodes.item(index) } } + .mapNotNull { it.attributes?.getNamedItem("name")?.nodeValue } + .toSet() + } + } + + private fun documentBuilderFactory(): DocumentBuilderFactory { + return DocumentBuilderFactory.newInstance().apply { + setFeature(XMLConstants.FEATURE_SECURE_PROCESSING, true) + setFeature("http://apache.org/xml/features/disallow-doctype-decl", true) + setExpandEntityReferences(false) + } + } +}