package state import ( "encoding/json" "os" "path/filepath" "strings" "testing" ) func TestSetPixel(t *testing.T) { s := New(8, 8) if err := s.SetPixel(3, 4, 5); err != nil { t.Fatal(err) } if got := s.Snapshot().Pixels[4][3]; got != 5 { t.Fatalf("got %d, want 5", got) } if err := s.SetPixel(8, 0, 1); err != ErrOutOfBounds { t.Fatalf("want ErrOutOfBounds, got %v", err) } if err := s.SetPixel(0, 0, 16); err != ErrInvalidColor { t.Fatalf("want ErrInvalidColor, got %v", err) } } func TestStampImage(t *testing.T) { s := New(4, 4) img := []Row{{1, 2}, {3, 4}} if err := s.StampImage(1, 1, img); err != nil { t.Fatal(err) } p := s.Snapshot().Pixels if p[1][1] != 1 || p[1][2] != 2 || p[2][1] != 3 || p[2][2] != 4 { t.Fatalf("unexpected pixels: %v", p) } if err := s.StampImage(3, 3, img); err != nil { t.Fatalf("clipping should succeed: %v", err) } p = s.Snapshot().Pixels if p[3][3] != 1 { t.Fatalf("clipped stamp wrong: %v", p) } big := make([]Row, 33) for i := range big { big[i] = make(Row, 1) } if err := s.StampImage(0, 0, big); err != ErrImageTooBig { t.Fatalf("want ErrImageTooBig, got %v", err) } } func TestMessages(t *testing.T) { s := New(4, 4) if err := s.AddMessage(""); err != ErrEmptyMessage { t.Fatalf("want ErrEmptyMessage, got %v", err) } long := make([]byte, 141) for i := range long { long[i] = 'a' } if err := s.AddMessage(string(long)); err != ErrMessageLong { t.Fatalf("want ErrMessageLong, got %v", err) } for i := 0; i < 60; i++ { if err := s.AddMessage("hi"); err != nil { t.Fatal(err) } } if got := len(s.Snapshot().Messages); got != 50 { t.Fatalf("ring buffer size %d, want 50", got) } } func TestPixelsEncodeAsNumbers(t *testing.T) { s := New(2, 1) s.SetPixel(1, 0, 7) data, err := json.Marshal(s.Snapshot()) if err != nil { t.Fatal(err) } if !strings.Contains(string(data), `"pixels":[[0,7]]`) { t.Fatalf("pixels must encode as number arrays, got %s", data) } } func TestSnapshotRoundtrip(t *testing.T) { s := New(16, 8) s.SetPixel(5, 5, 9) s.AddMessage("hello") path := filepath.Join(t.TempDir(), "snap.json") if err := s.Save(path); err != nil { t.Fatal(err) } loaded, err := Load(path) if err != nil { t.Fatal(err) } snap := loaded.Snapshot() if snap.Width != 16 || snap.Height != 8 { t.Fatalf("dims %dx%d", snap.Width, snap.Height) } if snap.Pixels[5][5] != 9 { t.Fatalf("pixel not preserved") } if len(snap.Messages) != 1 || snap.Messages[0].Text != "hello" { t.Fatalf("messages not preserved: %v", snap.Messages) } if _, err := Load(filepath.Join(t.TempDir(), "missing.json")); !os.IsNotExist(err) { t.Fatalf("want not-exist error, got %v", err) } }