| // RUN: %target-run-simple-swift |
| // REQUIRES: executable_test |
| |
| import StdlibUnittest |
| |
| let TypeNameTests = TestSuite("TypeName") |
| |
| class C {} |
| struct S {} |
| enum E {} |
| |
| protocol P {} |
| protocol P2 {} |
| protocol P3 {} |
| protocol AssociatedTypes { |
| associatedtype A |
| associatedtype B |
| associatedtype C |
| } |
| |
| class Model : AssociatedTypes { |
| typealias A = C |
| typealias B = S |
| typealias C = E |
| } |
| |
| struct Model2 : AssociatedTypes { |
| typealias A = C |
| typealias B = S |
| typealias C = E |
| } |
| |
| class GC<T : AssociatedTypes> {} |
| struct GS<T : AssociatedTypes> {} |
| enum GE<T : AssociatedTypes> {} |
| class GC2<T : AssociatedTypes, U : AssociatedTypes> {} |
| |
| TypeNameTests.test("Prints") { |
| expectEqual("Swift.Int", _typeName(Int.self)) |
| expectEqual("main.C", _typeName(C.self)) |
| expectEqual("main.S", _typeName(S.self)) |
| expectEqual("main.E", _typeName(E.self)) |
| expectEqual("main.GC<main.Model>", |
| _typeName(GC<Model>.self)) |
| expectEqual("main.GS<main.Model>", |
| _typeName(GS<Model>.self)) |
| expectEqual("main.GE<main.Model>", |
| _typeName(GE<Model>.self)) |
| expectEqual("main.GC2<main.Model, main.Model2>", |
| _typeName(GC2<Model, Model2>.self)) |
| |
| expectEqual("main.P", _typeName(P.self)) |
| typealias PP2 = P & P2 |
| expectEqual("main.P & main.P2", |
| _typeName(PP2.self)) |
| expectEqual("Any", _typeName(Any.self)) |
| expectEqual("main.P & main.P2", _typeName((P & P2).self)) |
| |
| typealias F = () -> () |
| typealias F2 = () -> () -> () |
| typealias F3 = (() -> ()) -> () |
| typealias F4 = (Int, Float) -> () |
| typealias F5 = ((Int, Float)) -> () |
| typealias F6 = (Int...) -> () |
| |
| expectEqual("() -> ()", _typeName(F.self)) |
| expectEqual("() -> () -> ()", _typeName(F2.self)) |
| expectEqual("(() -> ()) -> ()", _typeName(F3.self)) |
| expectEqual("() -> ()", _typeName((() -> ()).self)) |
| expectEqual("(Swift.Int, Swift.Float) -> ()", _typeName(F4.self)) |
| expectEqual("((Swift.Int, Swift.Float)) -> ()", _typeName(F5.self)) |
| expectEqual("(Swift.Int...) -> ()", _typeName(F6.self)) |
| |
| expectEqual("(main.P) -> main.P2 & main.P3", |
| _typeName(((P) -> P2 & P3).self)) |
| expectEqual("() -> main.P & main.P2 & main.P3", |
| _typeName((() -> P & P2 & P3).self)) |
| expectEqual("(main.P & main.P2) -> main.P & main.P3", |
| _typeName(((P & P2) -> P3 & P).self)) |
| |
| #if _runtime(_ObjC) |
| typealias B = @convention(block) () -> () |
| typealias B2 = () -> @convention(block) () -> () |
| typealias B3 = (@convention(block) () -> ()) -> () |
| expectEqual("@convention(block) () -> ()", _typeName(B.self)) |
| expectEqual("() -> @convention(block) () -> ()", |
| _typeName(B2.self)) |
| expectEqual("(@convention(block) () -> ()) -> ()", |
| _typeName(B3.self)) |
| #endif |
| |
| expectEqual("(() -> ()).Type", _typeName(F.Type.self)) |
| expectEqual("main.C.Type", _typeName(C.Type.self)) |
| expectEqual("main.C.Type.Type", _typeName(C.Type.Type.self)) |
| expectEqual("Any.Type", _typeName(Any.Type.self)) |
| expectEqual("Any.Protocol", _typeName(Any.Protocol.self)) |
| expectEqual("Swift.AnyObject", _typeName(AnyObject.self)) |
| expectEqual("Swift.AnyObject.Type", _typeName(AnyClass.self)) |
| expectEqual("Swift.Optional<Swift.AnyObject>", |
| _typeName((AnyObject?).self)) |
| expectEqual("()", _typeName(Void.self)) |
| |
| |
| typealias Tup = (Any, F, C) |
| expectEqual("(Any, () -> (), main.C)", |
| _typeName(Tup.self)) |
| } |
| |
| TypeNameTests.test("Inout") { |
| typealias IF = (inout Int) -> () |
| typealias IF2 = (inout Int) -> (inout Int) -> () |
| typealias IF3 = ((inout Int) -> ()) -> () |
| typealias IF3a = (inout ((Int) -> ())) -> () |
| typealias IF3b = (inout ((Int) -> ())) -> () |
| typealias IF3c = ((inout Int) -> ()) -> () |
| typealias IF4 = (inout (() -> ())) -> () |
| typealias IF5 = (inout Int, Any) -> () |
| |
| expectEqual("(inout Swift.Int) -> ()", _typeName(IF.self)) |
| expectEqual("(inout Swift.Int) -> (inout Swift.Int) -> ()", |
| _typeName(IF2.self)) |
| expectEqual("((inout Swift.Int) -> ()) -> ()", |
| _typeName(IF3.self)) |
| expectEqual("(inout (Swift.Int) -> ()) -> ()", |
| _typeName(IF3a.self)) |
| expectEqual("(inout (Swift.Int) -> ()) -> ()", |
| _typeName(IF3b.self)) |
| expectEqual("((inout Swift.Int) -> ()) -> ()", |
| _typeName(IF3c.self)) |
| expectEqual("(inout () -> ()) -> ()", |
| _typeName(IF4.self)) |
| expectEqual("(inout Swift.Int, Any) -> ()", |
| _typeName(IF5.self)) |
| } |
| |
| TypeNameTests.test("Functions") { |
| func curry1() { |
| |
| } |
| |
| func curry1Throws() throws { |
| |
| } |
| |
| func curry2() -> () -> () { |
| return curry1 |
| } |
| |
| func curry2Throws() throws -> () -> () { |
| return curry1 |
| } |
| |
| func curry3() -> () throws -> () { |
| return curry1Throws |
| } |
| |
| func curry3Throws() throws -> () throws -> () { |
| return curry1Throws |
| } |
| |
| expectEqual("() -> ()", |
| _typeName(type(of: curry1))) |
| expectEqual("() -> () -> ()", |
| _typeName(type(of: curry2))) |
| expectEqual("() throws -> () -> ()", |
| _typeName(type(of: curry2Throws))) |
| expectEqual("() -> () throws -> ()", |
| _typeName(type(of: curry3))) |
| expectEqual("() throws -> () throws -> ()", |
| _typeName(type(of: curry3Throws))) |
| } |
| |
| class SomeOuterClass { |
| struct SomeInnerStruct {} |
| struct SomeInnerGenericStruct<T> {} |
| } |
| |
| class SomeOuterGenericClass<T> { |
| struct SomeInnerStruct {} |
| struct SomeInnerGenericStruct<U> {} |
| } |
| |
| TypeNameTests.test("Nested") { |
| expectEqual("main.SomeOuterClass.SomeInnerStruct", |
| _typeName(SomeOuterClass.SomeInnerStruct.self)); |
| expectEqual("main.SomeOuterClass.SomeInnerGenericStruct<Swift.Int>", |
| _typeName(SomeOuterClass.SomeInnerGenericStruct<Int>.self)); |
| expectEqual("main.SomeOuterGenericClass<Swift.Int>.SomeInnerStruct", |
| _typeName(SomeOuterGenericClass<Int>.SomeInnerStruct.self)); |
| expectEqual("main.SomeOuterGenericClass<Swift.String>.SomeInnerGenericStruct<Swift.Int>", |
| _typeName(SomeOuterGenericClass<String>.SomeInnerGenericStruct<Int>.self)); |
| } |
| |
| extension SomeOuterGenericClass { |
| struct OtherInnerStruct {} |
| struct OtherInnerGenericStruct<U> {} |
| } |
| |
| TypeNameTests.test("NestedInExtension") { |
| expectEqual("main.SomeOuterGenericClass<Swift.Int>.OtherInnerStruct", |
| _typeName(SomeOuterGenericClass<Int>.OtherInnerStruct.self)); |
| expectEqual("main.SomeOuterGenericClass<Swift.Int>.OtherInnerGenericStruct<Swift.String>", |
| _typeName(SomeOuterGenericClass<Int>.OtherInnerGenericStruct<String>.self)); |
| } |
| |
| extension SomeOuterGenericClass where T == Int { |
| struct AnotherInnerStruct {} |
| struct AnotherInnerGenericStruct<U> {} |
| } |
| |
| TypeNameTests.test("NestedInConstrainedExtension") { |
| expectEqual("(extension in main):main.SomeOuterGenericClass<Swift.Int>.AnotherInnerStruct", |
| _typeName(SomeOuterGenericClass<Int>.AnotherInnerStruct.self)); |
| expectEqual("(extension in main):main.SomeOuterGenericClass<Swift.Int>.AnotherInnerGenericStruct<Swift.String>", |
| _typeName(SomeOuterGenericClass<Int>.AnotherInnerGenericStruct<String>.self)); |
| } |
| |
| runAllTests() |