|
4 | 4 |
|
5 | 5 | import Testing |
6 | 6 |
|
| 7 | +@Suite(.enabled(if: swiftToolchainSupported)) |
7 | 8 | struct MetadataTests { |
8 | 9 | class T1 { |
9 | 10 | var a = 0 |
10 | 11 | var b: Double = 0 |
11 | 12 | } |
12 | | - |
| 13 | + |
13 | 14 | struct T2 { |
14 | 15 | var a: Int |
15 | 16 | var b: Double |
16 | 17 | } |
17 | | - |
| 18 | + |
18 | 19 | enum T3 { |
19 | 20 | case a, b |
20 | 21 | } |
21 | | - |
| 22 | + |
| 23 | + enum T4: Equatable { |
| 24 | + case none |
| 25 | + case empty |
| 26 | + case int(Int) |
| 27 | + case double(Double) |
| 28 | + } |
| 29 | + |
22 | 30 | protocol P { |
23 | 31 | var a: Int { get } |
24 | 32 | var b: Double { get } |
25 | 33 | } |
26 | | - |
| 34 | + |
| 35 | + @Test |
| 36 | + func kind() { |
| 37 | + #expect(Metadata(T1.self).kind == .class) |
| 38 | + #expect(Metadata(T2.self).kind == .struct) |
| 39 | + #expect(Metadata(T3.self).kind == .enum) |
| 40 | + |
| 41 | + #expect(Metadata(Void?.self).kind == .optional) |
| 42 | + #expect(Metadata(Int?.self).kind == .optional) |
| 43 | + #expect(Metadata(T1?.self).kind == .optional) |
| 44 | + #expect(Metadata((T1, T2)?.self).kind == .optional) |
| 45 | + |
| 46 | + #expect(Metadata(Void.self).kind == .tuple) |
| 47 | + #expect(Metadata((Int, Double?).self).kind == .tuple) |
| 48 | + #expect(Metadata((T1, T2, T3).self).kind == .tuple) |
| 49 | + |
| 50 | + #expect(Metadata((() -> Void).self).kind == .function) |
| 51 | + |
| 52 | + #expect(Metadata(P.self).kind == .existential) |
| 53 | + #expect(Metadata((any P).self).kind == .existential) |
| 54 | + |
| 55 | + #expect(Metadata(P.Protocol.self).kind == .metatype) |
| 56 | + #expect(Metadata(type(of: Int.self)).kind == .metatype) |
| 57 | + } |
| 58 | + |
| 59 | + @Test |
| 60 | + func enumType() { |
| 61 | + var none = T4.none |
| 62 | + var empty = T4.empty |
| 63 | + var int = T4.int(1) |
| 64 | + var double = T4.double(2.0) |
| 65 | + let metadata = Metadata(T4.self) |
| 66 | + |
| 67 | + withUnsafePointer(to: none) { #expect(metadata.enumTag($0) == 2) } |
| 68 | + withUnsafePointer(to: empty) { #expect(metadata.enumTag($0) == 3) } |
| 69 | + withUnsafePointer(to: int) { #expect(metadata.enumTag($0) == 0) } |
| 70 | + withUnsafePointer(to: double) { #expect(metadata.enumTag($0) == 1) } |
| 71 | + |
| 72 | + withUnsafeMutablePointer(to: &int) { |
| 73 | + metadata.projectEnumData($0) |
| 74 | + #expect(UnsafeMutableRawPointer($0).assumingMemoryBound(to: Int.self).pointee == 1) |
| 75 | + } |
| 76 | + withUnsafeMutablePointer(to: &double) { |
| 77 | + metadata.projectEnumData($0) |
| 78 | + #expect(UnsafeMutableRawPointer($0).assumingMemoryBound(to: Double.self).pointee.isApproximatelyEqual(to: 2.0)) |
| 79 | + } |
| 80 | + withUnsafeMutablePointer(to: &none) { |
| 81 | + #expect($0.pointee == .none) |
| 82 | + metadata.injectEnumTag(tag: 3, $0) |
| 83 | + #expect($0.pointee == .empty) |
| 84 | + } |
| 85 | + withUnsafeMutablePointer(to: &empty) { |
| 86 | + #expect($0.pointee == .empty) |
| 87 | + metadata.injectEnumTag(tag: 2, $0) |
| 88 | + #expect($0.pointee == .none) |
| 89 | + } |
| 90 | + withUnsafeMutablePointer(to: &int) { |
| 91 | + #expect($0.pointee == .int(1)) |
| 92 | + |
| 93 | + metadata.injectEnumTag(tag: 1, $0) |
| 94 | + #expect(metadata.enumTag($0) == 1) |
| 95 | + #expect($0.pointee == .double(Double(bitPattern: 1))) |
| 96 | + |
| 97 | + metadata.injectEnumTag(tag: 2, $0) |
| 98 | + #expect($0.pointee == .none) |
| 99 | + |
| 100 | + metadata.injectEnumTag(tag: 3, $0) |
| 101 | + #expect($0.pointee == .empty) |
| 102 | + } |
| 103 | + } |
| 104 | + |
| 105 | + #if OPENGRAPH_SUPPORT_2024_API |
| 106 | + func descriptor() { |
| 107 | + let t1 = Metadata(T1.self).descriptor |
| 108 | + let t2 = Metadata(T2.self).descriptor |
| 109 | + let t3 = Metadata(T3.self).descriptor |
| 110 | + let p = Metadata(P.self).descriptor |
| 111 | + let optionalP = Metadata(P?.self).descriptor |
| 112 | + |
| 113 | + #expect(t1 != nil) |
| 114 | + #expect(t2 != nil) |
| 115 | + #expect(t3 != nil) |
| 116 | + |
| 117 | + #expect(p == nil) |
| 118 | + #expect(optionalP != nil) |
| 119 | + |
| 120 | + #expect(t1 == Metadata(T1.self).descriptor) |
| 121 | + } |
| 122 | + #endif |
| 123 | + |
| 124 | + @Test |
| 125 | + func nominalDescriptor() { |
| 126 | + let t1 = Metadata(T1.self).nominalDescriptor |
| 127 | + let t2 = Metadata(T2.self).nominalDescriptor |
| 128 | + let t3 = Metadata(T3.self).nominalDescriptor |
| 129 | + let p = Metadata(P.self).nominalDescriptor |
| 130 | + let optionalP = Metadata(P?.self).nominalDescriptor |
| 131 | + |
| 132 | + #expect(t1 == nil) |
| 133 | + #expect(t2 != nil) |
| 134 | + #expect(t3 != nil) |
| 135 | + #expect(p == nil) |
| 136 | + #expect(optionalP != nil) |
| 137 | + } |
| 138 | + |
| 139 | + @Test |
| 140 | + func nominalDescriptorName() throws { |
| 141 | + let t1 = Metadata(T1.self).nominalDescriptorName |
| 142 | + let t2 = Metadata(T2.self).nominalDescriptorName |
| 143 | + let t3 = Metadata(T3.self).nominalDescriptorName |
| 144 | + let p = Metadata(P.self).nominalDescriptorName |
| 145 | + let optionalP = Metadata(P?.self).nominalDescriptorName |
| 146 | + |
| 147 | + #expect(t1 == nil) |
| 148 | + try #expect(String(cString: #require(t2)) == "T2") |
| 149 | + try #expect(String(cString: #require(t3)) == "T3") |
| 150 | + #expect(p == nil) |
| 151 | + try #expect(String(cString: #require(optionalP)) == "Optional") |
| 152 | + } |
| 153 | + |
27 | 154 | @Test(.disabled(if: !compatibilityTestEnabled, "Metadata is not implemented")) |
28 | 155 | func description() { |
29 | 156 | #expect(Metadata(T1.self).description == "MetadataTests.T1") |
|
0 commit comments