diff options
author | Přemysl Janouch <p.janouch@gmail.com> | 2011-02-05 19:47:07 +0100 |
---|---|---|
committer | Přemysl Janouch <p.janouch@gmail.com> | 2011-02-05 19:47:07 +0100 |
commit | dca71f66c3cf65537017d5add98617a60235e5d7 (patch) | |
tree | 2365d1c909ba92f240b18eacee03f51ee08445a0 /tests | |
parent | 611b11508a910118694b6da0958a022826c07b29 (diff) | |
download | logdiag-dca71f66c3cf65537017d5add98617a60235e5d7.tar.gz logdiag-dca71f66c3cf65537017d5add98617a60235e5d7.tar.xz logdiag-dca71f66c3cf65537017d5add98617a60235e5d7.zip |
Fix undoing, create a unit test for history.
Diffstat (limited to 'tests')
-rw-r--r-- | tests/diagram.c | 143 |
1 files changed, 143 insertions, 0 deletions
diff --git a/tests/diagram.c b/tests/diagram.c new file mode 100644 index 0000000..9638ca2 --- /dev/null +++ b/tests/diagram.c @@ -0,0 +1,143 @@ +/* + * diagram.c + * + * This file is a part of logdiag. + * Copyright Přemysl Janouch 2011. All rights reserved. + * + * See the file LICENSE for licensing information. + * + */ + +#include <liblogdiag/liblogdiag.h> + +typedef struct +{ + LdDiagram *diagram; +} +Diagram; + +static void +diagram_setup (Diagram *fixture, gconstpointer test_data) +{ + fixture->diagram = ld_diagram_new (); +} + +static void +diagram_teardown (Diagram *fixture, gconstpointer test_data) +{ + g_object_unref (fixture->diagram); +} + +static void +diagram_test_history (Diagram *fixture, gconstpointer user_data) +{ + const gdouble start_x = 1; + const guint move_length = 3; + LdDiagramObject *object; + guint i; + gdouble x; + + object = ld_diagram_object_new (NULL); + g_object_set (object, "x", start_x, NULL); + + /* Link an object with the diagram. */ + ld_diagram_insert_object (fixture->diagram, object, 0); + g_assert (ld_diagram_can_undo (fixture->diagram) != FALSE); + + /* Create some object actions to undo. */ + for (i = 0; i++ < move_length;) + g_object_set (object, "x", start_x + i, NULL); + + /* Undo them and check the state. */ + for (i = move_length; i--;) + { + g_assert (ld_diagram_can_undo (fixture->diagram) != FALSE); + ld_diagram_undo (fixture->diagram); + + g_object_get (object, "x", &x, NULL); + g_assert_cmpfloat (x, ==, start_x + i); + } + + /* Redo them and check the state. */ + for (i = 0; i++ < move_length;) + { + g_assert (ld_diagram_can_redo (fixture->diagram) != FALSE); + ld_diagram_redo (fixture->diagram); + + g_object_get (object, "x", &x, NULL); + g_assert_cmpfloat (x, ==, start_x + i); + } + + g_object_unref (object); +} + +static void +diagram_test_history_grouping (Diagram *fixture, gconstpointer user_data) +{ + const LdPoint start_position = {1, 3}; + const guint move_length = 3; + LdDiagramObject *object; + guint i; + gdouble x, y; + + object = ld_diagram_object_new (NULL); + g_object_set (object, + "x", start_position.x, + "y", start_position.y, + NULL); + + /* Create a single user action. */ + ld_diagram_begin_user_action (fixture->diagram); + ld_diagram_insert_object (fixture->diagram, object, 0); + for (i = 0; i++ < move_length;) + { + ld_diagram_begin_user_action (fixture->diagram); + g_object_set (object, + "x", start_position.x + i, + "y", start_position.y + i, + NULL); + ld_diagram_end_user_action (fixture->diagram); + } + ld_diagram_end_user_action (fixture->diagram); + + /* Undo the action. */ + g_assert (ld_diagram_get_objects (fixture->diagram) != NULL); + g_assert (ld_diagram_can_undo (fixture->diagram) != FALSE); + ld_diagram_undo (fixture->diagram); + + /* Check that it has been undone correctly. */ + g_assert (ld_diagram_get_objects (fixture->diagram) == NULL); + g_assert (ld_diagram_can_undo (fixture->diagram) == FALSE); + + g_object_get (object, "x", &x, "y", &y, NULL); + g_assert_cmpfloat (x, ==, start_position.x); + g_assert_cmpfloat (y, ==, start_position.y); + + /* Redo the action. */ + g_assert (ld_diagram_can_redo (fixture->diagram) != FALSE); + ld_diagram_redo (fixture->diagram); + + /* Check that it has been redone correctly. */ + g_object_get (object, "x", &x, "y", &y, NULL); + g_assert_cmpfloat (x, ==, start_position.x + move_length); + g_assert_cmpfloat (y, ==, start_position.y + move_length); + + g_object_unref (object); +} + +int +main (int argc, char *argv[]) +{ + gtk_test_init (&argc, &argv, NULL); + + /* History. */ + g_test_add ("/diagram/history", Diagram, NULL, + diagram_setup, diagram_test_history, + diagram_teardown); + g_test_add ("/diagram/history-grouping", Diagram, NULL, + diagram_setup, diagram_test_history_grouping, + diagram_teardown); + + return g_test_run (); +} + |