Improve test data format for SMAP codegen tests

Instead of comments in a Kotlin source file, add a .smap with the contents of
the source mapping data (and possible comments)
This commit is contained in:
Alexander Udalov
2016-02-24 14:48:36 +03:00
committed by Alexander Udalov
parent cc84aabdcf
commit f7958edf21
19 changed files with 426 additions and 390 deletions
+43 -40
View File
@@ -8,22 +8,11 @@ inline fun call(crossinline init: () -> Unit) {
}()
}
//SMAP
//lambda.2.kt
//Kotlin
//*S Kotlin
//*F
//+ 1 lambda.2.kt
//builders/Lambda_2Kt$call$1
//*L
//1#1,18:1
//*E
// FILE: 2.kt
import builders.*
//NO_CHECK_LAMBDA_INLINING
fun test(): String {
var res = "Fail"
@@ -38,32 +27,46 @@ fun test(): String {
fun box(): String {
return test()
}
//NO_CHECK_LAMBDA_INLINING
//SMAP
//lambda.1.kt
//Kotlin
//*S Kotlin
//*F
//+ 1 lambda.1.kt
//Lambda_1Kt
//+ 2 lambda.2.kt
//builders/Lambda_2Kt
//*L
//1#1,46:1
//4#2:47
//*E
//
//SMAP
//lambda.2.kt
//Kotlin
//*S Kotlin
//*F
//+ 1 lambda.2.kt
//builders/Lambda_2Kt$call$1
//+ 2 lambda.1.kt
//Lambda_1Kt
//*L
//1#1,18:1
//8#2,2:19
//*E
// FILE: 1.smap
SMAP
1.kt
Kotlin
*S Kotlin
*F
+ 1 1.kt
builders/_1Kt$call$1
*L
1#1,11:1
*E
// FILE: 2.smap
SMAP
2.kt
Kotlin
*S Kotlin
*F
+ 1 2.kt
_2Kt
+ 2 1.kt
builders/_1Kt
*L
1#1,21:1
6#2:22
*E
SMAP
1.kt
Kotlin
*S Kotlin
*F
+ 1 1.kt
builders/_1Kt$call$1
+ 2 2.kt
_2Kt
*L
1#1,11:1
10#2,2:12
*E
@@ -6,7 +6,6 @@ inline fun call(crossinline init: () -> Unit) {
return init()
}
//NO_CHECK_LAMBDA_INLINING
//SMAP ABSENT
// FILE: 2.kt
@@ -30,17 +29,20 @@ fun box(): String {
return test()
}
// FILE: 1.smap
//SMAP
//lambdaOnCallSite.1.kt
//Kotlin
//*S Kotlin
//*F
//+ 1 lambdaOnCallSite.1.kt
//LambdaOnCallSite_1Kt
//+ 2 lambdaOnCallSite.2.kt
//builders/LambdaOnCallSite_2Kt
//*L
//1#1,34:1
//4#2:35
//*E
// FILE: 2.smap
SMAP
2.kt
Kotlin
*S Kotlin
*F
+ 1 2.kt
_2Kt
+ 2 1.kt
builders/_1Kt
*L
1#1,23:1
6#2:24
*E
@@ -6,8 +6,6 @@ inline fun call(crossinline init: () -> Unit) {
return init()
}
//SMAP ABSENT
// FILE: 2.kt
import builders.*
@@ -30,39 +28,44 @@ fun box(): String {
return test()
}
//NO_CHECK_LAMBDA_INLINING
// FILE: 1.smap
// FILE: 2.smap
//TODO SHOULD BE LESS
//SMAP
//lambdaOnInlineCallSite.1.kt
//Kotlin
//*S Kotlin
//*F
//+ 1 lambdaOnInlineCallSite.1.kt
//LambdaOnInlineCallSite_1Kt
//+ 2 lambdaOnInlineCallSite.2.kt
//builders/LambdaOnInlineCallSite_2Kt
//*L
//1#1,56:1
//4#2:57
//*E
//
//SMAP
//lambdaOnInlineCallSite.1.kt
//Kotlin
//*S Kotlin
//*F
//+ 1 lambdaOnInlineCallSite.1.kt
//LambdaOnInlineCallSite_1Kt$test$1$1
//*L
//1#1,56:1
//*E
//
//SMAP
//lambdaOnInlineCallSite.1.kt
//Kotlin
//*S Kotlin
//*F
//+ 1 lambdaOnInlineCallSite.1.kt
//LambdaOnInlineCallSite_1Kt$test$1$1
//*L
//1#1,56:1
//*E
SMAP
2.kt
Kotlin
*S Kotlin
*F
+ 1 2.kt
_2Kt
+ 2 1.kt
builders/_1Kt
*L
1#1,24:1
6#2:25
*E
SMAP
2.kt
Kotlin
*S Kotlin
*F
+ 1 2.kt
_2Kt$test$1$1
*L
1#1,24:1
*E
SMAP
2.kt
Kotlin
*S Kotlin
*F
+ 1 2.kt
_2Kt$test$1$1
*L
1#1,24:1
*E
+43 -39
View File
@@ -10,18 +10,6 @@ inline fun call(crossinline init: () -> Unit) {
}.run()
}
//SMAP
//object.2.kt
//Kotlin
//*S Kotlin
//*F
//+ 1 object.2.kt
//builders/Object_2Kt$call$1
//*L
//1#1,21:1
//*E
// FILE: 2.kt
import builders.*
@@ -42,30 +30,46 @@ fun box(): String {
return test()
}
//NO_CHECK_LAMBDA_INLINING
//SMAP
//object.1.kt
//Kotlin
//*S Kotlin
//*F
//+ 1 object.1.kt
//Object_1Kt
//+ 2 object.2.kt
//builders/Object_2Kt
//*L
//1#1,45:1
//4#2,5:46
//*E
//
//SMAP
//object.2.kt
//Kotlin
//*S Kotlin
//*F
//+ 1 object.2.kt
//builders/Object_2Kt$call$1
//+ 2 object.1.kt
//Object_1Kt
//*L
//1#1,21:1
//8#2,2:22
//*E
// FILE: 1.smap
SMAP
1.kt
Kotlin
*S Kotlin
*F
+ 1 1.kt
builders/_1Kt$call$1
*L
1#1,13:1
*E
// FILE: 2.smap
SMAP
2.kt
Kotlin
*S Kotlin
*F
+ 1 2.kt
_2Kt
+ 2 1.kt
builders/_1Kt
*L
1#1,22:1
6#2,5:23
*E
SMAP
1.kt
Kotlin
*S Kotlin
*F
+ 1 1.kt
builders/_1Kt$call$1
+ 2 2.kt
_2Kt
*L
1#1,13:1
10#2,2:14
*E
@@ -6,8 +6,6 @@ inline fun call(crossinline init: () -> Unit) {
return init()
}
//SMAP ABSENT
// FILE: 2.kt
import builders.*
@@ -33,16 +31,21 @@ fun box(): String {
}
//NO_CHECK_LAMBDA_INLINING
// FILE: 1.smap
// FILE: 2.smap
//SMAP
//objectOnCallSite.1.kt
//Kotlin
//*S Kotlin
//*F
//+ 1 objectOnCallSite.1.kt
//ObjectOnCallSite_1Kt
//+ 2 objectOnCallSite.2.kt
//builders/ObjectOnCallSite_2Kt
//*L
//1#1,36:1
//4#2:37
//*E
SMAP
2.kt
Kotlin
*S Kotlin
*F
+ 1 2.kt
_2Kt
+ 2 1.kt
builders/_1Kt
*L
1#1,26:1
6#2:27
*E
@@ -6,8 +6,6 @@ inline fun call(crossinline init: () -> Unit) {
return init()
}
//SMAP ABSENT
// FILE: 2.kt
import builders.*
@@ -32,39 +30,44 @@ fun box(): String {
return test()
}
//NO_CHECK_LAMBDA_INLINING
// FILE: 1.smap
// FILE: 2.smap
//TODO SHOULD BE LESS
//SMAP
//objectOnInlineCallSite.1.kt
//Kotlin
//*S Kotlin
//*F
//+ 1 objectOnInlineCallSite.1.kt
//ObjectOnInlineCallSite_1Kt
//+ 2 objectOnInlineCallSite.2.kt
//builders/ObjectOnInlineCallSite_2Kt
//*L
//1#1,58:1
//4#2:59
//*E
//
//SMAP
//objectOnInlineCallSite.1.kt
//Kotlin
//*S Kotlin
//*F
//+ 1 objectOnInlineCallSite.1.kt
//ObjectOnInlineCallSite_1Kt$test$1$1
//*L
//1#1,58:1
//*E
//
//SMAP
//objectOnInlineCallSite.1.kt
//Kotlin
//*S Kotlin
//*F
//+ 1 objectOnInlineCallSite.1.kt
//ObjectOnInlineCallSite_1Kt$test$1$1
//*L
//1#1,58:1
//*E
SMAP
2.kt
Kotlin
*S Kotlin
*F
+ 1 2.kt
_2Kt
+ 2 1.kt
builders/_1Kt
*L
1#1,26:1
6#2:27
*E
SMAP
2.kt
Kotlin
*S Kotlin
*F
+ 1 2.kt
_2Kt$test$1$1
*L
1#1,26:1
*E
SMAP
2.kt
Kotlin
*S Kotlin
*F
+ 1 2.kt
_2Kt$test$1$1
*L
1#1,26:1
*E
@@ -19,29 +19,6 @@ inline fun test(): String {
return res
}
//TODO SHOULD BE LESS
//SXMAP
//objectOnInlineCallSite2.2.kt
//Kotlin
//*S Kotlin
//*F
//+ 1 objectOnInlineCallSite2.2.kt
//builders/BuildersPackage
//*L
//1#1,42:1
//*E
//
//SXMAP
//objectOnInlineCallSite2.2.kt
//Kotlin
//*S Kotlin
//*F
//+ 1 objectOnInlineCallSite2.2.kt
//builders/BuildersPackage$objectOnInlineCallSite2_2$HASH$test$1$1
//*L
//1#1,42:1
//*E
// FILE: 2.kt
@@ -53,27 +30,55 @@ fun box(): String {
}
//NO_CHECK_LAMBDA_INLINING
//SXMAP
//objectOnInlineCallSite2.1.kt
//Kotlin
//*S Kotlin
//*F
//+ 1 objectOnInlineCallSite2.1.kt
//_DefaultPackage
//+ 2 objectOnInlineCallSite2.2.kt
//builders/BuildersPackage
//*L
//1#1,32:1
//8#2,11:33
//*E
//
//SXMAP
//objectOnInlineCallSite2.2.kt
//Kotlin
//*S Kotlin
//*F
//+ 1 objectOnInlineCallSite2.2.kt
//builders/BuildersPackage$objectOnInlineCallSite2_2$HASH$test$1$1
//*L
//1#1,42:1
//*E
// FILE: 1.sxmap
//TODO SHOULD BE LESS
SXMAP
objectOnInlineCallSite2.2.kt
Kotlin
*S Kotlin
*F
+ 1 objectOnInlineCallSite2.2.kt
builders/BuildersPackage
*L
1#1,42:1
*E
SXMAP
objectOnInlineCallSite2.2.kt
Kotlin
*S Kotlin
*F
+ 1 objectOnInlineCallSite2.2.kt
builders/BuildersPackage$objectOnInlineCallSite2_2$HASH$test$1$1
*L
1#1,42:1
*E
// FILE: 2.sxmap
SXMAP
objectOnInlineCallSite2.1.kt
Kotlin
*S Kotlin
*F
+ 1 objectOnInlineCallSite2.1.kt
_DefaultPackage
+ 2 objectOnInlineCallSite2.2.kt
builders/BuildersPackage
*L
1#1,32:1
8#2,11:33
*E
SXMAP
objectOnInlineCallSite2.2.kt
Kotlin
*S Kotlin
*F
+ 1 objectOnInlineCallSite2.2.kt
builders/BuildersPackage$objectOnInlineCallSite2_2$HASH$test$1$1
*L
1#1,42:1
*E
+18 -16
View File
@@ -22,8 +22,6 @@ public inline fun massert(value: Boolean, message: Any = "Assertion failed") {
}
}
//SMAP ABSENT
// FILE: 2.kt
import test.*
@@ -37,17 +35,21 @@ fun box(): String {
return "OK"
}
//SMAP
//assertion.1.kt
//Kotlin
//*S Kotlin
//*F
//+ 1 assertion.1.kt
//Assertion_1Kt
//+ 2 assertion.2.kt
//test/Assertion_2Kt
//*L
//1#1,25:1
//15#2,7:26
//6#2,7:33
//*E
// FILE: 1.smap
// FILE: 2.smap
SMAP
2.kt
Kotlin
*S Kotlin
*F
+ 1 2.kt
_2Kt
+ 2 1.kt
test/_1Kt
*L
1#1,14:1
17#2,7:15
8#2,7:22
*E
@@ -12,16 +12,18 @@ fun box(): String {
return "OK"
}
//SMAP
//classFromDefaultPackage.1.kt
//Kotlin
//*S Kotlin
//*F
//+ 1 classFromDefaultPackage.1.kt
//ClassFromDefaultPackage_1Kt
//+ 2 classFromDefaultPackage.2.kt
//A
//*L
//1#1,20:1
//2#2:21
//*E
// FILE: 2.smap
SMAP
2.kt
Kotlin
*S Kotlin
*F
+ 1 2.kt
_2Kt
+ 2 1.kt
A
*L
1#1,9:1
4#2:10
*E
+12 -10
View File
@@ -11,13 +11,15 @@ fun box(): String {
return "KO".reversed()
}
//SMAP
//noSmap.1.kt
//Kotlin
//*S Kotlin
//*F
//+ 1 noSmap.1.kt
//NoSmap_1Kt
//*L
//1#1,14:1
//*E
// FILE: 2.smap
SMAP
2.kt
Kotlin
*S Kotlin
*F
+ 1 2.kt
_2Kt
*L
1#1,7:1
*E
@@ -15,16 +15,18 @@ fun box(): String {
return "OK"
}
//SMAP
//reified.1.kt
//Kotlin
//*S Kotlin
//*F
//+ 1 reified.1.kt
//Reified_1Kt
//+ 2 reified.2.kt
//test/Reified_2Kt
//*L
//1#1,22:1
//3#2:23
//*E
// FILE: 2.smap
SMAP
2.kt
Kotlin
*S Kotlin
*F
+ 1 2.kt
_2Kt
+ 2 1.kt
test/_1Kt
*L
1#1,12:1
5#2:13
*E
+15 -12
View File
@@ -4,8 +4,6 @@ package zzz
inline fun nothing() {}
//SMAP ABSENT
// FILE: 2.kt
fun box(): String {
@@ -19,14 +17,19 @@ inline fun test(p: () -> String): String {
pd = "O"
return pd + p()
}
// FILE: 1.smap
// FILE: 2.smap
//TODO should be empty
//SMAP
//oneFile.1.kt
//Kotlin
//*S Kotlin
//*F
//+ 1 oneFile.1.kt
//OneFile_1Kt
//*L
//1#1,22:1
//*E
SMAP
2.kt
Kotlin
*S Kotlin
*F
+ 1 2.kt
_2Kt
*L
1#1,15:1
*E
@@ -8,8 +8,6 @@ operator inline fun A.component1() = a
operator inline fun A.component2() = b
//SMAP ABSENT
// FILE: 2.kt
import zzz.*
@@ -20,16 +18,20 @@ fun box(): String {
return if (p == 1 && l == 11) "OK" else "fail: $p"
}
//SMAP
//inlineComponent.1.kt
//Kotlin
//*S Kotlin
//*F
//+ 1 inlineComponent.1.kt
//InlineComponent_1Kt
//+ 2 inlineComponent.2.kt
//zzz/InlineComponent_2Kt
//*L
//1#1,21:1
//5#2,3:22
//*E
// FILE: 1.smap
// FILE: 2.smap
SMAP
2.kt
Kotlin
*S Kotlin
*F
+ 1 2.kt
_2Kt
+ 2 1.kt
zzz/_1Kt
*L
1#1,11:1
7#2,3:12
*E
@@ -6,8 +6,6 @@ public class A(val p: Int)
operator inline fun A.iterator() = (1..p).iterator()
//SMAP ABSENT
// FILE: 2.kt
import zzz.*
@@ -21,16 +19,20 @@ fun box(): String {
return if (p == 15) "OK" else "fail: $p"
}
//SMAP
//inlineIterator.1.kt
//Kotlin
//*S Kotlin
//*F
//+ 1 inlineIterator.1.kt
//InlineIterator_1Kt
//+ 2 inlineIterator.2.kt
//zzz/InlineIterator_2Kt
//*L
//1#1,24:1
//5#2:25
//*E
// FILE: 1.smap
// FILE: 2.smap
SMAP
2.kt
Kotlin
*S Kotlin
*F
+ 1 2.kt
_2Kt
+ 2 1.kt
zzz/_1Kt
*L
1#1,14:1
7#2:15
*E
+32 -27
View File
@@ -17,17 +17,6 @@ inline fun head(init: () -> Unit) {val p = initTag2(init); return p}
inline fun html(init: () -> Unit) {
return init(init)
}
//TODO SHOULD BE EMPTY
//SMAP
//smap.2.kt
//Kotlin
//*S Kotlin
//*F
//+ 1 smap.2.kt
//builders/Smap_2Kt
//*L
//1#1,28:1
//*E
// FILE: 2.kt
@@ -53,19 +42,35 @@ fun box(): String {
return expected
}
//SMAP
//smap.1.kt
//Kotlin
//*S Kotlin
//*F
//+ 1 smap.1.kt
//Smap_1Kt
//+ 2 smap.2.kt
//builders/Smap_2Kt
//*L
//1#1,38:1
//16#2:39
//4#2,9:40
//8#2,3:49
//5#2:52
//*E
// FILE: 1.smap
//TODO SHOULD BE EMPTY
SMAP
1.kt
Kotlin
*S Kotlin
*F
+ 1 1.kt
builders/_1Kt
*L
1#1,21:1
*E
// FILE: 2.smap
SMAP
2.kt
Kotlin
*S Kotlin
*F
+ 1 2.kt
_2Kt
+ 2 1.kt
builders/_1Kt
*L
1#1,25:1
18#2:26
6#2,9:27
10#2,3:36
7#2:39
*E
@@ -101,7 +101,9 @@ public abstract class AbstractBlackBoxCodegenTest extends CodegenTestCase {
List<KtFile> ktFiles = new ArrayList<KtFile>(files.size());
for (TestFile file : files) {
ktFiles.add(KotlinTestUtils.createFile(file.name, file.content, myEnvironment.getProject()));
if (file.name.endsWith(".kt")) {
ktFiles.add(KotlinTestUtils.createFile(file.name, file.content, myEnvironment.getProject()));
}
}
myFiles = CodegenTestFiles.create(ktFiles);
@@ -34,7 +34,7 @@ abstract class AbstractBlackBoxInlineCodegenTest : AbstractBlackBoxCodegenTest()
try {
InlineTestUtil.checkNoCallsToInline(initializedClassLoader.allGeneratedFiles.filterClassFiles(), myFiles.psiFiles)
checkSMAP(myFiles.psiFiles, generateClassesInFile().getClassFiles())
checkSMAP(files, generateClassesInFile().getClassFiles())
}
catch (e: Throwable) {
System.out.println(generateToText())
@@ -27,13 +27,13 @@ abstract class AbstractCompileKotlinAgainstInlineKotlinTest : AbstractCompileKot
override fun doMultiFileTest(
file: File, modules: Map<String, KotlinMultiFileTestWithJava<Void, TestFile>.ModuleAndDependencies>, files: List<TestFile>
) {
assert(files.size == 2) { "There should be exactly two files in this test" }
val kotlinFiles = files.filter { it.name.endsWith(".kt") }
assert(kotlinFiles.size == 2) { "There should be exactly two files in this test" }
var factory1: ClassFileFactory? = null
var factory2: ClassFileFactory? = null
try {
val fileA = files[0]
val fileB = files[1]
val (fileA, fileB) = kotlinFiles
factory1 = compileA(fileA.name, fileA.content)
factory2 = compileB(fileB.name, fileB.content)
invokeBox(PackagePartClassUtils.getFilePartShortName(File(fileB.name).name))
@@ -42,7 +42,7 @@ abstract class AbstractCompileKotlinAgainstInlineKotlinTest : AbstractCompileKot
val sourceFiles = factory1.inputFiles + factory2.inputFiles
InlineTestUtil.checkNoCallsToInline(allGeneratedFiles.filterClassFiles(), sourceFiles)
checkSMAP(sourceFiles, allGeneratedFiles.filterClassFiles())
checkSMAP(files, allGeneratedFiles.filterClassFiles())
}
catch (e: Throwable) {
var result = ""
@@ -17,18 +17,18 @@
package org.jetbrains.kotlin.jvm.compiler
import com.intellij.openapi.util.io.FileUtil
import com.intellij.openapi.util.text.StringUtil
import org.jetbrains.kotlin.backend.common.output.OutputFile
import org.jetbrains.kotlin.codegen.CodegenTestCase
import org.jetbrains.kotlin.codegen.inline.InlineCodegenUtil
import org.jetbrains.kotlin.psi.KtFile
import org.jetbrains.kotlin.test.InTextDirectivesUtils
import org.jetbrains.org.objectweb.asm.ClassReader
import org.jetbrains.org.objectweb.asm.ClassVisitor
import org.jetbrains.org.objectweb.asm.Opcodes
import org.junit.Assert
import java.io.File
import java.io.StringReader
interface AbstractSMAPBaseTest {
private fun extractSMAPFromClasses(outputFiles: Iterable<OutputFile>): List<SMAPAndFile> {
return outputFiles.mapNotNull { outputFile ->
var debugInfo: String? = null
@@ -42,52 +42,43 @@ interface AbstractSMAPBaseTest {
}
}
private fun extractSmapFromSource(file: KtFile): SMAPAndFile? {
val fileContent = file.text
val smapPrefix = "//SMAP"
if (InTextDirectivesUtils.isDirectiveDefined(fileContent, smapPrefix)) {
InTextDirectivesUtils.findLinesWithPrefixesRemoved(fileContent, smapPrefix)
var smapData = fileContent.substring(fileContent.indexOf(smapPrefix))
smapData = smapData.replace("//", "").trim()
private fun extractSmapFromTestDataFile(file: CodegenTestCase.TestFile): SMAPAndFile? {
if (!file.name.endsWith(".smap")) return null
return SMAPAndFile(if (smapData.startsWith("SMAP ABSENT")) null else smapData,
SMAPAndFile.getPath(file.virtualFile.canonicalPath!!))
}
return null;
val content = buildString {
StringReader(file.content).forEachLine { line ->
// Strip comments
if (!line.startsWith("//")) {
appendln(line.trim())
}
}
}.trim()
return SMAPAndFile(if (content.isNotEmpty()) content else null, SMAPAndFile.getPath(file.name))
}
fun checkSMAP(inputFiles: List<KtFile>, outputFiles: Iterable<OutputFile>) {
if (!InlineCodegenUtil.GENERATE_SMAP) {
return
}
fun checkSMAP(inputFiles: List<CodegenTestCase.TestFile>, outputFiles: Iterable<OutputFile>) {
if (!InlineCodegenUtil.GENERATE_SMAP) return
val sourceData = inputFiles.mapNotNull { extractSmapFromSource(it) }
val sourceData = inputFiles.mapNotNull { extractSmapFromTestDataFile(it) }
val compiledData = extractSMAPFromClasses(outputFiles).groupBy {
it.sourceFile
}.map {
val smap = it.value.mapNotNull { it.smap?.replaceHash() }.joinToString("\n")
val smap = it.value.mapNotNull { it.smap }.joinToString("\n")
SMAPAndFile(if (smap.isNotEmpty()) smap else null, it.key)
}.associateBy { it.sourceFile }
for (source in sourceData) {
val data = compiledData[source.sourceFile]
Assert.assertEquals("Smap data differs for ${source.sourceFile}", source.smap, data?.smap?.trim())
val ktFileName = "/" + source.sourceFile.replace(".smap", ".kt")
val data = compiledData[ktFileName]
Assert.assertEquals("Smap data differs for $ktFileName", normalize(source.smap), normalize(data?.smap))
}
}
private fun normalize(text: String?) =
text?.let { StringUtil.convertLineSeparators(it.trim()) }
private fun String.replaceHash(): String {
val fileSectionStart = indexOf("*F") + 3
val lineSection = indexOf("*L") - 1
val files = substring(fileSectionStart, lineSection).split("\n")
val cleaned = files.joinToString("\n")
return substring(0, fileSectionStart) + cleaned + substring(lineSection)
}
class SMAPAndFile(val smap: String?, val sourceFile: String) {
private class SMAPAndFile(val smap: String?, val sourceFile: String) {
companion object {
fun SMAPAndFile(smap: String?, sourceFile: File) = SMAPAndFile(smap, getPath(sourceFile))
@@ -101,4 +92,4 @@ interface AbstractSMAPBaseTest {
}
}
}
}
}