diff test/automated/surface/surface.c @ 3715:3c9d9c052c8f gsoc2009_unit_tests

Initial revision of SDL_Surface testsuite.
author Edgar Simo <bobbens@gmail.com>
date Wed, 01 Jul 2009 10:22:28 +0000
parents
children ac6bc19a2dfb
line wrap: on
line diff
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/test/automated/surface/surface.c	Wed Jul 01 10:22:28 2009 +0000
@@ -0,0 +1,195 @@
+/**
+ * Automated SDL_Surface test.
+ *
+ * Written by Edgar Simo "bobbens"
+ *
+ * Released under Public Domain.
+ */
+
+
+#include "SDL.h"
+#include "SDL_at.h"
+
+
+#if (SDL_BYTEORDER == SDL_BIG_ENDIAN)
+#  define RMASK   0xff000000 /**< Red bit mask. */
+#  define GMASK   0x00ff0000 /**< Green bit mask. */
+#  define BMASK   0x0000ff00 /**< Blue bit mask. */
+#  define AMASK   0x000000ff /**< Alpha bit mask. */
+#else
+#  define RMASK   0x000000ff /**< Red bit mask. */
+#  define GMASK   0x0000ff00 /**< Green bit mask. */
+#  define BMASK   0x00ff0000 /**< Blue bit mask. */
+#  define AMASK   0xff000000 /**< Alpha bit mask. */
+#endif
+
+
+typedef struct SurfaceImage_s {
+   unsigned int  width;
+   unsigned int  height;
+   unsigned int  bytes_per_pixel; /* 3:RGB, 4:RGBA */ 
+   const unsigned char pixel_data[];
+} SurfaceImage_t;
+
+
+/*
+ * Pull in images for testcases.
+ */
+#include "primitives.c"
+
+
+/**
+ * @brief Compares a surface and a surface image for equality.
+ *
+ *    @param sur Surface to compare.
+ *    @param img Image to compare against.
+ *    @return 0 if they are the same, -1 on error and positive if different.
+ */
+static int surface_compare( SDL_Surface *sur, const SurfaceImage_t *img )
+{
+   int ret;
+   int i,j;
+   Uint32 pix;
+   int bpp;
+   Uint8 *p, *pd;
+
+   /* Make sure size is the same. */
+   if ((sur->w != img->width) || (sur->h != img->height))
+      return -1;
+
+   SDL_LockSurface( sur );
+
+   ret = 0;
+   bpp = sur->format->BytesPerPixel;
+
+   /* Compare image - should be same format. */
+   for (j=0; j<sur->h; j++) {
+      for (i=0; i<sur->w; i++) {
+         p  = (Uint8 *)sur->pixels + j * sur->pitch + i * bpp;
+         pd = (Uint8 *)img->pixel_data + (j*img->width + i) * img->bytes_per_pixel;
+         switch (bpp) {
+            case 1:
+               /* Paletted not supported atm. */
+               ret += 1;
+               break;
+
+            case 2:
+               /* 16 BPP not supported atm. */
+               ret += 1;
+               break;
+
+            case 3:
+               /* 24 BPP not supported atm. */
+               ret += 1;
+               break;
+
+            case 4:
+               ret += !( (p[0] == pd[0]) &&
+                         (p[1] == pd[1]) &&
+                         (p[2] == pd[2]) );
+               break;
+         }
+      }
+   }
+  
+   SDL_UnlockSurface( sur );
+
+   return ret;
+}
+
+
+/**
+ * @brief Tests the SDL primitives for rendering.
+ */
+static void surface_testPrimitives (void)
+{
+   int ret;
+   int x, y;
+   SDL_Rect rect;
+   SDL_Surface *testsur;
+
+   SDL_ATbegin( "Primitives Test" );
+
+   /* Create the surface. */
+   testsur = SDL_CreateRGBSurface( 0, 80, 60, 32, 
+         RMASK, GMASK, BMASK, AMASK );
+   if (SDL_ATassert( "SDL_CreateRGBSurface", testsur != NULL))
+      return;
+
+   /* Draw a rectangle. */
+   rect.x = 40;
+   rect.y = 0;
+   rect.w = 40;
+   rect.h = 80;
+   ret = SDL_FillRect( testsur, &rect,
+         SDL_MapRGB( testsur->format, 13, 73, 200 ) );
+   if (SDL_ATassert( "SDL_FillRect", ret == 0))
+      return;
+
+   /* Draw a rectangle. */
+   rect.x = 10;
+   rect.y = 10;
+   rect.w = 60;
+   rect.h = 40;
+   ret = SDL_FillRect( testsur, &rect,
+         SDL_MapRGB( testsur->format, 200, 0, 100 ) );
+   if (SDL_ATassert( "SDL_FillRect", ret == 0))
+      return;
+
+   /* Draw some points like so:
+    * X.X.X.X..
+    * .X.X.X.X.
+    * X.X.X.X.. */
+   for (y=0; y<3; y++) {
+      x = y % 2;
+      for (; x<80; x+=2)
+         ret = SDL_DrawPoint( testsur, x, y,
+               SDL_MapRGB( testsur->format, x*y, x*y/2, x*y/3 ) );
+      if (SDL_ATassert( "SDL_DrawPoint", ret == 0))
+         return;
+   }
+
+   /* Draw some lines. */
+   ret = SDL_DrawLine( testsur, 0, 30, 80, 30,
+         SDL_MapRGB( testsur->format, 0, 255, 0 ) );
+   if (SDL_ATassert( "SDL_DrawLine", ret == 0))
+      return;
+   ret = SDL_DrawLine( testsur, 40, 30, 40, 60,
+         SDL_MapRGB( testsur->format, 55, 55, 5 ) );
+   if (SDL_ATassert( "SDL_DrawLine", ret == 0))
+      return;
+   ret = SDL_DrawLine( testsur, 0, 60, 80, 0,
+         SDL_MapRGB( testsur->format, 5, 105, 105 ) );
+   if (SDL_ATassert( "SDL_DrawLine", ret == 0))
+      return;
+
+   /* See if it's the same. */
+   if (SDL_ATassert( "Primitives output not the same.",
+            surface_compare( testsur, &img_primitives )==0 ))
+      return;
+
+   /* Clean up. */
+   SDL_FreeSurface( testsur );
+
+   SDL_ATend();
+}
+
+
+/**
+ * @brief Entry point.
+ */
+int main( int argc, const char *argv[] )
+{
+   SDL_ATinit( "SDL_Surface" );
+
+   /* Initializes the SDL subsystems. */
+   SDL_Init(0);
+
+   surface_testPrimitives();
+   /*surface_testPrimitivesAlpha();*/
+
+   /* Exit SDL. */
+   SDL_Quit();
+
+   return SDL_ATfinish(1);
+}