From 2bb69994ae3a06799d6c022bcda45f202cdbc6be Mon Sep 17 00:00:00 2001 From: Sergey Bogolepov Date: Thu, 7 Jul 2022 17:24:59 +0300 Subject: [PATCH] [K/N] Add regression test for objc2kotlin and kotlin2objc names --- .../backend.native/tests/build.gradle | 10 ++++ .../stacktraceBridges/stacktraceBridges.kt | 57 +++++++++++++++++++ .../stacktraceBridges/stacktraceBridges.swift | 54 ++++++++++++++++++ 3 files changed, 121 insertions(+) create mode 100644 kotlin-native/backend.native/tests/framework/stacktraceBridges/stacktraceBridges.kt create mode 100644 kotlin-native/backend.native/tests/framework/stacktraceBridges/stacktraceBridges.swift diff --git a/kotlin-native/backend.native/tests/build.gradle b/kotlin-native/backend.native/tests/build.gradle index 8585ce01059..23bf97cf92c 100644 --- a/kotlin-native/backend.native/tests/build.gradle +++ b/kotlin-native/backend.native/tests/build.gradle @@ -5726,6 +5726,16 @@ if (isAppleTarget(project)) { swiftSources = ['framework/stacktrace/'] } + frameworkTest("testStackTraceBridgesFramework") { + enabled = !project.globalTestArgs.contains('-opt') + framework('StacktraceBridges') { + sources = ['framework/stacktraceBridges'] + opts = ['-g'] + } + swiftSources = ['framework/stacktraceBridges/'] + } + + frameworkTest("testStackTraceByLibbacktraceFramework") { enabled = !project.globalTestArgs.contains('-opt') framework('StacktraceByLibbacktrace') { diff --git a/kotlin-native/backend.native/tests/framework/stacktraceBridges/stacktraceBridges.kt b/kotlin-native/backend.native/tests/framework/stacktraceBridges/stacktraceBridges.kt new file mode 100644 index 00000000000..941055690b7 --- /dev/null +++ b/kotlin-native/backend.native/tests/framework/stacktraceBridges/stacktraceBridges.kt @@ -0,0 +1,57 @@ +/* + * Copyright 2010-2021 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. + */ + +fun thrower() : Nothing { + throw Exception() +} + +fun getStackTrace() : List { + try { + thrower() + } catch (e: Exception) { + return e.getStackTrace().toList() + } + return emptyList() +} + +open class Foo { + open fun foo(): List { return emptyList() } + + companion object { + var trace: List = emptyList() + + init { + trace = getStackTrace() + } + } +} + +private class Bar : Foo() { + override fun foo(): List = getStackTrace() +} + +object Object { + var trace: List = emptyList() + + init { + trace = getStackTrace() + } +} + +enum class E { + A { + init { + trace = getStackTrace() + } + }; + + var trace: List = emptyList() +} + +fun createBar(): Foo = Bar() + +fun use(foo: Foo): List { + return foo.foo() +} \ No newline at end of file diff --git a/kotlin-native/backend.native/tests/framework/stacktraceBridges/stacktraceBridges.swift b/kotlin-native/backend.native/tests/framework/stacktraceBridges/stacktraceBridges.swift new file mode 100644 index 00000000000..85ff9f7efc7 --- /dev/null +++ b/kotlin-native/backend.native/tests/framework/stacktraceBridges/stacktraceBridges.swift @@ -0,0 +1,54 @@ +import Foundation +import StacktraceBridges + +class Bar : Foo { + override func foo() -> Array { + return StacktraceBridgesKt.getStackTrace() + } +} + +func testDirectObjc2Kotlin() throws { + let trace = StacktraceBridgesKt.getStackTrace() + try assertTrue(trace[4].contains("objc2kotlin_kfun:#getStackTrace(){}kotlin.collections.List")) +} + +func testVirtualObjc2Kotlin() throws { + let trace = StacktraceBridgesKt.createBar().foo() + try assertTrue(trace[5].contains("objc2kotlin_virtual_kfun:Foo#foo(){}kotlin.collections.List")) +} + +func testKotlin2Objc() throws { + let trace = StacktraceBridgesKt.use(foo: Bar()) + try assertTrue(trace[8].contains("kotlin2objc_kfun:Foo#foo(){}kotlin.collections.List")) +} + +func testCompanionObject() throws { + let trace = Foo.companion.trace + try assertTrue(trace[6].contains("objc2kotlin_kclass:Foo#companion")) +} + +func testStandaloneObject() throws { + let trace = Object.shared.trace + try assertTrue(trace[6].contains("objc2kotlin_kclass:Object#shared")) +} + +func testEnumEntry() throws { + let trace = E.a.trace + try assertTrue(trace[8].contains("objc2kotlin_kclass:E.A")) +} + +class StacktraceBridgesTests : TestProvider { + var tests: [TestCase] = [] + + init() { + providers.append(self) + tests = [ + TestCase(name: "Direct objc2kotlin", method: withAutorelease(testDirectObjc2Kotlin)), + TestCase(name: "Virtual objc2kotlin", method: withAutorelease(testVirtualObjc2Kotlin)), + TestCase(name: "kotlin2objc", method: withAutorelease(testKotlin2Objc)), + TestCase(name: "Companion object", method: withAutorelease(testCompanionObject)), + TestCase(name: "Standalone object", method: withAutorelease(testStandaloneObject)), + TestCase(name: "Enum entry", method: withAutorelease(testEnumEntry)), + ] + } +} \ No newline at end of file