func testMaximumDepthLimitTwoWithSuperclasses()

in PlaygroundLogger/PlaygroundLoggerTests/LogPolicyTests.swift [107:269]


    func testMaximumDepthLimitTwoWithSuperclasses() throws {
        let testPolicy = LogPolicy(maximumDepth: 2)

        check_TestClass: do {
            let logEntry = try LogEntry(describing: TestClass(), name: "testClass", policy: testPolicy)

            guard case let .structured(name, _, _, totalChildrenCount, children, disposition) = logEntry else {
                XCTFail("Expected a structured log entry for a class")
                return
            }

            XCTAssertEqual(name, "testClass")
            XCTAssertEqual(disposition, .class)
            XCTAssertEqual(totalChildrenCount, 1)

            guard children.count == 1 else {
                XCTFail("Expected TestClass to have exactly one child, but it had \(children.count)")
                break check_TestClass
            }

            check_child: do {
                guard case let .opaque(childName, childTypeName, _, _, childRepresentation) = children[0] else {
                    XCTFail("Expected an opaque log entry for the first child")
                    break check_TestClass
                }

                XCTAssertEqual(childName, "a")
                XCTAssertEqual(childTypeName, "Int")
                XCTAssertEqual(childRepresentation as? Int64, 1 as Int64)
            }
        }

        check_TestSubclass: do {
            let logEntry = try LogEntry(describing: TestSubclass(), name: "testSubclass", policy: testPolicy)

            guard case let .structured(name, _, _, totalChildrenCount, children, disposition) = logEntry else {
                XCTFail("Expected a structured log entry for a class")
                return
            }

            XCTAssertEqual(name, "testSubclass")
            XCTAssertEqual(disposition, .class)
            XCTAssertEqual(totalChildrenCount, 2)

            guard children.count == 2 else {
                XCTFail("Expected TestSubclass to have exactly two children, but it had \(children.count)")
                break check_TestSubclass
            }

            check_superclassChild: do {
                guard case let .structured(superclassName, _, _, superclassChildrenCount, superclassChildren, superclassDisposition) = children[0] else {
                    XCTFail("Expected a structured log entry for the first child (superclass)")
                    break check_TestSubclass
                }

                XCTAssertEqual(superclassName, "super")
                XCTAssertEqual(superclassChildrenCount, 1)
                XCTAssertEqual(superclassDisposition, .class)

                guard superclassChildren.count == 1 else {
                    XCTFail("Expected exactly one child of the superclass")
                    break check_superclassChild
                }

                guard case let .opaque(childName, childTypeName, _, _, childRepresentation) = superclassChildren[0] else {
                    XCTFail("Expected an opaque log entry for the first child")
                    break check_superclassChild
                }

                XCTAssertEqual(childName, "a")
                XCTAssertEqual(childTypeName, "Int")
                XCTAssertEqual(childRepresentation as? Int64, 1 as Int64)
            }

            check_child: do {
                guard case let .opaque(childName, childTypeName, _, _, childRepresentation) = children[1] else {
                    XCTFail("Expected an opaque log entry for the second child")
                    break check_TestSubclass
                }

                XCTAssertEqual(childName, "b")
                XCTAssertEqual(childTypeName, "Int")
                XCTAssertEqual(childRepresentation as? Int64, 2 as Int64)
            }
        }

        check_TestSubsubclass: do {
            let logEntry = try LogEntry(describing: TestSubsubclass(), name: "testSubsubclass", policy: testPolicy)

            guard case let .structured(name, _, _, totalChildrenCount, children, disposition) = logEntry else {
                XCTFail("Expected a structured log entry for a class")
                return
            }

            XCTAssertEqual(name, "testSubsubclass")
            XCTAssertEqual(disposition, .class)
            XCTAssertEqual(totalChildrenCount, 2)

            guard children.count == 2 else {
                XCTFail("Expected TestSubsubclass to have exactly two children, but it had \(children.count)")
                break check_TestSubsubclass
            }

            check_superclass: do {
                guard case let .structured(superclassName, _, _, superclassChildrenCount, superclassChildren, superclassDisposition) = children[0] else {
                    XCTFail("Expected a structured log entry for the first child (superclass)")
                    break check_superclass
                }

                XCTAssertEqual(superclassName, "super")
                XCTAssertEqual(superclassChildrenCount, 2)
                XCTAssertEqual(superclassDisposition, .class)

                guard superclassChildren.count == 2 else {
                    XCTFail("Expected exactly two children for the superclass")
                    break check_superclass
                }

                check_doubleSuperclass: do {
                    guard case let .structured(doubleSuperclassName, _, _, doubleSuperclassChildrenCount, doubleSuperclassChildren, doubleSuperclassDisposition) = superclassChildren[0] else {
                        XCTFail("Expected a structured log entry for the superclass's first child (double-superclass)")
                        break check_doubleSuperclass
                    }

                    XCTAssertEqual(doubleSuperclassName, "super")
                    XCTAssertEqual(doubleSuperclassChildrenCount, 1)
                    XCTAssertEqual(doubleSuperclassDisposition, .class)

                    guard doubleSuperclassChildren.count == 1 else {
                        XCTFail("Expected exactly one child for the double-superclass")
                        break check_doubleSuperclass
                    }

                    guard case .gap = doubleSuperclassChildren[0] else {
                        XCTFail("Expected the double-superclass's child to be a gap")
                        break check_doubleSuperclass
                    }
                }

                check_superclassChild: do {
                    guard case let .opaque(superclassChildName, superclassChildTypeName, _, _, superclassChildRepresentation) = superclassChildren[1] else {
                        XCTFail("Expected an opaque log entry for the superclass's second child")
                        break check_superclassChild
                    }

                    XCTAssertEqual(superclassChildName, "b")
                    XCTAssertEqual(superclassChildTypeName, "Int")
                    XCTAssertEqual(superclassChildRepresentation as? Int64, 2 as Int64)
                }
            }

            check_child: do {
                guard case let .opaque(childName, childTypeName, _, _, childRepresentation) = children[1] else {
                    XCTFail("Expected an opaque log entry for the second child")
                    break check_child
                }

                XCTAssertEqual(childName, "c")
                XCTAssertEqual(childTypeName, "Int")
                XCTAssertEqual(childRepresentation as? Int64, 3 as Int64)
            }
        }
    }