74 lines
2.8 KiB
Swift
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)
|
|
}
|
|
}
|
|
}
|