summaryrefslogtreecommitdiff
path: root/internal/render/instructions_test.go
diff options
context:
space:
mode:
authorBenjamin Chausse <benjamin@chausse.xyz>2024-07-11 22:04:29 -0400
committerBenjamin Chausse <benjamin@chausse.xyz>2024-07-11 22:04:29 -0400
commitc55207fe63006ed6e4a1151b91b9bfe5b9c3ff1c (patch)
tree66fcd3325ba43601113f84e12dcc0f6cd04f4359 /internal/render/instructions_test.go
parentc6877f2ca4fdd03c4282e1aa3c9b32358c9ad6ad (diff)
Render Test for Render Instructions
Diffstat (limited to 'internal/render/instructions_test.go')
-rw-r--r--internal/render/instructions_test.go254
1 files changed, 254 insertions, 0 deletions
diff --git a/internal/render/instructions_test.go b/internal/render/instructions_test.go
new file mode 100644
index 0000000..837a143
--- /dev/null
+++ b/internal/render/instructions_test.go
@@ -0,0 +1,254 @@
+package render
+
+import (
+ "testing"
+)
+
+const (
+ errFmt = "Failed: '%v'\nExpected %v, got %v"
+ passFmt = "Passed: '%v'\n"
+)
+
+type testTrim struct {
+ title string
+ input Instruction
+ expectedReach string
+ n int // number of characters to trim
+ d trimDir // FROM which side to trim
+ expected Instruction
+}
+
+var TrimCases []testTrim = []testTrim{
+ {
+ "Trim 2 characters from the left",
+ DrawInstruction{X: 5, Y: 5, Content: "hello"},
+ "\033[5;5H",
+ 2,
+ TrimLeft,
+ DrawInstruction{X: 7, Y: 5, Content: "llo"},
+ },
+ {
+ "Trim 2 characters from the right",
+ DrawInstruction{X: 43, Y: 6, Content: "hello"},
+ "\033[6;43H",
+ 2,
+ TrimRight,
+ DrawInstruction{X: 43, Y: 6, Content: "hel"},
+ },
+ {
+ "Trim 2 characters from the left of a Clear",
+ ClearInstruction{X: 8, Y: 4, Size: 5},
+ "\033[4;8H",
+ 2,
+ TrimLeft,
+ ClearInstruction{X: 10, Y: 4, Size: 3},
+ },
+ {
+ "Trim 2 characters from the right of a Clear",
+ ClearInstruction{X: 98, Y: 76, Size: 5},
+ "\033[76;98H",
+ 2,
+ TrimRight,
+ ClearInstruction{X: 98, Y: 76, Size: 3},
+ },
+ {
+ "Trim 10 characters from the left of a Clear of size 5",
+ ClearInstruction{X: 42, Y: 69, Size: 5},
+ "\033[69;42H",
+ 10,
+ TrimLeft,
+ nil,
+ },
+ {
+ "Trim 10 characters from the right of a Draw of size 5",
+ DrawInstruction{X: 420, Y: 1337, Content: "hello"},
+ "\033[1337;420H",
+ 10,
+ TrimRight,
+ nil,
+ },
+}
+
+type testOverlap struct {
+ title string
+ over, under Instruction
+ overlap overlapType
+ expected []Instruction
+}
+
+var OverlapCases []testOverlap = []testOverlap{
+ {
+ "Two draws that perfectly overlap",
+ DrawInstruction{X: 5, Y: 5, Content: "hello"},
+ DrawInstruction{X: 5, Y: 5, Content: "wadup"},
+ CoverTotal,
+ []Instruction{},
+ },
+ {
+ "Draw + Clear that perfectly overlap",
+ DrawInstruction{X: 5, Y: 5, Content: "hello"},
+ ClearInstruction{X: 5, Y: 5, Size: 5},
+ CoverTotal,
+ []Instruction{},
+ },
+ {
+ "Two Clears that perfectly overlap",
+ ClearInstruction{X: 5, Y: 5, Size: 5},
+ ClearInstruction{X: 5, Y: 5, Size: 5},
+ CoverTotal,
+ []Instruction{},
+ },
+ {
+ "Draw 'More than covers' Clear",
+ DrawInstruction{X: 5, Y: 5, Content: "hello"},
+ ClearInstruction{X: 7, Y: 5, Size: 3},
+ CoverTotal,
+ []Instruction{},
+ },
+ {
+ "Clear Squashes Draw on the left",
+ ClearInstruction{X: 2, Y: 5, Size: 5},
+ DrawInstruction{X: 5, Y: 5, Content: "qwertyuiop"},
+ CoverLeft,
+ []Instruction{
+ DrawInstruction{X: 7, Y: 5, Content: "ertyuiop"},
+ },
+ },
+ {
+ "Clear Squashes Draw on the right",
+ ClearInstruction{X: 5, Y: 5, Size: 10},
+ DrawInstruction{X: 2, Y: 5, Content: "qwertyuiop"},
+ CoverRight,
+ []Instruction{
+ DrawInstruction{X: 2, Y: 5, Content: "qwe"},
+ },
+ },
+ {
+ "Draw is within another Draw",
+ DrawInstruction{X: 7, Y: 5, Content: "yo"},
+ DrawInstruction{X: 5, Y: 5, Content: "hello"},
+ CoverWithin,
+ []Instruction{
+ DrawInstruction{X: 5, Y: 5, Content: "he"},
+ DrawInstruction{X: 9, Y: 5, Content: "o"},
+ },
+ },
+ {
+ "Clear is within another Draw",
+ ClearInstruction{X: 10, Y: 5, Size: 5},
+ DrawInstruction{X: 5, Y: 5, Content: "TheQuickBrownFoxJumpsOverTheLazyDog"},
+ CoverWithin,
+ []Instruction{
+ DrawInstruction{X: 5, Y: 5, Content: "TheQu"},
+ DrawInstruction{X: 15, Y: 5, Content: "ownFoxJumpsOverTheLazyDog"},
+ },
+ },
+
+ {
+ "Two Draws that don't overlap but are on the same row",
+ DrawInstruction{X: 5, Y: 5, Content: "hello"},
+ DrawInstruction{X: 55, Y: 5, Content: "greetings"},
+ CoverNone,
+ []Instruction{
+ DrawInstruction{X: 55, Y: 5, Content: "greetings"},
+ },
+ },
+ {
+ "Two Clears on different rows",
+ ClearInstruction{X: 5, Y: 5, Size: 5},
+ ClearInstruction{X: 5, Y: 12, Size: 5},
+ CoverNone,
+ []Instruction{
+ ClearInstruction{X: 5, Y: 12, Size: 5},
+ },
+ },
+}
+
+func InstructionEquals(a, b Instruction) bool {
+ var drwA, drwB DrawInstruction
+ drwAOk, clrAOk := false, false
+ var clrA, clrB ClearInstruction
+ switch a := a.(type) {
+ case DrawInstruction:
+ drwA = a
+ drwAOk = true
+ case ClearInstruction:
+ clrA = a
+ clrAOk = true
+
+ }
+ switch b := b.(type) {
+ case DrawInstruction:
+ drwB = b
+ if clrAOk { // A is of opposite type (clear)
+ return false
+ }
+ case ClearInstruction:
+ clrB = b
+ if drwAOk { // A is of opposite type (draw)
+ return false
+ }
+ }
+ // If both are draws
+ if drwAOk {
+ if drwA.Content != drwB.Content {
+ return false
+ }
+ if drwA.X != drwB.X || drwA.Y != drwB.Y {
+ return false
+ }
+ }
+ // If both are clears
+ if clrAOk {
+ if clrA.Size != clrB.Size {
+ return false
+ }
+ if clrA.X != clrB.X || clrA.Y != clrB.Y {
+ return false
+ }
+ }
+ return true
+}
+
+func TestTrim(t *testing.T) {
+ for _, tc := range TrimCases {
+ result := tc.input.Trim(tc.n, tc.d)
+ if !InstructionEquals(result, tc.expected) {
+ t.Errorf(errFmt, tc.title, tc.expected, result)
+ }
+ t.Logf(passFmt, tc.title)
+ }
+}
+
+func TestReach(t *testing.T) {
+ for _, tc := range TrimCases {
+ if r := reach(tc.input); r != tc.expectedReach {
+ t.Errorf(errFmt, tc.title, tc.expectedReach, r)
+ }
+ t.Logf(passFmt, tc.title)
+ }
+}
+
+func TestOverlap(t *testing.T) {
+ for _, tc := range OverlapCases {
+ if ot := overlap(tc.over, tc.under); ot != tc.overlap {
+ t.Errorf(errFmt, tc.title, tc.overlap, ot)
+ }
+ t.Logf(passFmt, tc.title)
+ }
+}
+
+func TestSquash(t *testing.T) {
+ for _, tc := range OverlapCases {
+ res := squash(tc.over, tc.under, tc.overlap)
+ if len(res) != len(tc.expected) {
+ t.Errorf(errFmt, tc.title, len(tc.expected), len(res))
+ }
+ for i, r := range res {
+ if !InstructionEquals(r, tc.expected[i]) {
+ t.Errorf(errFmt, tc.title, tc.expected[i], r)
+ }
+ }
+ t.Logf(passFmt, tc.title)
+ }
+}