import Foundation import Testing @testable import phbar // MARK: - Per-monitor resolution // // `PHConfig` exposes one resolution API: `theme`/`window`/`blocks`/ // `monitorOverride`, each taking a pure `(screenName, screenIndex)` pair. // Precedence for every field: override-by-name → override-by-index → global. /// Build a `PHConfig` with sensible defaults so each test only spells out the /// fields it cares about. private func makeConfig( theme: String = "default", window: String = "default", blocks: String? = nil, monitors: [String: PHConfigMonitorOverride]? = nil ) -> PHConfig { PHConfig(theme: theme, window: window, blocks: blocks, env: nil, monitors: monitors) } // MARK: window @Test func windowFallsBackToGlobal() { let config = makeConfig(window: "top") #expect(config.window(screenName: "Built-in", screenIndex: 0) == "top") } @Test func windowMatchesByIndex() { let config = makeConfig(monitors: ["1": .init(window: "bottom", layout: nil)]) #expect(config.window(screenName: "Whatever", screenIndex: 1) == "bottom") } @Test func windowMatchesByName() { let config = makeConfig(monitors: ["DELL U2723QE": .init(window: "clock", layout: nil)]) #expect(config.window(screenName: "DELL U2723QE", screenIndex: 0) == "clock") } @Test func windowPrefersNameOverIndex() { let config = makeConfig(monitors: [ "0": .init(window: "byIndex", layout: nil), "DELL": .init(window: "byName", layout: nil), ]) #expect(config.window(screenName: "DELL", screenIndex: 0) == "byName") } // MARK: blocks @Test func blocksDefaultsToDefault() { #expect(makeConfig().layout(screenName: "S", screenIndex: 0) == "default") } @Test func blocksUsesGlobalWhenNoOverride() { let config = makeConfig(blocks: "main") #expect(config.layout(screenName: "S", screenIndex: 0) == "main") } @Test func blocksOverrideBeatsGlobal() { let config = makeConfig(blocks: "main", monitors: ["1": .init(window: nil, layout: "alt")]) #expect(config.layout(screenName: "S", screenIndex: 1) == "alt") } // MARK: theme @Test func themeFallsBackToGlobal() { let config = makeConfig(theme: "voltage") #expect(config.theme(screenName: "S", screenIndex: 0) == "voltage") } @Test func themeOverrideBeatsGlobal() { let config = makeConfig(theme: "voltage", monitors: ["1": .init(theme: "mono", window: nil, blocks: nil)]) #expect(config.theme(screenName: "S", screenIndex: 1) == "mono") } // MARK: independence @Test func overrideInheritsUnsetFieldsFromGlobal() { // An override that sets only `blocks` still inherits the global window/theme. let config = makeConfig(theme: "voltage", window: "top", monitors: ["1": .init(window: nil, layout: "laptop")]) #expect(config.theme(screenName: "S", screenIndex: 1) == "voltage") #expect(config.window(screenName: "S", screenIndex: 1) == "top") #expect(config.layout(screenName: "S", screenIndex: 1) == "laptop") } @Test func themeWindowAndBlocksResolveIndependently() { let config = makeConfig( theme: "voltage", window: "top", blocks: "main", monitors: [ "DELL": .init(theme: "mono", window: "clock", blocks: nil), // inherits blocks "main" "1": .init(theme: nil, window: nil, blocks: "laptop"), // inherits theme/window ] ) #expect(config.theme(screenName: "DELL", screenIndex: 0) == "mono") #expect(config.window(screenName: "DELL", screenIndex: 0) == "clock") #expect(config.blocks(screenName: "DELL", screenIndex: 0) == "main") #expect(config.theme(screenName: "S", screenIndex: 1) == "voltage") #expect(config.window(screenName: "S", screenIndex: 1) == "top") #expect(config.blocks(screenName: "S", screenIndex: 1) == "laptop") } // MARK: monitorOverride @Test func monitorOverrideReturnsNilWhenTableAbsent() { #expect(makeConfig().monitorOverride(screenName: "S", screenIndex: 0) == nil) } @Test func monitorOverrideReturnsNilForUnmatchedScreen() { let config = makeConfig(monitors: ["DELL": .init(window: "clock", layout: nil)]) #expect(config.monitorOverride(screenName: "Unknown", screenIndex: 99) == nil) }