feat(ios): refine native ui controls
This commit is contained in:
@@ -4,12 +4,12 @@ import XCTest
|
||||
@testable import MultiSimAdmin
|
||||
|
||||
final class AIThemeTests: XCTestCase {
|
||||
func testControlDimensionsMatchWebScale() {
|
||||
XCTAssertEqual(AITheme.buttonHeight, 38, accuracy: 0.1)
|
||||
XCTAssertEqual(AITheme.compactButtonHeight, 34, accuracy: 0.1)
|
||||
XCTAssertEqual(AITheme.largeButtonHeight, 42, accuracy: 0.1)
|
||||
XCTAssertEqual(AITheme.buttonRadius, 10, accuracy: 0.1)
|
||||
XCTAssertEqual(AITheme.iconButtonSize, 40, accuracy: 0.1)
|
||||
func testControlDimensionsMatchIOS() {
|
||||
XCTAssertEqual(AITheme.buttonHeight, 44, accuracy: 0.1)
|
||||
XCTAssertEqual(AITheme.compactButtonHeight, 40, accuracy: 0.1)
|
||||
XCTAssertEqual(AITheme.largeButtonHeight, 50, accuracy: 0.1)
|
||||
XCTAssertEqual(AITheme.buttonRadius, 12, accuracy: 0.1)
|
||||
XCTAssertEqual(AITheme.iconButtonSize, 44, accuracy: 0.1)
|
||||
}
|
||||
|
||||
func testButtonKindsHaveDistinctBaseColors() {
|
||||
@@ -20,4 +20,23 @@ final class AIThemeTests: XCTestCase {
|
||||
].map(\.backgroundColor)
|
||||
XCTAssertEqual(Set(colors).count, 3)
|
||||
}
|
||||
|
||||
func testDisabledKindsUseReducedButVisibleRendering() {
|
||||
let disabledKinds = [
|
||||
AIButtonStyle.Kind.primary,
|
||||
.secondary,
|
||||
.danger
|
||||
]
|
||||
let disabledColors = disabledKinds.map { $0.backgroundColor(isEnabled: false) }
|
||||
|
||||
XCTAssertEqual(Set(disabledColors).count, disabledKinds.count)
|
||||
XCTAssertEqual(
|
||||
disabledKinds.map { $0.foregroundColor(isEnabled: false) },
|
||||
[
|
||||
.white.opacity(0.72),
|
||||
AITheme.muted,
|
||||
.white.opacity(0.72)
|
||||
]
|
||||
)
|
||||
}
|
||||
}
|
||||
|
||||
@@ -52,6 +52,36 @@ final class FleetViewModelTests: XCTestCase {
|
||||
XCTAssertTrue(model.rows.isEmpty)
|
||||
XCTAssertNil(credentials.saved[row.instance.id])
|
||||
}
|
||||
|
||||
func testDeleteSelectedClearsSelectionAndCredential() async throws {
|
||||
let repository = MemoryInstanceRepository()
|
||||
let credentials = NoopCredentialStore()
|
||||
let model = FleetViewModel(
|
||||
repository: repository,
|
||||
probe: ConnectionProbe(client: AlwaysOnlineClient()),
|
||||
credentials: credentials
|
||||
)
|
||||
try await model.add(InstanceInput(
|
||||
name: "Selected",
|
||||
origin: URL(string: "http://192.168.1.50:3000")!,
|
||||
password: "pass"
|
||||
))
|
||||
try await model.add(InstanceInput(
|
||||
name: "Other",
|
||||
origin: URL(string: "http://192.168.1.60:3000")!,
|
||||
password: nil
|
||||
))
|
||||
let selectedID = model.rows[0].id
|
||||
model.selectionMode = true
|
||||
model.selectedIDs = [selectedID]
|
||||
|
||||
await model.deleteSelected()
|
||||
|
||||
XCTAssertEqual(model.rows.map(\.instance.name), ["Selected"])
|
||||
XCTAssertEqual(credentials.removed, [selectedID])
|
||||
XCTAssertFalse(model.selectionMode)
|
||||
XCTAssertTrue(model.selectedIDs.isEmpty)
|
||||
}
|
||||
}
|
||||
|
||||
struct AlwaysOnlineClient: SimAdminClientProtocol {
|
||||
|
||||
@@ -4,7 +4,7 @@ import XCTest
|
||||
|
||||
final class SettingsViewModelTests: XCTestCase {
|
||||
@MainActor
|
||||
func testLoadsRuntimeAppAndDisabledServerCapabilities() async throws {
|
||||
func testLoadsRuntimeWithoutServerCapabilities() async throws {
|
||||
let store = SettingsMemoryLogStore()
|
||||
let model = SettingsViewModel(store: store)
|
||||
|
||||
@@ -16,8 +16,6 @@ final class SettingsViewModelTests: XCTestCase {
|
||||
XCTAssertEqual(model.runtime?.platform, "iOS")
|
||||
XCTAssertTrue(model.runtime?.deviceModel.isEmpty == false)
|
||||
|
||||
XCTAssertTrue(model.serverCapabilities.isEmpty)
|
||||
XCTAssertEqual(model.serverCapabilitiesNotice, "定时任务与后台刷新已在 iOS 版停用。")
|
||||
XCTAssertNil(model.errorMessage)
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user