From cade3e481a9e5cf3688e2e29e2b44b22b0c9c87d Mon Sep 17 00:00:00 2001 From: Abe White Date: Thu, 19 Dec 2024 23:46:25 -0600 Subject: [PATCH 1/2] Test bridging Java types to AnyDynamicObject --- Sources/SkipBridge/AnyDynamicObject.swift | 5 +++++ .../SkipBridgeToKotlinSamples/Samples.swift | 4 ++++ .../SkipBridgeToSwiftSamples/Samples.swift | 3 +++ .../TestsSupport.swift | 21 +++++++++++++++++++ .../BridgeToSwiftSamplesTests.swift | 4 ++++ 5 files changed, 37 insertions(+) diff --git a/Sources/SkipBridge/AnyDynamicObject.swift b/Sources/SkipBridge/AnyDynamicObject.swift index 27abde3..83021b4 100644 --- a/Sources/SkipBridge/AnyDynamicObject.swift +++ b/Sources/SkipBridge/AnyDynamicObject.swift @@ -40,6 +40,11 @@ open class AnyDynamicObject: JObjectProtocol, JConvertible { } } + /// Cast this instance to a generated `AnyDynamicObject` subclass type. + public func `as`(_ type: T.Type) throws -> T { + return try T(for: object.ptr) + } + public subscript(dynamicMember member: String) -> Bool { get { jniContext { diff --git a/Sources/SkipBridgeToKotlinSamples/Samples.swift b/Sources/SkipBridgeToKotlinSamples/Samples.swift index 99fd525..cebeb6f 100644 --- a/Sources/SkipBridgeToKotlinSamples/Samples.swift +++ b/Sources/SkipBridgeToKotlinSamples/Samples.swift @@ -150,6 +150,10 @@ public final class SwiftHelperClass: SwiftProtocol, Comparable, Identifiable { public init() { } + public init(string: String?) throws { + self.stringVar = string! + } + public func stringValue() -> String { return stringVar } diff --git a/Sources/SkipBridgeToSwiftSamples/Samples.swift b/Sources/SkipBridgeToSwiftSamples/Samples.swift index b3649a3..b869abd 100644 --- a/Sources/SkipBridgeToSwiftSamples/Samples.swift +++ b/Sources/SkipBridgeToSwiftSamples/Samples.swift @@ -60,6 +60,9 @@ public var kotlinInnerClassVar = KotlinHelperClass.Inner() public var kotlinSwiftClassVar = SwiftHelperClass() public var kotlinAnyVar: Any = "a" public var kotlinAnyHashableVar: AnyHashable = 1 +#if os(Android) || ROBOLECTRIC +public var kotlinJavaTypeVar: java.util.Date = java.util.Date() +#endif // MARK: Global optional vars diff --git a/Sources/SkipBridgeToSwiftSamplesTestsSupport/TestsSupport.swift b/Sources/SkipBridgeToSwiftSamplesTestsSupport/TestsSupport.swift index d1b3d3a..a5349f7 100644 --- a/Sources/SkipBridgeToSwiftSamplesTestsSupport/TestsSupport.swift +++ b/Sources/SkipBridgeToSwiftSamplesTestsSupport/TestsSupport.swift @@ -5,6 +5,7 @@ // as published by the Free Software Foundation https://fsf.org import Foundation +import SkipBridge import SkipBridgeToSwiftSamples import SkipBridgeToSwiftSamplesHelpers @@ -181,6 +182,26 @@ public func testSupport_kotlinAnyHashableVar_kotlinClass(value: String) -> Strin return (kotlinAnyHashableVar as? KotlinHelperClass)?.stringVar } +public func testSupport_kotlinJavaTypeVar() -> String? { + #if os(Android) || ROBOLECTRIC + guard kotlinJavaTypeVar is AnyDynamicObject else { + return "kotlinJavaTypeVar is AnyDynamicObject" + } + let time: Int64 = kotlinJavaTypeVar.time + guard time > 0 else { + return "time > 0" + } + kotlinJavaTypeVar = try! AnyDynamicObject(className: "java.util.Date", 999) + let time2: Int64 = kotlinJavaTypeVar.time + guard time2 == 999 else { + return "time2 == 999" + } + return nil + #else + return nil + #endif +} + public func testSupport_kotlinOptionalBoolVar(value: Bool?) -> Bool? { kotlinOptionalBoolVar = value return kotlinOptionalBoolVar diff --git a/Tests/SkipBridgeToSwiftSamplesTestsSupportTests/BridgeToSwiftSamplesTests.swift b/Tests/SkipBridgeToSwiftSamplesTestsSupportTests/BridgeToSwiftSamplesTests.swift index 2a6b787..0f12f58 100644 --- a/Tests/SkipBridgeToSwiftSamplesTestsSupportTests/BridgeToSwiftSamplesTests.swift +++ b/Tests/SkipBridgeToSwiftSamplesTestsSupportTests/BridgeToSwiftSamplesTests.swift @@ -84,6 +84,10 @@ final class BridgeToSwiftTests: XCTestCase { XCTAssertEqual(testSupport_kotlinAnyHashableVar_kotlinClass(value: "ss"), "ss") } + func testJavaTypeVar() { + XCTAssertNil(testSupport_kotlinJavaTypeVar()) + } + func testAnyVarContainerValues() { let anyArray = testSupport_kotlinAnyVar(value: ["a", 2, 3.0]) as? [Any] guard let anyArray else { From 9a856fb8694513a90937662234baf5a4ac54d63d Mon Sep 17 00:00:00 2001 From: Abe White Date: Sun, 22 Dec 2024 22:57:03 -0600 Subject: [PATCH 2/2] Test bridging extensions --- Sources/SkipBridgeToKotlinSamples/Samples.swift | 6 ++++++ Sources/SkipBridgeToSwiftSamples/Samples.swift | 6 ++++++ .../TestsSupport.swift | 8 +++++++- .../BridgeToKotlinSamplesTests.swift | 5 +++++ .../BridgeToSwiftSamplesTests.swift | 6 +++++- 5 files changed, 29 insertions(+), 2 deletions(-) diff --git a/Sources/SkipBridgeToKotlinSamples/Samples.swift b/Sources/SkipBridgeToKotlinSamples/Samples.swift index cebeb6f..e8bf9ba 100644 --- a/Sources/SkipBridgeToKotlinSamples/Samples.swift +++ b/Sources/SkipBridgeToKotlinSamples/Samples.swift @@ -132,6 +132,12 @@ public class SwiftClass { } } +extension SwiftClass { + public func swiftExtensionFunc(_ i: Int) -> Int { + return i + } +} + public final class SwiftSubclass: SwiftClass { public var stringVar: String diff --git a/Sources/SkipBridgeToSwiftSamples/Samples.swift b/Sources/SkipBridgeToSwiftSamples/Samples.swift index b869abd..b8d84e2 100644 --- a/Sources/SkipBridgeToSwiftSamples/Samples.swift +++ b/Sources/SkipBridgeToSwiftSamples/Samples.swift @@ -137,6 +137,12 @@ public class KotlinClass { } } +extension KotlinClass { + public func kotlinExtensionFunc(_ i: Int) -> Int { + return i + } +} + public final class KotlinSubclass: KotlinClass { public var stringVar: String diff --git a/Sources/SkipBridgeToSwiftSamplesTestsSupport/TestsSupport.swift b/Sources/SkipBridgeToSwiftSamplesTestsSupport/TestsSupport.swift index a5349f7..6e645dd 100644 --- a/Sources/SkipBridgeToSwiftSamplesTestsSupport/TestsSupport.swift +++ b/Sources/SkipBridgeToSwiftSamplesTestsSupport/TestsSupport.swift @@ -191,7 +191,8 @@ public func testSupport_kotlinJavaTypeVar() -> String? { guard time > 0 else { return "time > 0" } - kotlinJavaTypeVar = try! AnyDynamicObject(className: "java.util.Date", 999) + let date = try! AnyDynamicObject(className: "java.util.Date", 999) + kotlinJavaTypeVar = date let time2: Int64 = kotlinJavaTypeVar.time guard time2 == 999 else { return "time2 == 999" @@ -355,6 +356,11 @@ public func testSupport_kotlinClassComparable(lhs: String, rhs: String) -> Bool return lhsHelper < rhsHelper } +public func testSupport_kotlinExtension(value: Int) -> Int { + let cls = KotlinClass() + return cls.kotlinExtensionFunc(value) +} + public func testSupport_kotlinSubclass() -> String? { let sub = KotlinSubclass(string: "sub") sub.intVar = 100 diff --git a/Tests/SkipBridgeToKotlinSamplesTests/BridgeToKotlinSamplesTests.swift b/Tests/SkipBridgeToKotlinSamplesTests/BridgeToKotlinSamplesTests.swift index 095224d..adda12a 100644 --- a/Tests/SkipBridgeToKotlinSamplesTests/BridgeToKotlinSamplesTests.swift +++ b/Tests/SkipBridgeToKotlinSamplesTests/BridgeToKotlinSamplesTests.swift @@ -280,6 +280,11 @@ final class BridgeToKotlinTests: XCTestCase { XCTAssertFalse(lhs < rhs) } + public func testSwiftExtension() { + let cls = SwiftClass() + XCTAssertEqual(100, cls.swiftExtensionFunc(100)) + } + public func testSwiftSubclass() { let sub = SwiftSubclass(string: "sub") sub.intVar = 100 diff --git a/Tests/SkipBridgeToSwiftSamplesTestsSupportTests/BridgeToSwiftSamplesTests.swift b/Tests/SkipBridgeToSwiftSamplesTestsSupportTests/BridgeToSwiftSamplesTests.swift index 0f12f58..7a5d4eb 100644 --- a/Tests/SkipBridgeToSwiftSamplesTestsSupportTests/BridgeToSwiftSamplesTests.swift +++ b/Tests/SkipBridgeToSwiftSamplesTestsSupportTests/BridgeToSwiftSamplesTests.swift @@ -196,7 +196,11 @@ final class BridgeToSwiftTests: XCTestCase { XCTAssertFalse(testSupport_kotlinClassComparable(lhs: "bbb", rhs: "aaa")) } - public func testKotlinSubclass() { + func testKotlinExtension() { + XCTAssertEqual(100, testSupport_kotlinExtension(value: 100)) + } + + func testKotlinSubclass() { XCTAssertNil(testSupport_kotlinSubclass()) }