Files
MacMonitor/Tests/MMPowerTests.swift
T
gronod 91d50dcbae
MacMonitor CI/CD Pipeline / Build & Test (Intel x86_64) (push) Canceled after 0s
feat(telemetry): implement power, voltage, and current telemetry provider (fixes #19)
2026-09-08 12:25:34 +01:00

102 lines
4.0 KiB
Swift

import XCTest
@testable import MacMonitor
final class MMPowerTests: XCTestCase {
func testUnitsAndNames() {
XCTAssertEqual(MMPowerTelemetryProvider.unit(forKey: "PSTR"), "W")
XCTAssertEqual(MMPowerTelemetryProvider.unit(forKey: "VC0C"), "V")
XCTAssertEqual(MMPowerTelemetryProvider.unit(forKey: "IC0C"), "A")
XCTAssertEqual(MMPowerTelemetryProvider.unit(forKey: "UNKNOWN"), "")
XCTAssertEqual(MMPowerTelemetryProvider.humanReadableName(forKey: "PSTR"), "Total System Power")
XCTAssertEqual(MMPowerTelemetryProvider.humanReadableName(forKey: "VC0C"), "CPU Core Voltage")
XCTAssertEqual(MMPowerTelemetryProvider.humanReadableName(forKey: "IC0C"), "CPU Core Current")
}
func testPowerMetricsCalculationFromSMC() {
let readings: [String: NSNumber] = [
"PSTR": NSNumber(value: 45.2),
"PCPR": NSNumber(value: 28.4),
"PG0R": NSNumber(value: 8.5),
"PMSR": NSNumber(value: 3.1),
"VC0C": NSNumber(value: 1.15),
"IC0C": NSNumber(value: 24.5)
]
let batteryInfo: [String: Any] = [
"powerSource": "AC Power",
"isCharging": false,
"batteryLevel": 100.0,
"batteryWatts": 0.0
]
let metrics = MMPowerTelemetryProvider.calculatePowerMetrics(
withReadings: readings,
batteryInfo: batteryInfo
)
let systemWatts = metrics["systemTotalWatts"] as? Double ?? 0
let cpuWatts = metrics["cpuWatts"] as? Double ?? 0
let gpuWatts = metrics["gpuWatts"] as? Double ?? 0
let memWatts = metrics["memoryWatts"] as? Double ?? 0
let cpuV = metrics["cpuVoltage"] as? Double ?? 0
let cpuI = metrics["cpuCurrent"] as? Double ?? 0
let powerSource = metrics["powerSource"] as? String ?? ""
let sensors = metrics["sensors"] as? [[String: Any]] ?? []
XCTAssertEqual(systemWatts, 45.2, accuracy: 0.1)
XCTAssertEqual(cpuWatts, 28.4, accuracy: 0.1)
XCTAssertEqual(gpuWatts, 8.5, accuracy: 0.1)
XCTAssertEqual(memWatts, 3.1, accuracy: 0.1)
XCTAssertEqual(cpuV, 1.15, accuracy: 0.01)
XCTAssertEqual(cpuI, 24.5, accuracy: 0.1)
XCTAssertEqual(powerSource, "AC Power")
XCTAssertEqual(sensors.count, 6)
}
func testBatteryFallbackCalculation() {
// No PSTR, no PCPR, but VC0C and IC0C are present
let readings: [String: NSNumber] = [
"VC0C": NSNumber(value: 1.2),
"IC0C": NSNumber(value: 10.0)
]
let batteryInfo: [String: Any] = [
"powerSource": "Battery Power",
"isCharging": false,
"batteryLevel": 75.0,
"batteryWatts": 18.5
]
let metrics = MMPowerTelemetryProvider.calculatePowerMetrics(
withReadings: readings,
batteryInfo: batteryInfo
)
let systemWatts = metrics["systemTotalWatts"] as? Double ?? 0
let cpuWatts = metrics["cpuWatts"] as? Double ?? 0
let powerSource = metrics["powerSource"] as? String ?? ""
let isCharging = metrics["isCharging"] as? Bool ?? true
// System watts falls back to batteryWatts (18.5)
XCTAssertEqual(systemWatts, 18.5, accuracy: 0.1)
// CPU watts calculated from V * I = 1.2 * 10.0 = 12.0 W
XCTAssertEqual(cpuWatts, 12.0, accuracy: 0.1)
XCTAssertEqual(powerSource, "Battery Power")
XCTAssertFalse(isCharging)
}
func testLivePowerProvider() throws {
let provider = MMPowerTelemetryProvider()
XCTAssertEqual(provider.domain, .power)
XCTAssertEqual(provider.providerIdentifier, "com.i3omb.macmonitor.telemetry.power")
let sample = try provider.sampleTelemetry()
XCTAssertNotNil(sample)
XCTAssertNotNil(sample["systemTotalWatts"])
XCTAssertNotNil(sample["powerSource"])
XCTAssertNotNil(sample["sensors"])
}
}