From eedeb85b149c167af12784985c0724f70546c76b Mon Sep 17 00:00:00 2001
From: ALex Ogier <alexander.ogier@gmail.com>
Date: Mon, 31 Jul 2017 16:29:23 +1200
Subject: [PATCH] refactor and add test cases

---
 geometry_test.go | 143 +++++++++++++++++++++--------------------------
 1 file changed, 65 insertions(+), 78 deletions(-)

diff --git a/geometry_test.go b/geometry_test.go
index 85a21ce..8ecf664 100644
--- a/geometry_test.go
+++ b/geometry_test.go
@@ -6,89 +6,76 @@ import (
 	"github.com/faiface/pixel"
 )
 
-func TestResizeRect(t *testing.T) {
-	testCases := []pixel.Rect{
-		pixel.R(-10, -10, 10, 10),
-		pixel.R(10, 10, 30, 30),
-	}
-
-	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]
+type rectTestInput struct {
+	name string
+	rect pixel.Rect
+}
 
-		// 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))
+type rectTestTransform struct {
+	name string
+	f    func(pixel.Rect) pixel.Rect
+}
 
-		if resizedRect != answer {
-			t.Errorf("Rectangle resize was incorrect, got %v, want: %v.", resizedRect, answer)
-		}
-	}
+func TestResizeRect(t *testing.T) {
 
-	resizeAroundOriginAnswers := []pixel.Rect{
-		pixel.R(-5, -5, 5, 5),
-		pixel.R(5, 5, 15, 15),
+	// rectangles
+	squareAroundOrigin := rectTestInput{"square around origin", pixel.R(-10, -10, 10, 10)}
+	squareAround2020 := rectTestInput{"square around 20, 20", pixel.R(10, 10, 30, 30)}
+	rectangleAroundOrigin := rectTestInput{"rectangle around origin", pixel.R(-20, -10, 20, 10)}
+	rectangleAround2020 := rectTestInput{"rectangle around 20, 20", 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     rectTestInput
+		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)},
 	}
 
-	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 {
+		testResult := testCase.transform.f(testCase.input.rect)
+		if testResult != testCase.answer {
+			t.Errorf("Resizing %s %s failed, got: %v, wanted: %v\n", testCase.input.name, testCase.transform.name, testResult, testCase.answer)
 		}
 	}
 }
-- 
GitLab