summaryrefslogtreecommitdiff
path: root/api/canvas/canvas_test.go
diff options
context:
space:
mode:
Diffstat (limited to 'api/canvas/canvas_test.go')
-rw-r--r--api/canvas/canvas_test.go83
1 files changed, 83 insertions, 0 deletions
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)
+ }
+}