summaryrefslogtreecommitdiff
path: root/libpurple/tests/test_request_page.c
diff options
context:
space:
mode:
Diffstat (limited to 'libpurple/tests/test_request_page.c')
-rw-r--r--libpurple/tests/test_request_page.c194
1 files changed, 194 insertions, 0 deletions
diff --git a/libpurple/tests/test_request_page.c b/libpurple/tests/test_request_page.c
new file mode 100644
index 0000000000..aea7f52e63
--- /dev/null
+++ b/libpurple/tests/test_request_page.c
@@ -0,0 +1,194 @@
+/*
+ * Purple - Internet Messaging Library
+ * Copyright (C) Pidgin Developers <devel@pidgin.im>
+ *
+ * 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 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 <https://www.gnu.org/licenses/>.
+ */
+
+#include <glib.h>
+
+#include <purple.h>
+
+/******************************************************************************
+ * Helpers
+ *****************************************************************************/
+static gboolean
+test_request_page_string_validator(PurpleRequestField *field, char **errmsg,
+ G_GNUC_UNUSED gpointer data)
+{
+ /* Validator for a string field that is valid if the value is "valid". */
+ PurpleRequestFieldString *strfield = PURPLE_REQUEST_FIELD_STRING(field);
+ const char *value = NULL;
+ gboolean result = TRUE;
+
+ value = purple_request_field_string_get_value(strfield);
+ if(!purple_strequal(value, "valid")) {
+ if(errmsg != NULL) {
+ *errmsg = g_strdup_printf("String value is not valid: %s", value);
+ }
+ result = FALSE;
+ }
+
+ return result;
+}
+
+static PurpleRequestGroup *
+test_request_page_new_valid_group(const char *name) {
+ PurpleRequestGroup *group = NULL;
+ PurpleRequestField *field = NULL;
+ char *field_name = NULL;
+
+ group = purple_request_group_new(name);
+
+ /* Field is valid, making the group valid. */
+ field_name = g_strdup_printf("%s-string", name);
+ field = purple_request_field_string_new(field_name, field_name, "valid",
+ FALSE);
+ purple_request_field_set_validator(field,
+ test_request_page_string_validator,
+ NULL, NULL);
+ g_free(field_name);
+ purple_request_group_add_field(group, field);
+
+ return group;
+}
+
+static PurpleRequestGroup *
+test_request_page_new_invalid_group(const char *name) {
+ PurpleRequestGroup *group = NULL;
+ PurpleRequestField *field = NULL;
+ char *field_name = NULL;
+
+ group = purple_request_group_new(name);
+
+ /* Field is invalid, making the group invalid. */
+ field_name = g_strdup_printf("%s-string", name);
+ field = purple_request_field_string_new(field_name, field_name, "invalid",
+ FALSE);
+ purple_request_field_set_validator(field,
+ test_request_page_string_validator,
+ NULL, NULL);
+ g_free(field_name);
+ purple_request_group_add_field(group, field);
+
+ return group;
+}
+
+static void
+test_request_page_make_group_valid(PurpleRequestGroup *group) {
+ GListModel *model = G_LIST_MODEL(group);
+ guint n_items;
+
+ n_items = g_list_model_get_n_items(model);
+ for(guint index = 0; index < n_items; index++) {
+ PurpleRequestFieldString *field = g_list_model_get_item(model, index);
+ purple_request_field_string_set_value(field, "valid");
+ g_object_unref(field);
+ }
+}
+
+static void
+test_request_page_make_group_invalid(PurpleRequestGroup *group) {
+ GListModel *model = G_LIST_MODEL(group);
+ guint n_items;
+
+ n_items = g_list_model_get_n_items(model);
+ for(guint index = 0; index < n_items; index++) {
+ PurpleRequestFieldString *field = g_list_model_get_item(model, index);
+ purple_request_field_string_set_value(field, "invalid");
+ g_object_unref(field);
+ }
+}
+
+/******************************************************************************
+ * Tests
+ *****************************************************************************/
+static void
+test_request_page_valid_changed_cb(G_GNUC_UNUSED GObject *obj,
+ G_GNUC_UNUSED GParamSpec *pspec,
+ gpointer data)
+{
+ gint *called = data;
+
+ *called += 1;
+}
+
+static void
+test_request_page_valid(void) {
+ PurpleRequestPage *page = NULL;
+ PurpleRequestGroup *group1 = NULL, *group2 = NULL, *group3 = NULL;
+ gint called = FALSE;
+
+ page = purple_request_page_new();
+ g_signal_connect(page, "notify::valid",
+ G_CALLBACK(test_request_page_valid_changed_cb), &called);
+
+ /* Empty pages are always valid. */
+ g_assert_true(purple_request_page_is_valid(page));
+
+ /* An added valid group keeps the page valid. */
+ called = 0;
+ group1 = test_request_page_new_valid_group("group1");
+ purple_request_page_add_group(page, group1);
+ g_assert_true(purple_request_page_is_valid(page));
+ g_assert_cmpint(called, ==, 0);
+
+ /* Making the group invalid makes the page invalid. */
+ called = 0;
+ test_request_page_make_group_invalid(group1);
+ g_assert_false(purple_request_page_is_valid(page));
+ g_assert_cmpint(called, ==, 1);
+
+ /* Adding an invalid group keeps the page invalid. */
+ called = 0;
+ group2 = test_request_page_new_invalid_group("group2");
+ purple_request_page_add_group(page, group2);
+ g_assert_false(purple_request_page_is_valid(page));
+ g_assert_cmpint(called, ==, 0);
+
+ /* Adding a valid group to an already invalid page does not change it to
+ * valid accidentally. */
+ called = 0;
+ group3 = test_request_page_new_valid_group("group3");
+ purple_request_page_add_group(page, group3);
+ g_assert_false(purple_request_page_is_valid(page));
+ g_assert_cmpint(called, ==, 0);
+
+ /* Making one group valid while others are still invalid keeps the group
+ * invalid. */
+ called = 0;
+ test_request_page_make_group_valid(group1);
+ g_assert_false(purple_request_page_is_valid(page));
+ g_assert_cmpint(called, ==, 0);
+
+ /* Making last invalid group valid makes the page valid again. */
+ called = 0;
+ test_request_page_make_group_valid(group2);
+ g_assert_true(purple_request_page_is_valid(page));
+ g_assert_cmpint(called, ==, 1);
+
+ g_object_unref(page);
+}
+
+/******************************************************************************
+ * Main
+ *****************************************************************************/
+gint
+main(gint argc, gchar *argv[]) {
+ g_test_init(&argc, &argv, NULL);
+
+ g_test_add_func("/request-page/valid", test_request_page_valid);
+
+ return g_test_run();
+}