add check for SwiftExport golden-data by running swift compiler #KT-65559 fixed
Merge-request: KT-MR-14210 Merged-by: Artem Olkov <artem.olkov@jetbrains.com>
This commit is contained in:
+134
@@ -0,0 +1,134 @@
|
|||||||
|
/*
|
||||||
|
* Copyright 2010-2024 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.
|
||||||
|
*/
|
||||||
|
|
||||||
|
package org.jetbrains.kotlin.konan.test.blackbox;
|
||||||
|
|
||||||
|
import com.intellij.testFramework.TestDataPath;
|
||||||
|
import org.jetbrains.kotlin.test.util.KtTestUtil;
|
||||||
|
import org.jetbrains.kotlin.test.TestMetadata;
|
||||||
|
import org.junit.jupiter.api.Nested;
|
||||||
|
import org.junit.jupiter.api.Test;
|
||||||
|
|
||||||
|
import java.io.File;
|
||||||
|
import java.util.regex.Pattern;
|
||||||
|
|
||||||
|
/** This class is generated by {@link org.jetbrains.kotlin.generators.tests.GenerateNativeTestsKt}. DO NOT MODIFY MANUALLY */
|
||||||
|
@SuppressWarnings("all")
|
||||||
|
@TestMetadata("native/swift/swift-export-standalone/testData")
|
||||||
|
@TestDataPath("$PROJECT_ROOT")
|
||||||
|
public class TypeCheckSwiftExportGoldenData extends SwiftTypeCheckBaseTest {
|
||||||
|
@Test
|
||||||
|
public void testAllFilesPresentInTestData() throws Exception {
|
||||||
|
KtTestUtil.assertAllTestsPresentByMetadataWithExcluded(this.getClass(), new File("native/swift/swift-export-standalone/testData"), Pattern.compile("^(.+)\\.swift$"), null, true);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Nested
|
||||||
|
@TestMetadata("native/swift/swift-export-standalone/testData/no_package")
|
||||||
|
@TestDataPath("$PROJECT_ROOT")
|
||||||
|
public class No_package {
|
||||||
|
@Test
|
||||||
|
public void testAllFilesPresentInNo_package() throws Exception {
|
||||||
|
KtTestUtil.assertAllTestsPresentByMetadataWithExcluded(this.getClass(), new File("native/swift/swift-export-standalone/testData/no_package"), Pattern.compile("^(.+)\\.swift$"), null, true);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Nested
|
||||||
|
@TestMetadata("native/swift/swift-export-standalone/testData/no_package/golden_result")
|
||||||
|
@TestDataPath("$PROJECT_ROOT")
|
||||||
|
public class Golden_result {
|
||||||
|
@Test
|
||||||
|
public void testAllFilesPresentInGolden_result() throws Exception {
|
||||||
|
KtTestUtil.assertAllTestsPresentByMetadataWithExcluded(this.getClass(), new File("native/swift/swift-export-standalone/testData/no_package/golden_result"), Pattern.compile("^(.+)\\.swift$"), null, true);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
@TestMetadata("result.swift")
|
||||||
|
public void testResult() throws Exception {
|
||||||
|
runTest("native/swift/swift-export-standalone/testData/no_package/golden_result/result.swift");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@Nested
|
||||||
|
@TestMetadata("native/swift/swift-export-standalone/testData/no_package/input_root")
|
||||||
|
@TestDataPath("$PROJECT_ROOT")
|
||||||
|
public class Input_root {
|
||||||
|
@Test
|
||||||
|
public void testAllFilesPresentInInput_root() throws Exception {
|
||||||
|
KtTestUtil.assertAllTestsPresentByMetadataWithExcluded(this.getClass(), new File("native/swift/swift-export-standalone/testData/no_package/input_root"), Pattern.compile("^(.+)\\.swift$"), null, true);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@Nested
|
||||||
|
@TestMetadata("native/swift/swift-export-standalone/testData/simple")
|
||||||
|
@TestDataPath("$PROJECT_ROOT")
|
||||||
|
public class Simple {
|
||||||
|
@Test
|
||||||
|
public void testAllFilesPresentInSimple() throws Exception {
|
||||||
|
KtTestUtil.assertAllTestsPresentByMetadataWithExcluded(this.getClass(), new File("native/swift/swift-export-standalone/testData/simple"), Pattern.compile("^(.+)\\.swift$"), null, true);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Nested
|
||||||
|
@TestMetadata("native/swift/swift-export-standalone/testData/simple/golden_result")
|
||||||
|
@TestDataPath("$PROJECT_ROOT")
|
||||||
|
public class Golden_result {
|
||||||
|
@Test
|
||||||
|
public void testAllFilesPresentInGolden_result() throws Exception {
|
||||||
|
KtTestUtil.assertAllTestsPresentByMetadataWithExcluded(this.getClass(), new File("native/swift/swift-export-standalone/testData/simple/golden_result"), Pattern.compile("^(.+)\\.swift$"), null, true);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
@TestMetadata("result.swift")
|
||||||
|
public void testResult() throws Exception {
|
||||||
|
runTest("native/swift/swift-export-standalone/testData/simple/golden_result/result.swift");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@Nested
|
||||||
|
@TestMetadata("native/swift/swift-export-standalone/testData/simple/input_root")
|
||||||
|
@TestDataPath("$PROJECT_ROOT")
|
||||||
|
public class Input_root {
|
||||||
|
@Test
|
||||||
|
public void testAllFilesPresentInInput_root() throws Exception {
|
||||||
|
KtTestUtil.assertAllTestsPresentByMetadataWithExcluded(this.getClass(), new File("native/swift/swift-export-standalone/testData/simple/input_root"), Pattern.compile("^(.+)\\.swift$"), null, true);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@Nested
|
||||||
|
@TestMetadata("native/swift/swift-export-standalone/testData/variables")
|
||||||
|
@TestDataPath("$PROJECT_ROOT")
|
||||||
|
public class Variables {
|
||||||
|
@Test
|
||||||
|
public void testAllFilesPresentInVariables() throws Exception {
|
||||||
|
KtTestUtil.assertAllTestsPresentByMetadataWithExcluded(this.getClass(), new File("native/swift/swift-export-standalone/testData/variables"), Pattern.compile("^(.+)\\.swift$"), null, true);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Nested
|
||||||
|
@TestMetadata("native/swift/swift-export-standalone/testData/variables/golden_result")
|
||||||
|
@TestDataPath("$PROJECT_ROOT")
|
||||||
|
public class Golden_result {
|
||||||
|
@Test
|
||||||
|
public void testAllFilesPresentInGolden_result() throws Exception {
|
||||||
|
KtTestUtil.assertAllTestsPresentByMetadataWithExcluded(this.getClass(), new File("native/swift/swift-export-standalone/testData/variables/golden_result"), Pattern.compile("^(.+)\\.swift$"), null, true);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
@TestMetadata("result.swift")
|
||||||
|
public void testResult() throws Exception {
|
||||||
|
runTest("native/swift/swift-export-standalone/testData/variables/golden_result/result.swift");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@Nested
|
||||||
|
@TestMetadata("native/swift/swift-export-standalone/testData/variables/input_root")
|
||||||
|
@TestDataPath("$PROJECT_ROOT")
|
||||||
|
public class Input_root {
|
||||||
|
@Test
|
||||||
|
public void testAllFilesPresentInInput_root() throws Exception {
|
||||||
|
KtTestUtil.assertAllTestsPresentByMetadataWithExcluded(this.getClass(), new File("native/swift/swift-export-standalone/testData/variables/input_root"), Pattern.compile("^(.+)\\.swift$"), null, true);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
+11
@@ -488,6 +488,17 @@ fun main() {
|
|||||||
model("CExport", pattern = "^([^_](.+))$", recursive = false)
|
model("CExport", pattern = "^([^_](.+))$", recursive = false)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
// Swift Export
|
||||||
|
testGroup(
|
||||||
|
"native/native.tests/tests-gen/",
|
||||||
|
"native/swift/swift-export-standalone/testData"
|
||||||
|
) {
|
||||||
|
testClass<SwiftTypeCheckBaseTest>(
|
||||||
|
suiteTestClassName = "TypeCheckSwiftExportGoldenData"
|
||||||
|
) {
|
||||||
|
model("", extension = "swift", recursive = true)
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
+67
@@ -0,0 +1,67 @@
|
|||||||
|
/*
|
||||||
|
* Copyright 2010-2024 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.
|
||||||
|
*/
|
||||||
|
|
||||||
|
package org.jetbrains.kotlin.konan.test.blackbox
|
||||||
|
|
||||||
|
import org.jetbrains.kotlin.cli.common.ExitCode
|
||||||
|
import org.jetbrains.kotlin.konan.target.AppleConfigurables
|
||||||
|
import org.jetbrains.kotlin.konan.target.withOSVersion
|
||||||
|
import org.jetbrains.kotlin.konan.test.blackbox.support.compilation.invokeSwiftC
|
||||||
|
import org.jetbrains.kotlin.konan.test.blackbox.support.settings.configurables
|
||||||
|
import org.jetbrains.kotlin.utils.fileUtils.withReplacedExtensionOrNull
|
||||||
|
import org.junit.jupiter.api.Assertions.assertEquals
|
||||||
|
import org.junit.jupiter.api.Assumptions
|
||||||
|
import java.io.File
|
||||||
|
|
||||||
|
|
||||||
|
abstract class SwiftTypeCheckBaseTest : AbstractNativeSimpleTest() {
|
||||||
|
/**
|
||||||
|
This test is the simplest possible solutions for task KT-65559
|
||||||
|
|
||||||
|
One reading this test could find themselves confused, with following questions:
|
||||||
|
1/ what does it do
|
||||||
|
2/ why it is placed in native-test infra
|
||||||
|
3/ what actually we do test
|
||||||
|
|
||||||
|
This comment wil try to answer all those questions.
|
||||||
|
|
||||||
|
What we are trying to achieve:
|
||||||
|
There is a SwiftExport artefact, and we have some integration tests for it.
|
||||||
|
But our integration tests check only one thing - that our current implementation generates expected source files.
|
||||||
|
But we do not compile that resulted files, as that actions requires macOS agents with swift installed,
|
||||||
|
and we want to keep our day2day tests as quick as possible.
|
||||||
|
|
||||||
|
So, we have construct this test - it will take golden data that we are expecting to receive from SwiftExport,
|
||||||
|
and verify with swift compiler that we expect valid code. This way we have separated tests that verify code generation
|
||||||
|
from tests that verify code validity. That separation may not be desired, but that separation allows us to keep tests for
|
||||||
|
code generation fast and TeamCity agent agnostic.
|
||||||
|
|
||||||
|
We do plan to refactor this, and extract infra for running swiftc and xcode into separate module, that will be shared
|
||||||
|
between SwiftExport, ObjectiveCExport, Kotlin/Native and KGP tests. But currently - the following solution is the simplest one.
|
||||||
|
*/
|
||||||
|
fun runTest(
|
||||||
|
swiftFilePath: String,
|
||||||
|
) {
|
||||||
|
Assumptions.assumeTrue(targets.hostTarget.family.isAppleFamily && targets.testTarget.family.isAppleFamily)
|
||||||
|
|
||||||
|
val swiftFile = File(swiftFilePath)
|
||||||
|
val cHeader = swiftFile.withReplacedExtensionOrNull("swift", "h")
|
||||||
|
?: throw IllegalArgumentException("SwiftTypeCheckBaseTest input should have .h counterpart")
|
||||||
|
|
||||||
|
val configs = testRunSettings.configurables as AppleConfigurables
|
||||||
|
val swiftTarget = configs.targetTriple.withOSVersion(configs.osVersionMin).toString()
|
||||||
|
|
||||||
|
val args = listOf(
|
||||||
|
"-typecheck", swiftFile.absolutePath,
|
||||||
|
"-import-objc-header", cHeader.absolutePath,
|
||||||
|
"-sdk", configs.absoluteTargetSysRoot, "-target", swiftTarget
|
||||||
|
)
|
||||||
|
|
||||||
|
val (exitCode, swiftcOutput, _, _) =
|
||||||
|
invokeSwiftC(testRunSettings, args)
|
||||||
|
|
||||||
|
assertEquals(ExitCode.OK, exitCode, "swift type checked resulted in: $swiftcOutput")
|
||||||
|
}
|
||||||
|
}
|
||||||
Reference in New Issue
Block a user