Uast: render-tests-checks moved to RenderLogTestBase (IDEA-CR-28371)

To make them available for Groovy then
This commit is contained in:
Nicolay Mitropolsky
2018-01-12 21:47:56 +03:00
parent cebbe3a311
commit 70c2be7819
2 changed files with 93 additions and 98 deletions
@@ -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<PsiElement, String>()
file.accept(object : UastVisitor {
private val parentStack = Stack<UElement>()
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
}
})
}
}
@@ -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<PsiElement, String>()
file.accept(object : UastVisitor {
private val parentStack = Stack<UElement>()
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
}
})
}
}