blob: debd0d6b9fd8c8e8e85ac7735b20e54ea0556c53 [file] [log] [blame]
// 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()