diff --git a/geometry_test.go b/geometry_test.go index 85a21ce..e1c1a6f 100644 --- a/geometry_test.go +++ b/geometry_test.go @@ -1,94 +1,79 @@ package pixel_test import ( + "fmt" "testing" "github.com/faiface/pixel" ) +type rectTestTransform struct { + name string + f func(pixel.Rect) pixel.Rect +} + func TestResizeRect(t *testing.T) { - testCases := []pixel.Rect{ - pixel.R(-10, -10, 10, 10), - pixel.R(10, 10, 30, 30), + + // rectangles + squareAroundOrigin := pixel.R(-10, -10, 10, 10) + squareAround2020 := pixel.R(10, 10, 30, 30) + rectangleAroundOrigin := pixel.R(-20, -10, 20, 10) + rectangleAround2020 := pixel.R(0, 10, 40, 30) + + // resize transformations + resizeByHalfAroundCenter := rectTestTransform{"by half around center", func(rect pixel.Rect) pixel.Rect { + return rect.Resized(rect.Center(), rect.Size().Scaled(0.5)) + }} + resizeByHalfAroundMin := rectTestTransform{"by half around Min", func(rect pixel.Rect) pixel.Rect { + return rect.Resized(rect.Min, rect.Size().Scaled(0.5)) + }} + resizeByHalfAroundMax := rectTestTransform{"by half around Max", func(rect pixel.Rect) pixel.Rect { + return rect.Resized(rect.Max, rect.Size().Scaled(0.5)) + }} + resizeByHalfAroundMiddleOfLeftSide := rectTestTransform{"by half around middle of left side", func(rect pixel.Rect) pixel.Rect { + return rect.Resized(pixel.V(rect.Min.X, rect.Center().Y), rect.Size().Scaled(0.5)) + }} + resizeByHalfAroundOrigin := rectTestTransform{"by half around the origin", func(rect pixel.Rect) pixel.Rect { + return rect.Resized(pixel.ZV, rect.Size().Scaled(0.5)) + }} + + testCases := []struct { + input pixel.Rect + transform rectTestTransform + answer pixel.Rect + }{ + {squareAroundOrigin, resizeByHalfAroundCenter, pixel.R(-5, -5, 5, 5)}, + {squareAround2020, resizeByHalfAroundCenter, pixel.R(15, 15, 25, 25)}, + {rectangleAroundOrigin, resizeByHalfAroundCenter, pixel.R(-10, -5, 10, 5)}, + {rectangleAround2020, resizeByHalfAroundCenter, pixel.R(10, 15, 30, 25)}, + + {squareAroundOrigin, resizeByHalfAroundMin, pixel.R(-10, -10, 0, 0)}, + {squareAround2020, resizeByHalfAroundMin, pixel.R(10, 10, 20, 20)}, + {rectangleAroundOrigin, resizeByHalfAroundMin, pixel.R(-20, -10, 0, 0)}, + {rectangleAround2020, resizeByHalfAroundMin, pixel.R(0, 10, 20, 20)}, + + {squareAroundOrigin, resizeByHalfAroundMax, pixel.R(0, 0, 10, 10)}, + {squareAround2020, resizeByHalfAroundMax, pixel.R(20, 20, 30, 30)}, + {rectangleAroundOrigin, resizeByHalfAroundMax, pixel.R(0, 0, 20, 10)}, + {rectangleAround2020, resizeByHalfAroundMax, pixel.R(20, 20, 40, 30)}, + + {squareAroundOrigin, resizeByHalfAroundMiddleOfLeftSide, pixel.R(-10, -5, 0, 5)}, + {squareAround2020, resizeByHalfAroundMiddleOfLeftSide, pixel.R(10, 15, 20, 25)}, + {rectangleAroundOrigin, resizeByHalfAroundMiddleOfLeftSide, pixel.R(-20, -5, 0, 5)}, + {rectangleAround2020, resizeByHalfAroundMiddleOfLeftSide, pixel.R(0, 15, 20, 25)}, + + {squareAroundOrigin, resizeByHalfAroundOrigin, pixel.R(-5, -5, 5, 5)}, + {squareAround2020, resizeByHalfAroundOrigin, pixel.R(5, 5, 15, 15)}, + {rectangleAroundOrigin, resizeByHalfAroundOrigin, pixel.R(-10, -5, 10, 5)}, + {rectangleAround2020, resizeByHalfAroundOrigin, pixel.R(0, 5, 20, 15)}, } - resizeAroundCenterAnswers := []pixel.Rect{ - pixel.R(-5, -5, 5, 5), - pixel.R(15, 15, 25, 25), - } - - for i, rect := range testCases { - answer := resizeAroundCenterAnswers[i] - - // resize rectangle by 50% anchored at it's current center point - resizedRect := rect.Resized(rect.Center(), rect.Size().Scaled(0.5)) - - if resizedRect != answer { - t.Errorf("Rectangle resize was incorrect, got %v, want: %v.", resizedRect, answer) - } - } - - resizeAroundMinAnswers := []pixel.Rect{ - pixel.R(-10, -10, 0, 0), - pixel.R(10, 10, 20, 20), - } - - for i, rect := range testCases { - answer := resizeAroundMinAnswers[i] - - // resize rectangle by 50% anchored at it's Min coordinate - resizedRect := rect.Resized(rect.Min, rect.Size().Scaled(0.5)) - - if resizedRect != answer { - t.Errorf("Rectangle resize was incorrect, got %v, want: %v.", resizedRect, answer) - } - } - - resizeAroundMaxAnswers := []pixel.Rect{ - pixel.R(0, 0, 10, 10), - pixel.R(20, 20, 30, 30), - } - - for i, rect := range testCases { - answer := resizeAroundMaxAnswers[i] - - // resize rectangle by 50% anchored at it's Max coordinate - resizedRect := rect.Resized(rect.Max, rect.Size().Scaled(0.5)) - - if resizedRect != answer { - t.Errorf("Rectangle resize was incorrect, got %v, want: %v.", resizedRect, answer) - } - } - - resizeAroundMiddleOfLeftSideAnswers := []pixel.Rect{ - pixel.R(-10, -5, 0, 5), - pixel.R(10, 15, 20, 25), - } - - for i, rect := range testCases { - answer := resizeAroundMiddleOfLeftSideAnswers[i] - - // resize rectangle by 50% anchored at the middle of it's left side - resizedRect := rect.Resized(pixel.V(rect.Min.X, rect.Center().Y), rect.Size().Scaled(0.5)) - - if resizedRect != answer { - t.Errorf("Rectangle resize was incorrect, got %v, want: %v.", resizedRect, answer) - } - } - - resizeAroundOriginAnswers := []pixel.Rect{ - pixel.R(-5, -5, 5, 5), - pixel.R(5, 5, 15, 15), - } - - for i, rect := range testCases { - answer := resizeAroundOriginAnswers[i] - - // resize rectangle by 50% anchored at the origin - resizedRect := rect.Resized(pixel.ZV, rect.Size().Scaled(0.5)) - - if resizedRect != answer { - t.Errorf("Rectangle resize was incorrect, got %v, want: %v.", resizedRect, answer) - } + for _, testCase := range testCases { + t.Run(fmt.Sprintf("Resize %v %s", testCase.input, testCase.transform.name), func(t *testing.T) { + testResult := testCase.transform.f(testCase.input) + if testResult != testCase.answer { + t.Errorf("Got: %v, wanted: %v\n", testResult, testCase.answer) + } + }) } }