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) } }