104 lines
4.7 KiB
Swift
104 lines
4.7 KiB
Swift
// Copyright (C) 2026 ysicing
|
|
// SPDX-License-Identifier: AGPL-3.0-or-later
|
|
|
|
import AppKit
|
|
import Foundation
|
|
import Localization
|
|
import Testing
|
|
@testable import XStatsUI
|
|
|
|
@MainActor
|
|
struct ProcessFeatureTests {
|
|
private func defaults() -> UserDefaults {
|
|
UserDefaults(suiteName: "ProcessFeatureTests.\(UUID())")!
|
|
}
|
|
|
|
@Test func defaultsOffAndRejectsSavedOrDirectProcessRoutes() {
|
|
let defaults = defaults()
|
|
defaults.set("processes", forKey: "panelTab")
|
|
let settings = AppSettings(defaults: defaults)
|
|
#expect(!settings.processesEnabled)
|
|
#expect(settings.panelTab == .settingsGeneral)
|
|
settings.panelTab = .processes
|
|
#expect(settings.panelTab == .settingsGeneral)
|
|
#expect(defaults.string(forKey: "panelTab") == "settingsGeneral")
|
|
settings.processesEnabled = true
|
|
settings.panelTab = .processes
|
|
let restored = AppSettings(defaults: defaults)
|
|
#expect(restored.processesEnabled && restored.panelTab == .processes)
|
|
settings.processesEnabled = false
|
|
#expect(settings.panelTab == .settingsGeneral)
|
|
#expect(!AppSettings(defaults: defaults).processesEnabled)
|
|
}
|
|
|
|
@Test func disablingProcessPageStopsSystemSamplingWithoutDisablingCPUDetails() {
|
|
let settings = AppSettings(defaults: defaults())
|
|
let model = AppModel(settings: settings, historyURL: nil, aiUsageProviders: [])
|
|
model.isMainWindowVisible = true
|
|
settings.processesEnabled = true
|
|
settings.panelTab = .processes
|
|
#expect(model.demand.processes && model.demand.systemProcesses)
|
|
settings.processesEnabled = false
|
|
#expect(!model.demand.processes && !model.demand.systemProcesses)
|
|
model.openPopover = .cpu
|
|
#expect(model.demand.processes && !model.demand.systemProcesses)
|
|
model.openPopover = nil
|
|
settings.processesEnabled = true
|
|
settings.panelTab = .processes
|
|
model.isMainWindowVisible = false
|
|
#expect(!model.demand.processes && !model.demand.systemProcesses)
|
|
}
|
|
|
|
@Test func shortcutKeepsItsBindingAndRoutesToTheEnabledDestination() {
|
|
let settings = AppSettings(defaults: defaults())
|
|
let model = AppModel(settings: settings, historyURL: nil, aiUsageProviders: [])
|
|
var systemLaunches = 0
|
|
var pages: [PanelTab?] = []
|
|
model.openActivityMonitor = { systemLaunches += 1 }
|
|
model.openMainWindow = { pages.append($0) }
|
|
let key = HotKey(keyCode: 35, modifiers: [.command, .option], key: "p")
|
|
settings.hotKeys[.showProcesses] = key
|
|
let initialPage = settings.panelTab
|
|
model.openProcessMonitor()
|
|
#expect(systemLaunches == 1 && pages.isEmpty)
|
|
#expect(!settings.processesEnabled && settings.panelTab == initialPage)
|
|
#expect(HotKeyAction.showProcesses.title(processesEnabled: false) == tr("打开系统活动监视器"))
|
|
settings.processesEnabled = true
|
|
model.openProcessMonitor()
|
|
#expect(systemLaunches == 1 && pages == [.processes])
|
|
#expect(HotKeyAction.showProcesses.title(processesEnabled: true) == tr("打开进程页"))
|
|
settings.processesEnabled = false
|
|
model.openProcessMonitor()
|
|
#expect(systemLaunches == 2 && pages == [.processes])
|
|
#expect(settings.hotKeys[.showProcesses] == key)
|
|
}
|
|
|
|
@Test func disabledFeatureDoesNotStartAnExplanationOrOpenItsPage() {
|
|
let settings = AppSettings(defaults: defaults())
|
|
let model = AppModel(settings: settings, historyURL: nil, aiUsageProviders: [])
|
|
var opened = false
|
|
model.openMainWindow = { _ in opened = true }
|
|
model.explainProcess(.init(pid: 42, name: "fixture", displayName: "fixture", executablePath: nil,
|
|
appBundlePath: nil, cpu: nil, memory: nil, networkRate: nil))
|
|
#expect(!opened && settings.panelTab != .processes)
|
|
#expect(model.explainer.subject == nil && model.explainer.phase == .idle)
|
|
}
|
|
|
|
@Test func backupRoundTripsPreferenceAndOldDocumentsPreserveIt() throws {
|
|
let source = AppSettings(defaults: defaults())
|
|
source.processesEnabled = true
|
|
let data = try JSONEncoder().encode(source.exportDocument())
|
|
let decoded = try JSONDecoder().decode(SettingsDocument.self, from: data)
|
|
let target = AppSettings(defaults: defaults())
|
|
target.apply(decoded)
|
|
#expect(target.processesEnabled)
|
|
target.apply(try JSONDecoder().decode(SettingsDocument.self, from: Data("{}".utf8)))
|
|
#expect(target.processesEnabled)
|
|
var disabled = SettingsDocument()
|
|
disabled.processesEnabled = false
|
|
target.panelTab = .processes
|
|
target.apply(disabled)
|
|
#expect(!target.processesEnabled && target.panelTab == .settingsGeneral)
|
|
}
|
|
}
|