mirror of
https://github.com/apple/swift.git
synced 2025-12-14 20:36:38 +01:00
stdlib: Move Mirrors tests from Runtime.swift.gyb to Mirror.swift
This commit is contained in:
File diff suppressed because it is too large
Load Diff
@@ -602,385 +602,8 @@ Reflection.test("dumpToAStream") {
|
||||
expectEqual("▿ 2 elements\n - 42\n - 4242\n", output)
|
||||
}
|
||||
|
||||
struct StructWithDefaultMirror {
|
||||
let s: String
|
||||
|
||||
init (_ s: String) {
|
||||
self.s = s
|
||||
}
|
||||
}
|
||||
|
||||
Reflection.test("Struct/NonGeneric/DefaultMirror") {
|
||||
do {
|
||||
var output = ""
|
||||
dump(StructWithDefaultMirror("123"), to: &output)
|
||||
expectEqual("▿ a.StructWithDefaultMirror\n - s: \"123\"\n", output)
|
||||
}
|
||||
|
||||
do {
|
||||
// Build a String around an interpolation as a way of smoke-testing that
|
||||
// the internal _Mirror implementation gets memory management right.
|
||||
var output = ""
|
||||
dump(StructWithDefaultMirror("\(456)"), to: &output)
|
||||
expectEqual("▿ a.StructWithDefaultMirror\n - s: \"456\"\n", output)
|
||||
}
|
||||
|
||||
expectEqual(
|
||||
.`struct`,
|
||||
Mirror(reflecting: StructWithDefaultMirror("")).displayStyle)
|
||||
}
|
||||
|
||||
struct GenericStructWithDefaultMirror<T, U> {
|
||||
let first: T
|
||||
let second: U
|
||||
}
|
||||
|
||||
Reflection.test("Struct/Generic/DefaultMirror") {
|
||||
do {
|
||||
var value = GenericStructWithDefaultMirror<Int, [Any?]>(
|
||||
first: 123,
|
||||
second: ["abc", 456, 789.25])
|
||||
var output = ""
|
||||
dump(value, to: &output)
|
||||
|
||||
let expected =
|
||||
"▿ a.GenericStructWithDefaultMirror<Swift.Int, Swift.Array<Swift.Optional<Any>>>\n" +
|
||||
" - first: 123\n" +
|
||||
" ▿ second: 3 elements\n" +
|
||||
" ▿ Optional(\"abc\")\n" +
|
||||
" - some: \"abc\"\n" +
|
||||
" ▿ Optional(456)\n" +
|
||||
" - some: 456\n" +
|
||||
" ▿ Optional(789.25)\n" +
|
||||
" - some: 789.25\n"
|
||||
|
||||
expectEqual(expected, output)
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
enum NoPayloadEnumWithDefaultMirror {
|
||||
case A, ß
|
||||
}
|
||||
|
||||
Reflection.test("Enum/NoPayload/DefaultMirror") {
|
||||
do {
|
||||
let value: [NoPayloadEnumWithDefaultMirror] =
|
||||
[.A, .ß]
|
||||
var output = ""
|
||||
dump(value, to: &output)
|
||||
|
||||
let expected =
|
||||
"▿ 2 elements\n" +
|
||||
" - a.NoPayloadEnumWithDefaultMirror.A\n" +
|
||||
" - a.NoPayloadEnumWithDefaultMirror.ß\n"
|
||||
|
||||
expectEqual(expected, output)
|
||||
}
|
||||
}
|
||||
|
||||
enum SingletonNonGenericEnumWithDefaultMirror {
|
||||
case OnlyOne(Int)
|
||||
}
|
||||
|
||||
Reflection.test("Enum/SingletonNonGeneric/DefaultMirror") {
|
||||
do {
|
||||
let value = SingletonNonGenericEnumWithDefaultMirror.OnlyOne(5)
|
||||
var output = ""
|
||||
dump(value, to: &output)
|
||||
|
||||
let expected =
|
||||
"▿ a.SingletonNonGenericEnumWithDefaultMirror.OnlyOne\n" +
|
||||
" - OnlyOne: 5\n"
|
||||
|
||||
expectEqual(expected, output)
|
||||
}
|
||||
}
|
||||
|
||||
enum SingletonGenericEnumWithDefaultMirror<T> {
|
||||
case OnlyOne(T)
|
||||
}
|
||||
|
||||
Reflection.test("Enum/SingletonGeneric/DefaultMirror") {
|
||||
do {
|
||||
let value = SingletonGenericEnumWithDefaultMirror.OnlyOne("IIfx")
|
||||
var output = ""
|
||||
dump(value, to: &output)
|
||||
|
||||
let expected =
|
||||
"▿ a.SingletonGenericEnumWithDefaultMirror<Swift.String>.OnlyOne\n" +
|
||||
" - OnlyOne: \"IIfx\"\n"
|
||||
|
||||
expectEqual(expected, output)
|
||||
}
|
||||
expectEqual(0, LifetimeTracked.instances)
|
||||
do {
|
||||
let value = SingletonGenericEnumWithDefaultMirror.OnlyOne(
|
||||
LifetimeTracked(0))
|
||||
expectEqual(1, LifetimeTracked.instances)
|
||||
var output = ""
|
||||
dump(value, to: &output)
|
||||
}
|
||||
expectEqual(0, LifetimeTracked.instances)
|
||||
}
|
||||
|
||||
enum SinglePayloadNonGenericEnumWithDefaultMirror {
|
||||
case Cat
|
||||
case Dog
|
||||
case Volleyball(String, Int)
|
||||
}
|
||||
|
||||
Reflection.test("Enum/SinglePayloadNonGeneric/DefaultMirror") {
|
||||
do {
|
||||
let value: [SinglePayloadNonGenericEnumWithDefaultMirror] =
|
||||
[.Cat,
|
||||
.Dog,
|
||||
.Volleyball("Wilson", 2000)]
|
||||
var output = ""
|
||||
dump(value, to: &output)
|
||||
|
||||
let expected =
|
||||
"▿ 3 elements\n" +
|
||||
" - a.SinglePayloadNonGenericEnumWithDefaultMirror.Cat\n" +
|
||||
" - a.SinglePayloadNonGenericEnumWithDefaultMirror.Dog\n" +
|
||||
" ▿ a.SinglePayloadNonGenericEnumWithDefaultMirror.Volleyball\n" +
|
||||
" ▿ Volleyball: (2 elements)\n" +
|
||||
" - .0: \"Wilson\"\n" +
|
||||
" - .1: 2000\n"
|
||||
|
||||
expectEqual(expected, output)
|
||||
}
|
||||
}
|
||||
|
||||
enum SinglePayloadGenericEnumWithDefaultMirror<T, U> {
|
||||
case Well
|
||||
case Faucet
|
||||
case Pipe(T, U)
|
||||
}
|
||||
|
||||
Reflection.test("Enum/SinglePayloadGeneric/DefaultMirror") {
|
||||
do {
|
||||
let value: [SinglePayloadGenericEnumWithDefaultMirror<Int, [Int]>] =
|
||||
[.Well,
|
||||
.Faucet,
|
||||
.Pipe(408, [415])]
|
||||
var output = ""
|
||||
dump(value, to: &output)
|
||||
|
||||
let expected =
|
||||
"▿ 3 elements\n" +
|
||||
" - a.SinglePayloadGenericEnumWithDefaultMirror<Swift.Int, Swift.Array<Swift.Int>>.Well\n" +
|
||||
" - a.SinglePayloadGenericEnumWithDefaultMirror<Swift.Int, Swift.Array<Swift.Int>>.Faucet\n" +
|
||||
" ▿ a.SinglePayloadGenericEnumWithDefaultMirror<Swift.Int, Swift.Array<Swift.Int>>.Pipe\n" +
|
||||
" ▿ Pipe: (2 elements)\n" +
|
||||
" - .0: 408\n" +
|
||||
" ▿ .1: 1 element\n" +
|
||||
" - 415\n"
|
||||
|
||||
expectEqual(expected, output)
|
||||
}
|
||||
}
|
||||
|
||||
enum MultiPayloadTagBitsNonGenericEnumWithDefaultMirror {
|
||||
case Plus
|
||||
case SE30
|
||||
case Classic(mhz: Int)
|
||||
case Performa(model: Int)
|
||||
}
|
||||
|
||||
Reflection.test("Enum/MultiPayloadTagBitsNonGeneric/DefaultMirror") {
|
||||
do {
|
||||
let value: [MultiPayloadTagBitsNonGenericEnumWithDefaultMirror] =
|
||||
[.Plus,
|
||||
.SE30,
|
||||
.Classic(mhz: 16),
|
||||
.Performa(model: 220)]
|
||||
var output = ""
|
||||
dump(value, to: &output)
|
||||
|
||||
let expected =
|
||||
"▿ 4 elements\n" +
|
||||
" - a.MultiPayloadTagBitsNonGenericEnumWithDefaultMirror.Plus\n" +
|
||||
" - a.MultiPayloadTagBitsNonGenericEnumWithDefaultMirror.SE30\n" +
|
||||
" ▿ a.MultiPayloadTagBitsNonGenericEnumWithDefaultMirror.Classic\n" +
|
||||
" ▿ Classic: (1 element)\n" +
|
||||
" - mhz: 16\n" +
|
||||
" ▿ a.MultiPayloadTagBitsNonGenericEnumWithDefaultMirror.Performa\n" +
|
||||
" ▿ Performa: (1 element)\n" +
|
||||
" - model: 220\n"
|
||||
|
||||
expectEqual(expected, output)
|
||||
}
|
||||
}
|
||||
|
||||
class Floppy {
|
||||
let capacity: Int
|
||||
|
||||
init(capacity: Int) { self.capacity = capacity }
|
||||
}
|
||||
|
||||
class CDROM {
|
||||
let capacity: Int
|
||||
|
||||
init(capacity: Int) { self.capacity = capacity }
|
||||
}
|
||||
|
||||
enum MultiPayloadSpareBitsNonGenericEnumWithDefaultMirror {
|
||||
case MacWrite
|
||||
case MacPaint
|
||||
case FileMaker
|
||||
case ClarisWorks(floppy: Floppy)
|
||||
case HyperCard(cdrom: CDROM)
|
||||
}
|
||||
|
||||
Reflection.test("Enum/MultiPayloadSpareBitsNonGeneric/DefaultMirror") {
|
||||
do {
|
||||
let value: [MultiPayloadSpareBitsNonGenericEnumWithDefaultMirror] =
|
||||
[.MacWrite,
|
||||
.MacPaint,
|
||||
.FileMaker,
|
||||
.ClarisWorks(floppy: Floppy(capacity: 800)),
|
||||
.HyperCard(cdrom: CDROM(capacity: 600))]
|
||||
|
||||
var output = ""
|
||||
dump(value, to: &output)
|
||||
|
||||
let expected =
|
||||
"▿ 5 elements\n" +
|
||||
" - a.MultiPayloadSpareBitsNonGenericEnumWithDefaultMirror.MacWrite\n" +
|
||||
" - a.MultiPayloadSpareBitsNonGenericEnumWithDefaultMirror.MacPaint\n" +
|
||||
" - a.MultiPayloadSpareBitsNonGenericEnumWithDefaultMirror.FileMaker\n" +
|
||||
" ▿ a.MultiPayloadSpareBitsNonGenericEnumWithDefaultMirror.ClarisWorks\n" +
|
||||
" ▿ ClarisWorks: (1 element)\n" +
|
||||
" ▿ floppy: a.Floppy #0\n" +
|
||||
" - capacity: 800\n" +
|
||||
" ▿ a.MultiPayloadSpareBitsNonGenericEnumWithDefaultMirror.HyperCard\n" +
|
||||
" ▿ HyperCard: (1 element)\n" +
|
||||
" ▿ cdrom: a.CDROM #1\n" +
|
||||
" - capacity: 600\n"
|
||||
|
||||
expectEqual(expected, output)
|
||||
}
|
||||
}
|
||||
|
||||
enum MultiPayloadTagBitsSmallNonGenericEnumWithDefaultMirror {
|
||||
case MacWrite
|
||||
case MacPaint
|
||||
case FileMaker
|
||||
case ClarisWorks(floppy: Bool)
|
||||
case HyperCard(cdrom: Bool)
|
||||
}
|
||||
|
||||
Reflection.test("Enum/MultiPayloadTagBitsSmallNonGeneric/DefaultMirror") {
|
||||
do {
|
||||
let value: [MultiPayloadTagBitsSmallNonGenericEnumWithDefaultMirror] =
|
||||
[.MacWrite,
|
||||
.MacPaint,
|
||||
.FileMaker,
|
||||
.ClarisWorks(floppy: true),
|
||||
.HyperCard(cdrom: false)]
|
||||
|
||||
var output = ""
|
||||
dump(value, to: &output)
|
||||
|
||||
let expected =
|
||||
"▿ 5 elements\n" +
|
||||
" - a.MultiPayloadTagBitsSmallNonGenericEnumWithDefaultMirror.MacWrite\n" +
|
||||
" - a.MultiPayloadTagBitsSmallNonGenericEnumWithDefaultMirror.MacPaint\n" +
|
||||
" - a.MultiPayloadTagBitsSmallNonGenericEnumWithDefaultMirror.FileMaker\n" +
|
||||
" ▿ a.MultiPayloadTagBitsSmallNonGenericEnumWithDefaultMirror.ClarisWorks\n" +
|
||||
" ▿ ClarisWorks: (1 element)\n" +
|
||||
" - floppy: true\n" +
|
||||
" ▿ a.MultiPayloadTagBitsSmallNonGenericEnumWithDefaultMirror.HyperCard\n" +
|
||||
" ▿ HyperCard: (1 element)\n" +
|
||||
" - cdrom: false\n"
|
||||
|
||||
expectEqual(expected, output)
|
||||
}
|
||||
}
|
||||
|
||||
enum MultiPayloadGenericEnumWithDefaultMirror<T, U> {
|
||||
case IIe
|
||||
case IIgs
|
||||
case Centris(ram: T)
|
||||
case Quadra(hdd: U)
|
||||
case PowerBook170
|
||||
case PowerBookDuo220
|
||||
}
|
||||
|
||||
Reflection.test("Enum/MultiPayloadGeneric/DefaultMirror") {
|
||||
do {
|
||||
let value: [MultiPayloadGenericEnumWithDefaultMirror<Int, String>] =
|
||||
[.IIe,
|
||||
.IIgs,
|
||||
.Centris(ram: 4096),
|
||||
.Quadra(hdd: "160MB"),
|
||||
.PowerBook170,
|
||||
.PowerBookDuo220]
|
||||
|
||||
var output = ""
|
||||
dump(value, to: &output)
|
||||
|
||||
let expected =
|
||||
"▿ 6 elements\n" +
|
||||
" - a.MultiPayloadGenericEnumWithDefaultMirror<Swift.Int, Swift.String>.IIe\n" +
|
||||
" - a.MultiPayloadGenericEnumWithDefaultMirror<Swift.Int, Swift.String>.IIgs\n" +
|
||||
" ▿ a.MultiPayloadGenericEnumWithDefaultMirror<Swift.Int, Swift.String>.Centris\n" +
|
||||
" ▿ Centris: (1 element)\n" +
|
||||
" - ram: 4096\n" +
|
||||
" ▿ a.MultiPayloadGenericEnumWithDefaultMirror<Swift.Int, Swift.String>.Quadra\n" +
|
||||
" ▿ Quadra: (1 element)\n" +
|
||||
" - hdd: \"160MB\"\n" +
|
||||
" - a.MultiPayloadGenericEnumWithDefaultMirror<Swift.Int, Swift.String>.PowerBook170\n" +
|
||||
" - a.MultiPayloadGenericEnumWithDefaultMirror<Swift.Int, Swift.String>.PowerBookDuo220\n"
|
||||
|
||||
expectEqual(expected, output)
|
||||
}
|
||||
expectEqual(0, LifetimeTracked.instances)
|
||||
do {
|
||||
let value = MultiPayloadGenericEnumWithDefaultMirror<LifetimeTracked,
|
||||
LifetimeTracked>
|
||||
.Quadra(hdd: LifetimeTracked(0))
|
||||
expectEqual(1, LifetimeTracked.instances)
|
||||
var output = ""
|
||||
dump(value, to: &output)
|
||||
}
|
||||
expectEqual(0, LifetimeTracked.instances)
|
||||
}
|
||||
|
||||
enum Foo<T> {
|
||||
indirect case Foo(Int)
|
||||
case Bar(T)
|
||||
}
|
||||
|
||||
enum List<T> {
|
||||
case Nil
|
||||
indirect case Cons(first: T, rest: List<T>)
|
||||
}
|
||||
|
||||
Reflection.test("Enum/IndirectGeneric/DefaultMirror") {
|
||||
let x = Foo<String>.Foo(22)
|
||||
let y = Foo<String>.Bar("twenty-two")
|
||||
|
||||
expectEqual("\(x)", "Foo(22)")
|
||||
expectEqual("\(y)", "Bar(\"twenty-two\")")
|
||||
|
||||
let list = List.Cons(first: 0, rest: .Cons(first: 1, rest: .Nil))
|
||||
expectEqual("Cons(first: 0, rest: a.List<Swift.Int>.Cons(first: 1, rest: a.List<Swift.Int>.Nil))",
|
||||
"\(list)")
|
||||
}
|
||||
|
||||
enum MyError: Error {
|
||||
case myFirstError(LifetimeTracked)
|
||||
}
|
||||
|
||||
Reflection.test("Enum/CaseName/Error") {
|
||||
// Just make sure this doesn't leak.
|
||||
let e: Error = MyError.myFirstError(LifetimeTracked(0))
|
||||
_ = String(describing: e)
|
||||
}
|
||||
|
||||
class Brilliant : CustomReflectable {
|
||||
class Brilliant {
|
||||
let first: Int
|
||||
let second: String
|
||||
|
||||
@@ -988,74 +611,6 @@ class Brilliant : CustomReflectable {
|
||||
self.first = fst
|
||||
self.second = snd
|
||||
}
|
||||
|
||||
var customMirror: Mirror {
|
||||
return Mirror(self, children: ["first": first, "second": second, "self": self])
|
||||
}
|
||||
}
|
||||
|
||||
/// Subclasses inherit their parents' custom mirrors.
|
||||
class Irradiant : Brilliant {
|
||||
init() {
|
||||
super.init(400, "")
|
||||
}
|
||||
}
|
||||
|
||||
Reflection.test("CustomMirror") {
|
||||
do {
|
||||
var output = ""
|
||||
dump(Brilliant(123, "four five six"), to: &output)
|
||||
|
||||
let expected =
|
||||
"▿ a.Brilliant #0\n" +
|
||||
" - first: 123\n" +
|
||||
" - second: \"four five six\"\n" +
|
||||
" ▿ self: a.Brilliant #0\n"
|
||||
|
||||
expectEqual(expected, output)
|
||||
}
|
||||
|
||||
do {
|
||||
var output = ""
|
||||
dump(Brilliant(123, "four five six"), to: &output, maxDepth: 0)
|
||||
expectEqual("▹ a.Brilliant #0\n", output)
|
||||
}
|
||||
|
||||
do {
|
||||
var output = ""
|
||||
dump(Brilliant(123, "four five six"), to: &output, maxItems: 3)
|
||||
|
||||
let expected =
|
||||
"▿ a.Brilliant #0\n" +
|
||||
" - first: 123\n" +
|
||||
" - second: \"four five six\"\n" +
|
||||
" (1 more child)\n"
|
||||
|
||||
expectEqual(expected, output)
|
||||
}
|
||||
|
||||
do {
|
||||
var output = ""
|
||||
dump(Brilliant(123, "four five six"), to: &output, maxItems: 2)
|
||||
|
||||
let expected =
|
||||
"▿ a.Brilliant #0\n" +
|
||||
" - first: 123\n" +
|
||||
" (2 more children)\n"
|
||||
|
||||
expectEqual(expected, output)
|
||||
}
|
||||
|
||||
do {
|
||||
var output = ""
|
||||
dump(Brilliant(123, "four five six"), to: &output, maxItems: 1)
|
||||
|
||||
let expected =
|
||||
"▿ a.Brilliant #0\n" +
|
||||
" (3 children)\n"
|
||||
|
||||
expectEqual(expected, output)
|
||||
}
|
||||
}
|
||||
|
||||
Reflection.test("ObjectIdentifier/Hashable,Comparable") {
|
||||
@@ -1102,475 +657,6 @@ Reflection.test("ObjectIdentifier/CustomDebugStringConvertible") {
|
||||
|
||||
}
|
||||
|
||||
Reflection.test("CustomMirrorIsInherited") {
|
||||
do {
|
||||
var output = ""
|
||||
dump(Irradiant(), to: &output)
|
||||
|
||||
let expected =
|
||||
"▿ a.Brilliant #0\n" +
|
||||
" - first: 400\n" +
|
||||
" - second: \"\"\n" +
|
||||
" ▿ self: a.Brilliant #0\n"
|
||||
|
||||
expectEqual(expected, output)
|
||||
}
|
||||
}
|
||||
|
||||
protocol SomeNativeProto {}
|
||||
extension Int: SomeNativeProto {}
|
||||
|
||||
Reflection.test("MetatypeMirror") {
|
||||
do {
|
||||
var output = ""
|
||||
let concreteMetatype = Int.self
|
||||
dump(concreteMetatype, to: &output)
|
||||
|
||||
let expectedInt = "- Swift.Int #0\n"
|
||||
expectEqual(expectedInt, output)
|
||||
|
||||
let anyMetatype: Any.Type = Int.self
|
||||
output = ""
|
||||
dump(anyMetatype, to: &output)
|
||||
expectEqual(expectedInt, output)
|
||||
|
||||
let nativeProtocolMetatype: SomeNativeProto.Type = Int.self
|
||||
output = ""
|
||||
dump(nativeProtocolMetatype, to: &output)
|
||||
expectEqual(expectedInt, output)
|
||||
|
||||
let concreteClassMetatype = SomeClass.self
|
||||
let expectedSomeClass = "- a.SomeClass #0\n"
|
||||
output = ""
|
||||
dump(concreteClassMetatype, to: &output)
|
||||
expectEqual(expectedSomeClass, output)
|
||||
|
||||
let nativeProtocolConcreteMetatype = SomeNativeProto.self
|
||||
let expectedNativeProtocolConcrete = "- a.SomeNativeProto #0\n"
|
||||
output = ""
|
||||
dump(nativeProtocolConcreteMetatype, to: &output)
|
||||
expectEqual(expectedNativeProtocolConcrete, output)
|
||||
}
|
||||
}
|
||||
|
||||
Reflection.test("TupleMirror") {
|
||||
do {
|
||||
var output = ""
|
||||
let tuple =
|
||||
(Brilliant(384, "seven six eight"), StructWithDefaultMirror("nine"))
|
||||
dump(tuple, to: &output)
|
||||
|
||||
let expected =
|
||||
"▿ (2 elements)\n" +
|
||||
" ▿ .0: a.Brilliant #0\n" +
|
||||
" - first: 384\n" +
|
||||
" - second: \"seven six eight\"\n" +
|
||||
" ▿ self: a.Brilliant #0\n" +
|
||||
" ▿ .1: a.StructWithDefaultMirror\n" +
|
||||
" - s: \"nine\"\n"
|
||||
|
||||
expectEqual(expected, output)
|
||||
|
||||
expectEqual(.tuple, Mirror(reflecting: tuple).displayStyle)
|
||||
}
|
||||
|
||||
do {
|
||||
// A tuple of stdlib types with mirrors.
|
||||
var output = ""
|
||||
let tuple = (1, 2.5, false, "three")
|
||||
dump(tuple, to: &output)
|
||||
|
||||
let expected =
|
||||
"▿ (4 elements)\n" +
|
||||
" - .0: 1\n" +
|
||||
" - .1: 2.5\n" +
|
||||
" - .2: false\n" +
|
||||
" - .3: \"three\"\n"
|
||||
|
||||
expectEqual(expected, output)
|
||||
}
|
||||
|
||||
do {
|
||||
// A nested tuple.
|
||||
var output = ""
|
||||
let tuple = (1, ("Hello", "World"))
|
||||
dump(tuple, to: &output)
|
||||
|
||||
let expected =
|
||||
"▿ (2 elements)\n" +
|
||||
" - .0: 1\n" +
|
||||
" ▿ .1: (2 elements)\n" +
|
||||
" - .0: \"Hello\"\n" +
|
||||
" - .1: \"World\"\n"
|
||||
|
||||
expectEqual(expected, output)
|
||||
}
|
||||
}
|
||||
|
||||
class DullClass {}
|
||||
|
||||
Reflection.test("ClassReflection") {
|
||||
expectEqual(.`class`, Mirror(reflecting: DullClass()).displayStyle)
|
||||
}
|
||||
|
||||
Reflection.test("String/Mirror") {
|
||||
do {
|
||||
var output = ""
|
||||
dump("", to: &output)
|
||||
|
||||
let expected =
|
||||
"- \"\"\n"
|
||||
|
||||
expectEqual(expected, output)
|
||||
}
|
||||
|
||||
do {
|
||||
// U+0061 LATIN SMALL LETTER A
|
||||
// U+304B HIRAGANA LETTER KA
|
||||
// U+3099 COMBINING KATAKANA-HIRAGANA VOICED SOUND MARK
|
||||
// U+1F425 FRONT-FACING BABY CHICK
|
||||
var output = ""
|
||||
dump("\u{61}\u{304b}\u{3099}\u{1f425}", to: &output)
|
||||
|
||||
let expected =
|
||||
"- \"\u{61}\u{304b}\u{3099}\u{1f425}\"\n"
|
||||
|
||||
expectEqual(expected, output)
|
||||
}
|
||||
}
|
||||
|
||||
Reflection.test("String.UTF8View/Mirror") {
|
||||
// U+0061 LATIN SMALL LETTER A
|
||||
// U+304B HIRAGANA LETTER KA
|
||||
// U+3099 COMBINING KATAKANA-HIRAGANA VOICED SOUND MARK
|
||||
var output = ""
|
||||
dump("\u{61}\u{304b}\u{3099}".utf8, to: &output)
|
||||
|
||||
let expected =
|
||||
"▿ UTF8View(\"\u{61}\u{304b}\u{3099}\")\n" +
|
||||
" - 97\n" +
|
||||
" - 227\n" +
|
||||
" - 129\n" +
|
||||
" - 139\n" +
|
||||
" - 227\n" +
|
||||
" - 130\n" +
|
||||
" - 153\n"
|
||||
|
||||
expectEqual(expected, output)
|
||||
}
|
||||
|
||||
Reflection.test("String.UTF16View/Mirror") {
|
||||
// U+0061 LATIN SMALL LETTER A
|
||||
// U+304B HIRAGANA LETTER KA
|
||||
// U+3099 COMBINING KATAKANA-HIRAGANA VOICED SOUND MARK
|
||||
// U+1F425 FRONT-FACING BABY CHICK
|
||||
var output = ""
|
||||
dump("\u{61}\u{304b}\u{3099}\u{1f425}".utf16, to: &output)
|
||||
|
||||
let expected =
|
||||
"▿ StringUTF16(\"\u{61}\u{304b}\u{3099}\u{1f425}\")\n" +
|
||||
" - 97\n" +
|
||||
" - 12363\n" +
|
||||
" - 12441\n" +
|
||||
" - 55357\n" +
|
||||
" - 56357\n"
|
||||
|
||||
expectEqual(expected, output)
|
||||
}
|
||||
|
||||
Reflection.test("String.UnicodeScalarView/Mirror") {
|
||||
// U+0061 LATIN SMALL LETTER A
|
||||
// U+304B HIRAGANA LETTER KA
|
||||
// U+3099 COMBINING KATAKANA-HIRAGANA VOICED SOUND MARK
|
||||
// U+1F425 FRONT-FACING BABY CHICK
|
||||
var output = ""
|
||||
dump("\u{61}\u{304b}\u{3099}\u{1f425}".unicodeScalars, to: &output)
|
||||
|
||||
let expected =
|
||||
"▿ StringUnicodeScalarView(\"\u{61}\u{304b}\u{3099}\u{1f425}\")\n" +
|
||||
" - \"\u{61}\"\n" +
|
||||
" - \"\\u{304B}\"\n" +
|
||||
" - \"\\u{3099}\"\n" +
|
||||
" - \"\\u{0001F425}\"\n"
|
||||
|
||||
expectEqual(expected, output)
|
||||
}
|
||||
|
||||
Reflection.test("Character/Mirror") {
|
||||
do {
|
||||
// U+0061 LATIN SMALL LETTER A
|
||||
let input: Character = "\u{61}"
|
||||
var output = ""
|
||||
dump(input, to: &output)
|
||||
|
||||
let expected =
|
||||
"- \"\u{61}\"\n"
|
||||
|
||||
expectEqual(expected, output)
|
||||
}
|
||||
|
||||
do {
|
||||
// U+304B HIRAGANA LETTER KA
|
||||
// U+3099 COMBINING KATAKANA-HIRAGANA VOICED SOUND MARK
|
||||
let input: Character = "\u{304b}\u{3099}"
|
||||
var output = ""
|
||||
dump(input, to: &output)
|
||||
|
||||
let expected =
|
||||
"- \"\u{304b}\u{3099}\"\n"
|
||||
|
||||
expectEqual(expected, output)
|
||||
}
|
||||
|
||||
do {
|
||||
// U+1F425 FRONT-FACING BABY CHICK
|
||||
let input: Character = "\u{1f425}"
|
||||
var output = ""
|
||||
dump(input, to: &output)
|
||||
|
||||
let expected =
|
||||
"- \"\u{1f425}\"\n"
|
||||
|
||||
expectEqual(expected, output)
|
||||
}
|
||||
}
|
||||
|
||||
Reflection.test("UnicodeScalar") {
|
||||
do {
|
||||
// U+0061 LATIN SMALL LETTER A
|
||||
let input: UnicodeScalar = "\u{61}"
|
||||
var output = ""
|
||||
dump(input, to: &output)
|
||||
|
||||
let expected =
|
||||
"- \"\u{61}\"\n"
|
||||
|
||||
expectEqual(expected, output)
|
||||
}
|
||||
|
||||
do {
|
||||
// U+304B HIRAGANA LETTER KA
|
||||
let input: UnicodeScalar = "\u{304b}"
|
||||
var output = ""
|
||||
dump(input, to: &output)
|
||||
|
||||
let expected =
|
||||
"- \"\\u{304B}\"\n"
|
||||
|
||||
expectEqual(expected, output)
|
||||
}
|
||||
|
||||
do {
|
||||
// U+3099 COMBINING KATAKANA-HIRAGANA VOICED SOUND MARK
|
||||
let input: UnicodeScalar = "\u{3099}"
|
||||
var output = ""
|
||||
dump(input, to: &output)
|
||||
|
||||
let expected =
|
||||
"- \"\\u{3099}\"\n"
|
||||
|
||||
expectEqual(expected, output)
|
||||
}
|
||||
|
||||
do {
|
||||
// U+1F425 FRONT-FACING BABY CHICK
|
||||
let input: UnicodeScalar = "\u{1f425}"
|
||||
var output = ""
|
||||
dump(input, to: &output)
|
||||
|
||||
let expected =
|
||||
"- \"\\u{0001F425}\"\n"
|
||||
|
||||
expectEqual(expected, output)
|
||||
}
|
||||
}
|
||||
|
||||
Reflection.test("Bool") {
|
||||
do {
|
||||
var output = ""
|
||||
dump(false, to: &output)
|
||||
|
||||
let expected =
|
||||
"- false\n"
|
||||
|
||||
expectEqual(expected, output)
|
||||
}
|
||||
|
||||
do {
|
||||
var output = ""
|
||||
dump(true, to: &output)
|
||||
|
||||
let expected =
|
||||
"- true\n"
|
||||
|
||||
expectEqual(expected, output)
|
||||
}
|
||||
}
|
||||
|
||||
// FIXME: these tests should cover Float80.
|
||||
// FIXME: these tests should be automatically generated from the list of
|
||||
// available floating point types.
|
||||
Reflection.test("Float") {
|
||||
do {
|
||||
var output = ""
|
||||
dump(Float.nan, to: &output)
|
||||
|
||||
let expected =
|
||||
"- nan\n"
|
||||
|
||||
expectEqual(expected, output)
|
||||
}
|
||||
|
||||
do {
|
||||
var output = ""
|
||||
dump(Float.infinity, to: &output)
|
||||
|
||||
let expected =
|
||||
"- inf\n"
|
||||
|
||||
expectEqual(expected, output)
|
||||
}
|
||||
|
||||
do {
|
||||
var input: Float = 42.125
|
||||
var output = ""
|
||||
dump(input, to: &output)
|
||||
|
||||
let expected =
|
||||
"- 42.125\n"
|
||||
|
||||
expectEqual(expected, output)
|
||||
}
|
||||
}
|
||||
|
||||
Reflection.test("Double") {
|
||||
do {
|
||||
var output = ""
|
||||
dump(Double.nan, to: &output)
|
||||
|
||||
let expected =
|
||||
"- nan\n"
|
||||
|
||||
expectEqual(expected, output)
|
||||
}
|
||||
|
||||
do {
|
||||
var output = ""
|
||||
dump(Double.infinity, to: &output)
|
||||
|
||||
let expected =
|
||||
"- inf\n"
|
||||
|
||||
expectEqual(expected, output)
|
||||
}
|
||||
|
||||
do {
|
||||
var input: Double = 42.125
|
||||
var output = ""
|
||||
dump(input, to: &output)
|
||||
|
||||
let expected =
|
||||
"- 42.125\n"
|
||||
|
||||
expectEqual(expected, output)
|
||||
}
|
||||
}
|
||||
|
||||
// A struct type and class type whose NominalTypeDescriptor.FieldNames
|
||||
// data is exactly eight bytes long. FieldNames data of exactly
|
||||
// 4 or 8 or 16 bytes was once miscompiled on arm64.
|
||||
struct EightByteFieldNamesStruct {
|
||||
let abcdef = 42
|
||||
}
|
||||
class EightByteFieldNamesClass {
|
||||
let abcdef = 42
|
||||
}
|
||||
|
||||
Reflection.test("FieldNamesBug") {
|
||||
do {
|
||||
let expected =
|
||||
"▿ a.EightByteFieldNamesStruct\n" +
|
||||
" - abcdef: 42\n"
|
||||
var output = ""
|
||||
dump(EightByteFieldNamesStruct(), to: &output)
|
||||
expectEqual(expected, output)
|
||||
}
|
||||
|
||||
do {
|
||||
let expected =
|
||||
"▿ a.EightByteFieldNamesClass #0\n" +
|
||||
" - abcdef: 42\n"
|
||||
var output = ""
|
||||
dump(EightByteFieldNamesClass(), to: &output)
|
||||
expectEqual(expected, output)
|
||||
}
|
||||
}
|
||||
|
||||
Reflection.test("MirrorMirror") {
|
||||
var object = 1
|
||||
var mirror = Mirror(reflecting: object)
|
||||
var mirrorMirror = Mirror(reflecting: mirror)
|
||||
|
||||
expectEqual(0, mirrorMirror.children.count)
|
||||
}
|
||||
|
||||
Reflection.test("OpaquePointer/null") {
|
||||
// Don't crash on null pointers. rdar://problem/19708338
|
||||
let pointer: OpaquePointer? = nil
|
||||
let mirror = Mirror(reflecting: pointer)
|
||||
expectEqual(0, mirror.children.count)
|
||||
}
|
||||
|
||||
Reflection.test("StaticString/Mirror") {
|
||||
do {
|
||||
var output = ""
|
||||
dump("" as StaticString, to: &output)
|
||||
|
||||
let expected =
|
||||
"- \"\"\n"
|
||||
|
||||
expectEqual(expected, output)
|
||||
}
|
||||
|
||||
do {
|
||||
// U+0061 LATIN SMALL LETTER A
|
||||
// U+304B HIRAGANA LETTER KA
|
||||
// U+3099 COMBINING KATAKANA-HIRAGANA VOICED SOUND MARK
|
||||
// U+1F425 FRONT-FACING BABY CHICK
|
||||
var output = ""
|
||||
dump("\u{61}\u{304b}\u{3099}\u{1f425}" as StaticString, to: &output)
|
||||
|
||||
let expected =
|
||||
"- \"\u{61}\u{304b}\u{3099}\u{1f425}\"\n"
|
||||
|
||||
expectEqual(expected, output)
|
||||
}
|
||||
}
|
||||
|
||||
Reflection.test("DictionaryIterator/Mirror") {
|
||||
let d: [MinimalHashableValue : OpaqueValue<Int>] =
|
||||
[ MinimalHashableValue(0) : OpaqueValue(0) ]
|
||||
|
||||
var output = ""
|
||||
dump(d.makeIterator(), to: &output)
|
||||
|
||||
let expected =
|
||||
"- Swift.DictionaryIterator<StdlibUnittest.MinimalHashableValue, StdlibUnittest.OpaqueValue<Swift.Int>>\n"
|
||||
|
||||
expectEqual(expected, output)
|
||||
}
|
||||
|
||||
Reflection.test("SetIterator/Mirror") {
|
||||
let s: Set<MinimalHashableValue> = [ MinimalHashableValue(0)]
|
||||
|
||||
var output = ""
|
||||
dump(s.makeIterator(), to: &output)
|
||||
|
||||
let expected =
|
||||
"- Swift.SetIterator<StdlibUnittest.MinimalHashableValue>\n"
|
||||
|
||||
expectEqual(expected, output)
|
||||
}
|
||||
|
||||
var BitTwiddlingTestSuite = TestSuite("BitTwiddling")
|
||||
|
||||
|
||||
Reference in New Issue
Block a user