diff options
author | Benjamin Chausse <benjamin@chausse.xyz> | 2024-07-11 22:04:29 -0400 |
---|---|---|
committer | Benjamin Chausse <benjamin@chausse.xyz> | 2024-07-11 22:04:29 -0400 |
commit | c55207fe63006ed6e4a1151b91b9bfe5b9c3ff1c (patch) | |
tree | 66fcd3325ba43601113f84e12dcc0f6cd04f4359 /internal/render/instructions_test.go | |
parent | c6877f2ca4fdd03c4282e1aa3c9b32358c9ad6ad (diff) |
Render Test for Render Instructions
Diffstat (limited to 'internal/render/instructions_test.go')
-rw-r--r-- | internal/render/instructions_test.go | 254 |
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) + } +} |