| // Copyright 2022 The Chromium Authors |
| // Use of this source code is governed by a BSD-style license that can be |
| // found in the LICENSE file. |
| |
| import Classes |
| import XCTest |
| |
| class PolymorphismTest: XCTestCase { |
| |
| func testBasicInheritance() throws { |
| #if swift(<5.7) |
| var rect = Rectangle(10, 10) |
| XCTAssertEqual(rect.Area(), 100) |
| XCTAssertEqual(rect.NumberOfSides(), 4) |
| |
| var square = Square(5) |
| XCTAssertEqual(square.Area(), 25) |
| XCTAssertEqual(square.NumberOfSides(), 4) |
| |
| var triangle = Triangle(10, 10) |
| XCTAssertEqual(triangle.Area(), 50) |
| XCTAssertEqual(triangle.NumberOfSides(), 3) |
| #endif |
| } |
| |
| // The primary bug for inherited methods not working is |
| // https://github.com/apple/swift/issues/55192. That covers several of |
| // these tests. |
| |
| func testInheritedMethods_noCompile() throws { |
| // Test calling a public method defined in the public base class. |
| // DOESN'T COMPILE: value of type 'Rectangle' has no member 'HasSides' |
| // CRASHES in 5.7-dev. |
| // var rect = Rectangle(10, 10) |
| // XCTAssertTrue(rect.HasSides()) |
| } |
| |
| func testRuntimePolymorphism_fails() throws { |
| // MakeShape() creates a Triangle and returns the object as a Shape*. |
| // let shape = MakeShape(10, 10) |
| |
| // DOES NOT WORK: executes the Shape implementation, not the Triangle |
| // version, and thus fails the comparision (0 != 3) |
| // XCTAssertEqual(shape!.pointee.NumberOfSides(), 3) |
| } |
| |
| func testPureVirtualMethods_noCompile() throws { |
| // MakeShape() creates a Triangle and returns the object as a Shape*. |
| // let shape = MakeShape(10, 10) |
| |
| // DOES NOT COMPILE: undefined symbol Shape::Area() for lld. |
| // XCTAssertEqual(shape!.pointee.Area(), 50) |
| } |
| } |