Fail spec box tests if they have unexpected behaviour and passed
This commit is contained in:
@@ -1,5 +1,5 @@
|
|||||||
/*
|
/*
|
||||||
* Copyright 2010-2018 JetBrains s.r.o. and Kotlin Programming Language contributors.
|
* Copyright 2010-2019 JetBrains s.r.o. and Kotlin Programming Language contributors.
|
||||||
* Use of this source code is governed by the Apache 2.0 license that can be found in the license/LICENSE.txt file.
|
* Use of this source code is governed by the Apache 2.0 license that can be found in the license/LICENSE.txt file.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
@@ -98,10 +98,13 @@ class TestExceptionsComparator(wholeFile: File) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
fun run(expectedException: TestsExceptionType?, runnable: () -> Unit) =
|
||||||
|
run(expectedException, mapOf(), null, runnable)
|
||||||
|
|
||||||
fun run(
|
fun run(
|
||||||
expectedException: TestsExceptionType?,
|
expectedException: TestsExceptionType?,
|
||||||
exceptionByCases: Map<Int, TestsExceptionType?> = mapOf(),
|
exceptionByCases: Map<Int, TestsExceptionType?>,
|
||||||
computeExceptionPoint: ((Matcher?) -> Set<Int>?)? = null,
|
computeExceptionPoint: ((Matcher?) -> Set<Int>?)?,
|
||||||
runnable: () -> Unit
|
runnable: () -> Unit
|
||||||
) {
|
) {
|
||||||
try {
|
try {
|
||||||
|
|||||||
+20
-5
@@ -27,14 +27,17 @@ import static org.jetbrains.kotlin.test.clientserver.TestProcessServerKt.getBoxM
|
|||||||
import static org.jetbrains.kotlin.test.clientserver.TestProcessServerKt.getGeneratedClass;
|
import static org.jetbrains.kotlin.test.clientserver.TestProcessServerKt.getGeneratedClass;
|
||||||
|
|
||||||
public abstract class AbstractBlackBoxCodegenTest extends CodegenTestCase {
|
public abstract class AbstractBlackBoxCodegenTest extends CodegenTestCase {
|
||||||
@Override
|
protected void doMultiFileTest(
|
||||||
protected void doMultiFileTest(@NotNull File wholeFile, @NotNull List<TestFile> files) throws Exception {
|
@NotNull File wholeFile,
|
||||||
|
@NotNull List<TestFile> files,
|
||||||
|
boolean unexpectedBehaviour
|
||||||
|
) throws Exception {
|
||||||
boolean isIgnored = InTextDirectivesUtils.isIgnoredTarget(getBackend(), wholeFile);
|
boolean isIgnored = InTextDirectivesUtils.isIgnoredTarget(getBackend(), wholeFile);
|
||||||
|
|
||||||
compile(files, !isIgnored);
|
compile(files, !isIgnored);
|
||||||
|
|
||||||
try {
|
try {
|
||||||
blackBox(!isIgnored);
|
blackBox(!isIgnored, unexpectedBehaviour);
|
||||||
}
|
}
|
||||||
catch (Throwable t) {
|
catch (Throwable t) {
|
||||||
if (!isIgnored) {
|
if (!isIgnored) {
|
||||||
@@ -52,6 +55,14 @@ public abstract class AbstractBlackBoxCodegenTest extends CodegenTestCase {
|
|||||||
doBytecodeListingTest(wholeFile);
|
doBytecodeListingTest(wholeFile);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
protected void doMultiFileTest(
|
||||||
|
@NotNull File wholeFile,
|
||||||
|
@NotNull List<TestFile> files
|
||||||
|
) throws Exception {
|
||||||
|
doMultiFileTest(wholeFile, files, false);
|
||||||
|
}
|
||||||
|
|
||||||
private void doBytecodeListingTest(@NotNull File wholeFile) throws Exception {
|
private void doBytecodeListingTest(@NotNull File wholeFile) throws Exception {
|
||||||
if (!InTextDirectivesUtils.isDirectiveDefined(FileUtil.loadFile(wholeFile), "CHECK_BYTECODE_LISTING")) return;
|
if (!InTextDirectivesUtils.isDirectiveDefined(FileUtil.loadFile(wholeFile), "CHECK_BYTECODE_LISTING")) return;
|
||||||
|
|
||||||
@@ -90,7 +101,7 @@ public abstract class AbstractBlackBoxCodegenTest extends CodegenTestCase {
|
|||||||
assertEqualsToFile(expectedFile, text, s -> s.replace("COROUTINES_PACKAGE", coroutinesPackage));
|
assertEqualsToFile(expectedFile, text, s -> s.replace("COROUTINES_PACKAGE", coroutinesPackage));
|
||||||
}
|
}
|
||||||
|
|
||||||
protected void blackBox(boolean reportProblems) {
|
protected void blackBox(boolean reportProblems, boolean unexpectedBehaviour) {
|
||||||
// If there are many files, the first 'box(): String' function will be executed.
|
// If there are many files, the first 'box(): String' function will be executed.
|
||||||
GeneratedClassLoader generatedClassLoader = generateAndCreateClassLoader(reportProblems);
|
GeneratedClassLoader generatedClassLoader = generateAndCreateClassLoader(reportProblems);
|
||||||
for (KtFile firstFile : myFiles.getPsiFiles()) {
|
for (KtFile firstFile : myFiles.getPsiFiles()) {
|
||||||
@@ -100,7 +111,7 @@ public abstract class AbstractBlackBoxCodegenTest extends CodegenTestCase {
|
|||||||
try {
|
try {
|
||||||
Method method = getBoxMethodOrNull(aClass);
|
Method method = getBoxMethodOrNull(aClass);
|
||||||
if (method != null) {
|
if (method != null) {
|
||||||
callBoxMethodAndCheckResult(generatedClassLoader, aClass, method);
|
callBoxMethodAndCheckResult(generatedClassLoader, aClass, method, unexpectedBehaviour);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -117,6 +128,10 @@ public abstract class AbstractBlackBoxCodegenTest extends CodegenTestCase {
|
|||||||
fail("Can't find box method!");
|
fail("Can't find box method!");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
protected void blackBox(boolean reportProblems) {
|
||||||
|
blackBox(reportProblems, false);
|
||||||
|
}
|
||||||
|
|
||||||
@Nullable
|
@Nullable
|
||||||
private static String getFacadeFqName(@NotNull KtFile file) {
|
private static String getFacadeFqName(@NotNull KtFile file) {
|
||||||
return CodegenUtil.getMemberDeclarationsToGenerate(file).isEmpty()
|
return CodegenUtil.getMemberDeclarationsToGenerate(file).isEmpty()
|
||||||
|
|||||||
@@ -838,8 +838,17 @@ public abstract class CodegenTestCase extends KtUsefulTestCase {
|
|||||||
callBoxMethodAndCheckResult(classLoader, aClass, method);
|
callBoxMethodAndCheckResult(classLoader, aClass, method);
|
||||||
}
|
}
|
||||||
|
|
||||||
protected void callBoxMethodAndCheckResult(URLClassLoader classLoader, Class<?> aClass, Method method)
|
private void callBoxMethodAndCheckResult(URLClassLoader classLoader, Class<?> aClass, Method method)
|
||||||
throws IOException, IllegalAccessException, InvocationTargetException {
|
throws IOException, IllegalAccessException, InvocationTargetException {
|
||||||
|
callBoxMethodAndCheckResult(classLoader, aClass, method, false);
|
||||||
|
}
|
||||||
|
|
||||||
|
protected void callBoxMethodAndCheckResult(
|
||||||
|
URLClassLoader classLoader,
|
||||||
|
Class<?> aClass,
|
||||||
|
Method method,
|
||||||
|
boolean unexpectedBehaviour
|
||||||
|
) throws IOException, IllegalAccessException, InvocationTargetException {
|
||||||
String result;
|
String result;
|
||||||
if (BOX_IN_SEPARATE_PROCESS_PORT != null) {
|
if (BOX_IN_SEPARATE_PROCESS_PORT != null) {
|
||||||
result = invokeBoxInSeparateProcess(classLoader, aClass);
|
result = invokeBoxInSeparateProcess(classLoader, aClass);
|
||||||
@@ -859,7 +868,11 @@ public abstract class CodegenTestCase extends KtUsefulTestCase {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
assertEquals("OK", result);
|
if (unexpectedBehaviour) {
|
||||||
|
assertNotSame("OK", result);
|
||||||
|
} else {
|
||||||
|
assertEquals("OK", result);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@NotNull
|
@NotNull
|
||||||
|
|||||||
+12
-11
@@ -3,18 +3,19 @@
|
|||||||
* Use of this source code is governed by the Apache 2.0 license that can be found in the license/LICENSE.txt file.
|
* Use of this source code is governed by the Apache 2.0 license that can be found in the license/LICENSE.txt file.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
package org.jetbrains.kotlin.codegen
|
package org.jetbrains.kotlin.spec.codegen
|
||||||
|
|
||||||
import com.intellij.openapi.util.io.FileUtil
|
import com.intellij.openapi.util.io.FileUtil
|
||||||
import org.jetbrains.kotlin.TestExceptionsComparator
|
import org.jetbrains.kotlin.TestExceptionsComparator
|
||||||
import org.jetbrains.kotlin.spec.models.AbstractSpecTest
|
import org.jetbrains.kotlin.codegen.AbstractBlackBoxCodegenTest
|
||||||
import org.jetbrains.kotlin.spec.parsers.CommonParser
|
|
||||||
import org.jetbrains.kotlin.spec.parsers.CommonPatterns.packagePattern
|
|
||||||
import org.jetbrains.kotlin.spec.utils.GeneralConfiguration.TESTDATA_PATH
|
import org.jetbrains.kotlin.spec.utils.GeneralConfiguration.TESTDATA_PATH
|
||||||
import org.jetbrains.kotlin.spec.validators.BlackBoxTestTypeValidator
|
import org.jetbrains.kotlin.spec.utils.models.AbstractSpecTest
|
||||||
import org.jetbrains.kotlin.spec.validators.SpecTestValidationException
|
import org.jetbrains.kotlin.spec.utils.parsers.CommonParser
|
||||||
|
import org.jetbrains.kotlin.spec.utils.parsers.CommonPatterns.packagePattern
|
||||||
|
import org.jetbrains.kotlin.spec.utils.validators.BlackBoxTestTypeValidator
|
||||||
|
import org.jetbrains.kotlin.spec.utils.validators.SpecTestValidationException
|
||||||
import org.junit.Assert
|
import org.junit.Assert
|
||||||
import java.io.File
|
import java.io.*
|
||||||
|
|
||||||
abstract class AbstractBlackBoxCodegenTestSpec : AbstractBlackBoxCodegenTest() {
|
abstract class AbstractBlackBoxCodegenTestSpec : AbstractBlackBoxCodegenTest() {
|
||||||
companion object {
|
companion object {
|
||||||
@@ -61,12 +62,12 @@ abstract class AbstractBlackBoxCodegenTestSpec : AbstractBlackBoxCodegenTest() {
|
|||||||
|
|
||||||
includeHelpers(wholeFile, files, specTest)
|
includeHelpers(wholeFile, files, specTest)
|
||||||
|
|
||||||
|
val runTest = { super.doMultiFileTest(wholeFile, files, specTest.unexpectedBehavior) }
|
||||||
|
|
||||||
if (specTest.exception == null) {
|
if (specTest.exception == null) {
|
||||||
super.doMultiFileTest(wholeFile, files)
|
runTest()
|
||||||
} else {
|
} else {
|
||||||
TestExceptionsComparator(wholeFile).run(specTest.exception) {
|
TestExceptionsComparator(wholeFile).run(specTest.exception, runTest)
|
||||||
super.doMultiFileTest(wholeFile, files)
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user