// Copyright (c) 2026 Storm Dragon // SPDX-License-Identifier: GPL-3.0-or-later package emoji import ( "strings" "testing" "git.stormux.org/storm/cthulhu/internal/interaction" ) func TestCatalogUniquenessAndSequences(t *testing.T) { seen := map[string]bool{} strip := strings.NewReplacer("\ufe0e", "", "\ufe0f", "") for _, category := range categories { for _, item := range category.choices { id := strip.Replace(item.ID) if seen[id] { t.Fatalf("duplicate presentation: %q", item.ID) } seen[id] = true } } if len(seen) != 501 || !seen["🧑‍🚀"] || !seen["🐐"] || !seen["🎉"] { t.Fatalf("catalog missing entries: %d", len(seen)) } } func TestPickerSearchSelectionAndIndependentCategories(t *testing.T) { session, err := NewSession(true) if err != nil { t.Fatal(err) } if got := session.Opening().Speech; got != "Emoji Menu. All tab" { t.Fatal(got) } session.Handle(interaction.Event{Key: interaction.Tab}) session.Handle(interaction.Event{Text: "astronaut"}) if got := session.Values()["grid"].Selected; got != "🧑‍🚀" { t.Fatalf("sequence changed: %q", got) } // Empty results must not activate or retain a previous selection. session.Handle(interaction.Event{Text: "zz"}) if session.Values()["grid"].Selected != "" || session.Handle(interaction.Event{Key: interaction.Enter}).Activated != "" { t.Fatal("stale selection after empty search") } session.Handle(interaction.Event{Key: interaction.Backspace, Control: true}) session.Handle(interaction.Event{Text: "goat"}) if session.Values()["grid"].Selected != "🐐" { t.Fatal("search not reset") } // Forward and reverse Tab include the checkbox and category strip. session.Handle(interaction.Event{Key: interaction.Tab}) session.Handle(interaction.Event{Text: " "}) if session.Values()["copy"].Checked { t.Fatal("checkbox did not toggle") } session.Handle(interaction.Event{Key: interaction.Tab}) session.Handle(interaction.Event{Key: interaction.Right}) session.Handle(interaction.Event{Key: interaction.Tab}) if strings.Contains(session.Presentation().Speech, "Goat") { t.Fatal("category search leaked") } session.Handle(interaction.Event{Key: interaction.Tab, Shift: true}) session.Handle(interaction.Event{Key: interaction.Left}) session.Handle(interaction.Event{Key: interaction.Tab}) if session.Values()["grid"].Selected != "🐐" { t.Fatal("category search not retained") } if got := session.Handle(interaction.Event{Key: interaction.Enter}).Activated; got != "select-grid-item" { t.Fatal(got) } other, _ := NewSession(true) other.Handle(interaction.Event{Key: interaction.Tab}) if other.Values()["grid"].Selected == "🐐" { t.Fatal("new picker inherited search") } }