Files
Cyrene_v2/internal/services/backthink/state_test.go
T
AskaEth 3dc1232bc2
CI / Backend (build / vet / test / cross-compile) (push) Has been cancelled
CI / Frontend (tsc + vite build) (push) Has been cancelled
docs(comments): 注释中文化 · internal/runtime/model + internal/services/backthink(54 文件,纯替换)
- 只翻注释/文档字符串:`go/scanner` 剥注释后按 token 序列+literal 逐 token 比对,**54/54 文件 SAME**;
  改动文件总行数与 HEAD 漂移 = 0(严格 1:1,无合并/拆行)
- 裁决编号与 design 节号逐字保留(03.4.1/03.4.2/03.4.3/14.4.1/14.4.5/07.4.2-4、design/04 §3.1/§3.2 等);
  `chat_template_kwargs` / `enable_thinking` / `reasoning_effort` / `thinking:{type}` 字段名与形状说明未动
- 存疑译法(已登记):`persona` 在叙事语境用「角色」、标识符语境保留 `persona`(仓库既有模块本身混用);
  `rung`→「级」;`provider` 存在「提供商/提供者」两种落笔(可按需一键统一)
- 复核:build/vet 绿 + 两包测试绿;gofmt 干净;残留英文注释 0 条
- 既有存量(未修,只报告):`model/anthropic_test.go` 612 行 >500;`applyAnthropicEvent` 115 行 >80
2026-10-04 16:27:54 +08:00

86 lines
2.4 KiB
Go

package backthink
import (
"context"
"errors"
"testing"
"git.yeij.top/AskaEth/Cyrene_v2/internal/config"
"git.yeij.top/AskaEth/Cyrene_v2/internal/iot"
)
// stateMockProvider 是一个极小的 iot.Provider,返回心率手表、
// 睡眠手环与工作日历设备,用于演练状态解码。
type stateMockProvider struct{}
func (stateMockProvider) Name() string { return "state-mock" }
func (stateMockProvider) List(context.Context) ([]iot.Device, error) {
return []iot.Device{
{ID: "watch.heart", Name: "心率手表", Type: "sensor", State: map[string]any{"bpm": 62}},
{ID: "band.sleep", Name: "睡眠手环", Type: "sensor", State: map[string]any{"sleeping": true}},
{ID: "cal.schedule", Name: "日程", State: map[string]any{"working": true}},
}, nil
}
func (stateMockProvider) Control(context.Context, string, string, map[string]any) (*iot.Device, error) {
return nil, iot.ErrUnsupported
}
func (stateMockProvider) Status(context.Context, string) (*iot.Device, error) {
return nil, iot.ErrDeviceNotFound
}
func TestIoTStateProvider_Current(t *testing.T) {
t.Parallel()
mgr, err := iot.New(config.IoTConfig{Provider: "none"}, nil)
if err != nil {
t.Fatalf("iot.New: %v", err)
}
if err := mgr.Register(stateMockProvider{}); err != nil {
t.Fatalf("Register: %v", err)
}
p := NewIoTStateProvider(mgr, nil)
st, err := p.Current(context.Background())
if err != nil {
t.Fatalf("Current: %v", err)
}
if st.HeartRateBPM != 62 {
t.Fatalf("HeartRateBPM = %d, want 62", st.HeartRateBPM)
}
if !st.Sleeping {
t.Fatalf("Sleeping = false, want true")
}
if !st.Working {
t.Fatalf("Working = false, want true")
}
}
func TestIoTStateProvider_NilManager(t *testing.T) {
t.Parallel()
p := NewIoTStateProvider(nil, nil)
_, err := p.Current(context.Background())
if !errors.Is(err, iot.ErrProviderNotRegistered) {
t.Fatalf("err = %v, want ErrProviderNotRegistered", err)
}
}
func TestIoTStateProvider_EmptyNeutral(t *testing.T) {
t.Parallel()
mgr, err := iot.New(config.IoTConfig{Provider: "mock"}, nil)
if err != nil {
t.Fatalf("iot.New: %v", err)
}
p := NewIoTStateProvider(mgr, nil)
// 该 mock 提供者没有心率/睡眠/工作设备,所以它必须给出
// 零值状态而不是错误,保持服务可运行。
st, err := p.Current(context.Background())
if err != nil {
t.Fatalf("Current: %v", err)
}
if st != (UserState{}) {
t.Fatalf("state = %+v, want zero UserState", st)
}
}