mirror of
https://github.com/apple/swift.git
synced 2025-12-14 20:36:38 +01:00
415 lines
8.7 KiB
Swift
415 lines
8.7 KiB
Swift
// RUN: rm -rf %t && mkdir %t
|
|
|
|
// RUN: %target-build-swift -emit-library -Xfrontend -enable-resilience -c %S/../Inputs/resilient_struct.swift -o %t/resilient_struct.o
|
|
// RUN: %target-build-swift -emit-module -Xfrontend -enable-resilience -c %S/../Inputs/resilient_struct.swift -o %t/resilient_struct.o
|
|
|
|
// RUN: %target-build-swift -emit-library -Xfrontend -enable-resilience -c %S/../Inputs/resilient_enum.swift -I %t/ -o %t/resilient_enum.o
|
|
// RUN: %target-build-swift -emit-module -Xfrontend -enable-resilience -c %S/../Inputs/resilient_enum.swift -I %t/ -o %t/resilient_enum.o
|
|
|
|
// RUN: %target-build-swift %s -Xlinker %t/resilient_struct.o -Xlinker %t/resilient_enum.o -I %t -L %t -o %t/main
|
|
// RUN: %target-run %t/main
|
|
|
|
// REQUIRES: executable_test
|
|
|
|
import StdlibUnittest
|
|
|
|
// Also import modules which are used by StdlibUnittest internally. This
|
|
// workaround is needed to link all required libraries in case we compile
|
|
// StdlibUnittest with -sil-serialize-all.
|
|
import SwiftPrivate
|
|
#if _runtime(_ObjC)
|
|
import ObjectiveC
|
|
#endif
|
|
|
|
import resilient_enum
|
|
import resilient_struct
|
|
|
|
var ResilientEnumTestSuite = TestSuite("ResilientEnum")
|
|
|
|
ResilientEnumTestSuite.test("ResilientEmptyEnum") {
|
|
let e = ResilientEmptyEnum.X
|
|
let n: Int
|
|
switch e {
|
|
case .X: n = 0
|
|
default: n = -1
|
|
}
|
|
expectEqual(n, 0)
|
|
}
|
|
|
|
ResilientEnumTestSuite.test("ResilientSingletonEnum") {
|
|
let o: AnyObject = ArtClass()
|
|
let e = ResilientSingletonEnum.X(o)
|
|
let n: Int
|
|
switch e {
|
|
case .X(let oo):
|
|
n = 0
|
|
expectTrue(o === oo)
|
|
default:
|
|
n = -1
|
|
}
|
|
expectEqual(n, 0)
|
|
}
|
|
|
|
ResilientEnumTestSuite.test("ResilientSingletonGenericEnum") {
|
|
let o = ArtClass()
|
|
let e = ResilientSingletonGenericEnum.X(o)
|
|
let n: Int
|
|
switch e {
|
|
case .X(let oo):
|
|
n = 0
|
|
expectEqual(o === oo, true)
|
|
default:
|
|
n = -1
|
|
}
|
|
expectEqual(n, 0)
|
|
}
|
|
|
|
ResilientEnumTestSuite.test("ResilientNoPayloadEnum") {
|
|
let a: [ResilientNoPayloadEnum] = [.A, .B, .C]
|
|
let b: [Int] = a.map {
|
|
switch $0 {
|
|
case .A:
|
|
return 0
|
|
case .B:
|
|
return 1
|
|
case .C:
|
|
return 2
|
|
default:
|
|
return -1
|
|
}
|
|
}
|
|
|
|
expectEqual(b, [0, 1, 2])
|
|
}
|
|
|
|
ResilientEnumTestSuite.test("ResilientSinglePayloadEnum") {
|
|
let o = ArtClass()
|
|
let a: [ResilientSinglePayloadEnum] = [.A, .B, .C, .X(o)]
|
|
let b: [Int] = a.map {
|
|
switch $0 {
|
|
case .A:
|
|
return 0
|
|
case .B:
|
|
return 1
|
|
case .C:
|
|
return 2
|
|
case .X(let oo):
|
|
expectTrue(o === oo)
|
|
return 3
|
|
default:
|
|
return -1
|
|
}
|
|
}
|
|
|
|
expectEqual(b, [0, 1, 2, 3])
|
|
}
|
|
|
|
ResilientEnumTestSuite.test("ResilientSinglePayloadGenericEnum") {
|
|
let o = ArtClass()
|
|
let a: [ResilientSinglePayloadGenericEnum<ArtClass>] = [.A, .B, .C, .X(o)]
|
|
let b: [Int] = a.map {
|
|
switch $0 {
|
|
case .A:
|
|
return 0
|
|
case .B:
|
|
return 1
|
|
case .C:
|
|
return 2
|
|
case .X(let oo):
|
|
expectTrue(o === oo)
|
|
return 3
|
|
default:
|
|
return -1
|
|
}
|
|
}
|
|
|
|
expectEqual(b, [0, 1, 2, 3])
|
|
}
|
|
|
|
ResilientEnumTestSuite.test("ResilientMultiPayloadEnum") {
|
|
let a: [ResilientMultiPayloadEnum] =
|
|
[.A, .B, .C, .X(1), .Y(2)]
|
|
let b: [Int] = a.map {
|
|
switch $0 {
|
|
case .A:
|
|
return 0
|
|
case .B:
|
|
return 1
|
|
case .C:
|
|
return 2
|
|
case .X(let x):
|
|
expectEqual(x, 1)
|
|
return 3
|
|
case .Y(let y):
|
|
expectEqual(y, 2)
|
|
return 4
|
|
default:
|
|
return -1
|
|
}
|
|
}
|
|
|
|
expectEqual(b, [0, 1, 2, 3, 4])
|
|
}
|
|
|
|
ResilientEnumTestSuite.test("ResilientMultiPayloadEnumRoundTrip") {
|
|
let a = [0, 1, 2, 3, 4]
|
|
let b = a.map { makeResilientMultiPayloadEnum(1122, i: $0) }
|
|
let c: [Int] = b.map {
|
|
switch $0 {
|
|
case .A:
|
|
return 0
|
|
case .B:
|
|
return 1
|
|
case .C:
|
|
return 2
|
|
case .X(let x):
|
|
expectEqual(x, 1122)
|
|
return 3
|
|
case .Y(let y):
|
|
expectEqual(y, 1122)
|
|
return 4
|
|
default:
|
|
return -1
|
|
}
|
|
}
|
|
|
|
expectEqual(c, a)
|
|
}
|
|
|
|
ResilientEnumTestSuite.test("ResilientMultiPayloadEnumSpareBits") {
|
|
let o1 = ArtClass()
|
|
let o2 = ArtClass()
|
|
let a: [ResilientMultiPayloadEnumSpareBits] =
|
|
[.A, .B, .C, .X(o1), .Y(o2)]
|
|
let b: [Int] = a.map {
|
|
switch $0 {
|
|
case .A:
|
|
return 0
|
|
case .B:
|
|
return 1
|
|
case .C:
|
|
return 2
|
|
case .X(let oo1):
|
|
expectTrue(oo1 === o1)
|
|
return 3
|
|
case .Y(let oo2):
|
|
expectTrue(oo2 === o2)
|
|
return 4
|
|
default:
|
|
return -1
|
|
}
|
|
}
|
|
|
|
expectEqual(b, [0, 1, 2, 3, 4])
|
|
}
|
|
|
|
ResilientEnumTestSuite.test("ResilientMultiPayloadEnumSpareBitsRoundTrip") {
|
|
let o = ArtClass()
|
|
let a = [0, 1, 2, 3, 4]
|
|
let b = a.map { makeResilientMultiPayloadEnumSpareBits(o, i: $0) }
|
|
let c: [Int] = b.map {
|
|
switch $0 {
|
|
case .A:
|
|
return 0
|
|
case .B:
|
|
return 1
|
|
case .C:
|
|
return 2
|
|
case .X(let oo):
|
|
expectTrue(oo === o)
|
|
return 3
|
|
case .Y(let oo):
|
|
expectTrue(oo === o)
|
|
return 4
|
|
default:
|
|
return -1
|
|
}
|
|
}
|
|
|
|
expectEqual(c, a)
|
|
}
|
|
|
|
ResilientEnumTestSuite.test("ResilientMultiPayloadEnumSpareBitsAndExtraBits") {
|
|
let o = ArtClass()
|
|
let s: SevenSpareBits = (false, 1, 2, 3, 4, 5, 6, 7)
|
|
let a: [ResilientMultiPayloadEnumSpareBitsAndExtraBits]
|
|
= [.P1(s), .P2(o), .P3(o), .P4(o), .P5(o), .P6(o), .P7(o), .P8(o)]
|
|
let b: [Int] = a.map {
|
|
switch $0 {
|
|
case .P1(let ss):
|
|
// FIXME: derive Equatable conformances for arbitrary tuples :-)
|
|
expectEqual(ss.0, s.0)
|
|
expectEqual(ss.1, s.1)
|
|
expectEqual(ss.2, s.2)
|
|
expectEqual(ss.3, s.3)
|
|
expectEqual(ss.4, s.4)
|
|
expectEqual(ss.5, s.5)
|
|
expectEqual(ss.6, s.6)
|
|
expectEqual(ss.7, s.7)
|
|
return 0
|
|
case .P2(let oo):
|
|
expectTrue(oo === o)
|
|
return 1
|
|
case .P3(let oo):
|
|
expectTrue(oo === o)
|
|
return 2
|
|
case .P4(let oo):
|
|
expectTrue(oo === o)
|
|
return 3
|
|
case .P5(let oo):
|
|
expectTrue(oo === o)
|
|
return 4
|
|
case .P6(let oo):
|
|
expectTrue(oo === o)
|
|
return 5
|
|
case .P7(let oo):
|
|
expectTrue(oo === o)
|
|
return 6
|
|
case .P8(let oo):
|
|
expectTrue(oo === o)
|
|
return 7
|
|
default:
|
|
return -1
|
|
}
|
|
}
|
|
|
|
expectEqual(b, [0, 1, 2, 3, 4, 5, 6, 7])
|
|
}
|
|
|
|
ResilientEnumTestSuite.test("ResilientMultiPayloadGenericEnum") {
|
|
let o1 = ArtClass()
|
|
let o2 = ArtClass()
|
|
let a: [ResilientMultiPayloadGenericEnum<ArtClass>] =
|
|
[.A, .B, .C, .X(o1), .Y(o2)]
|
|
let b: [Int] = a.map {
|
|
switch $0 {
|
|
case .A:
|
|
return 0
|
|
case .B:
|
|
return 1
|
|
case .C:
|
|
return 2
|
|
case .X(let oo1):
|
|
expectTrue(oo1 === o1)
|
|
return 3
|
|
case .Y(let oo2):
|
|
expectTrue(oo2 === o2)
|
|
return 4
|
|
default:
|
|
return -1
|
|
}
|
|
}
|
|
|
|
expectEqual(b, [0, 1, 2, 3, 4])
|
|
}
|
|
|
|
public func getMetadata() -> Any.Type {
|
|
return Shape.self
|
|
}
|
|
|
|
ResilientEnumTestSuite.test("DynamicLayoutMetatype") {
|
|
do {
|
|
var output = ""
|
|
let expected = "- resilient_enum.Shape #0\n"
|
|
dump(getMetadata(), to: &output)
|
|
expectEqual(output, expected)
|
|
}
|
|
do {
|
|
expectEqual(true, getMetadata() == getMetadata())
|
|
}
|
|
}
|
|
|
|
ResilientEnumTestSuite.test("DynamicLayoutSinglePayload") {
|
|
let s = Size(w: 10, h: 20)
|
|
let a: [SimpleShape] = [.KleinBottle, .Triangle(s)]
|
|
|
|
let b: [Int] = a.map {
|
|
switch $0 {
|
|
case .KleinBottle:
|
|
return 0
|
|
case .Triangle(let s):
|
|
expectEqual(s.w, 10)
|
|
expectEqual(s.h, 20)
|
|
return 1
|
|
}
|
|
}
|
|
|
|
expectEqual(b, [0, 1])
|
|
}
|
|
|
|
ResilientEnumTestSuite.test("DynamicLayoutMultiPayload") {
|
|
let s = Size(w: 10, h: 20)
|
|
let a: [Shape] = [.Point, .Rect(s), .RoundedRect(s, s)]
|
|
|
|
let b: [Int] = a.map {
|
|
switch $0 {
|
|
case .Point:
|
|
return 0
|
|
case .Rect(let s):
|
|
expectEqual(s.w, 10)
|
|
expectEqual(s.h, 20)
|
|
return 1
|
|
case .RoundedRect(let s, let ss):
|
|
expectEqual(s.w, 10)
|
|
expectEqual(s.h, 20)
|
|
expectEqual(ss.w, 10)
|
|
expectEqual(ss.h, 20)
|
|
return 2
|
|
}
|
|
}
|
|
|
|
expectEqual(b, [0, 1, 2])
|
|
}
|
|
|
|
ResilientEnumTestSuite.test("DynamicLayoutMultiPayload2") {
|
|
let c = Color(r: 1, g: 2, b: 3)
|
|
let a: [CustomColor] = [.Black, .White, .Custom(c), .Bespoke(c, c)]
|
|
|
|
let b: [Int] = a.map {
|
|
switch $0 {
|
|
case .Black:
|
|
return 0
|
|
case .White:
|
|
return 1
|
|
case .Custom(let c):
|
|
expectEqual(c.r, 1)
|
|
expectEqual(c.g, 2)
|
|
expectEqual(c.b, 3)
|
|
return 2
|
|
case .Bespoke(let c, let cc):
|
|
expectEqual(c.r, 1)
|
|
expectEqual(c.g, 2)
|
|
expectEqual(c.b, 3)
|
|
expectEqual(cc.r, 1)
|
|
expectEqual(cc.g, 2)
|
|
expectEqual(cc.b, 3)
|
|
return 3
|
|
}
|
|
}
|
|
|
|
expectEqual(b, [0, 1, 2, 3])
|
|
}
|
|
|
|
// Make sure case numbers round-trip if payload has zero size
|
|
|
|
ResilientEnumTestSuite.test("ResilientEnumWithEmptyCase") {
|
|
let a: [ResilientEnumWithEmptyCase] = getResilientEnumWithEmptyCase()
|
|
|
|
let b: [Int] = a.map {
|
|
switch $0 {
|
|
case .A:
|
|
return 0
|
|
case .B:
|
|
return 1
|
|
case .Empty:
|
|
return 2
|
|
default:
|
|
return -1
|
|
}
|
|
}
|
|
|
|
expectEqual(b, [0, 1, 2])
|
|
}
|
|
|
|
runAllTests()
|