summaryrefslogtreecommitdiff
path: root/test
diff options
context:
space:
mode:
authorP. F. Chimento <philip.chimento@gmail.com>2013-05-03 18:33:05 +0200
committerP. F. Chimento <philip.chimento@gmail.com>2013-05-13 16:41:15 +0200
commit5e9dcb466c5506a8ea4b52e1eb452df6d806c823 (patch)
treec896145fc89115c6ffc37484f460a0e5330f7964 /test
parent55be2cb2bd90e55832af798c05e699c99fc3d38f (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.am1
-rw-r--r--test/run-tests.c1
-rw-r--r--test/run-tests.h1
-rw-r--r--test/smoke-tests/app-window.js42
-rw-r--r--test/test-page-manager.c333
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);
+ }
+}