summaryrefslogtreecommitdiff
path: root/src/tests/eina_test_quadtree.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/tests/eina_test_quadtree.c')
-rw-r--r--src/tests/eina_test_quadtree.c195
1 files changed, 195 insertions, 0 deletions
diff --git a/src/tests/eina_test_quadtree.c b/src/tests/eina_test_quadtree.c
new file mode 100644
index 0000000..52faeec
--- /dev/null
+++ b/src/tests/eina_test_quadtree.c
@@ -0,0 +1,195 @@
+/* EINA - EFL data type library
+ * Copyright (C) 2010 Cedric Bail
+ *
+ * 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 <assert.h>
+#include <stdio.h>
+
+#include "eina_suite.h"
+#include "Eina.h"
+
+static Eina_Quad_Direction
+_eina_quadtree_rectangle_vert(const void *object, size_t middle)
+{
+ const Eina_Rectangle *r = object;
+
+ if (r->y + r->h < (int)middle)
+ return EINA_QUAD_LEFT;
+
+ if (r->y > (int)middle)
+ return EINA_QUAD_RIGHT;
+
+ return EINA_QUAD_BOTH;
+}
+
+static Eina_Quad_Direction
+_eina_quadtree_rectangle_hort(const void *object, size_t middle)
+{
+ const Eina_Rectangle *r = object;
+
+ if (r->x + r->w < (int)middle)
+ return EINA_QUAD_LEFT;
+
+ if (r->x > (int)middle)
+ return EINA_QUAD_RIGHT;
+
+ return EINA_QUAD_BOTH;
+}
+
+START_TEST(eina_quadtree_collision)
+{
+ struct
+ {
+ Eina_Rectangle r;
+ Eina_QuadTree_Item *item;
+ } objects[] = {
+ { { 10, 10, 30, 30 }, NULL },
+ { { 20, 20, 30, 30 }, NULL },
+ { { 5, 30, 30, 30 }, NULL },
+ { { 70, 130, 100, 100 }, NULL },
+ { { 10, 220, 50, 40 }, NULL },
+ { { 310, 20, 50, 30 }, NULL },
+ { { 300, 220, 40, 40 }, NULL },
+ { { 500, 150, 40, 40 }, NULL },
+ { { 500, 220, 40, 40 }, NULL },
+ { { 330, 250, 40, 40 }, NULL },
+ { { 300, 400, 40, 40 }, NULL },
+ { { 10, 400, 40, 40 }, NULL },
+ { { 0, 0, 0, 0 }, NULL }
+ };
+ struct
+ {
+ Eina_Rectangle r;
+ int count;
+ int result[20];
+ } tests [] = {
+ { { 600, 400, 40, 40 }, 4, { 4, 6, 8, 10 } },
+ { { 20, 30, 10, 10 }, 7, { 0, 1, 2, 4, 5, 6, 8 } },
+ { { 0, 0, 0, 0 }, -1, {} },
+ };
+ int hidden[] = { 4, 5, 6, 8, 10 };
+ int show[] = { 0, 1, 2 };
+ Eina_QuadTree *q;
+ Eina_Inlist *head;
+ Eina_Rectangle *r;
+ int count;
+ int i;
+
+ fail_if(!eina_init());
+
+ q = eina_quadtree_new(640, 480,
+ _eina_quadtree_rectangle_vert,
+ _eina_quadtree_rectangle_hort);
+
+ fail_if(!q);
+
+ for (i = 0; objects[i].r.w != 0 && objects[i].r.h != 0; ++i)
+ {
+ objects[i].item = eina_quadtree_add(q, &objects[i].r);
+ fail_if(!objects[i].item);
+ fail_if(!eina_quadtree_show(objects[i].item));
+ }
+
+ eina_quadtree_resize(q, 640, 480);
+
+ for (i = 0; tests[i].count != -1; ++i)
+ {
+ head = eina_quadtree_collide(q,
+ tests[i].r.x, tests[i].r.y,
+ tests[i].r.w, tests[i].r.h);
+
+ count = 0;
+ while (head)
+ {
+ int k;
+
+ r = eina_quadtree_object(head);
+
+ for (k = 0; k < tests[i].count; ++k)
+ {
+ if (&objects[tests[i].result[k]].r == r)
+ break;
+ }
+ fail_if(k == tests[i].count);
+
+ head = head->next;
+ count++;
+ }
+ fail_if(count != tests[i].count);
+ }
+
+ for (i = 0; i < (int)(sizeof (hidden) / sizeof (int)); ++i)
+ eina_quadtree_hide(objects[hidden[i]].item);
+ for (i = 0; i < (int)(sizeof (show) / sizeof (int)); ++i)
+ eina_quadtree_show(objects[show[i]].item);
+
+ head = eina_quadtree_collide(q,
+ tests[1].r.x, tests[1].r.y,
+ tests[1].r.w, tests[1].r.h);
+
+ count = 0;
+ while (head)
+ {
+ r = eina_quadtree_object(head);
+
+ fail_if(r != &objects[tests[1].result[show[count]]].r);
+
+ head = head->next;
+ count++;
+ }
+ fail_if(count != 3);
+
+ eina_quadtree_cycle(q);
+ eina_quadtree_show(objects[4].item);
+ eina_quadtree_increase(objects[4].item);
+ eina_quadtree_show(objects[5].item);
+ eina_quadtree_increase(objects[5].item);
+ eina_quadtree_del(objects[5].item);
+ eina_quadtree_change(objects[10].item);
+ eina_quadtree_increase(objects[10].item);
+
+ eina_quadtree_resize(q, 641, 480);
+
+ head = eina_quadtree_collide(q,
+ tests[0].r.x, tests[0].r.y,
+ tests[0].r.w, tests[0].r.h);
+
+ count = 0;
+ while (head)
+ {
+ r = eina_quadtree_object(head);
+
+ head = head->next;
+ count++;
+ }
+ fail_if(count != 1);
+
+ eina_quadtree_free(q);
+
+ eina_shutdown();
+}
+END_TEST
+
+void
+eina_test_quadtree(TCase *tc)
+{
+ tcase_add_test(tc, eina_quadtree_collision);
+}