package vote import ( "testing" ) // TestAppendUniqueValue 钉住多选字段的去重语义: // 客户端重复提交同一选项时,落库与统计都只能算一次。 func TestAppendUniqueValue(t *testing.T) { t.Run("重复值只保留第一次", func(t *testing.T) { seen := map[string]bool{} var got []string for _, v := range []string{"A", "A", "B", "A", "B", "C"} { got = appendUniqueValue(got, seen, v) } want := []string{"A", "B", "C"} if len(got) != len(want) { t.Fatalf("got %v, want %v", got, want) } for i := range want { if got[i] != want[i] { t.Fatalf("got %v, want %v(顺序应按首次出现)", got, want) } } }) t.Run("空切片与单值", func(t *testing.T) { seen := map[string]bool{} var got []string got = appendUniqueValue(got, seen, "只有一项") if len(got) != 1 || got[0] != "只有一项" { t.Fatalf("got %v", got) } }) t.Run("seen 复用时跨批次仍然去重", func(t *testing.T) { // checkbox 的「其他」文本与预置值走同一条追加路径, // seen 必须在整个字段解析期间共享,而不是每轮新建。 seen := map[string]bool{} var got []string got = appendUniqueValue(got, seen, "预置") got = appendUniqueValue(got, seen, "其他文本") got = appendUniqueValue(got, seen, "预置") if len(got) != 2 { t.Fatalf("got %v, want 2 项", got) } }) }