> > On Thu, Jun 21, 2018 at 10:32:53PM +0100, Frediano Ziglio wrote: > > region.c contained code to test the module. > > Separate test code into a proper test. > > Test is copied verbatim from the original code. > > > > Signed-off-by: Frediano Ziglio <fziglio@xxxxxxxxxx> > > --- > > common/region.c | 378 ----------------------------------------- > > tests/Makefile.am | 12 ++ > > tests/meson.build | 2 +- > > tests/test-region.c | 401 ++++++++++++++++++++++++++++++++++++++++++++ > > 4 files changed, 414 insertions(+), 379 deletions(-) > > create mode 100644 tests/test-region.c > > > > Changes since v1: > > - reuse code for Meson build > > > > diff --git a/common/region.c b/common/region.c > > index e9abb32..c950a9b 100644 > > --- a/common/region.c > > +++ b/common/region.c > > @@ -522,381 +522,3 @@ void region_dump(const QRegion *rgn, const char > > *prefix) > > rects[i].y2); > > } > > } > > - > > -#ifdef REGION_TEST > > - > > -static int slow_region_test(const QRegion *rgn, const QRegion *other_rgn, > > int query) > > -{ > > - pixman_region32_t intersection; > > - int res; > > - > > - pixman_region32_init(&intersection); > > - pixman_region32_intersect(&intersection, > > - (pixman_region32_t *)rgn, > > - (pixman_region32_t *)other_rgn); > > - > > - res = 0; > > - > > - if (query & REGION_TEST_SHARED && > > - pixman_region32_not_empty(&intersection)) { > > - res |= REGION_TEST_SHARED; > > - } > > - > > - if (query & REGION_TEST_LEFT_EXCLUSIVE && > > - !pixman_region32_equal(&intersection, (pixman_region32_t *)rgn)) { > > - res |= REGION_TEST_LEFT_EXCLUSIVE; > > - } > > - > > - if (query & REGION_TEST_RIGHT_EXCLUSIVE && > > - !pixman_region32_equal(&intersection, (pixman_region32_t > > *)other_rgn)) { > > - res |= REGION_TEST_RIGHT_EXCLUSIVE; > > - } > > - > > - pixman_region32_fini(&intersection); > > - > > - return res; > > -} > > - > > - > > -static int rect_is_valid(const SpiceRect *r) > > -{ > > - if (r->top > r->bottom || r->left > r->right) { > > - printf("%s: invalid rect\n", __FUNCTION__); > > - return FALSE; > > - } > > - return TRUE; > > -} > > - > > -static void rect_set(SpiceRect *r, int32_t top, int32_t left, int32_t > > bottom, int32_t right) > > -{ > > - r->top = top; > > - r->left = left; > > - r->bottom = bottom; > > - r->right = right; > > - spice_assert(rect_is_valid(r)); > > -} > > - > > -static void random_region(QRegion *reg) > > -{ > > - int i; > > - int num_rects; > > - int x, y, w, h; > > - SpiceRect _r; > > - SpiceRect *r = &_r; > > - > > - region_clear(reg); > > - > > - num_rects = rand() % 20; > > - for (i = 0; i < num_rects; i++) { > > - x = rand()%100; > > - y = rand()%100; > > - w = rand()%100; > > - h = rand()%100; > > - rect_set(r, > > - x, y, > > - x+w, y+h); > > - region_add(reg, r); > > - } > > -} > > - > > -static void test(const QRegion *r1, const QRegion *r2, int *expected) > > -{ > > - printf("r1 is_empty %s [%s]\n", > > - region_is_empty(r1) ? "TRUE" : "FALSE", > > - (region_is_empty(r1) == *(expected++)) ? "OK" : "ERR"); > > - printf("r2 is_empty %s [%s]\n", > > - region_is_empty(r2) ? "TRUE" : "FALSE", > > - (region_is_empty(r2) == *(expected++)) ? "OK" : "ERR"); > > - printf("is_equal %s [%s]\n", > > - region_is_equal(r1, r2) ? "TRUE" : "FALSE", > > - (region_is_equal(r1, r2) == *(expected++)) ? "OK" : "ERR"); > > - printf("intersects %s [%s]\n", > > - region_intersects(r1, r2) ? "TRUE" : "FALSE", > > - (region_intersects(r1, r2) == *(expected++)) ? "OK" : "ERR"); > > - printf("contains %s [%s]\n", > > - region_contains(r1, r2) ? "TRUE" : "FALSE", > > - (region_contains(r1, r2) == *(expected++)) ? "OK" : "ERR"); > > -} > > - > > -enum { > > - EXPECT_R1_EMPTY, > > - EXPECT_R2_EMPTY, > > - EXPECT_EQUAL, > > - EXPECT_SECT, > > - EXPECT_CONT, > > -}; > > - > > -int main(void) > > -{ > > - QRegion _r1, _r2, _r3; > > - QRegion *r1 = &_r1; > > - QRegion *r2 = &_r2; > > - QRegion *r3 = &_r3; > > - SpiceRect _r; > > - SpiceRect *r = &_r; > > - int expected[5]; > > - int i, j; > > - > > - region_init(r1); > > - region_init(r2); > > - > > - printf("dump r1 empty rgn [%s]\n", region_is_valid(r1) ? "VALID" : > > "INVALID"); > > - region_dump(r1, ""); > > - expected[EXPECT_R1_EMPTY] = TRUE; > > - expected[EXPECT_R2_EMPTY] = TRUE; > > - expected[EXPECT_EQUAL] = TRUE; > > - expected[EXPECT_SECT] = FALSE; > > - expected[EXPECT_CONT] = TRUE; > > - test(r1, r2, expected); > > - printf("\n"); > > - > > - region_clone(r3, r1); > > - printf("dump r3 clone rgn [%s]\n", region_is_valid(r3) ? "VALID" : > > "INVALID"); > > - region_dump(r3, ""); > > - expected[EXPECT_R1_EMPTY] = TRUE; > > - expected[EXPECT_R2_EMPTY] = TRUE; > > - expected[EXPECT_EQUAL] = TRUE; > > - expected[EXPECT_SECT] = FALSE; > > - expected[EXPECT_CONT] = TRUE; > > - test(r1, r3, expected); > > - region_destroy(r3); > > - printf("\n"); > > - > > - rect_set(r, 0, 0, 100, 100); > > - region_add(r1, r); > > - printf("dump r1 [%s]\n", region_is_valid(r1) ? "VALID" : "INVALID"); > > - region_dump(r1, ""); > > - expected[EXPECT_R1_EMPTY] = FALSE; > > - expected[EXPECT_R2_EMPTY] = TRUE; > > - expected[EXPECT_EQUAL] = FALSE; > > - expected[EXPECT_SECT] = FALSE; > > - expected[EXPECT_CONT] = TRUE; > > - test(r1, r2, expected); > > - printf("\n"); > > - > > - region_clear(r1); > > - rect_set(r, 0, 0, 0, 0); > > - region_add(r1, r); > > - printf("dump r1 [%s]\n", region_is_valid(r1) ? "VALID" : "INVALID"); > > - region_dump(r1, ""); > > - expected[EXPECT_R1_EMPTY] = TRUE; > > - expected[EXPECT_R2_EMPTY] = TRUE; > > - expected[EXPECT_EQUAL] = TRUE; > > - expected[EXPECT_SECT] = FALSE; > > - expected[EXPECT_CONT] = TRUE; > > - test(r1, r2, expected); > > - printf("\n"); > > - > > - rect_set(r, -100, -100, 0, 0); > > - region_add(r1, r); > > - printf("dump r1 [%s]\n", region_is_valid(r1) ? "VALID" : "INVALID"); > > - region_dump(r1, ""); > > - expected[EXPECT_R1_EMPTY] = FALSE; > > - expected[EXPECT_R2_EMPTY] = TRUE; > > - expected[EXPECT_EQUAL] = FALSE; > > - expected[EXPECT_SECT] = FALSE; > > - expected[EXPECT_CONT] = TRUE; > > - test(r1, r2, expected); > > - printf("\n"); > > - > > - region_clear(r1); > > - rect_set(r, -100, -100, 100, 100); > > - region_add(r1, r); > > - printf("dump r1 [%s]\n", region_is_valid(r1) ? "VALID" : "INVALID"); > > - region_dump(r1, ""); > > - expected[EXPECT_R1_EMPTY] = FALSE; > > - expected[EXPECT_R2_EMPTY] = TRUE; > > - expected[EXPECT_EQUAL] = FALSE; > > - expected[EXPECT_SECT] = FALSE; > > - expected[EXPECT_CONT] = TRUE; > > - test(r1, r2, expected); > > - printf("\n"); > > - > > - > > - region_clear(r1); > > - region_clear(r2); > > - > > - rect_set(r, 100, 100, 200, 200); > > - region_add(r1, r); > > - printf("dump r1 [%s]\n", region_is_valid(r1) ? "VALID" : "INVALID"); > > - region_dump(r1, ""); > > - expected[EXPECT_R1_EMPTY] = FALSE; > > - expected[EXPECT_R2_EMPTY] = TRUE; > > - expected[EXPECT_EQUAL] = FALSE; > > - expected[EXPECT_SECT] = FALSE; > > - expected[EXPECT_CONT] = TRUE; > > - test(r1, r2, expected); > > - printf("\n"); > > - > > - rect_set(r, 300, 300, 400, 400); > > - region_add(r1, r); > > - printf("dump r1 [%s]\n", region_is_valid(r1) ? "VALID" : "INVALID"); > > - region_dump(r1, ""); > > - expected[EXPECT_R1_EMPTY] = FALSE; > > - expected[EXPECT_R2_EMPTY] = TRUE; > > - expected[EXPECT_EQUAL] = FALSE; > > - expected[EXPECT_SECT] = FALSE; > > - expected[EXPECT_CONT] = TRUE; > > - test(r1, r2, expected); > > - printf("\n"); > > - > > - rect_set(r, 500, 500, 600, 600); > > - region_add(r2, r); > > - printf("dump r2 [%s]\n", region_is_valid(r2) ? "VALID" : "INVALID"); > > - region_dump(r2, ""); > > - expected[EXPECT_R1_EMPTY] = FALSE; > > - expected[EXPECT_R2_EMPTY] = FALSE; > > - expected[EXPECT_EQUAL] = FALSE; > > - expected[EXPECT_SECT] = FALSE; > > - expected[EXPECT_CONT] = FALSE; > > - test(r1, r2, expected); > > - printf("\n"); > > - > > - region_clear(r2); > > - > > - rect_set(r, 100, 100, 200, 200); > > - region_add(r2, r); > > - rect_set(r, 300, 300, 400, 400); > > - region_add(r2, r); > > - printf("dump r2 [%s]\n", region_is_valid(r2) ? "VALID" : "INVALID"); > > - region_dump(r2, ""); > > - expected[EXPECT_R1_EMPTY] = FALSE; > > - expected[EXPECT_R2_EMPTY] = FALSE; > > - expected[EXPECT_EQUAL] = TRUE; > > - expected[EXPECT_SECT] = TRUE; > > - expected[EXPECT_CONT] = TRUE; > > - test(r1, r2, expected); > > - printf("\n"); > > - > > - region_clear(r2); > > - > > - rect_set(r, 100, 100, 200, 200); > > - region_add(r2, r); > > - printf("dump r2 [%s]\n", region_is_valid(r2) ? "VALID" : "INVALID"); > > - region_dump(r2, ""); > > - expected[EXPECT_R1_EMPTY] = FALSE; > > - expected[EXPECT_R2_EMPTY] = FALSE; > > - expected[EXPECT_EQUAL] = FALSE; > > - expected[EXPECT_SECT] = TRUE; > > - expected[EXPECT_CONT] = TRUE; > > - test(r1, r2, expected); > > - printf("\n"); > > - > > - region_clear(r2); > > - > > - rect_set(r, -2000, -2000, -1000, -1000); > > - region_add(r2, r); > > - printf("dump r2 [%s]\n", region_is_valid(r2) ? "VALID" : "INVALID"); > > - region_dump(r2, ""); > > - expected[EXPECT_R1_EMPTY] = FALSE; > > - expected[EXPECT_R2_EMPTY] = FALSE; > > - expected[EXPECT_EQUAL] = FALSE; > > - expected[EXPECT_SECT] = FALSE; > > - expected[EXPECT_CONT] = FALSE; > > - test(r1, r2, expected); > > - printf("\n"); > > - > > - region_clear(r2); > > - > > - rect_set(r, -2000, -2000, 1000, 1000); > > - region_add(r2, r); > > - printf("dump r2 [%s]\n", region_is_valid(r2) ? "VALID" : "INVALID"); > > - region_dump(r2, ""); > > - expected[EXPECT_R1_EMPTY] = FALSE; > > - expected[EXPECT_R2_EMPTY] = FALSE; > > - expected[EXPECT_EQUAL] = FALSE; > > - expected[EXPECT_SECT] = TRUE; > > - expected[EXPECT_CONT] = FALSE; > > - test(r1, r2, expected); > > - printf("\n"); > > - > > - region_clear(r2); > > - > > - rect_set(r, 150, 150, 175, 175); > > - region_add(r2, r); > > - printf("dump r2 [%s]\n", region_is_valid(r2) ? "VALID" : "INVALID"); > > - region_dump(r2, ""); > > - expected[EXPECT_R1_EMPTY] = FALSE; > > - expected[EXPECT_R2_EMPTY] = FALSE; > > - expected[EXPECT_EQUAL] = FALSE; > > - expected[EXPECT_SECT] = TRUE; > > - expected[EXPECT_CONT] = TRUE; > > - test(r1, r2, expected); > > - printf("\n"); > > - > > - region_clear(r2); > > - > > - rect_set(r, 150, 150, 350, 350); > > - region_add(r2, r); > > - printf("dump r2 [%s]\n", region_is_valid(r2) ? "VALID" : "INVALID"); > > - region_dump(r2, ""); > > - expected[EXPECT_R1_EMPTY] = FALSE; > > - expected[EXPECT_R2_EMPTY] = FALSE; > > - expected[EXPECT_EQUAL] = FALSE; > > - expected[EXPECT_SECT] = TRUE; > > - expected[EXPECT_CONT] = FALSE; > > - test(r1, r2, expected); > > - printf("\n"); > > - > > - region_and(r2, r1); > > - printf("dump r2 and r1 [%s]\n", region_is_valid(r2) ? "VALID" : > > "INVALID"); > > - region_dump(r2, ""); > > - expected[EXPECT_R1_EMPTY] = FALSE; > > - expected[EXPECT_R2_EMPTY] = FALSE; > > - expected[EXPECT_EQUAL] = FALSE; > > - expected[EXPECT_SECT] = TRUE; > > - expected[EXPECT_CONT] = FALSE; > > - test(r2, r1, expected); > > - printf("\n"); > > - > > - > > - region_clone(r3, r1); > > - printf("dump r3 clone rgn [%s]\n", region_is_valid(r3) ? "VALID" : > > "INVALID"); > > - region_dump(r3, ""); > > - expected[EXPECT_R1_EMPTY] = FALSE; > > - expected[EXPECT_R2_EMPTY] = FALSE; > > - expected[EXPECT_EQUAL] = TRUE; > > - expected[EXPECT_SECT] = TRUE; > > - expected[EXPECT_CONT] = TRUE; > > - test(r1, r3, expected); > > - printf("\n"); > > - > > - j = 0; > > - for (i = 0; i < 1000000; i++) { > > - int res1, res2, test; > > - int tests[] = { > > - REGION_TEST_LEFT_EXCLUSIVE, > > - REGION_TEST_RIGHT_EXCLUSIVE, > > - REGION_TEST_SHARED, > > - REGION_TEST_LEFT_EXCLUSIVE | REGION_TEST_RIGHT_EXCLUSIVE, > > - REGION_TEST_LEFT_EXCLUSIVE | REGION_TEST_SHARED, > > - REGION_TEST_RIGHT_EXCLUSIVE | REGION_TEST_SHARED, > > - REGION_TEST_LEFT_EXCLUSIVE | REGION_TEST_RIGHT_EXCLUSIVE | > > REGION_TEST_SHARED > > - }; > > - > > - random_region(r1); > > - random_region(r2); > > - > > - for (test = 0; test < 7; test++) { > > - res1 = region_test(r1, r2, tests[test]); > > - res2 = slow_region_test(r1, r2, tests[test]); > > - if (res1 != res2) { > > - printf ("Error in region_test %d, got %d, expected %d, > > query=%d\n", > > - j, res1, res2, tests[test]); > > - printf ("r1:\n"); > > - region_dump(r1, ""); > > - printf ("r2:\n"); > > - region_dump(r2, ""); > > - } > > - j++; > > - } > > - } > > - > > - region_destroy(r3); > > - region_destroy(r1); > > - region_destroy(r2); > > - > > - return 0; > > -} > > - > > -#endif > > diff --git a/tests/Makefile.am b/tests/Makefile.am > > index 7022808..457bb23 100644 > > --- a/tests/Makefile.am > > +++ b/tests/Makefile.am > > @@ -54,6 +54,18 @@ test_quic_LDADD = \ > > $(NULL) > > endif > > > > +TESTS += test_region > > +test_region_SOURCES = \ > > + test-region.c \ > > + $(NULL) > > +test_region_CFLAGS = \ > > + -I$(top_srcdir) \ > > + $(SPICE_COMMON_CFLAGS) \ > > + $(PROTOCOL_CFLAGS) \ > > + $(NULL) > > +test_region_LDADD = \ > > + $(top_builddir)/common/libspice-common.la \ > > + $(NULL) > > > > # Avoid need for python(pyparsing) by end users > > TEST_MARSHALLERS = \ > > diff --git a/tests/meson.build b/tests/meson.build > > index 18b03c4..39408a1 100644 > > --- a/tests/meson.build > > +++ b/tests/meson.build > > @@ -1,7 +1,7 @@ > > # > > # Build tests > > # > > -tests = ['test-logging'] > > +tests = ['test-logging', 'test-region'] > > tests_deps = [spice_common_dep] > > > > if spice_common_generate_code == 'all' > > diff --git a/tests/test-region.c b/tests/test-region.c > > new file mode 100644 > > index 0000000..38b3203 > > --- /dev/null > > +++ b/tests/test-region.c > > @@ -0,0 +1,401 @@ > > +/* -*- Mode: C; c-basic-offset: 4; indent-tabs-mode: nil -*- */ > > +/* > > + Copyright (C) 2009 Red Hat, Inc. > > + > > + This library is free software; you can redistribute it and/or > > + modify it under the terms of the GNU Lesser General Public > > + License as published by the Free Software Foundation; either > > + version 2.1 of the License, or (at your option) any later version. > > + > > + This library 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 > > + Lesser General Public License for more details. > > + > > + You should have received a copy of the GNU Lesser General Public > > + License along with this library; if not, see > > <http://www.gnu.org/licenses/>. > > +*/ > > +#ifdef HAVE_CONFIG_H > > +#include <config.h> > > +#endif > > + > > +#include <stdio.h> > > +#include <string.h> > > +#include <stdlib.h> > > +#include <spice/macros.h> > > + > > +#include <common/region.h> > > + > > +static int slow_region_test(const QRegion *rgn, const QRegion *other_rgn, > > int query) > > +{ > > + pixman_region32_t intersection; > > + int res; > > + > > + pixman_region32_init(&intersection); > > + pixman_region32_intersect(&intersection, > > + (pixman_region32_t *)rgn, > > + (pixman_region32_t *)other_rgn); > > + > > + res = 0; > > + > > + if (query & REGION_TEST_SHARED && > > + pixman_region32_not_empty(&intersection)) { > > + res |= REGION_TEST_SHARED; > > + } > > + > > + if (query & REGION_TEST_LEFT_EXCLUSIVE && > > + !pixman_region32_equal(&intersection, (pixman_region32_t *)rgn)) { > > + res |= REGION_TEST_LEFT_EXCLUSIVE; > > + } > > + > > + if (query & REGION_TEST_RIGHT_EXCLUSIVE && > > + !pixman_region32_equal(&intersection, (pixman_region32_t > > *)other_rgn)) { > > + res |= REGION_TEST_RIGHT_EXCLUSIVE; > > + } > > + > > + pixman_region32_fini(&intersection); > > + > > + return res; > > +} > > + > > + > > +static int rect_is_valid(const SpiceRect *r) > > +{ > > + if (r->top > r->bottom || r->left > r->right) { > > + printf("%s: invalid rect\n", __FUNCTION__); > > + return FALSE; > > + } > > + return TRUE; > > +} > > + > > +static void rect_set(SpiceRect *r, int32_t top, int32_t left, int32_t > > bottom, int32_t right) > > +{ > > + r->top = top; > > + r->left = left; > > + r->bottom = bottom; > > + r->right = right; > > + spice_assert(rect_is_valid(r)); > > +} > > + > > +static void random_region(QRegion *reg) > > +{ > > + int i; > > + int num_rects; > > + int x, y, w, h; > > + SpiceRect _r; > > + SpiceRect *r = &_r; > > + > > + region_clear(reg); > > + > > + num_rects = rand() % 20; > > + for (i = 0; i < num_rects; i++) { > > + x = rand()%100; > > + y = rand()%100; > > + w = rand()%100; > > + h = rand()%100; > > + rect_set(r, > > + x, y, > > + x+w, y+h); > > + region_add(reg, r); > > + } > > +} > > + > > +static void test(const QRegion *r1, const QRegion *r2, int *expected) > > +{ > > + printf("r1 is_empty %s [%s]\n", > > + region_is_empty(r1) ? "TRUE" : "FALSE", > > + (region_is_empty(r1) == *(expected++)) ? "OK" : "ERR"); > > + printf("r2 is_empty %s [%s]\n", > > + region_is_empty(r2) ? "TRUE" : "FALSE", > > + (region_is_empty(r2) == *(expected++)) ? "OK" : "ERR"); > > + printf("is_equal %s [%s]\n", > > + region_is_equal(r1, r2) ? "TRUE" : "FALSE", > > + (region_is_equal(r1, r2) == *(expected++)) ? "OK" : "ERR"); > > + printf("intersects %s [%s]\n", > > + region_intersects(r1, r2) ? "TRUE" : "FALSE", > > + (region_intersects(r1, r2) == *(expected++)) ? "OK" : "ERR"); > > + printf("contains %s [%s]\n", > > + region_contains(r1, r2) ? "TRUE" : "FALSE", > > + (region_contains(r1, r2) == *(expected++)) ? "OK" : "ERR"); > > +} > > + > > +enum { > > + EXPECT_R1_EMPTY, > > + EXPECT_R2_EMPTY, > > + EXPECT_EQUAL, > > + EXPECT_SECT, > > + EXPECT_CONT, > > +}; > > + > > +int main(void) > > +{ > > Why not use the GTest API (even by just moving all of this 'main' code > in a single test case). > > Christophe > Why use GTest API ? I honestly just created a test and I prefer to have at least a first commit with a verbatim copy of the old test, in case we found some bugs later. For me is more important to have a test than the style of it. Was working, why changing it, is just more work (honestly I didn't spend much to say with GTest would be better or not... was doing some experiments with Meson+Gitlab+coverage output and I found that region.c was not that tested... so I found the test code there and I turned into a test see https://freddy77.pages.freedesktop.org/spice-common/) Frediano _______________________________________________ Spice-devel mailing list Spice-devel@xxxxxxxxxxxxxxxxxxxxx https://lists.freedesktop.org/mailman/listinfo/spice-devel