From fb653292612eddca5b088ed88466c546d1597107 Mon Sep 17 00:00:00 2001 From: Elizabeth Alexander Hunt Date: Sat, 20 Jun 2026 09:40:07 -0700 Subject: Initial commit --- api/canvas/canvas_test.go | 83 +++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 83 insertions(+) create mode 100644 api/canvas/canvas_test.go (limited to 'api/canvas/canvas_test.go') diff --git a/api/canvas/canvas_test.go b/api/canvas/canvas_test.go new file mode 100644 index 0000000..324a3a1 --- /dev/null +++ b/api/canvas/canvas_test.go @@ -0,0 +1,83 @@ +package canvas + +import ( + "database/sql" + "path/filepath" + "testing" + + "penguins.lan/database" +) + +func canvasTestDB(t *testing.T) *sql.DB { + db, err := sql.Open("sqlite3", filepath.Join(t.TempDir(), "c.db")) + if err != nil { + t.Fatal(err) + } + t.Cleanup(func() { db.Close() }) + if _, err := database.Migrate(db); err != nil { + t.Fatal(err) + } + return db +} + +func pixelAt(buf []byte, x, y int) int { + i := (y*Cols + x) * 3 + return int(buf[i])<<16 | int(buf[i+1])<<8 | int(buf[i+2]) +} + +func TestCurrentCanvasReplaysPixels(t *testing.T) { + db := canvasTestDB(t) + + if _, err := database.SavePixel(db, "u", 1, 2, 0xe50000); err != nil { + t.Fatal(err) + } + + buf, err := currentCanvas(db) + if err != nil { + t.Fatal(err) + } + if got := pixelAt(buf, 1, 2); got != 0xe50000 { + t.Errorf("placed pixel = %06x, want e50000", got) + } + if got := pixelAt(buf, 0, 0); got != defaultColor { + t.Errorf("untouched pixel = %06x, want white", got) + } +} + +func TestSnapshotBakesThenReplays(t *testing.T) { + db := canvasTestDB(t) + + if _, err := database.SavePixel(db, "u", 5, 5, 0x000000); err != nil { + t.Fatal(err) + } + if err := takeSnapshot(db); err != nil { + t.Fatal(err) + } + // a placement after the snapshot must be replayed on top of it + if _, err := database.SavePixel(db, "u", 6, 6, 0x02be01); err != nil { + t.Fatal(err) + } + + buf, err := currentCanvas(db) + if err != nil { + t.Fatal(err) + } + if got := pixelAt(buf, 5, 5); got != 0x000000 { + t.Errorf("baked pixel = %06x, want black", got) + } + if got := pixelAt(buf, 6, 6); got != 0x02be01 { + t.Errorf("replayed pixel = %06x, want green", got) + } + + // snapshots are kept to one row + if err := takeSnapshot(db); err != nil { + t.Fatal(err) + } + var n int + if err := db.QueryRow("SELECT COUNT(*) FROM canvas_snapshots").Scan(&n); err != nil { + t.Fatal(err) + } + if n != 1 { + t.Errorf("snapshot rows = %d, want 1", n) + } +} -- cgit v1.3