Ver Fonte

Extended the draw regression tests.

David Piuva há 5 anos atrás
pai
commit
f466c3e9b5
1 ficheiros alterados com 286 adições e 37 exclusões
  1. 286 37
      Source/test/tests/DrawTest.cpp

+ 286 - 37
Source/test/tests/DrawTest.cpp

@@ -2,45 +2,294 @@
 #include "../testTools.h"
 
 START_TEST(Draw)
-	ImageU8 imageA = image_create_U8(16, 16);
-	uint8_t black = 0;
-	uint8_t gray = 127;
-	uint8_t white = 255;
-	ImageU8 expected1 = image_fromAscii(
+	// Resources
+	ImageU8 imageBall = image_fromAscii(
 		"< .x>"
-		"<xxxxxxxxxxxxxxxx>"
-		"<x......xx      x>"
-		"<x......xx      x>"
-		"<x..xx..xx  xx  x>"
-		"<x..xx..xx  xx  x>"
-		"<x......xx      x>"
-		"<x......xx      x>"
-		"<xxxxxxxxxxxxxxxx>"
-		"<xxxxxxxxxxxxxxxx>"
-		"<x      xx......x>"
-		"<x      xx......x>"
-		"<x  xx  xx..xx..x>"
-		"<x  xx  xx..xx..x>"
-		"<x      xx......x>"
-		"<x      xx......x>"
-		"<xxxxxxxxxxxxxxxx>"
+		"< .xx. >"
+		"<.xxxx.>"
+		"<xxxxxx>"
+		"<xxxxxx>"
+		"<.xxxx.>"
+		"< .xx. >"
 	);
 
-	// TODO: Try drawing outside without crashing. Only drawing to a broken target image should allow crashing.
-
-	// Fill the image
-	image_fill(imageA, white);
-	draw_rectangle(imageA, IRect(1, 1, 6, 6), gray);
-	draw_rectangle(imageA, IRect(9, 9, 6, 6), gray);
-	draw_rectangle(imageA, IRect(9, 1, 6, 6), black);
-	draw_rectangle(imageA, IRect(1, 9, 6, 6), black);
-	draw_rectangle(imageA, IRect(3, 3, 2, 2), white);
-	draw_rectangle(imageA, IRect(3, 11, 2, 2), white);
-	draw_rectangle(imageA, IRect(11, 3, 2, 2), white);
-	draw_rectangle(imageA, IRect(11, 11, 2, 2), white);
-
-	// TODO: Make a reusable macro for comparing images and showing them when a test fails.
-	ASSERT_EQUAL(image_maxDifference(imageA, expected1), 0);
-	//printText("imageA:\n", image_toAscii(imageA, " .x"), "\n");
+	{ // 8-bit monochrome drawing
+		int black = 0;
+		int gray = 127;
+		int white = 255;
+		ImageU8 imageA = image_create_U8(16, 16);
+
+		// New images begin with all black pixels
+		ASSERT_EQUAL(image_maxDifference(imageA, image_fromAscii(
+			"< .x>"
+			"<                >"
+			"<                >"
+			"<                >"
+			"<                >"
+			"<                >"
+			"<                >"
+			"<                >"
+			"<                >"
+			"<                >"
+			"<                >"
+			"<                >"
+			"<                >"
+			"<                >"
+			"<                >"
+			"<                >"
+			"<                >"
+		)), 0);
+
+		// Filling an image sets all pixels to the new color
+		image_fill(imageA, white);
+		ASSERT_EQUAL(image_maxDifference(imageA, image_fromAscii(
+			"< .x>"
+			"<xxxxxxxxxxxxxxxx>"
+			"<xxxxxxxxxxxxxxxx>"
+			"<xxxxxxxxxxxxxxxx>"
+			"<xxxxxxxxxxxxxxxx>"
+			"<xxxxxxxxxxxxxxxx>"
+			"<xxxxxxxxxxxxxxxx>"
+			"<xxxxxxxxxxxxxxxx>"
+			"<xxxxxxxxxxxxxxxx>"
+			"<xxxxxxxxxxxxxxxx>"
+			"<xxxxxxxxxxxxxxxx>"
+			"<xxxxxxxxxxxxxxxx>"
+			"<xxxxxxxxxxxxxxxx>"
+			"<xxxxxxxxxxxxxxxx>"
+			"<xxxxxxxxxxxxxxxx>"
+			"<xxxxxxxxxxxxxxxx>"
+			"<xxxxxxxxxxxxxxxx>"
+		)), 0);
+
+		// Drawing a gray rectangle near the upper left corner
+		draw_rectangle(imageA, IRect(1, 1, 6, 6), gray);
+		ASSERT_EQUAL(image_maxDifference(imageA, image_fromAscii(
+			"< .x>"
+			"<xxxxxxxxxxxxxxxx>"
+			"<x......xxxxxxxxx>"
+			"<x......xxxxxxxxx>"
+			"<x......xxxxxxxxx>"
+			"<x......xxxxxxxxx>"
+			"<x......xxxxxxxxx>"
+			"<x......xxxxxxxxx>"
+			"<xxxxxxxxxxxxxxxx>"
+			"<xxxxxxxxxxxxxxxx>"
+			"<xxxxxxxxxxxxxxxx>"
+			"<xxxxxxxxxxxxxxxx>"
+			"<xxxxxxxxxxxxxxxx>"
+			"<xxxxxxxxxxxxxxxx>"
+			"<xxxxxxxxxxxxxxxx>"
+			"<xxxxxxxxxxxxxxxx>"
+			"<xxxxxxxxxxxxxxxx>"
+		)), 0);
+
+		// Drawing a gray rectangle near the lower right corner
+		draw_rectangle(imageA, IRect(9, 9, 6, 6), gray);
+		ASSERT_EQUAL(image_maxDifference(imageA, image_fromAscii(
+			"< .x>"
+			"<xxxxxxxxxxxxxxxx>"
+			"<x......xxxxxxxxx>"
+			"<x......xxxxxxxxx>"
+			"<x......xxxxxxxxx>"
+			"<x......xxxxxxxxx>"
+			"<x......xxxxxxxxx>"
+			"<x......xxxxxxxxx>"
+			"<xxxxxxxxxxxxxxxx>"
+			"<xxxxxxxxxxxxxxxx>"
+			"<xxxxxxxxx......x>"
+			"<xxxxxxxxx......x>"
+			"<xxxxxxxxx......x>"
+			"<xxxxxxxxx......x>"
+			"<xxxxxxxxx......x>"
+			"<xxxxxxxxx......x>"
+			"<xxxxxxxxxxxxxxxx>"
+		)), 0);
+
+		// Drawing out of bound at the upper right corner, which is safely clipped to only affect pixels within the current image's view
+		draw_rectangle(imageA, IRect(7, -11, 20, 20), black);
+		draw_rectangle(imageA, IRect(8, -12, 20, 20), white);
+		ASSERT_EQUAL(image_maxDifference(imageA, image_fromAscii(
+			"< .x>"
+			"<xxxxxxx xxxxxxxx>"
+			"<x...... xxxxxxxx>"
+			"<x...... xxxxxxxx>"
+			"<x...... xxxxxxxx>"
+			"<x...... xxxxxxxx>"
+			"<x...... xxxxxxxx>"
+			"<x...... xxxxxxxx>"
+			"<xxxxxxx xxxxxxxx>"
+			"<xxxxxxx         >"
+			"<xxxxxxxxx......x>"
+			"<xxxxxxxxx......x>"
+			"<xxxxxxxxx......x>"
+			"<xxxxxxxxx......x>"
+			"<xxxxxxxxx......x>"
+			"<xxxxxxxxx......x>"
+			"<xxxxxxxxxxxxxxxx>"
+		)), 0);
+
+		// Draw diagonal lines from upper left side to lower right side
+		draw_line(imageA, 1, 2, 12, 13, 0);
+		draw_line(imageA, 2, 2, 13, 13, 255);
+		draw_line(imageA, 3, 2, 14, 13, 0);
+		ASSERT_EQUAL(image_maxDifference(imageA, image_fromAscii(
+			"< .x>"
+			"<xxxxxxx xxxxxxxx>"
+			"<x...... xxxxxxxx>"
+			"<x x ... xxxxxxxx>"
+			"<x. x .. xxxxxxxx>"
+			"<x.. x . xxxxxxxx>"
+			"<x... x  xxxxxxxx>"
+			"<x.... x xxxxxxxx>"
+			"<xxxxxx x xxxxxxx>"
+			"<xxxxxxx x       >"
+			"<xxxxxxxx x ....x>"
+			"<xxxxxxxxx x ...x>"
+			"<xxxxxxxxx. x ..x>"
+			"<xxxxxxxxx.. x .x>"
+			"<xxxxxxxxx... x x>"
+			"<xxxxxxxxx......x>"
+			"<xxxxxxxxxxxxxxxx>"
+		)), 0);
+
+		draw_copy(imageA, imageBall, 4, 2);
+		ASSERT_EQUAL(image_maxDifference(imageA, image_fromAscii(
+			"< .x>"
+			"<xxxxxxx xxxxxxxx>"
+			"<x...... xxxxxxxx>"
+			"<x x  .xx. xxxxxx>"
+			"<x. x.xxxx.xxxxxx>"
+			"<x.. xxxxxxxxxxxx>"
+			"<x...xxxxxxxxxxxx>"
+			"<x....xxxx.xxxxxx>"
+			"<xxxx .xx. xxxxxx>"
+			"<xxxxxxx x       >"
+			"<xxxxxxxx x ....x>"
+			"<xxxxxxxxx x ...x>"
+			"<xxxxxxxxx. x ..x>"
+			"<xxxxxxxxx.. x .x>"
+			"<xxxxxxxxx... x x>"
+			"<xxxxxxxxx......x>"
+			"<xxxxxxxxxxxxxxxx>"
+		)), 0);
+	}
+	{ // RGBA silhouette drawing (Giving color to grayscale images by treating silhouette luma as source opacity and the uniform color as source RGB)
+		ImageRgbaU8 imageA = image_create_RgbaU8(8, 8);
+		draw_rectangle(imageA, IRect(4, 0, 4, 8), ColorRgbaI32(255, 255, 255, 255));
+		//printText("imageA R:\n", image_toAscii(image_get_red(imageA), " ,.-x"), "\n");
+		//printText("imageA G:\n", image_toAscii(image_get_green(imageA), " ,.-x"), "\n");
+		//printText("imageA B:\n", image_toAscii(image_get_blue(imageA), " ,.-x"), "\n");
+		ASSERT_LESSER_OR_EQUAL(image_maxDifference(image_get_red(imageA), image_fromAscii(
+			"< ,.-x>"
+			"<    xxxx>"
+			"<    xxxx>"
+			"<    xxxx>"
+			"<    xxxx>"
+			"<    xxxx>"
+			"<    xxxx>"
+			"<    xxxx>"
+			"<    xxxx>"
+		)), 0);
+		ASSERT_LESSER_OR_EQUAL(image_maxDifference(image_get_green(imageA), image_fromAscii(
+			"< ,.-x>"
+			"<    xxxx>"
+			"<    xxxx>"
+			"<    xxxx>"
+			"<    xxxx>"
+			"<    xxxx>"
+			"<    xxxx>"
+			"<    xxxx>"
+			"<    xxxx>"
+		)), 0);
+		ASSERT_LESSER_OR_EQUAL(image_maxDifference(image_get_blue(imageA), image_fromAscii(
+			"< ,.-x>"
+			"<    xxxx>"
+			"<    xxxx>"
+			"<    xxxx>"
+			"<    xxxx>"
+			"<    xxxx>"
+			"<    xxxx>"
+			"<    xxxx>"
+			"<    xxxx>"
+		)), 0);
+		// Draw a fully opaque orange ball
+		draw_silhouette(imageA, imageBall, ColorRgbaI32(255, 127, 0, 255), 1, 1);
+		//printText("imageA R:\n", image_toAscii(image_get_red(imageA), " ,.-x"), "\n");
+		//printText("imageA G:\n", image_toAscii(image_get_green(imageA), " ,.-x"), "\n");
+		//printText("imageA B:\n", image_toAscii(image_get_blue(imageA), " ,.-x"), "\n");
+		ASSERT_LESSER_OR_EQUAL(image_maxDifference(image_get_red(imageA), image_fromAscii(
+			"< ,.-x>"
+			"<    xxxx>"
+			"<  .xxxxx>"
+			"< .xxxxxx>"
+			"< xxxxxxx>"
+			"< xxxxxxx>"
+			"< .xxxxxx>"
+			"<  .xxxxx>"
+			"<    xxxx>"
+		)), 1);
+		ASSERT_LESSER_OR_EQUAL(image_maxDifference(image_get_green(imageA), image_fromAscii(
+			"< ,.-x>"
+			"<    xxxx>"
+			"<  ,..-xx>"
+			"< ,....-x>"
+			"< ......x>"
+			"< ......x>"
+			"< ,....-x>"
+			"<  ,..-xx>"
+			"<    xxxx>"
+		)), 1);
+		ASSERT_LESSER_OR_EQUAL(image_maxDifference(image_get_blue(imageA), image_fromAscii(
+			"< ,.-x>"
+			"<    xxxx>"
+			"<     .xx>"
+			"<      .x>"
+			"<       x>"
+			"<       x>"
+			"<      .x>"
+			"<     .xx>"
+			"<    xxxx>"
+		)), 1);
+		// Draw a half opaque blue ball in the lower right corner
+		draw_silhouette(imageA, imageBall, ColorRgbaI32(0, 0, 255, 127), 3, 3);
+		//printText("imageA R:\n", image_toAscii(image_get_red(imageA)), "\n");
+		//printText("imageA G:\n", image_toAscii(image_get_green(imageA)), "\n");
+		//printText("imageA B:\n", image_toAscii(image_get_blue(imageA)), "\n");
+		ASSERT_LESSER_OR_EQUAL(image_maxDifference(image_get_red(imageA), image_fromAscii(
+			"< .,-_':;!+~=^?*abcdefghijklmnopqrstuvwxyz()[]{}|&@#0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ>"
+			"<    ZZZZ>"
+			"<  [ZZZZZ>"
+			"< [ZZZZZZ>"
+			"< ZZZE[[E>"
+			"< ZZE[[[[>"
+			"< [Z[[[[[>"
+			"<  [[[[[[>"
+			"<    [[[[>"
+		)), 2);
+		ASSERT_LESSER_OR_EQUAL(image_maxDifference(image_get_green(imageA), image_fromAscii(
+			"< .,-_':;!+~=^?*abcdefghijklmnopqrstuvwxyz()[]{}|&@#0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ>"
+			"<    ZZZZ>"
+			"<  g[[DZZ>"
+			"< g[[[[DZ>"
+			"< [[[rhhE>"
+			"< [[rhhh[>"
+			"< g[hhhr[>"
+			"<  ghhr[[>"
+			"<    [[[[>"
+		)), 2);
+		ASSERT_LESSER_OR_EQUAL(image_maxDifference(image_get_blue(imageA), image_fromAscii(
+			"< .,-_':;!+~=^?*abcdefghijklmnopqrstuvwxyz()[]{}|&@#0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ>"
+			"<    ZZZZ>"
+			"<     [ZZ>"
+			"<      [Z>"
+			"<    g[[Z>"
+			"<   g[[[Z>"
+			"<   [[[DZ>"
+			"<   [[DZZ>"
+			"<   gZZZZ>"
+		)), 2);
+	}
+
 END_TEST