// RUN: rm -rf %t && mkdir -p %t // RUN: %target-build-swift -c -force-single-frontend-invocation -parse-as-library -emit-module -emit-module-path %t/PrintTestTypes.swiftmodule -o %t/PrintTestTypes.o %S/Inputs/PrintTestTypes.swift // RUN: %target-build-swift %s -Xlinker %t/PrintTestTypes.o -I %t -L %t -o %t/main // RUN: %target-run %t/main // REQUIRES: executable_test import StdlibUnittest import PrintTestTypes let PrintTests = TestSuite("PrintStruct") PrintTests.test("Printable") { let s0 = [ WithoutDescription(1), WithoutDescription(2), WithoutDescription(3) ] expectPrinted( "[PrintTestTypes.WithoutDescription(x: 1), PrintTestTypes.WithoutDescription(x: 2), PrintTestTypes.WithoutDescription(x: 3)]", s0) expectDebugPrinted( "[PrintTestTypes.WithoutDescription(x: 1), PrintTestTypes.WithoutDescription(x: 2), PrintTestTypes.WithoutDescription(x: 3)]", s0) expectPrinted("EmptyStructWithoutDescription()", EmptyStructWithoutDescription()) expectDebugPrinted("PrintTestTypes.EmptyStructWithoutDescription()", EmptyStructWithoutDescription()) expectPrinted( "ValuesWithoutDescription>(t: 1.25, u: \"abc\", v: [1, 2, 3])", ValuesWithoutDescription(1.25, "abc", [ 1, 2, 3 ])) expectDebugPrinted( "PrintTestTypes.ValuesWithoutDescription>(t: 1.25, u: \"abc\", v: [1, 2, 3])", ValuesWithoutDescription(1.25, "abc", [ 1, 2, 3 ])) } PrintTests.test("custom string convertible structs") { struct Wrapper : CustomStringConvertible { var x: CustomStringConvertible? var description: String { return "Wrapper(\(x.debugDescription))" } } expectPrinted("Wrapper(nil)", Wrapper()) expectPrinted("Wrapper(Optional(Wrapper(nil)))", Wrapper(x: Wrapper())) expectPrinted("Wrapper(Optional(Wrapper(Optional(Wrapper(nil)))))", Wrapper(x: Wrapper(x: Wrapper()))) } func test_ThickMetatypePrintingImpl( _ thickMetatype: T.Type, _ expectedPrint: String, _ expectedDebug: String ) { expectPrinted(expectedPrint, thickMetatype) expectPrinted("[\(expectedDebug)]", [thickMetatype]) expectDebugPrinted(expectedDebug, thickMetatype) expectDebugPrinted("[\(expectedDebug)]", [thickMetatype]) } PrintTests.test("StructPrintable") { let s0 = StructPrintable(1) let s1: ProtocolUnrelatedToPrinting = StructPrintable(1) let s2: CustomStringConvertible = StructPrintable(1) let s3: Any = StructPrintable(1) expectPrinted("►1◀︎", s0) expectPrinted("►1◀︎", s1) expectPrinted("►1◀︎", s2) expectPrinted("►1◀︎", s3) let structMetatype = StructPrintable.self expectPrinted("StructPrintable", structMetatype) expectDebugPrinted("PrintTestTypes.StructPrintable", structMetatype) expectPrinted("[PrintTestTypes.StructPrintable]", [structMetatype]) expectDebugPrinted("[PrintTestTypes.StructPrintable]", [structMetatype]) test_ThickMetatypePrintingImpl(structMetatype, "StructPrintable", "PrintTestTypes.StructPrintable") } PrintTests.test("LargeStructPrintable") { let s0 = LargeStructPrintable(10, 20, 30, 40) let s1: ProtocolUnrelatedToPrinting = LargeStructPrintable(10, 20, 30, 40) let s2: CustomStringConvertible = LargeStructPrintable(10, 20, 30, 40) let s3: Any = LargeStructPrintable(10, 20, 30, 40) expectPrinted("<10 20 30 40>", s0) expectPrinted("<10 20 30 40>", s1) expectPrinted("<10 20 30 40>", s2) expectPrinted("<10 20 30 40>", s0) expectPrinted("<10 20 30 40>", s3) } PrintTests.test("StructVeryPrintable") { let s0 = StructVeryPrintable(1) let s1: ProtocolUnrelatedToPrinting = StructVeryPrintable(1) let s2: CustomStringConvertible = StructVeryPrintable(1) let s3: CustomDebugStringConvertible = StructVeryPrintable(1) let s4: Any = StructVeryPrintable(1) expectPrinted("", s0) expectPrinted("", s1) expectPrinted("", s2) expectPrinted("", s3) expectPrinted("", s4) } runAllTests()