diff options
author | P. F. Chimento <philip.chimento@gmail.com> | 2013-05-03 18:33:05 +0200 |
---|---|---|
committer | P. F. Chimento <philip.chimento@gmail.com> | 2013-05-13 16:41:15 +0200 |
commit | 5e9dcb466c5506a8ea4b52e1eb452df6d806c823 (patch) | |
tree | c896145fc89115c6ffc37484f460a0e5330f7964 /test | |
parent | 55be2cb2bd90e55832af798c05e699c99fc3d38f (diff) |
Implement EosPageManager
Minimum functionality for EosPageManager. Currently uses a
GtkNotebook internally until we decide what to do regarding GtkStack.
(Philip; map/unmap Matt, Patrick)
Diffstat (limited to 'test')
-rw-r--r-- | test/Makefile.am | 1 | ||||
-rw-r--r-- | test/run-tests.c | 1 | ||||
-rw-r--r-- | test/run-tests.h | 1 | ||||
-rw-r--r-- | test/smoke-tests/app-window.js | 42 | ||||
-rw-r--r-- | test/test-page-manager.c | 333 |
5 files changed, 375 insertions, 3 deletions
diff --git a/test/Makefile.am b/test/Makefile.am index 39f4155..9435a9b 100644 --- a/test/Makefile.am +++ b/test/Makefile.am @@ -12,6 +12,7 @@ test_run_tests_SOURCES = \ test/test-init.c \ test/test-hello.c \ test/test-application.c \ + test/test-page-manager.c \ test/test-window.c test_run_tests_CPPFLAGS = $(TEST_FLAGS) test_run_tests_LDADD = $(TEST_LIBS) diff --git a/test/run-tests.c b/test/run-tests.c index aa6acbf..aaecef8 100644 --- a/test/run-tests.c +++ b/test/run-tests.c @@ -42,6 +42,7 @@ main (int argc, add_hello_tests (); add_application_tests (); add_window_tests (); + add_page_manager_tests (); return g_test_run (); } diff --git a/test/run-tests.h b/test/run-tests.h index 8d18015..77319a3 100644 --- a/test/run-tests.h +++ b/test/run-tests.h @@ -28,5 +28,6 @@ void add_init_tests (void); void add_hello_tests (void); void add_application_tests (void); void add_window_tests (void); +void add_page_manager_tests (void); #endif /* RUN_TESTS_H */ diff --git a/test/smoke-tests/app-window.js b/test/smoke-tests/app-window.js index 8f989ea..32b1736 100644 --- a/test/smoke-tests/app-window.js +++ b/test/smoke-tests/app-window.js @@ -6,6 +6,15 @@ const Gtk = imports.gi.Gtk; const TEST_APPLICATION_ID = 'com.endlessm.example.test'; +/* Override Endless.PageManager.add() */ +Endless.PageManager.prototype.add_real = Endless.PageManager.prototype.add +Endless.PageManager.prototype.add = function(child, props) { + this.add_real(child); + for(let prop_id in props) { + this.child_set_property(child, prop_id, props[prop_id]); + } +} + const TestApplication = new Lang.Class ({ Name: 'TestApplication', Extends: Endless.Application, @@ -13,14 +22,41 @@ const TestApplication = new Lang.Class ({ vfunc_startup: function() { this.parent(); - this._button = new Gtk.Button({label: 'Close me'}); - this._button.connect('clicked', Lang.bind(this, this._onButtonClicked)); + // First page + this._page0 = new Gtk.Grid({ orientation: Gtk.Orientation.VERTICAL }); + let a1 = new Gtk.Button({ label: 'Go to page1' }); + a1.connect('clicked', Lang.bind(this, function () { + this._pm.visible_page = this._page1; + })); + this._page0.add(a1); + let a2 = new Gtk.Button({ label: 'Go to page named "page1"' }); + a2.connect('clicked', Lang.bind(this, function () { + this._pm.visible_page_name = "page1"; + })); + this._page0.add(a2); + + // Second page + this._page1 = new Gtk.Grid({ orientation: Gtk.Orientation.HORIZONTAL }); + let b1 = new Gtk.Button({ label: 'Go to page0' }); + b1.connect('clicked', Lang.bind(this, function () { + this._pm.visible_page = this._page0; + })); + this._page1.add(b1); + let b2 = new Gtk.Button({ label: 'Go to page named "page0"' }); + b2.connect('clicked', Lang.bind(this, function () { + this._pm.visible_page_name = "page0"; + })); + this._page1.add(b2); + + this._pm = new Endless.PageManager(); + this._pm.add(this._page0, { name: "page0" }); + this._pm.add(this._page1, { name: "page1" }); this._window = new Endless.Window({ application: this, border_width: 16 }); - this._window.add(this._button); + this._window.add(this._pm); this._window.show_all(); }, diff --git a/test/test-page-manager.c b/test/test-page-manager.c new file mode 100644 index 0000000..00ce0ad --- /dev/null +++ b/test/test-page-manager.c @@ -0,0 +1,333 @@ +#include <gtk/gtk.h> +#include <endless/endless.h> + +#include "run-tests.h" + +#define PAGE1_NAME "page1" +#define PAGE2_NAME "page2" +#define PAGE3_NAME "page3" +#define EXPECTED_PAGE_NAME PAGE2_NAME +#define EXPECTED_CHANGED_PAGE_NAME "changed-name" +#define DUPLICATE_PAGE_NAME "duplicate-name" +#define EXPECTED_DUPLICATE_PAGE_NAME_ERRMSG "*Not setting page name to \"" \ + DUPLICATE_PAGE_NAME "\", because page manager already contains a page by " \ + "that name*" +#define ADD_PAGE_MANAGER_TEST(path, test_func) \ + g_test_add ((path), PageManagerFixture, NULL, \ + pm_fixture_setup, (test_func), pm_fixture_teardown) +#define ADD_EMPTY_PAGE_MANAGER_TEST(path, test_func) \ + g_test_add ((path), PageManagerFixture, NULL, \ + empty_pm_fixture_setup, (test_func), pm_fixture_teardown); + +typedef struct +{ + GtkWidget *pm; + GtkWidget *page1; + GtkWidget *page2; + GtkWidget *page3; +} PageManagerFixture; + +static void +pm_fixture_setup (PageManagerFixture *fixture, + gconstpointer unused) +{ + fixture->pm = eos_page_manager_new (); + fixture->page1 = gtk_label_new ("1"); + fixture->page2 = gtk_label_new ("2"); + fixture->page3 = gtk_label_new ("3"); + gtk_container_add_with_properties (GTK_CONTAINER (fixture->pm), + fixture->page1, + "name", PAGE1_NAME, + NULL); + gtk_container_add_with_properties (GTK_CONTAINER (fixture->pm), + fixture->page2, + "name", PAGE2_NAME, + NULL); + gtk_container_add_with_properties (GTK_CONTAINER (fixture->pm), + fixture->page3, + "name", PAGE3_NAME, + NULL); +} + +static void +empty_pm_fixture_setup (PageManagerFixture *fixture, + gconstpointer unused) +{ + fixture->pm = eos_page_manager_new (); +} + +static void +pm_fixture_teardown (PageManagerFixture *fixture, + gconstpointer unused) +{ + gtk_widget_destroy (fixture->pm); +} + +static void +test_pm_get_set_visible_page (PageManagerFixture *fixture, + gconstpointer unused) +{ + GtkWidget *visible_page; + visible_page = eos_page_manager_get_visible_page (EOS_PAGE_MANAGER (fixture->pm)); + g_assert (visible_page != fixture->page2); + eos_page_manager_set_visible_page (EOS_PAGE_MANAGER (fixture->pm), + fixture->page2); + visible_page = eos_page_manager_get_visible_page (EOS_PAGE_MANAGER (fixture->pm)); + g_assert (visible_page == fixture->page2); +} + +static void +test_pm_prop_visible_page (PageManagerFixture *fixture, + gconstpointer unused) +{ + GtkWidget *visible_page; + g_object_get (fixture->pm, "visible-page", &visible_page, NULL); + g_assert (visible_page != fixture->page2); + g_object_set (fixture->pm, "visible-page", fixture->page2, NULL); + g_object_get (fixture->pm, "visible-page", &visible_page, NULL); + g_assert (visible_page == fixture->page2); +} + +static void +test_pm_get_set_visible_page_name (PageManagerFixture *fixture, + gconstpointer unused) +{ + const gchar *name; + name = eos_page_manager_get_visible_page_name (EOS_PAGE_MANAGER (fixture->pm)); + g_assert_cmpstr (name, !=, EXPECTED_PAGE_NAME); + eos_page_manager_set_visible_page_name (EOS_PAGE_MANAGER (fixture->pm), + EXPECTED_PAGE_NAME); + name = eos_page_manager_get_visible_page_name (EOS_PAGE_MANAGER (fixture->pm)); + g_assert_cmpstr (name, ==, EXPECTED_PAGE_NAME); +} + +static void +test_pm_prop_visible_page_name (PageManagerFixture *fixture, + gconstpointer unused) +{ + gchar *name; + g_object_get (fixture->pm, "visible-page-name", &name, NULL); + g_assert_cmpstr (name, !=, EXPECTED_PAGE_NAME); + g_free (name); + g_object_set (fixture->pm, "visible-page-name", EXPECTED_PAGE_NAME, NULL); + g_object_get (fixture->pm, "visible-page-name", &name, NULL); + g_assert_cmpstr (name, ==, EXPECTED_PAGE_NAME); + g_free (name); +} + +static void +test_pm_get_set_page_name (PageManagerFixture *fixture, + gconstpointer unused) +{ + const gchar *name; + name = eos_page_manager_get_page_name (EOS_PAGE_MANAGER (fixture->pm), + fixture->page1); + g_assert_cmpstr (name, ==, PAGE1_NAME); + name = eos_page_manager_get_page_name (EOS_PAGE_MANAGER (fixture->pm), + fixture->page2); + g_assert_cmpstr (name, ==, PAGE2_NAME); + name = eos_page_manager_get_page_name (EOS_PAGE_MANAGER (fixture->pm), + fixture->page3); + g_assert_cmpstr (name, ==, PAGE3_NAME); + eos_page_manager_set_page_name (EOS_PAGE_MANAGER (fixture->pm), + fixture->page2, + EXPECTED_CHANGED_PAGE_NAME); + name = eos_page_manager_get_page_name (EOS_PAGE_MANAGER (fixture->pm), + fixture->page2); + g_assert_cmpstr (name, ==, EXPECTED_CHANGED_PAGE_NAME); +} + +static void +test_pm_child_prop_name (PageManagerFixture *fixture, + gconstpointer unused) +{ + gchar *name; + gtk_container_child_get (GTK_CONTAINER (fixture->pm), fixture->page1, + "name", &name, + NULL); + g_assert_cmpstr (name, ==, PAGE1_NAME); + g_free (name); + gtk_container_child_get (GTK_CONTAINER (fixture->pm), fixture->page2, + "name", &name, + NULL); + g_assert_cmpstr (name, ==, PAGE2_NAME); + g_free (name); + gtk_container_child_get (GTK_CONTAINER (fixture->pm), fixture->page3, + "name", &name, + NULL); + g_assert_cmpstr (name, ==, PAGE3_NAME); + g_free (name); + gtk_container_child_set (GTK_CONTAINER (fixture->pm), fixture->page2, + "name", EXPECTED_CHANGED_PAGE_NAME, + NULL); + gtk_container_child_get (GTK_CONTAINER (fixture->pm), fixture->page2, + "name", &name, + NULL); + g_assert_cmpstr (name, ==, EXPECTED_CHANGED_PAGE_NAME); + g_free (name); +} + +static void +test_pm_page_no_name (PageManagerFixture *fixture, + gconstpointer unused) +{ + const gchar *name_get; + gchar *name_prop; + GtkWidget *new_page = gtk_label_new("new"); + gtk_container_add (GTK_CONTAINER (fixture->pm), new_page); + name_get = eos_page_manager_get_page_name (EOS_PAGE_MANAGER (fixture->pm), new_page); + g_assert_cmpstr (name_get, ==, ""); + gtk_container_child_get (GTK_CONTAINER (fixture->pm), new_page, + "name", &name_prop, + NULL); + g_assert_cmpstr (name_prop, ==, ""); + g_free (name_prop); +} + +static void +test_pm_remove_page_behavior (PageManagerFixture *fixture, + gconstpointer unused) +{ + GtkWidget *visible_page; + visible_page = eos_page_manager_get_visible_page (EOS_PAGE_MANAGER (fixture->pm)); + g_assert (visible_page == fixture->page1); + gtk_container_remove (GTK_CONTAINER (fixture->pm), fixture->page3); + visible_page = eos_page_manager_get_visible_page (EOS_PAGE_MANAGER (fixture->pm)); + g_assert (visible_page == fixture->page1); + gtk_container_remove (GTK_CONTAINER (fixture->pm), fixture->page2); + visible_page = eos_page_manager_get_visible_page (EOS_PAGE_MANAGER (fixture->pm)); + g_assert (visible_page == fixture->page1); + gtk_container_remove (GTK_CONTAINER (fixture->pm), fixture->page1); + visible_page = eos_page_manager_get_visible_page (EOS_PAGE_MANAGER (fixture->pm)); + g_assert (visible_page == NULL); +} + +static void +test_pm_remove_page_undefined_behavior (PageManagerFixture *fixture, + gconstpointer unused) +{ + GtkWidget *visible_page; + visible_page = eos_page_manager_get_visible_page (EOS_PAGE_MANAGER (fixture->pm)); + g_assert (visible_page == fixture->page1); + gtk_container_remove (GTK_CONTAINER (fixture->pm), fixture->page1); + visible_page = eos_page_manager_get_visible_page (EOS_PAGE_MANAGER (fixture->pm)); + g_assert (visible_page != fixture->page1); +} + +static void +test_pm_remove_page_by_name (PageManagerFixture *fixture, + gconstpointer unused) +{ + GList *pages = gtk_container_get_children (GTK_CONTAINER (fixture->pm)); + guint length = g_list_length (pages); + g_list_free (pages); + + eos_page_manager_remove_page_by_name (EOS_PAGE_MANAGER (fixture->pm), + PAGE2_NAME); + pages = gtk_container_get_children (GTK_CONTAINER (fixture->pm)); + g_assert_cmpuint (g_list_length (pages), ==, length - 1); + g_assert (g_list_find (pages, fixture->page1) != NULL); + g_assert (g_list_find (pages, fixture->page2) == NULL); + g_assert (g_list_find (pages, fixture->page3) != NULL); + g_list_free (pages); +} + +static void +test_pm_duplicate_page_name (PageManagerFixture *fixture, + gconstpointer unused) +{ + eos_page_manager_set_page_name (EOS_PAGE_MANAGER (fixture->pm), + fixture->page1, + DUPLICATE_PAGE_NAME); + /* Should not complain */ + eos_page_manager_set_page_name (EOS_PAGE_MANAGER (fixture->pm), + fixture->page1, + DUPLICATE_PAGE_NAME); + + g_test_expect_message (TEST_LOG_DOMAIN, G_LOG_LEVEL_CRITICAL, + EXPECTED_DUPLICATE_PAGE_NAME_ERRMSG); + eos_page_manager_set_page_name (EOS_PAGE_MANAGER (fixture->pm), + fixture->page2, + DUPLICATE_PAGE_NAME); + g_test_assert_expected_messages (); + + const gchar *name = eos_page_manager_get_page_name (EOS_PAGE_MANAGER (fixture->pm), + fixture->page2); + g_assert_cmpstr (name, !=, DUPLICATE_PAGE_NAME); +} + +static void +test_empty_pm_visible_page (PageManagerFixture *fixture, + gconstpointer unused) +{ + GtkWidget *visible_page_get, *visible_page_prop; + visible_page_get = eos_page_manager_get_visible_page (EOS_PAGE_MANAGER (fixture->pm)); + g_assert (visible_page_get == NULL); + g_object_get (fixture->pm, "visible-page", &visible_page_prop, NULL); + g_assert (visible_page_prop == NULL); +} + +static void +test_empty_pm_visible_page_name (PageManagerFixture *fixture, + gconstpointer unused) +{ + const gchar *name_get; + gchar *name_prop; + name_get = eos_page_manager_get_visible_page_name (EOS_PAGE_MANAGER (fixture->pm)); + g_assert (name_get == NULL); + g_object_get (fixture->pm, "visible-page-name", &name_prop, NULL); + g_assert (name_prop == NULL); +} + +static void +test_empty_pm_add_page_behavior (PageManagerFixture *fixture, + gconstpointer unused) +{ + GtkWidget *visible_page; + GtkWidget *page1 = gtk_label_new ("page1"); + GtkWidget *page2 = gtk_label_new ("page2"); + gtk_container_add (GTK_CONTAINER (fixture->pm), page1); + visible_page = eos_page_manager_get_visible_page (EOS_PAGE_MANAGER (fixture->pm)); + g_assert (visible_page == page1); + gtk_container_add (GTK_CONTAINER (fixture->pm), page2); + visible_page = eos_page_manager_get_visible_page (EOS_PAGE_MANAGER (fixture->pm)); + g_assert (visible_page == page1); /* Not page2! */ +} + +void +add_page_manager_tests (void) +{ + ADD_PAGE_MANAGER_TEST ("/page-manager/get-set-visible-page", + test_pm_get_set_visible_page); + ADD_PAGE_MANAGER_TEST ("/page-manager/prop-visible-page", + test_pm_prop_visible_page); + ADD_PAGE_MANAGER_TEST ("/page-manager/get-set-visible-page-name", + test_pm_get_set_visible_page_name); + ADD_PAGE_MANAGER_TEST ("/page-manager/prop-visible-page-name", + test_pm_prop_visible_page_name); + ADD_PAGE_MANAGER_TEST ("/page-manager/get-set-page-name", + test_pm_get_set_page_name); + ADD_PAGE_MANAGER_TEST ("/page-manager/child-prop-name", + test_pm_child_prop_name); + ADD_PAGE_MANAGER_TEST ("/page-manager/page-no-name", test_pm_page_no_name); + ADD_PAGE_MANAGER_TEST ("/page-manager/remove-page-by-name", + test_pm_remove_page_by_name); + ADD_PAGE_MANAGER_TEST ("/page-manager/duplicate-page-name", + test_pm_duplicate_page_name); + ADD_EMPTY_PAGE_MANAGER_TEST ("/page-manager/empty-visible-page", + test_empty_pm_visible_page); + ADD_EMPTY_PAGE_MANAGER_TEST ("/page-manager/empty-visible-page-name", + test_empty_pm_visible_page_name); + ADD_EMPTY_PAGE_MANAGER_TEST ("/page-manager/add-page-behavior", + test_empty_pm_add_page_behavior); + + /* Disabled until https://bugzilla.gnome.org/show_bug.cgi?id=699756 is fixed + [endlessm/eos-sdk#67] */ + if (FALSE) + { + ADD_PAGE_MANAGER_TEST ("/page-manager/remove-page-behavior", + test_pm_remove_page_behavior); + ADD_PAGE_MANAGER_TEST ("/page-manager/remove-page-undefined-behavior", + test_pm_remove_page_undefined_behavior); + } +} |