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 示例(风扇/窗帘/传感器控制)
This commit is contained in:
@@ -0,0 +1,92 @@
|
||||
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)
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user