From 70c2be78196cc043344e99ecbbb7742dbc46a88c Mon Sep 17 00:00:00 2001 From: Nicolay Mitropolsky Date: Fri, 12 Jan 2018 15:27:36 +0300 Subject: [PATCH] Uast: render-tests-checks moved to `RenderLogTestBase` (IDEA-CR-28371) To make them available for Groovy then --- .../uast/test/common/RenderLogTestBase.kt | 95 +++++++++++++++++- .../test/java/AbstractJavaRenderLogTest.kt | 96 ------------------- 2 files changed, 93 insertions(+), 98 deletions(-) diff --git a/uast/uast-tests/src/org/jetbrains/uast/test/common/RenderLogTestBase.kt b/uast/uast-tests/src/org/jetbrains/uast/test/common/RenderLogTestBase.kt index 19a92cd5f166..dc3b12f88c6e 100644 --- a/uast/uast-tests/src/org/jetbrains/uast/test/common/RenderLogTestBase.kt +++ b/uast/uast-tests/src/org/jetbrains/uast/test/common/RenderLogTestBase.kt @@ -15,10 +15,18 @@ */ package org.jetbrains.uast.test.common -import org.jetbrains.uast.UFile -import org.jetbrains.uast.asRecursiveLogString +import com.intellij.psi.PsiElement +import com.intellij.psi.PsiJavaFile +import com.intellij.psi.PsiRecursiveElementVisitor +import com.intellij.testFramework.UsefulTestCase +import junit.framework.TestCase +import org.jetbrains.uast.* +import org.jetbrains.uast.java.JavaUastLanguagePlugin import org.jetbrains.uast.test.env.assertEqualsToFile +import org.jetbrains.uast.visitor.UastVisitor +import org.junit.Assert import java.io.File +import java.util.* interface RenderLogTestBase { fun getTestFile(testName: String, ext: String): File @@ -27,10 +35,93 @@ interface RenderLogTestBase { private fun getLogFile(testName: String) = getTestFile(testName, "log.txt") fun check(testName: String, file: UFile) { + check(testName, file, true) + } + + fun check(testName: String, file: UFile, checkParentConsistency: Boolean) { val renderFile = getRenderFile(testName) val logFile = getLogFile(testName) assertEqualsToFile("Render string", renderFile, file.asRenderString()) assertEqualsToFile("Log string", logFile, file.asRecursiveLogString()) + + if (checkParentConsistency) { + checkParentConsistency(file) + } + + file.checkContainingFileForAllElements() } + + private fun checkParentConsistency(file: UFile) { + val parentMap = mutableMapOf() + + file.accept(object : UastVisitor { + private val parentStack = Stack() + + override fun visitElement(node: UElement): Boolean { + + val parent = node.uastParent + if (parent == null) { + Assert.assertTrue("Wrong null-parent of ${node.javaClass} '${node.psi?.text?.lineSequence()?.firstOrNull()}'", + parentStack.empty()) + } + else { + Assert.assertEquals("Wrong parent of ${node.javaClass} '${node.psi?.text?.lineSequence()?.firstOrNull()}'", parentStack.peek(), + parent) + } + node.psi?.let { + if (it !in parentMap) { + parentMap[it] = parentStack.reversed().joinToString { it.asLogString() } + } + } + parentStack.push(node) + return false + } + + override fun afterVisitElement(node: UElement) { + super.afterVisitElement(node) + parentStack.pop() + } + }) + + + file.psi.accept(object : PsiRecursiveElementVisitor() { + override fun visitElement(element: PsiElement) { + val uElement = JavaUastLanguagePlugin().convertElementWithParent(element, null) + val expectedParents = parentMap[element] + if (expectedParents != null) { + TestCase.assertNotNull("Expected to be able to convert PSI element $element", uElement) + val parents = generateSequence(uElement!!.uastParent) { it.uastParent }.joinToString { it.asLogString() } + TestCase.assertEquals( + "Inconsistent parents for $uElement (converted from $element) parent: -> ${uElement.uastParent}", + expectedParents, + parents) + } + super.visitElement(element) + } + }) + } + + private fun UFile.checkContainingFileForAllElements() { + accept(object : UastVisitor { + override fun visitElement(node: UElement): Boolean { + if (node is PsiElement) { + UsefulTestCase.assertInstanceOf(node.containingFile, PsiJavaFile::class.java) + + val uElement = node.psi.toUElement()!! + TestCase.assertEquals("getContainingUFile should be equal to source for ${uElement.javaClass}", + this@checkContainingFileForAllElements, + uElement.getContainingUFile()) + } + + val anchorPsi = (node as? UDeclaration)?.uastAnchor?.psi + if (anchorPsi != null) { + UsefulTestCase.assertInstanceOf(anchorPsi.containingFile, PsiJavaFile::class.java) + } + + return false + } + }) + } + } \ No newline at end of file diff --git a/uast/uast-tests/test/org/jetbrains/uast/test/java/AbstractJavaRenderLogTest.kt b/uast/uast-tests/test/org/jetbrains/uast/test/java/AbstractJavaRenderLogTest.kt index 0e64c7a2d4de..cb927d684a5f 100644 --- a/uast/uast-tests/test/org/jetbrains/uast/test/java/AbstractJavaRenderLogTest.kt +++ b/uast/uast-tests/test/org/jetbrains/uast/test/java/AbstractJavaRenderLogTest.kt @@ -15,107 +15,11 @@ */ package org.jetbrains.uast.test.java -import com.intellij.psi.PsiElement -import com.intellij.psi.PsiJavaFile -import com.intellij.psi.PsiRecursiveElementVisitor -import com.intellij.testFramework.UsefulTestCase -import junit.framework.TestCase -import org.jetbrains.uast.* -import org.jetbrains.uast.java.JavaUastLanguagePlugin import org.jetbrains.uast.test.common.RenderLogTestBase -import org.jetbrains.uast.visitor.UastVisitor -import org.junit.Assert import java.io.File -import java.util.* abstract class AbstractJavaRenderLogTest : AbstractJavaUastTest(), RenderLogTestBase { override fun getTestFile(testName: String, ext: String) = File(File(TEST_JAVA_MODEL_DIR, testName).canonicalPath.substringBeforeLast('.') + '.' + ext) - override fun check(testName: String, file: UFile) { - check(testName, file, true) - } - - fun check(testName: String, file: UFile, checkParentConsistency: Boolean) { - super.check(testName, file) - - if (checkParentConsistency) { - checkParentConsistency(file) - } - - file.checkContainingFileForAllElements() - } - - private fun checkParentConsistency(file: UFile) { - val parentMap = mutableMapOf() - - file.accept(object : UastVisitor { - private val parentStack = Stack() - - override fun visitElement(node: UElement): Boolean { - - val parent = node.uastParent - if (parent == null) { - Assert.assertTrue("Wrong null-parent of ${node.javaClass} '${node.psi?.text?.lineSequence()?.firstOrNull()}'", - parentStack.empty()) - } - else { - Assert.assertEquals("Wrong parent of ${node.javaClass} '${node.psi?.text?.lineSequence()?.firstOrNull()}'", parentStack.peek(), - parent) - } - node.psi?.let { - if (it !in parentMap) { - parentMap[it] = parentStack.reversed().joinToString { it.asLogString() } - } - } - parentStack.push(node) - return false - } - - override fun afterVisitElement(node: UElement) { - super.afterVisitElement(node) - parentStack.pop() - } - }) - - - file.psi.accept(object : PsiRecursiveElementVisitor() { - override fun visitElement(element: PsiElement) { - val uElement = JavaUastLanguagePlugin().convertElementWithParent(element, null) - val expectedParents = parentMap[element] - if (expectedParents != null) { - TestCase.assertNotNull("Expected to be able to convert PSI element $element", uElement) - val parents = generateSequence(uElement!!.uastParent) { it.uastParent }.joinToString { it.asLogString() } - TestCase.assertEquals( - "Inconsistent parents for $uElement (converted from $element) parent: -> ${uElement.uastParent}", - expectedParents, - parents) - } - super.visitElement(element) - } - }) - } - - private fun UFile.checkContainingFileForAllElements() { - accept(object : UastVisitor { - override fun visitElement(node: UElement): Boolean { - if (node is PsiElement) { - UsefulTestCase.assertInstanceOf(node.containingFile, PsiJavaFile::class.java) - - val uElement = node.psi.toUElement()!! - TestCase.assertEquals("getContainingUFile should be equal to source for ${uElement.javaClass}", - this@checkContainingFileForAllElements, - uElement.getContainingUFile()) - } - - val anchorPsi = (node as? UDeclaration)?.uastAnchor?.psi - if (anchorPsi != null) { - UsefulTestCase.assertInstanceOf(anchorPsi.containingFile, PsiJavaFile::class.java) - } - - return false - } - }) - } - } \ No newline at end of file