package tokenizer import ( "sync" "testing" ) // 同一模型连续计数应复用同一个 codec(缓存命中),且结果稳定。 func TestCountCachesCodec(t *testing.T) { text := "请帮我分析这段代码的性能问题" first := Count(text, "gpt-4o-mini") if first == 0 { t.Fatal("期望非 0 的 token 数") } c1 := codecFor("gpt-4o-mini") c2 := codecFor("gpt-4o-mini") if c1 != c2 { t.Fatal("同一模型应复用同一个 codec 实例") } if got := Count(text, "gpt-4o-mini"); got != first { t.Fatalf("结果不稳定:%d vs %d", got, first) } } // 未知模型回退 cl100k_base,且不重复构建。 func TestCountUnknownModelFallsBack(t *testing.T) { if got := Count("hello world", "some-unknown-model-x"); got == 0 { t.Fatal("未知模型应回退到 cl100k_base 并给出非 0 结果") } if fallback() != fallback() { t.Fatal("回退编码器应被缓存") } } // 并发调用不得 panic/竞态(-race 下验证)。 func TestCountConcurrent(t *testing.T) { var wg sync.WaitGroup for i := 0; i < 16; i++ { wg.Add(1) go func() { defer wg.Done() for j := 0; j < 50; j++ { if Count("并发测试文本,检查 codec 复用是否安全。", "gpt-4o-mini") == 0 { t.Error("期望非 0") return } } }() } wg.Wait() }