107 lines
3.5 KiB
Swift
107 lines
3.5 KiB
Swift
import XCTest
|
|
@testable import MacTools
|
|
@testable import SystemMutePlugin
|
|
|
|
@MainActor
|
|
final class SystemMutePluginTests: XCTestCase {
|
|
private struct MockController: SystemAudioControlling {
|
|
var muteState: Bool
|
|
var setMuteResult: Bool = true
|
|
|
|
func readMuteState() -> Bool { muteState }
|
|
func setMuteState(_ muted: Bool) -> Bool { setMuteResult }
|
|
}
|
|
|
|
func testMetadataIdentifiesSystemMutePlugin() {
|
|
let plugin = SystemMutePlugin(controller: MockController(muteState: false))
|
|
|
|
XCTAssertEqual(plugin.metadata.id, "system-mute")
|
|
XCTAssertEqual(plugin.metadata.title, "系统静音")
|
|
}
|
|
|
|
func testControlStyleIsSwitch() {
|
|
let plugin = SystemMutePlugin(controller: MockController(muteState: false))
|
|
|
|
XCTAssertEqual(plugin.primaryPanelDescriptor.controlStyle, .switch)
|
|
}
|
|
|
|
func testPanelStateReflectsUnmutedStatus() {
|
|
let plugin = SystemMutePlugin(controller: MockController(muteState: false))
|
|
|
|
XCTAssertFalse(plugin.primaryPanelState.isOn)
|
|
XCTAssertEqual(plugin.primaryPanelState.subtitle, "未静音")
|
|
}
|
|
|
|
func testPanelStateReflectsMutedStatus() {
|
|
let plugin = SystemMutePlugin(controller: MockController(muteState: true))
|
|
|
|
XCTAssertTrue(plugin.primaryPanelState.isOn)
|
|
XCTAssertEqual(plugin.primaryPanelState.subtitle, "已静音")
|
|
}
|
|
|
|
func testPanelStateIsAlwaysEnabled() {
|
|
let plugin = SystemMutePlugin(controller: MockController(muteState: false))
|
|
|
|
XCTAssertTrue(plugin.primaryPanelState.isEnabled)
|
|
}
|
|
|
|
func testPermissionRequirementsIsEmpty() {
|
|
let plugin = SystemMutePlugin(controller: MockController(muteState: false))
|
|
|
|
XCTAssertTrue(plugin.permissionRequirements.isEmpty)
|
|
}
|
|
|
|
func testPluginHostIncludesSystemMuteWhenProvided() {
|
|
let host = makePluginHostForTests(plugins: [SystemMutePlugin(controller: MockController(muteState: false))])
|
|
|
|
XCTAssertTrue(host.featureManagementItems.contains { $0.id == "system-mute" })
|
|
}
|
|
|
|
func testHandleActionMutesWhenSwitchedOn() {
|
|
let plugin = SystemMutePlugin(controller: MockController(muteState: false))
|
|
|
|
plugin.handleAction(.setSwitch(true))
|
|
|
|
XCTAssertTrue(plugin.primaryPanelState.isOn)
|
|
XCTAssertNil(plugin.primaryPanelState.errorMessage)
|
|
}
|
|
|
|
func testHandleActionUnmutesWhenSwitchedOff() {
|
|
let plugin = SystemMutePlugin(controller: MockController(muteState: true))
|
|
|
|
plugin.handleAction(.setSwitch(false))
|
|
|
|
XCTAssertFalse(plugin.primaryPanelState.isOn)
|
|
XCTAssertNil(plugin.primaryPanelState.errorMessage)
|
|
}
|
|
|
|
func testHandleActionOnFailureSetsErrorMessage() {
|
|
let plugin = SystemMutePlugin(controller: MockController(muteState: false, setMuteResult: false))
|
|
|
|
plugin.handleAction(.setSwitch(true))
|
|
|
|
XCTAssertFalse(plugin.primaryPanelState.isOn)
|
|
XCTAssertNotNil(plugin.primaryPanelState.errorMessage)
|
|
}
|
|
|
|
func testRefreshDoesNotCallOnStateChangeWhenStateUnchanged() {
|
|
let plugin = SystemMutePlugin(controller: MockController(muteState: false))
|
|
var callCount = 0
|
|
plugin.onStateChange = { callCount += 1 }
|
|
|
|
plugin.refresh()
|
|
|
|
XCTAssertEqual(callCount, 0)
|
|
}
|
|
|
|
func testHandleActionCallsOnStateChange() {
|
|
let plugin = SystemMutePlugin(controller: MockController(muteState: false))
|
|
var callCount = 0
|
|
plugin.onStateChange = { callCount += 1 }
|
|
|
|
plugin.handleAction(.setSwitch(true))
|
|
|
|
XCTAssertEqual(callCount, 1)
|
|
}
|
|
}
|