Files

264 lines
5.4 KiB
Go

package state_test
import (
"testing"
"github.com/StevanFreeborn/term-tier/internal/core"
"github.com/StevanFreeborn/term-tier/internal/state"
tea "github.com/charmbracelet/bubbletea"
)
func TestNew_Defaults(t *testing.T) {
s := state.New()
if s.Mode() != state.NavigationMode {
t.Errorf("Expected default mode NavigationMode, got %v", s.Mode())
}
tiers := s.Tiers()
if len(tiers) != 6 {
t.Errorf("Expected 6 default tiers, got %d", len(tiers))
}
if tiers[0].Name != "S Tier" {
t.Errorf("Expected first tier to be 'S Tier', got '%s'", tiers[0].Name)
}
if s.CursorRow() != 5 {
t.Errorf("Expected cursor to start at row 5 (Pool), got %d", s.CursorRow())
}
if s.CursorCol() != 0 {
t.Errorf("Expected cursor to start at col 0, got %d", s.CursorCol())
}
}
func TestInputMode_Flow(t *testing.T) {
s := state.New()
triggered := false
s.StartInputMode("Title", func(v string, _ state.State) tea.Cmd {
triggered = true
return nil
})
if s.Mode() != state.InputMode {
t.Fatal("Failed to enter input mode")
}
s.SubmitInput()
if !triggered {
t.Error("SubmitInput failed to trigger callback")
}
if s.Mode() != state.NavigationMode {
t.Error("SubmitInput failed to reset mode to Navigation")
}
}
func TestAddItem(t *testing.T) {
s := state.New()
initialPoolSize := len(s.Tiers()[5].Items)
s.AddItemToPool("New Item")
newPool := s.Tiers()[5].Items
if len(newPool) != initialPoolSize+1 {
t.Errorf("Expected pool size to increase by 1, got %d", len(newPool))
}
if newPool[len(newPool)-1] != "New Item" {
t.Error("Item was not appended to the end of the pool")
}
}
func TestNavigation_Movement(t *testing.T) {
fullTiers := make([]core.Tier, 6)
fullTiers[0] = core.Tier{Name: "S", Items: []core.Item{"1", "2", "3"}}
fullTiers[1] = core.Tier{Name: "A", Items: []core.Item{"4"}}
s := state.New(state.WithTiers(fullTiers), state.WithCursor(0, 0))
s.MoveRight()
if s.CursorCol() != 1 {
t.Errorf("Expected Col 1, got %d", s.CursorCol())
}
s.MoveRight()
s.MoveRight()
if s.CursorCol() != 2 {
t.Errorf("Expected Col 2, got %d", s.CursorCol())
}
s.MoveLeft()
if s.CursorCol() != 1 {
t.Errorf("Expected Col 1 after MoveLeft, got %d", s.CursorCol())
}
s.MoveLeft()
s.MoveLeft()
if s.CursorCol() != 0 {
t.Error("Cursor went out of bounds left")
}
s.MoveRight()
s.MoveRight()
s.MoveDown()
if s.CursorRow() != 1 {
t.Errorf("Expected Row 1, got %d", s.CursorRow())
}
if s.CursorCol() != 0 {
t.Errorf("Expected Col to clamp to 0, got %d", s.CursorCol())
}
s.MoveUp()
if s.CursorRow() != 0 {
t.Error("Expected to return to Row 0")
}
}
func TestDragAndDrop(t *testing.T) {
tiers := make([]core.Tier, 6)
tiers[0] = core.Tier{Name: "0", Items: []core.Item{"A", "B"}}
tiers[1] = core.Tier{Name: "1", Items: []core.Item{"C"}}
s := state.New(state.WithTiers(tiers), state.WithCursor(0, 0))
s.SelectItem()
if !s.Dragging() {
t.Fatal("Expected dragging to be true")
}
s.MoveRight()
items := s.Tiers()[0].Items
if items[0] != "B" || items[1] != "A" {
t.Errorf("Expected swap [B, A], got %v", items)
}
s.MoveDown()
if len(s.Tiers()[0].Items) != 1 || s.Tiers()[0].Items[0] != "B" {
t.Error("Row 0 should only contain 'B'")
}
row1 := s.Tiers()[1].Items
if len(row1) != 2 {
t.Errorf("Row 1 should have 2 items, got %d", len(row1))
}
if row1[0] != "A" {
t.Errorf("Expected 'A' at index 0, got %v", row1)
}
s.SelectItem()
if s.Dragging() {
t.Error("Expected dragging to stop")
}
}
func TestDeleteItem(t *testing.T) {
tiers := make([]core.Tier, 6)
tiers[0] = core.Tier{Name: "0", Items: []core.Item{"DeleteMe", "KeepMe"}}
s := state.New(state.WithTiers(tiers), state.WithCursor(0, 0))
s.DeleteItem()
items := s.Tiers()[0].Items
if len(items) != 1 {
t.Fatalf("Expected 1 item remaining, got %d", len(items))
}
if items[0] != "KeepMe" {
t.Errorf("Expected 'KeepMe', got '%s'", items[0])
}
if s.StatusMsg() != "Item Deleted" {
t.Error("Status message not set")
}
}
func TestSaveLoad(t *testing.T) {
tiers := make([]core.Tier, 6)
tiers[0] = core.Tier{Name: "S", Items: []core.Item{"UniqueData"}}
s1 := state.New(state.WithTiers(tiers))
savedData := s1.Save()
s2 := state.New()
s2.Load(savedData)
loadedItem := s2.Tiers()[0].Items[0]
if loadedItem != "UniqueData" {
t.Errorf("Failed to persist data. Got '%s'", loadedItem)
}
}
func TestUpdateItem(t *testing.T) {
tiers := make([]core.Tier, 6)
tiers[0] = core.Tier{Name: "0", Items: []core.Item{"OldName"}}
s := state.New(state.WithTiers(tiers), state.WithCursor(0, 0))
cmd := s.UpdateItem()
if s.Mode() != state.InputMode {
t.Fatal("UpdateItem should trigger InputMode")
}
if cmd == nil {
t.Error("UpdateItem should return command")
}
if s.Input().Value() != "OldName" {
t.Errorf("Expected input to be pre-filled with 'OldName', got '%s'", s.Input().Value())
}
s.UpdateCurrentItem("NewName")
if s.Tiers()[0].Items[0] != "NewName" {
t.Errorf("Item was not renamed. Got '%s'", s.Tiers()[0].Items[0])
}
}
func TestWindowSize(t *testing.T) {
s := state.New()
s.SetWindowSize(100, 50)
if s.WindowWidth() != 100 || s.WindowHeight() != 50 {
t.Error("SetWindowSize failed")
}
}
func TestToggleHelp(t *testing.T) {
s := state.New(state.WithMode(state.NavigationMode))
s.ToggleHelp()
if s.Mode() != state.HelpMode {
t.Error("Expected HelpMode")
}
s.ToggleHelp()
if s.Mode() != state.NavigationMode {
t.Error("Expected NavigationMode")
}
}