Files
MacMonitor/Tests/MMSMCTests.swift
T

74 lines
2.8 KiB
Swift

import XCTest
@testable import MacMonitor
final class MMSMCTests: XCTestCase {
func testSP78TemperatureDecoding() {
// 0x36, 0x80 -> 54.5°C in sp78 (signed 8.8 fixed point: 0x36 = 54, 0x80 = 128 / 256 = 0.5)
let bytes: [UInt8] = [0x36, 0x80]
let temp = MMSMCParser.decodeSP78(bytes)
XCTAssertEqual(Double(temp), 54.5, accuracy: 0.001)
// Negative temperature: -10.25°C -> -10.25 * 256 = -2624 = 0xF5C0
let negBytes: [UInt8] = [0xF5, 0xC0]
let negTemp = MMSMCParser.decodeSP78(negBytes)
XCTAssertEqual(Double(negTemp), -10.25, accuracy: 0.001)
}
func testFPE2FanRPMDecoding() {
// 1800 RPM in fpe2 (unsigned 14.2 fixed point: 1800 * 4 = 7200 = 0x1C20)
let bytes: [UInt8] = [0x1C, 0x20]
let rpm = MMSMCParser.decodeFPE2(bytes)
XCTAssertEqual(Double(rpm), 1800.0, accuracy: 0.001)
// 2450.5 RPM: 2450.5 * 4 = 9802 = 0x264A
let bytesFrac: [UInt8] = [0x26, 0x4A]
let rpmFrac = MMSMCParser.decodeFPE2(bytesFrac)
XCTAssertEqual(Double(rpmFrac), 2450.5, accuracy: 0.001)
}
func testFLTDecoding() {
// 3.14159f in IEEE 754 float
var original: Float = 3.14159
let bytes = withUnsafeBytes(of: &original) { Array($0) }
let decoded = MMSMCParser.decodeFLT(bytes)
XCTAssertEqual(Double(decoded), 3.14159, accuracy: 0.0001)
}
func testIntegerDecoding() {
// UI8
let byteUI8: [UInt8] = [0x7F]
XCTAssertEqual(MMSMCParser.decodeUI8(byteUI8), 127)
// UI16 big endian (0x1234 = 4660)
let bytesUI16: [UInt8] = [0x12, 0x34]
XCTAssertEqual(MMSMCParser.decodeUI16(bytesUI16), 4660)
// UI32 big endian (0x12345678 = 305419896)
let bytesUI32: [UInt8] = [0x12, 0x34, 0x56, 0x78]
XCTAssertEqual(MMSMCParser.decodeUI32(bytesUI32), 305419896)
}
func testGenericDecoderWithType() {
let tempBytes: [UInt8] = [0x41, 0x00] // 65.0°C in sp78
let val = MMSMCParser.decodeValue(withDataType: "sp78", bytes: tempBytes, size: 2)
XCTAssertNotNil(val)
XCTAssertEqual(val?.doubleValue ?? 0, 65.0, accuracy: 0.001)
let flagBytes: [UInt8] = [0x01]
let flagVal = MMSMCParser.decodeValue(withDataType: "flag", bytes: flagBytes, size: 1)
XCTAssertNotNil(flagVal)
XCTAssertEqual(flagVal?.boolValue, true)
}
func testSMCClientSingletonAndKeyCount() {
let client = MMAppleSMCClient.shared
XCTAssertNotNil(client)
// On physical Intel Macs, client.isAvailable should be true and totalKeyCount > 0.
// In headless environments or VMs without AppleSMC, it gracefully degrades.
if client.isAvailable {
XCTAssertGreaterThan(client.totalKeyCount, 0)
}
}
}