Files
4566704 a3d94c4b9f chore: 提交高层 xiaomi 封装库及示例
- 新增 xiaomi/examples/ 下 8 个示例程序(用户/家庭查询、设备列表、开关/灯光/空调控制、属性订阅、高级过滤分类、SPEC 解析)
- miot_client_sub.go: 重构 SubProp/SubEvent,使用 buildPropTopic/buildEventTopic 支持通配符订阅(siid/piid=0 → +),并修复锁顺序问题(将 RequestRefreshProp 移到 Lock 外)
- spec_parser.go: 新增 downloadSpecFile 方法,本地 SPEC 文件缺失时自动从 miot-spec.org 下载
- ARCH_PLAN.md: 架构设计从 Proposed 更新为 Accepted(v1.0→v1.1),补充设备分类/工厂/SPEC 映射等模块设计
- xiaomi/: 新增 miot 上层强类型封装模块,包含 Client 主入口、用户/家庭/设备 API、属性读写、动作调用、订阅通知,以及 devices/ 设备控制抽象(Switch/Light/AirConditioner/Fan/Cover/Humidifier/Vacuum/WaterHeater/Thermostat)和 specs/ SPEC 查询辅助
- 更多 xiaomi 示例(风扇/窗帘/传感器控制)
2026-06-29 08:51:21 +08:00

93 lines
2.0 KiB
Go

package xiaomi
import "testing"
func TestPropHandler(t *testing.T) {
var capturedDID string
var capturedProp *PropertyValue
handler := PropHandler(func(did string, prop *PropertyValue) {
capturedDID = did
capturedProp = prop
})
handler("test.did", &PropertyValue{
DID: "test.did",
SIID: 2,
PIID: 1,
Value: true,
})
if capturedDID != "test.did" {
t.Errorf("captured DID = %q", capturedDID)
}
if capturedProp == nil {
t.Fatal("capturedProp is nil")
}
if capturedProp.SIID != 2 {
t.Errorf("SIID = %d, want 2", capturedProp.SIID)
}
if b, ok := capturedProp.Value.(bool); !ok || !b {
t.Errorf("Value = %v, want true", capturedProp.Value)
}
}
func TestEventHandler(t *testing.T) {
var capturedDID string
var capturedEvent *EventOccurred
handler := EventHandler(func(did string, event *EventOccurred) {
capturedDID = did
capturedEvent = event
})
handler("test.did", &EventOccurred{
DID: "test.did",
SIID: 3,
EIID: 1,
Arguments: map[string]interface{}{"key": "value"},
Timestamp: 1234567890,
})
if capturedDID != "test.did" {
t.Errorf("captured DID = %q", capturedDID)
}
if capturedEvent == nil {
t.Fatal("capturedEvent is nil")
}
if capturedEvent.SIID != 3 {
t.Errorf("SIID = %d", capturedEvent.SIID)
}
if v, ok := capturedEvent.Arguments["key"]; !ok || v.(string) != "value" {
t.Errorf("Arguments = %v", capturedEvent.Arguments)
}
}
func TestDeviceStateHandler(t *testing.T) {
var capturedDID string
var capturedState DeviceState
handler := DeviceStateHandler(func(did string, state DeviceState) {
capturedDID = did
capturedState = state
})
handler("test.did", StateOnline)
if capturedDID != "test.did" {
t.Errorf("captured DID = %q", capturedDID)
}
if capturedState != StateOnline {
t.Errorf("captured state = %q", capturedState)
}
}
func TestDeviceStateConstants(t *testing.T) {
if StateOnline != "online" {
t.Errorf("StateOnline = %q", StateOnline)
}
if StateOffline != "offline" {
t.Errorf("StateOffline = %q", StateOffline)
}
}