mirror of
https://github.com/apple/swift.git
synced 2025-12-14 20:36:38 +01:00
The use of a synthesized C++ method allows us to avoid making a copy of self when invoking the base method from Swift
108 lines
3.9 KiB
Swift
108 lines
3.9 KiB
Swift
// RUN: %target-run-simple-swift(-I %S/Inputs/ -Xfrontend -enable-experimental-cxx-interop)
|
|
//
|
|
// REQUIRES: executable_test
|
|
|
|
import StdlibUnittest
|
|
import Functions
|
|
|
|
var FunctionsTestSuite = TestSuite("Calling functions in base classes")
|
|
|
|
FunctionsTestSuite.test("Basic methods from derived") {
|
|
let derived = Derived()
|
|
expectEqual(String(cString: derived.constInBase()!), "Base::constInBase")
|
|
expectEqual(String(cString: derived.takesArgsInBase(0, 1, 2)!), "Base::takesArgsInBase")
|
|
|
|
var mutableDerived = derived
|
|
expectEqual(String(cString: mutableDerived.mutatingInBase()!), "Base::mutatingInBase")
|
|
}
|
|
|
|
FunctionsTestSuite.test("NonTrivial methods from derived") {
|
|
let derived = Derived()
|
|
expectEqual(String(cString: derived.takesNonTrivialInBase(NonTrivial())!), "Base::takesNonTrivialInBase")
|
|
_ = derived.returnsNonTrivialInBase()
|
|
}
|
|
|
|
// TODO: eventually support templates.
|
|
//FunctionsTestSuite.test("Template from derived") {
|
|
// let derived = Derived()
|
|
// expectEqual(String(cString: derived.templateInBase(0)!), "Base::templateInBase")
|
|
//}
|
|
|
|
// TODO: eventually support static functions.
|
|
//FunctionsTestSuite.test("Static from derived") {
|
|
// expectEqual(String(cString: Derived.staticInBase()!), "Base::staticInBase")
|
|
//}
|
|
|
|
FunctionsTestSuite.test("Other base member from derived") {
|
|
let derived = Derived()
|
|
expectEqual(String(cString: derived.inOtherBase()!), "OtherBase::inOtherBase")
|
|
}
|
|
|
|
FunctionsTestSuite.test("Unambiguous members from derived") {
|
|
let derived = Derived()
|
|
expectEqual(derived.sameMethodNameSameSignature(), 21)
|
|
expectEqual(derived.sameMethodDifferentSignature(1), 2)
|
|
expectEqual(derived.sameMethodDifferentSignature(), 18)
|
|
}
|
|
|
|
FunctionsTestSuite.test("Basic methods from derived * 2") {
|
|
let dd = DerivedFromDerived()
|
|
expectEqual(String(cString: dd.constInBase()!), "Base::constInBase")
|
|
expectEqual(String(cString: dd.takesArgsInBase(0, 1, 2)!), "Base::takesArgsInBase")
|
|
|
|
var mutableDerived = dd
|
|
expectEqual(String(cString: mutableDerived.mutatingInBase()!), "Base::mutatingInBase")
|
|
}
|
|
|
|
FunctionsTestSuite.test("NonTrivial methods from derived * 2") {
|
|
let dd = DerivedFromDerived()
|
|
expectEqual(String(cString: dd.takesNonTrivialInBase(NonTrivial())!), "Base::takesNonTrivialInBase")
|
|
_ = dd.returnsNonTrivialInBase()
|
|
}
|
|
|
|
// TODO: eventually support static functions.
|
|
//FunctionsTestSuite.test("Static from derived * 2") {
|
|
// expectEqual(String(cString: DerivedFromDerived.staticInBase()!), "Base::staticInBase")
|
|
//}
|
|
|
|
FunctionsTestSuite.test("Other base member from derived * 2") {
|
|
let dd = DerivedFromDerived()
|
|
expectEqual(String(cString: dd.inOtherBase()!), "OtherBase::inOtherBase")
|
|
}
|
|
|
|
FunctionsTestSuite.test("base member from derived from non trivial") {
|
|
let dnt = DerivedFromNonTrivial()
|
|
expectEqual(String(cString: dnt.inNonTrivial()!), "NonTrivial::inNonTrivial")
|
|
expectEqual(String(cString: dnt.inNonTrivialWithArgs(0, 1)!), "NonTrivial::inNonTrivialWithArgs")
|
|
}
|
|
|
|
FunctionsTestSuite.test("non-empty derived from empty class") {
|
|
let derived = DerivedFromEmptyBaseClass()
|
|
expectEqual(String(cString: derived.inBase()!), "EmptyBaseClass::inBase")
|
|
expectEqual(derived.b, 42)
|
|
}
|
|
|
|
FunctionsTestSuite.test("base member calls do not require copying") {
|
|
let derived = CopyTrackedDerivedClass(42)
|
|
var copyCounter = getCopyCounter().pointee
|
|
expectEqual(derived.getX(), 42)
|
|
expectEqual(copyCounter, getCopyCounter().pointee)
|
|
expectEqual(derived.getDerivedX(), 42)
|
|
expectEqual(copyCounter, getCopyCounter().pointee)
|
|
|
|
let derivedDerived = CopyTrackedDerivedDerivedClass(-5)
|
|
copyCounter = getCopyCounter().pointee
|
|
expectEqual(derivedDerived.getX(), -5)
|
|
expectEqual(derivedDerived.getY(), 11)
|
|
expectEqual(copyCounter, getCopyCounter().pointee)
|
|
}
|
|
|
|
FunctionsTestSuite.test("mutating base member calls do not require copying") {
|
|
var derived = CopyTrackedDerivedClass(42)
|
|
var copyCounter = getCopyCounter().pointee
|
|
expectEqual(derived.getXMut(), 42)
|
|
expectEqual(copyCounter, getCopyCounter().pointee)
|
|
}
|
|
|
|
runAllTests()
|