// // AppThemeTokensTests.swift // suixinkanTests // import UIKit import XCTest @testable import suixinkan /// Design Token 值与 Android 对齐校验。 final class AppThemeTokensTests: XCTestCase { func testPrimaryColorMatchesAndroid() { XCTAssertEqual(AppColor.primary.hexRGB, 0x0073FF) } func testPageBackgroundColors() { XCTAssertEqual(AppColor.pageBackground.hexRGB, 0xF5F5F5) XCTAssertEqual(AppColor.pageBackgroundSoft.hexRGB, 0xF7FAFF) } func testTextColorsMatchAndroid() { XCTAssertEqual(AppColor.textPrimary.hexRGB, 0x333333) XCTAssertEqual(AppColor.textSecondary.hexRGB, 0x666666) XCTAssertEqual(AppColor.textTertiary.hexRGB, 0x999999) } func testSemanticStatusColors() { XCTAssertEqual(AppColor.success.hexRGB, 0x10B981) XCTAssertEqual(AppColor.danger.hexRGB, 0xEF4444) XCTAssertEqual(AppColor.warning.hexRGB, 0xFF7B00) XCTAssertEqual(AppColor.info.hexRGB, 0x0073FF) } func testSpacingGrid() { XCTAssertEqual(AppSpacing.xxs, 4) XCTAssertEqual(AppSpacing.xs, 8) XCTAssertEqual(AppSpacing.sm, 12) XCTAssertEqual(AppSpacing.md, 16) XCTAssertEqual(AppSpacing.lg, 24) XCTAssertEqual(AppSpacing.screenHorizontalInset, AppSpacing.md) XCTAssertEqual(AppSpacing.minTouchTarget, 44) XCTAssertGreaterThanOrEqual(AppSpacing.buttonHeight, AppSpacing.minTouchTarget) } func testRadiusTokens() { XCTAssertEqual(AppRadius.xs, 4) XCTAssertEqual(AppRadius.md, 10) XCTAssertEqual(AppRadius.lg, 12) XCTAssertEqual(AppRadius.xl, 16) } func testAppFontSizes() { XCTAssertEqual(UIFont.app(.body).pointSize, 14) XCTAssertEqual(UIFont.app(.metric).pointSize, 18) XCTAssertEqual(UIFont.app(.display).pointSize, 28) } func testStatusBadgeOrderMapping() { let badge = AppStatusBadge() badge.applyOrderStatus(30, text: "已完成") // 布局完成后仍应能读取子 label 文案 XCTAssertFalse(badge.isHidden) } } private extension UIColor { var hexRGB: UInt { var red: CGFloat = 0 var green: CGFloat = 0 var blue: CGFloat = 0 var alpha: CGFloat = 0 getRed(&red, green: &green, blue: &blue, alpha: &alpha) let r = Int(round(red * 255)) let g = Int(round(green * 255)) let b = Int(round(blue * 255)) return UInt(r << 16 | g << 8 | b) } }