Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion pitest/pitest.go
Original file line number Diff line number Diff line change
Expand Up @@ -37,7 +37,7 @@ func AssertSurfaceEqual[T comparable](t *testing.T, expected, actual pi.Surface[
if !hasDifferentData {
t.Errorf("\nexpected:\n%s\nactual:\n%s", expected, actual)
}
t.Errorf("expected pixel at (%d,%d): %v, actual: %v", x, y, e, a)
t.Errorf("expected at (%d,%d): %v, actual: %v", x, y, e, a)
hasDifferentData = true
equal = false
}
Expand Down
2 changes: 1 addition & 1 deletion surface.go
Original file line number Diff line number Diff line change
Expand Up @@ -243,7 +243,7 @@ func (m Surface[T]) EntireArea() IntArea {
}

func (m Surface[T]) Clear(v T) {
// color only first line
// color only the first line
var firstLine = m.data[:m.width]
for i := 0; i < m.width; i++ {
firstLine[i] = v
Expand Down
125 changes: 108 additions & 17 deletions surface_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -207,14 +207,52 @@ func TestSurface_SetSurface(t *testing.T) {
}

func TestSurface_LinesIterator(t *testing.T) {
// temporary test
surface := pi.NewSurface[int](2, 2)
for range surface.LinesIterator(pi.IntArea{W: 2, H: 2}) {
}
surface := pi.NewSurface[rune](4, 3)
surface.SetAll(
'a', 'b', 'c', 'd',
'e', 'f', 'g', 'h',
'i', 'j', 'k', 'l',
)

t.Run("iterate over area", func(t *testing.T) {
area := pi.IntArea{X: 1, Y: 1, W: 2, H: 2}
expectedPos := []pi.Position{
{1, 1},
{1, 2},
}
expectedLines := [][]rune{
{'f', 'g'},
{'j', 'k'},
}

var i int
for pos, line := range surface.LinesIterator(area) {
require.Less(t, i, len(expectedPos))
assert.Equal(t, expectedPos[i], pos)
assert.Equal(t, expectedLines[i], line)
i++
}
assert.Equal(t, len(expectedPos), i)
})

t.Run("modifies underlying data", func(t *testing.T) {
area := pi.IntArea{X: 1, Y: 1, W: 2, H: 1}
for _, line := range surface.LinesIterator(area) {
line[0] = 'z'
}
assert.Equal(t, 'z', surface.Get(1, 1))
})

t.Run("panic on area outside surface", func(t *testing.T) {
area := pi.IntArea{X: -1, Y: 0, W: 2, H: 1}
require.Panics(t, func() {
for range surface.LinesIterator(area) {
}
})
})
}

func BenchmarkSurface_LinesIterator(b *testing.B) {
// temporary test
surface := pi.NewSurface[int](2, 2)
area := pi.IntArea{W: 2, H: 2}
b.ResetTimer()
Expand All @@ -227,18 +265,71 @@ func BenchmarkSurface_LinesIterator(b *testing.B) {
}

func TestSurface_SetMany(t *testing.T) {
// temporary test
canvas := pi.NewCanvas(4, 4)
canvas.SetMany(1, 1,
2, 3, 4, 5)
canvas.SetMany(-1, 0,
2, 3, 4, 5)
canvas.SetMany(0, -1,
2, 3, 4, 5)
canvas.SetMany(3, 3,
2, 3, 4, 5)
canvas.SetMany(4, 4,
2, 3, 4, 5)
t.Run("inside surface", func(t *testing.T) {
surface := pi.NewSurface[rune](3, 2)
// when
surface.SetMany(1, 0, 'a', 'b', 'c', 'd')
// then
expected := pi.NewSurface[rune](3, 2)
expected.Set(1, 0, 'a')
expected.Set(2, 0, 'b')
expected.Set(0, 1, 'c')
expected.Set(1, 1, 'd')

pitest.AssertSurfaceEqual(t, expected, surface)
})

t.Run("partially outside left", func(t *testing.T) {
surface := pi.NewSurface[rune](3, 2)
// when
surface.SetMany(-1, 0, 'a', 'b', 'c')
// then
expected := pi.NewSurface[rune](3, 2)
expected.Set(0, 0, 'b')
expected.Set(1, 0, 'c')

pitest.AssertSurfaceEqual(t, expected, surface)
})

t.Run("partially outside top", func(t *testing.T) {
surface := pi.NewSurface[rune](2, 2)
// when
surface.SetMany(0, -1, 'a', 'b', 'c')
// then
expected := pi.NewSurface[rune](2, 2)
expected.Set(0, 0, 'c')

pitest.AssertSurfaceEqual(t, expected, surface)
})

t.Run("start far left with too few values", func(t *testing.T) {
surface := pi.NewSurface[rune](2, 2)
original := surface.Clone()
// when
surface.SetMany(-3, 0, 'a')
// then
pitest.AssertSurfaceEqual(t, original, surface)
})

t.Run("outside bottom-right", func(t *testing.T) {
surface := pi.NewSurface[rune](2, 2)
original := surface.Clone()
// when
surface.SetMany(2, 2, 'a', 'b')
// then
pitest.AssertSurfaceEqual(t, original, surface)
})

t.Run("truncate at surface end", func(t *testing.T) {
surface := pi.NewSurface[rune](2, 2)
// when
surface.SetMany(1, 1, 'a', 'b')
// then
expected := pi.NewSurface[rune](2, 2)
expected.Set(1, 1, 'a')

pitest.AssertSurfaceEqual(t, expected, surface)
})
}

func TestSurface_Clear(t *testing.T) {
Expand Down