package queue import ( "io" "math/rand/v2" "testing" "github.com/go-json-experiment/json" "github.com/go-json-experiment/json/jsontext" ) func TestSenderUnique(t *testing.T) { // Salt, channel, and user should all produce differences in the sender ID. base := Sender([]byte("nijika"), "kessoku", "bocchi") salt := Sender([]byte("kita"), "kessoku", "bocchi") channel := Sender([]byte("nijika"), "sickhack", "bocchi") user := Sender([]byte("nijika"), "kessoku", "ryō") m := map[sender]struct{}{ base: {}, salt: {}, channel: {}, user: {}, } if len(m) != 4 { t.Errorf("collision:\nbase: %v\nsalt: %v\nchan: %v\nuser: %v", base, salt, channel, user) } } func TestSenderRoundTrip(t *testing.T) { want := Sender([]byte("nijika"), "kessoku", "bocchi") b, err := json.Marshal(want) if err != nil { t.Errorf("encode failed: %v", err) } var got sender if err := json.Unmarshal(b, &got); err != nil { t.Errorf("decode failed: %v", err) } if want != got { t.Errorf("round-trip failed:\nwant %v\ngot %v", want, got) } } func BenchmarkSenderEncode(b *testing.B) { enc := jsontext.NewEncoder(io.Discard) opts := []*sender{ // pointers to avoid allocations ref(Sender([]byte("nijika"), "kessoku", "bocchi")), ref(Sender([]byte("kita"), "kessoku", "bocchi")), ref(Sender([]byte("nijika"), "sickhack", "bocchi")), ref(Sender([]byte("nijika"), "kessoku", "ryō")), ref(Sender([]byte("nijika"), "kessoku", "bocchi2")), ref(Sender([]byte("kita"), "kessoku", "bocchi2")), ref(Sender([]byte("nijika"), "sickhack", "bocchi2")), ref(Sender([]byte("nijika"), "kessoku", "ryō2")), } b.ReportAllocs() for b.Loop() { json.MarshalEncode(enc, opts[rand.IntN(len(opts))]) } } func BenchmarkSenderDecode(b *testing.B) { opts := [][]byte{ must(json.Marshal(Sender([]byte("nijika"), "kessoku", "bocchi"))), must(json.Marshal(Sender([]byte("kita"), "kessoku", "bocchi"))), must(json.Marshal(Sender([]byte("nijika"), "sickhack", "bocchi"))), must(json.Marshal(Sender([]byte("nijika"), "kessoku", "ryō"))), must(json.Marshal(Sender([]byte("nijika"), "kessoku", "bocchi2"))), must(json.Marshal(Sender([]byte("kita"), "kessoku", "bocchi2"))), must(json.Marshal(Sender([]byte("nijika"), "sickhack", "bocchi2"))), must(json.Marshal(Sender([]byte("nijika"), "kessoku", "ryō2"))), } b.ReportAllocs() var v sender for b.Loop() { json.Unmarshal(opts[rand.IntN(len(opts))], &v) } } func ref[T any](x T) *T { return &x } func must[T any](x T, err error) T { if err != nil { panic(err) } return x }