将会话、权限、位置、收款与排队存储拆分为独立模块,同步更新各 ViewModel 与单元测试,并补充素材管理 UI 与个人空间设置交互。 Co-authored-by: Cursor <cursoragent@cursor.com>
48 lines
1.9 KiB
Swift
48 lines
1.9 KiB
Swift
//
|
|
// ProfileAvatarCropTests.swift
|
|
// suixinkanTests
|
|
//
|
|
|
|
import XCTest
|
|
@testable import suixinkan
|
|
|
|
@MainActor
|
|
/// 空间设置头像裁剪输出测试。
|
|
final class ProfileAvatarCropTests: XCTestCase {
|
|
func testCropOutputIs480PixelSquare() throws {
|
|
let source = UIGraphicsImageRenderer(size: CGSize(width: 800, height: 600)).image { context in
|
|
UIColor.red.setFill()
|
|
context.fill(CGRect(x: 0, y: 0, width: 800, height: 600))
|
|
}
|
|
let controller = ProfileAvatarCropViewController(image: source) { _ in }
|
|
controller.loadViewIfNeeded()
|
|
controller.view.frame = CGRect(x: 0, y: 0, width: 390, height: 844)
|
|
controller.view.setNeedsLayout()
|
|
controller.view.layoutIfNeeded()
|
|
|
|
let data = try XCTUnwrap(controller.renderedCropData())
|
|
let image = try XCTUnwrap(UIImage(data: data))
|
|
XCTAssertEqual(image.size.width * image.scale, 480)
|
|
XCTAssertEqual(image.size.height * image.scale, 480)
|
|
}
|
|
|
|
func testCropNormalizesImageOrientation() throws {
|
|
let base = UIGraphicsImageRenderer(size: CGSize(width: 600, height: 800)).image { context in
|
|
UIColor.blue.setFill()
|
|
context.fill(CGRect(x: 0, y: 0, width: 600, height: 800))
|
|
}
|
|
let cgImage = try XCTUnwrap(base.cgImage)
|
|
let rotated = UIImage(cgImage: cgImage, scale: 1, orientation: .left)
|
|
let controller = ProfileAvatarCropViewController(image: rotated) { _ in }
|
|
controller.loadViewIfNeeded()
|
|
controller.view.frame = CGRect(x: 0, y: 0, width: 390, height: 844)
|
|
controller.view.layoutIfNeeded()
|
|
|
|
let data = try XCTUnwrap(controller.renderedCropData())
|
|
let output = try XCTUnwrap(UIImage(data: data))
|
|
XCTAssertEqual(output.imageOrientation, .up)
|
|
XCTAssertEqual(output.size.width * output.scale, 480)
|
|
XCTAssertEqual(output.size.height * output.scale, 480)
|
|
}
|
|
}
|