[tests] split by FILE directive to avoid artificial errors

during parsing psi
This commit is contained in:
Anna Kozlova
2022-11-18 22:59:52 +01:00
parent 17c20bff92
commit f937a85fb8
@@ -68,19 +68,25 @@ class TreesCompareTest : AbstractRawFirBuilderTestCase() {
val (text, linesMapping) = with(file.inputStream().reader(Charsets.UTF_8)) { val (text, linesMapping) = with(file.inputStream().reader(Charsets.UTF_8)) {
this.readSourceFileWithMapping() this.readSourceFileWithMapping()
} }
splitText(file.path, text.toString().trim()).forEach { pair ->
val (filePath, fileText) = pair
//psi //psi
val ktFile = createPsiFile(FileUtil.getNameWithoutExtension(PathUtil.getFileName(file.path)), text.toString().trim()) as KtFile val ktFile = createPsiFile(FileUtil.getNameWithoutExtension(PathUtil.getFileName(filePath)), fileText) as KtFile
val firFileFromPsi = ktFile.toFirFile() val firFileFromPsi = ktFile.toFirFile()
val treeFromPsi = FirRenderer().renderElementAsString(firFileFromPsi) val treeFromPsi = FirRenderer().renderElementAsString(firFileFromPsi)
.replace("<ERROR TYPE REF:.*?>".toRegex(), "<ERROR TYPE REF>") .replace("<ERROR TYPE REF:.*?>".toRegex(), "<ERROR TYPE REF>")
//light tree //light tree
val firFileFromLightTree = lightTreeConverter.buildFirFile(text, KtIoFileSourceFile(file), linesMapping) val firFileFromLightTree = lightTreeConverter.buildFirFile(text, KtIoFileSourceFile(file), linesMapping)
val treeFromLightTree = FirRenderer().renderElementAsString(firFileFromLightTree) val treeFromLightTree = FirRenderer().renderElementAsString(firFileFromLightTree)
.replace("<ERROR TYPE REF:.*?>".toRegex(), "<ERROR TYPE REF>") .replace("<ERROR TYPE REF:.*?>".toRegex(), "<ERROR TYPE REF>")
return@compareBase treeFromLightTree == treeFromPsi if (treeFromLightTree != treeFromPsi) {
return@compareBase false
}
}
return@compareBase true
} }
} }
@@ -101,29 +107,56 @@ class TreesCompareTest : AbstractRawFirBuilderTestCase() {
val notEditedText = FileUtil.loadFile(file, CharsetToolkit.UTF8, true).trim() val notEditedText = FileUtil.loadFile(file, CharsetToolkit.UTF8, true).trim()
val text = notEditedText.replace(DIAGNOSTIC_IN_TESTDATA_PATTERN, "").replaceAfter(".java", "") val text = notEditedText.replace(DIAGNOSTIC_IN_TESTDATA_PATTERN, "").replaceAfter(".java", "")
//psi splitText(file.path, text).forEach { pair ->
val ktFile = createPsiFile(FileUtil.getNameWithoutExtension(PathUtil.getFileName(file.path)), text) as KtFile val (filePath, fileText) = pair
val firFileFromPsi = ktFile.toFirFile() //psi
val treeFromPsi = FirRenderer().renderElementAsString(firFileFromPsi) val fileName = PathUtil.getFileName(filePath)
.replace("<Unsupported LValue.*?>".toRegex(), "<Unsupported LValue>") val ktFile = createPsiFile(FileUtil.getNameWithoutExtension(fileName), fileText) as KtFile
.replace("<ERROR TYPE REF:.*?>".toRegex(), "<ERROR TYPE REF>") val firFileFromPsi = ktFile.toFirFile()
val treeFromPsi = FirRenderer().renderElementAsString(firFileFromPsi)
.replace("<Unsupported LValue.*?>".toRegex(), "<Unsupported LValue>")
.replace("<ERROR TYPE REF:.*?>".toRegex(), "<ERROR TYPE REF>")
//light tree //light tree
val firFileFromLightTree = val firFileFromLightTree =
lightTreeConverter.buildFirFile( lightTreeConverter.buildFirFile(
text, fileText,
KtInMemoryTextSourceFile(file.name, file.path, text), KtInMemoryTextSourceFile(fileName, filePath, fileText),
text.toSourceLinesMapping() fileText.toSourceLinesMapping()
) )
val treeFromLightTree = FirRenderer().renderElementAsString(firFileFromLightTree) val treeFromLightTree = FirRenderer().renderElementAsString(firFileFromLightTree)
.replace("<Unsupported LValue.*?>".toRegex(), "<Unsupported LValue>") .replace("<Unsupported LValue.*?>".toRegex(), "<Unsupported LValue>")
.replace("<ERROR TYPE REF:.*?>".toRegex(), "<ERROR TYPE REF>") .replace("<ERROR TYPE REF:.*?>".toRegex(), "<ERROR TYPE REF>")
return@compareBase treeFromLightTree == treeFromPsi if (treeFromLightTree != treeFromPsi) {
return@compareBase false
}
}
return@compareBase true
} }
} }
fun testCompareAll() { fun testCompareAll() {
compareAll() compareAll()
} }
private fun splitText(filePath: String, text: String): List<Pair<String, String>> {
val fileDirective = "// FILE:"
val idx = text.indexOf(fileDirective)
if (idx > 0 && text[idx - 1] != '\n') {
//try to avoid splitting of sources
return emptyList()
}
if (idx >= 0) {
val result = mutableListOf<Pair<String, String>>()
val strings = text.drop(idx).drop(fileDirective.length).split(fileDirective)
for (string in strings) {
val newLineIdx = string.indexOf("\n")
if (newLineIdx < 0) return emptyList()
result.add(Pair(string.substring(0, newLineIdx).trim(), string.substring(newLineIdx)))
}
return result
}
return listOf(Pair(filePath, text))
}
} }