From f4d2342e5a924ade6dc7f5f41b82932707835104 Mon Sep 17 00:00:00 2001 From: Michael Brown Date: Mon, 6 Jan 2014 19:10:18 +0000 Subject: [PATCH] [test] Generalise pnm_ok() to pixbuf_ok() Signed-off-by: Michael Brown --- src/tests/pixbuf_test.c | 76 +++++++++++++++++++++++++++++ src/tests/pixbuf_test.h | 66 +++++++++++++++++++++++++ src/tests/pnm_test.c | 103 ++++++---------------------------------- 3 files changed, 157 insertions(+), 88 deletions(-) create mode 100644 src/tests/pixbuf_test.c create mode 100644 src/tests/pixbuf_test.h diff --git a/src/tests/pixbuf_test.c b/src/tests/pixbuf_test.c new file mode 100644 index 00000000..15cd33df --- /dev/null +++ b/src/tests/pixbuf_test.c @@ -0,0 +1,76 @@ +/* + * Copyright (C) 2013 Michael Brown . + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License as + * published by the Free Software Foundation; either version 2 of the + * License, or any later version. + * + * This program is distributed in the hope that it will be useful, but + * WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA + * 02110-1301, USA. + */ + +FILE_LICENCE ( GPL2_OR_LATER ); + +/** @file + * + * Pixel buffer self-tests + * + */ + +/* Forcibly enable assertions */ +#undef NDEBUG + +#include +#include +#include +#include +#include "pixbuf_test.h" + +/** + * Report pixel buffer test result + * + * @v test Pixel buffer test + * @v file Test code file + * @v line Test code line + */ +void pixbuf_okx ( struct pixel_buffer_test *test, const char *file, + unsigned int line ) { + struct pixel_buffer *pixbuf; + int rc; + + /* Sanity check */ + assert ( ( test->width * test->height * sizeof ( test->data[0] ) ) + == test->len ); + + /* Correct image data pointer */ + test->image->data = virt_to_user ( ( void * ) test->image->data ); + + /* Check that image is detected as PNM */ + okx ( image_probe ( test->image ) == 0, file, line ); + okx ( test->image->type == test->type, file, line ); + + /* Check that a pixel buffer can be created from the image */ + okx ( ( rc = image_pixbuf ( test->image, &pixbuf ) ) == 0, file, line ); + if ( rc == 0 ) { + + /* Check pixel buffer dimensions */ + okx ( pixbuf->width == test->width, file, line ); + okx ( pixbuf->height == test->height, file, line ); + + /* Check pixel buffer data */ + okx ( pixbuf->len == test->len, file, line ); + okx ( memcmp_user ( pixbuf->data, 0, + virt_to_user ( test->data ), 0, + test->len ) == 0, file, line ); + + pixbuf_put ( pixbuf ); + } +} diff --git a/src/tests/pixbuf_test.h b/src/tests/pixbuf_test.h new file mode 100644 index 00000000..394f7f5f --- /dev/null +++ b/src/tests/pixbuf_test.h @@ -0,0 +1,66 @@ +#ifndef _PIXBUF_TEST_H +#define _PIXBUF_TEST_H + +FILE_LICENCE ( GPL2_OR_LATER ); + +#include +#include +#include +#include + +/** A pixel buffer test */ +struct pixel_buffer_test { + /** Image type */ + struct image_type *type; + /** Source image */ + struct image *image; + /** Pixel data */ + const uint32_t *data; + /** Length of pixel data */ + size_t len; + /** Width */ + unsigned int width; + /** Height */ + unsigned int height; +}; + +/** + * Define a pixel buffer test + * + * @v _name Test name + * @v _type Test image file type + * @v _file Test image file data + * @v _width Expected pixel buffer width + * @v _height Expected pixel buffer height + * @v _data Expected pixel buffer data + * @ret test Pixel buffer test + */ +#define PIX( _name, _type, _file, _width, _height, _data ) \ + static const char _name ## __file[] = _file; \ + static const uint32_t _name ## __data[] = _data; \ + static struct image _name ## __image = { \ + .refcnt = REF_INIT ( ref_no_free ), \ + .name = #_name, \ + .data = ( userptr_t ) ( _name ## __file ), \ + .len = sizeof ( _name ## __file ), \ + }; \ + static struct pixel_buffer_test _name = { \ + .type = _type, \ + .image = & _name ## __image, \ + .data = _name ## __data, \ + .len = sizeof ( _name ## __data ), \ + .width = _width, \ + .height = _height, \ + }; + +extern void pixbuf_okx ( struct pixel_buffer_test *test, const char *file, + unsigned int line ); + +/** + * Report pixel buffer test result + * + * @v test Pixel buffer test + */ +#define pixbuf_ok( test ) pixbuf_okx ( test, __FILE__, __LINE__ ) + +#endif /* _PIXBUF_TEST_H */ diff --git a/src/tests/pnm_test.c b/src/tests/pnm_test.c index 099ccbc5..26b0c072 100644 --- a/src/tests/pnm_test.c +++ b/src/tests/pnm_test.c @@ -33,44 +33,13 @@ FILE_LICENCE ( GPL2_OR_LATER ); #include #include #include +#include "pixbuf_test.h" /** Define inline pixel data */ #define DATA(...) { __VA_ARGS__ } -/** A PNM test */ -struct pnm_test { - /** Source image */ - struct image *image; - /** Pixel data */ - const uint32_t *data; - /** Length of pixel data */ - size_t len; - /** Width */ - unsigned int width; - /** Height */ - unsigned int height; -}; - -/** Define a PNM test */ -#define PNM( NAME, FILE, WIDTH, HEIGHT, DATA ) \ - static const char NAME ## _file[] = FILE; \ - static const uint32_t NAME ## _data[] = DATA; \ - static struct image NAME ## _image = { \ - .refcnt = REF_INIT ( ref_no_free ), \ - .name = #NAME, \ - .data = ( userptr_t ) ( NAME ## _file ), \ - .len = sizeof ( NAME ## _file ), \ - }; \ - static struct pnm_test NAME = { \ - .image = & NAME ## _image, \ - .data = NAME ## _data, \ - .len = sizeof ( NAME ## _data ), \ - .width = WIDTH, \ - .height = HEIGHT, \ - }; - /** PBM ASCII example (from Wikipedia) */ -PNM ( pbm_ascii, +PIX ( pbm_ascii, &pnm_image_type, "P1\n" "# This is an example bitmap of the letter \"J\"\n" "6 10\n" @@ -97,7 +66,7 @@ PNM ( pbm_ascii, 0xffffff, 0xffffff, 0xffffff, 0xffffff, 0xffffff, 0xffffff ) ); /** PGM ASCII example (from Wikipedia) */ -PNM ( pgm_ascii, +PIX ( pgm_ascii, &pnm_image_type, "P2\n" "# Shows the word \"FEEP\" (example from Netpbm man page on PGM)\n" "24 7\n" @@ -140,7 +109,7 @@ PNM ( pgm_ascii, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000 ) ); /** PPM ASCII example (from Wikipedia) */ -PNM ( ppm_ascii, +PIX ( ppm_ascii, &pnm_image_type, "P3\n" "# The P3 means colors are in ASCII, then 3 columns and 2 rows,\n" "# then 255 for max color, then RGB triplets\n" @@ -152,7 +121,7 @@ PNM ( ppm_ascii, DATA ( 0xff0000, 0x00ff00, 0x0000ff, 0xffff00, 0xffffff, 0x000000 ) ); /** PBM ASCII with no space between pixel values */ -PNM ( pbm_ascii_no_space, +PIX ( pbm_ascii_no_space, &pnm_image_type, "P1\n" "3 3\n" "001\n" @@ -163,7 +132,7 @@ PNM ( pbm_ascii_no_space, 0x000000, 0x000000, 0x000000 ) ); /** PBM binary example (converted from Wikipedia) */ -PNM ( pbm_binary, +PIX ( pbm_binary, &pnm_image_type, DATA ( 0x50, 0x34, 0x0a, 0x23, 0x20, 0x43, 0x52, 0x45, 0x41, 0x54, 0x4f, 0x52, 0x3a, 0x20, 0x47, 0x49, 0x4d, 0x50, 0x20, 0x50, 0x4e, 0x4d, 0x20, 0x46, 0x69, 0x6c, 0x74, 0x65, 0x72, 0x20, 0x56, 0x65, 0x72, @@ -183,7 +152,7 @@ PNM ( pbm_binary, 0xffffff, 0xffffff, 0xffffff, 0xffffff, 0xffffff, 0xffffff ) ); /** PGM binary example (converted from Wikipedia) */ -PNM ( pgm_binary, +PIX ( pgm_binary, &pnm_image_type, DATA ( 0x50, 0x35, 0x0a, 0x32, 0x34, 0x20, 0x37, 0x0a, 0x31, 0x35, 0x0a, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, @@ -232,68 +201,26 @@ PNM ( pgm_binary, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000 ) ); /** PPM binary example (converted from Wikipedia) */ -PNM ( ppm_binary, +PIX ( ppm_binary, &pnm_image_type, DATA ( 0x50, 0x36, 0x0a, 0x33, 0x20, 0x32, 0x0a, 0x32, 0x35, 0x35, 0x0a, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0x00, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00 ), 3, 2, DATA ( 0xff0000, 0x00ff00, 0x0000ff, 0xffff00, 0xffffff, 0x000000 ) ); -/** - * Report PNM test result - * - * @v test PNM test - * @v file Test code file - * @v line Test code line - */ -static void pnm_okx ( struct pnm_test *test, const char *file, - unsigned int line ) { - struct pixel_buffer *pixbuf; - int rc; - - /* Sanity check */ - assert ( ( test->width * test->height * sizeof ( test->data[0] ) ) - == test->len ); - - /* Correct image data pointer */ - test->image->data = virt_to_user ( ( void * ) test->image->data ); - - /* Check that image is detected as PNM */ - okx ( image_probe ( test->image ) == 0, file, line ); - okx ( test->image->type == &pnm_image_type, file, line ); - - /* Check that a pixel buffer can be created from the image */ - okx ( ( rc = image_pixbuf ( test->image, &pixbuf ) ) == 0, file, line ); - if ( rc == 0 ) { - - /* Check pixel buffer dimensions */ - okx ( pixbuf->width == test->width, file, line ); - okx ( pixbuf->height == test->height, file, line ); - - /* Check pixel buffer data */ - okx ( pixbuf->len == test->len, file, line ); - okx ( memcmp_user ( pixbuf->data, 0, - virt_to_user ( test->data ), 0, - test->len ) == 0, file, line ); - - pixbuf_put ( pixbuf ); - } -} -#define pnm_ok( test ) pnm_okx ( test, __FILE__, __LINE__ ) - /** * Perform PNM self-test * */ static void pnm_test_exec ( void ) { - pnm_ok ( &pbm_ascii ); - pnm_ok ( &pgm_ascii ); - pnm_ok ( &ppm_ascii ); - pnm_ok ( &pbm_ascii_no_space ); - pnm_ok ( &pbm_binary ); - pnm_ok ( &pgm_binary ); - pnm_ok ( &ppm_binary ); + pixbuf_ok ( &pbm_ascii ); + pixbuf_ok ( &pgm_ascii ); + pixbuf_ok ( &ppm_ascii ); + pixbuf_ok ( &pbm_ascii_no_space ); + pixbuf_ok ( &pbm_binary ); + pixbuf_ok ( &pgm_binary ); + pixbuf_ok ( &ppm_binary ); } /** PNM self-test */