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)
}