func testImageLogging()

in PlaygroundLogger/PlaygroundLoggerTests/LegacyPlaygroundLoggerTests.swift [299:359]


    func testImageLogging() {
        let size = CGSize(width: 30, height: 30)

        #if os(macOS)
            let image = NSImage(size: size, flipped: false) { rect -> Bool in
                NSColor.white.setFill()
                NSBezierPath(rect: rect).fill()
                NSColor.orange.setFill()
                NSBezierPath(roundedRect: rect.insetBy(dx: 5, dy: 5), xRadius: 3, yRadius: 3).fill()
                return true
            }
        #elseif os(iOS) || os(tvOS)
            let rendererFormat: UIGraphicsImageRendererFormat
            if #available(iOS 11.0, tvOS 11.0, *) {
                rendererFormat = .preferred()
            }
            else {
                rendererFormat = .default()
            }
            rendererFormat.scale = 1
            rendererFormat.opaque = true

            let image = UIGraphicsImageRenderer(size: size, format: rendererFormat).image { context in
                UIColor.white.setFill()
                UIBezierPath(rect: context.format.bounds).fill()
                UIColor.orange.setFill()
                UIBezierPath(roundedRect: context.format.bounds.insetBy(dx: 5, dy: 5), cornerRadius: 3).fill()
            }
        #endif

        let logdata  = legacyLog(instance: image, name: "image", id: 0, startLine: 0, endLine: 0, startColumn: 0, endColumn: 0) as! NSData
        guard let decoded = legacyLogDecode(logdata) else {
            XCTFail("Failed to decode log data")
            return
        }
        guard let iderepr = decoded.object as? PlaygroundDecodedObject_IDERepr else {
            XCTFail("Decoded object is not IDERepr")
            return
        }
        XCTAssertEqual(iderepr.tag, "IMAG")

        guard let payloadImage = iderepr.payload as? ImageType else {
            XCTFail("Decoded payload is not an image")
            return
        }

        let expectedSize: CGSize
        #if os(macOS)
            // On macOS, the image we create above is rendered at a scale factor. We get the best-available scale factor from all screens and use that when creating our expectation.
            let scaleFactor = NSScreen.screens.reduce(1.0) { previousBestScaleFactor, screen in
                return max(previousBestScaleFactor, screen.backingScaleFactor)
            }

            expectedSize = CGSize(width: size.width * scaleFactor, height: size.height * scaleFactor)
        #elseif os(iOS) || os(tvOS)
            // On iOS and tvOS, we expect the output image to be the same size as the input image.
            expectedSize = size
        #endif

        XCTAssertEqual(payloadImage.size, expectedSize)
    }