Files
swift-mirror/test/Interop/Cxx/foreign-reference/member-inheritance.swift

162 lines
5.3 KiB
Swift

// RUN: %target-run-simple-swift(-I %S/Inputs -cxx-interoperability-mode=swift-5.9)
// RUN: %target-run-simple-swift(-I %S/Inputs -cxx-interoperability-mode=swift-6)
// RUN: %target-run-simple-swift(-I %S/Inputs -cxx-interoperability-mode=upcoming-swift)
// RUN: %target-run-simple-swift(-g -I %S/Inputs -cxx-interoperability-mode=default)
//
// REQUIRES: executable_test
import StdlibUnittest
import MemberInheritance
var FunctionsTestSuite = TestSuite("Calling functions in foreign reference classes")
FunctionsTestSuite.test("base member FRT calls do not require copying") {
let derived = makeCopyTrackedDerivedClass(42)!
var copyCounter = getCopyCounter().pointee
expectEqual(derived.getX(), 42)
expectEqual(copyCounter, getCopyCounter().pointee)
expectEqual(derived.getDerivedX(), 42)
expectEqual(copyCounter, getCopyCounter().pointee)
let derivedDerived = makeCopyTrackedDerivedDerivedClass(-5)!
copyCounter = getCopyCounter().pointee
expectEqual(derivedDerived.getX(), -5)
expectEqual(derivedDerived.getY(), 11)
expectEqual(copyCounter, getCopyCounter().pointee)
}
FunctionsTestSuite.test("base member FRT field access") {
let copyCounter = getCopyCounter().pointee
let derived = makeCopyTrackedDerivedClass(42)!
expectEqual(derived.field, 43)
expectEqual(copyCounter, getCopyCounter().pointee)
let derivedDerived = makeCopyTrackedDerivedDerivedClass(-5)!
expectEqual(derivedDerived.field, -4)
expectEqual(copyCounter, getCopyCounter().pointee)
}
FunctionsTestSuite.test("base member FRT subscript access") {
let copyCounter = getCopyCounter().pointee
let derived = makeCopyTrackedDerivedClass(42)!
expectEqual(derived[1], 44)
expectEqual(copyCounter, getCopyCounter().pointee)
let derivedDerived = makeCopyTrackedDerivedDerivedClass(-5)!
expectEqual(derivedDerived[10], 6)
expectEqual(copyCounter, getCopyCounter().pointee)
}
FunctionsTestSuite.test("base member FRT subscript accessing reference FRT") {
let copyCounter = getCopyCounter().pointee
var base = makeBaseReturningFRTFromSubscript()!
var frt = base[1]
expectEqual(frt.getX(), 1)
let derived = makeDerivedFromBaseReturningFRTFromSubscript()!
frt = derived[2]
expectEqual(frt.getX(), 2)
}
FunctionsTestSuite.test("base member FRT subscript accessing reference FRT through constant subscript result value") {
let derivedNoPtr = makeDerivedFromBaseReturningFRTFromSubscript()!
var frt = derivedNoPtr[9]
expectEqual(frt.getX(), 9)
let derived = makeDerivedFromBaseReturningFRTFromSubscriptPointer()!
frt = derived[1]!
expectEqual(frt.getX(), 0)
}
if #available(SwiftStdlib 5.8, *) {
FunctionsTestSuite.test("virtual members in FRT") {
let i = Immortal.create()
expectEqual(42, i.get42())
expectEqual(0, i.getIntValue())
let base = castToImmortalBase(i)
expectEqual(42, base.get42())
expectEqual(42, base.getOverridden42())
expectEqual(0, base.getIntValue())
i.setIntValue(566)
expectEqual(566, i.getIntValue())
expectEqual(566, base.getIntValue())
let d = DerivedFromImmortal.create()
expectEqual(42, d.get42())
expectEqual(42, d.getOverridden42())
d.setIntValue(321)
expectEqual(321, d.getIntValue())
let base2 = castToImmortalBase(castToImmortal(d))
expectEqual(321, base2.getIntValue())
}
}
#if !os(Windows)
// FIXME in Windows, non-trivial C++ class with trivial ABI is not yet available in Swift
FunctionsTestSuite.test("C++ virtual method with complex parameter") {
@available(SwiftStdlib 5.8, *)
func f(simpleClass: HasDestructor, immortalClass: Immortal2) {
immortalClass.virtualMethod(simpleClass)
}
}
#endif
if #available(SwiftStdlib 5.8, *) {
FunctionsTestSuite.test("renamed C++ virtual method") {
func f(immortalClass: Immortal2) {
immortalClass.swiftVirtualRename()
}
let a1 = A1.create()
expectEqual(a1.virtualMethod(), 111)
expectEqual(a1.swiftFooRename(), 112)
expectEqual(a1.swiftBarRename(), 113)
expectEqual(a1.swiftParamsRename(a1: 42), 42)
let b1 = B1.create()
expectEqual(b1.virtualMethod(), 211)
expectEqual(b1.swiftFooRename(), 212)
expectEqual(b1.swiftBarRename(), 213)
expectEqual(b1.swiftParamsRename(a1: 42), 42)
let b2 = B2.create()
expectEqual(b2.virtualMethod(), 221)
expectEqual(b2.swiftFooRename(), 222)
expectEqual(b2.swiftBarRename(), 223)
let c1 = C1.create()
expectEqual(c1.virtualMethod(), 211)
expectEqual(c1.swiftFooRename(), 312)
expectEqual(c1.swiftBarRename(), 313)
expectEqual(c1.swiftParamsRename(a1: 42), 42)
let c2 = C2.create()
expectEqual(c2.virtualMethod(), 321)
expectEqual(c2.swiftFooRename(), 322)
expectEqual(c2.swiftBarRename(), 323)
expectEqual(c2.swiftParamsRename(a1: 42), 42)
let a2 = A2.create()
expectEqual(a2.swiftVirtualMethod(), 121)
expectEqual(a2.swiftFooRename(), 122)
expectEqual(a2.A2BarRename(), 123)
expectEqual(a2.swiftParamsRename(a2: 42), 43)
let d1 = D1.create()
expectEqual(d1.virtualMethod(), 111)
expectEqual(d1.swiftBarRename(), 113)
expectEqual(d1.swiftParamsRename(a1: 42), 42)
// FIXME the method calls below return incorrect values
expectEqual(d1.swiftVirtualMethod(), 111) // should be 121
expectEqual(d1.A2BarRename(), 113) // should be 123
expectEqual(d1.swiftParamsRename(a2: 42), 42) // should be 43
}
}
runAllTests()