MoeMoji/tests/test-moemoji.c

602 lines
20 KiB
C
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

#include "moemoji-internal.h"
#include "moemoji-window.h"
#include <glib.h>
#include <glib/gstdio.h>
#include <gtk/gtk.h>
static void test_display_name_underscores(void) {
char *name = make_display_name("happy_faces");
g_assert_cmpstr(name, ==, "Happy faces");
g_free(name);
}
static void test_display_name_no_underscores(void) {
char *name = make_display_name("animals");
g_assert_cmpstr(name, ==, "Animals");
g_free(name);
}
static void test_display_name_already_upper(void) {
char *name = make_display_name("Animals");
g_assert_cmpstr(name, ==, "Animals");
g_free(name);
}
static void test_display_name_single_char(void) {
char *name = make_display_name("x");
g_assert_cmpstr(name, ==, "X");
g_free(name);
}
static void test_display_name_empty(void) {
char *name = make_display_name("");
g_assert_cmpstr(name, ==, "");
g_free(name);
}
static void test_find_kaomoji_with_env(void) {
char *dir = find_kaomoji_dir();
g_assert_nonnull(dir);
g_assert_true(g_file_test(dir, G_FILE_TEST_IS_DIR));
g_free(dir);
}
static gboolean find_kaomoji_bogus_passed = FALSE;
static void run_find_kaomoji_bogus(void) {
g_setenv("MESON_SOURCE_ROOT", "/nonexistent", TRUE);
char *saved = g_get_current_dir();
g_assert_true(g_chdir("/tmp") == 0);
char *dir = find_kaomoji_dir();
g_free(dir);
g_assert_true(g_chdir(saved) == 0);
g_free(saved);
g_setenv("MESON_SOURCE_ROOT", SRCDIR, TRUE);
find_kaomoji_bogus_passed = TRUE;
}
static void test_find_kaomoji_bogus(void) {
g_assert_true(find_kaomoji_bogus_passed);
}
static void test_sni_category(void) {
GVariant *v =
sni_get_property(NULL, NULL, NULL, NULL, "Category", NULL, NULL);
g_assert_nonnull(v);
g_assert_cmpstr(g_variant_get_string(v, NULL), ==, "ApplicationStatus");
g_variant_unref(v);
}
static void test_sni_id(void) {
GVariant *v = sni_get_property(NULL, NULL, NULL, NULL, "Id", NULL, NULL);
g_assert_nonnull(v);
g_assert_cmpstr(g_variant_get_string(v, NULL), ==, "moemoji");
g_variant_unref(v);
}
static void test_sni_item_is_menu(void) {
GVariant *v =
sni_get_property(NULL, NULL, NULL, NULL, "ItemIsMenu", NULL, NULL);
g_assert_nonnull(v);
g_assert_false(g_variant_get_boolean(v));
g_variant_unref(v);
}
static void test_sni_menu(void) {
GVariant *v = sni_get_property(NULL, NULL, NULL, NULL, "Menu", NULL, NULL);
g_assert_nonnull(v);
g_assert_cmpstr(g_variant_get_string(v, NULL), ==, "/MenuBar");
g_variant_unref(v);
}
static void test_sni_unknown(void) {
GVariant *v =
sni_get_property(NULL, NULL, NULL, NULL, "Nonexistent", NULL, NULL);
g_assert_null(v);
}
static void test_dbusmenu_version(void) {
GVariant *v =
dbusmenu_get_property(NULL, NULL, NULL, NULL, "Version", NULL, NULL);
g_assert_nonnull(v);
g_assert_cmpuint(g_variant_get_uint32(v), ==, 3);
g_variant_unref(v);
}
static void test_dbusmenu_status(void) {
GVariant *v =
dbusmenu_get_property(NULL, NULL, NULL, NULL, "Status", NULL, NULL);
g_assert_nonnull(v);
g_assert_cmpstr(g_variant_get_string(v, NULL), ==, "normal");
g_variant_unref(v);
}
static void test_dbusmenu_text_direction(void) {
GVariant *v = dbusmenu_get_property(NULL, NULL, NULL, NULL, "TextDirection",
NULL, NULL);
g_assert_nonnull(v);
g_assert_cmpstr(g_variant_get_string(v, NULL), ==, "ltr");
g_variant_unref(v);
}
static void test_dbusmenu_unknown(void) {
GVariant *v =
dbusmenu_get_property(NULL, NULL, NULL, NULL, "Bogus", NULL, NULL);
g_assert_null(v);
}
static void test_category_widgets_chip_init(void) {
CategoryWidgets *cw = g_new0(CategoryWidgets, 1);
g_assert_null(cw->chip);
g_assert_null(cw->header);
g_assert_null(cw->flow);
g_assert_null(cw->name);
g_free(cw);
}
G_GNUC_INTERNAL GResource *moemoji_get_resource(void);
static GResource *test_res = NULL;
static GtkWidget *test_win = NULL;
static MoeMojiWindow *test_self = NULL;
static void window_test_setup(void) {
if (!test_res) {
test_res = moemoji_get_resource();
g_resources_register(test_res);
}
test_win = g_object_new(MOEMOJI_TYPE_WINDOW, NULL);
test_self = MOEMOJI_WINDOW(test_win);
}
static void window_test_teardown(void) {
gtk_window_destroy(GTK_WINDOW(test_win));
test_win = NULL;
test_self = NULL;
}
static void test_window_chip_setup(void) {
window_test_setup();
g_assert_cmpuint(test_self->category_widgets->len, >, 0);
for (guint i = 0; i < test_self->category_widgets->len; i++) {
CategoryWidgets *cw = g_ptr_array_index(test_self->category_widgets, i);
g_assert_nonnull(cw->chip);
}
window_test_teardown();
}
static void test_window_chip_labels_match(void) {
window_test_setup();
for (guint i = 0; i < test_self->category_widgets->len; i++) {
CategoryWidgets *cw = g_ptr_array_index(test_self->category_widgets, i);
const char *chip_label = gtk_button_get_label(GTK_BUTTON(cw->chip));
g_assert_cmpstr(chip_label, ==, cw->name);
}
window_test_teardown();
}
static void test_window_initial_active_chip(void) {
window_test_setup();
g_assert_cmpint(test_self->active_chip_index, ==, -1);
window_test_teardown();
}
static void test_window_all_categories_visible(void) {
window_test_setup();
for (guint i = 0; i < test_self->category_widgets->len; i++) {
CategoryWidgets *cw = g_ptr_array_index(test_self->category_widgets, i);
g_assert_true(gtk_widget_get_visible(cw->header));
g_assert_true(gtk_widget_get_visible(cw->flow));
}
window_test_teardown();
}
static void test_window_bottom_spacer(void) {
window_test_setup();
g_assert_nonnull(test_self->bottom_spacer);
GtkWidget *last =
gtk_widget_get_last_child(GTK_WIDGET(test_self->content_box));
g_assert_true(last == test_self->bottom_spacer);
window_test_teardown();
}
static void test_window_view_stack_exists(void) {
window_test_setup();
g_assert_nonnull(test_self->view_stack);
g_assert_true(GTK_IS_STACK(test_self->view_stack));
const char *name = gtk_stack_get_visible_child_name(test_self->view_stack);
g_assert_cmpstr(name, ==, "main");
window_test_teardown();
}
static void test_window_add_button_navigates(void) {
window_test_setup();
g_assert_nonnull(test_self->add_button);
g_assert_nonnull(test_self->back_button);
g_assert_true(gtk_widget_get_visible(test_self->add_button));
g_assert_false(gtk_widget_get_visible(test_self->back_button));
g_signal_emit_by_name(test_self->add_button, "clicked");
const char *name = gtk_stack_get_visible_child_name(test_self->view_stack);
g_assert_cmpstr(name, ==, "add-choice");
g_assert_false(gtk_widget_get_visible(test_self->add_button));
g_assert_true(gtk_widget_get_visible(test_self->back_button));
g_signal_emit_by_name(test_self->back_button, "clicked");
name = gtk_stack_get_visible_child_name(test_self->view_stack);
g_assert_cmpstr(name, ==, "main");
g_assert_true(gtk_widget_get_visible(test_self->add_button));
g_assert_false(gtk_widget_get_visible(test_self->back_button));
window_test_teardown();
}
static void test_window_stack_pages_exist(void) {
window_test_setup();
g_assert_nonnull(gtk_stack_get_child_by_name(test_self->view_stack, "main"));
g_assert_nonnull(
gtk_stack_get_child_by_name(test_self->view_stack, "add-choice"));
g_assert_nonnull(
gtk_stack_get_child_by_name(test_self->view_stack, "add-category"));
g_assert_nonnull(
gtk_stack_get_child_by_name(test_self->view_stack, "pick-category"));
g_assert_nonnull(
gtk_stack_get_child_by_name(test_self->view_stack, "add-entry"));
g_assert_nonnull(
gtk_stack_get_child_by_name(test_self->view_stack, "manage"));
window_test_teardown();
}
static void test_add_category_creates_dir(void) {
char *cat_dir = g_build_filename(g_get_user_data_dir(), "moemoji", "kaomoji",
"ZZZ_test_category", NULL);
g_mkdir_with_parents(cat_dir, 0755);
window_test_setup();
gboolean found = FALSE;
for (guint i = 0; i < test_self->category_widgets->len; i++) {
CategoryWidgets *cw = g_ptr_array_index(test_self->category_widgets, i);
if (g_strcmp0(cw->name, "ZZZ test category") == 0) {
found = TRUE;
break;
}
}
g_assert_true(found);
window_test_teardown();
g_rmdir(cat_dir);
char *kaomoji_parent =
g_build_filename(g_get_user_data_dir(), "moemoji", "kaomoji", NULL);
g_rmdir(kaomoji_parent);
g_free(kaomoji_parent);
char *moemoji_parent =
g_build_filename(g_get_user_data_dir(), "moemoji", NULL);
g_rmdir(moemoji_parent);
g_free(moemoji_parent);
g_free(cat_dir);
}
static void test_add_entry_creates_file(void) {
char *cat_dir = g_build_filename(g_get_user_data_dir(), "moemoji", "kaomoji",
"ZZZ_test_entry_cat", NULL);
g_mkdir_with_parents(cat_dir, 0755);
char *fpath = g_build_filename(cat_dir, "1.txt", NULL);
g_file_set_contents(fpath, "(╯°□°)╯︵ ┻━┻\n", -1, NULL);
window_test_setup();
gboolean found = FALSE;
for (guint i = 0; i < test_self->category_widgets->len; i++) {
CategoryWidgets *cw = g_ptr_array_index(test_self->category_widgets, i);
if (g_strcmp0(cw->name, "ZZZ test entry cat") == 0) {
GtkWidget *first = gtk_widget_get_first_child(cw->flow);
g_assert_nonnull(first);
found = TRUE;
break;
}
}
g_assert_true(found);
g_free(test_self->selected_category_dir);
test_self->selected_category_dir = g_strdup(cat_dir);
GtkTextBuffer *buf =
gtk_text_view_get_buffer(GTK_TEXT_VIEW(test_self->entry_text_view));
gtk_text_buffer_set_text(buf, "( ˘ω˘ )", -1);
GtkWidget *entry_page =
gtk_stack_get_child_by_name(test_self->view_stack, "add-entry");
GtkWidget *save_btn = gtk_widget_get_last_child(entry_page);
g_assert_nonnull(save_btn);
g_signal_emit_by_name(save_btn, "clicked");
char *fpath2 = g_build_filename(cat_dir, "2.txt", NULL);
g_assert_true(g_file_test(fpath2, G_FILE_TEST_EXISTS));
char *contents = NULL;
g_file_get_contents(fpath2, &contents, NULL, NULL);
g_assert_nonnull(contents);
g_strchomp(contents);
g_assert_cmpstr(contents, ==, "( ˘ω˘ )");
g_free(contents);
const char *name = gtk_stack_get_visible_child_name(test_self->view_stack);
g_assert_cmpstr(name, ==, "main");
window_test_teardown();
g_unlink(fpath);
g_unlink(fpath2);
g_rmdir(cat_dir);
char *kaomoji_parent =
g_build_filename(g_get_user_data_dir(), "moemoji", "kaomoji", NULL);
g_rmdir(kaomoji_parent);
g_free(kaomoji_parent);
char *moemoji_parent =
g_build_filename(g_get_user_data_dir(), "moemoji", NULL);
g_rmdir(moemoji_parent);
g_free(moemoji_parent);
g_free(cat_dir);
g_free(fpath);
g_free(fpath2);
}
static void test_export_creates_archive(void) {
char *user_dir =
g_build_filename(g_get_user_data_dir(), "moemoji", "kaomoji", NULL);
char *cat_dir = g_build_filename(user_dir, "ZZZ_export_test", NULL);
g_mkdir_with_parents(cat_dir, 0755);
char *fpath = g_build_filename(cat_dir, "1.txt", NULL);
g_file_set_contents(fpath, "(ノ◕ヮ◕)ノ*:・゚✧\n", -1, NULL);
char *tmpdir = g_dir_make_tmp("moemoji-test-XXXXXX", NULL);
g_assert_nonnull(tmpdir);
char *archive_path = g_build_filename(tmpdir, "test-export.tar.gz", NULL);
GSubprocess *tar =
g_subprocess_new(G_SUBPROCESS_FLAGS_NONE, NULL, "tar", "czf",
archive_path, "-C", user_dir, ".", NULL);
g_assert_nonnull(tar);
g_assert_true(g_subprocess_wait_check(tar, NULL, NULL));
g_object_unref(tar);
g_assert_true(g_file_test(archive_path, G_FILE_TEST_EXISTS));
char *extract_dir = g_build_filename(tmpdir, "extracted", NULL);
g_mkdir_with_parents(extract_dir, 0755);
GSubprocess *untar =
g_subprocess_new(G_SUBPROCESS_FLAGS_NONE, NULL, "tar", "xzf",
archive_path, "-C", extract_dir, NULL);
g_assert_nonnull(untar);
g_assert_true(g_subprocess_wait_check(untar, NULL, NULL));
g_object_unref(untar);
char *extracted_file =
g_build_filename(extract_dir, "ZZZ_export_test", "1.txt", NULL);
g_assert_true(g_file_test(extracted_file, G_FILE_TEST_EXISTS));
char *contents = NULL;
g_file_get_contents(extracted_file, &contents, NULL, NULL);
g_assert_nonnull(contents);
g_strchomp(contents);
g_assert_cmpstr(contents, ==, "(ノ◕ヮ◕)ノ*:・゚✧");
g_free(contents);
g_unlink(extracted_file);
g_free(extracted_file);
char *extracted_cat = g_build_filename(extract_dir, "ZZZ_export_test", NULL);
g_rmdir(extracted_cat);
g_free(extracted_cat);
g_rmdir(extract_dir);
g_free(extract_dir);
g_unlink(archive_path);
g_free(archive_path);
g_rmdir(tmpdir);
g_free(tmpdir);
g_unlink(fpath);
g_free(fpath);
g_rmdir(cat_dir);
g_free(cat_dir);
char *kaomoji_parent =
g_build_filename(g_get_user_data_dir(), "moemoji", "kaomoji", NULL);
g_rmdir(kaomoji_parent);
g_free(kaomoji_parent);
char *moemoji_parent =
g_build_filename(g_get_user_data_dir(), "moemoji", NULL);
g_rmdir(moemoji_parent);
g_free(moemoji_parent);
g_free(user_dir);
}
static void test_import_extracts_and_loads(void) {
char *src_dir = g_dir_make_tmp("moemoji-import-src-XXXXXX", NULL);
g_assert_nonnull(src_dir);
char *cat_dir = g_build_filename(src_dir, "ZZZ_import_test", NULL);
g_mkdir_with_parents(cat_dir, 0755);
char *fpath = g_build_filename(cat_dir, "1.txt", NULL);
g_file_set_contents(fpath, "ヽ(>∀<☆)\n", -1, NULL);
char *archive_path = g_build_filename(src_dir, "import-test.tar.gz", NULL);
GSubprocess *tar =
g_subprocess_new(G_SUBPROCESS_FLAGS_NONE, NULL, "tar", "czf",
archive_path, "-C", src_dir, "ZZZ_import_test", NULL);
g_assert_nonnull(tar);
g_assert_true(g_subprocess_wait_check(tar, NULL, NULL));
g_object_unref(tar);
char *user_dir =
g_build_filename(g_get_user_data_dir(), "moemoji", "kaomoji", NULL);
g_mkdir_with_parents(user_dir, 0755);
GSubprocess *untar =
g_subprocess_new(G_SUBPROCESS_FLAGS_NONE, NULL, "tar", "xzf",
archive_path, "-C", user_dir, NULL);
g_assert_nonnull(untar);
g_assert_true(g_subprocess_wait_check(untar, NULL, NULL));
g_object_unref(untar);
char *imported_file =
g_build_filename(user_dir, "ZZZ_import_test", "1.txt", NULL);
g_assert_true(g_file_test(imported_file, G_FILE_TEST_EXISTS));
char *contents = NULL;
g_file_get_contents(imported_file, &contents, NULL, NULL);
g_assert_nonnull(contents);
g_strchomp(contents);
g_assert_cmpstr(contents, ==, "ヽ(>∀<☆)");
g_free(contents);
window_test_setup();
gboolean found = FALSE;
for (guint i = 0; i < test_self->category_widgets->len; i++) {
CategoryWidgets *cw = g_ptr_array_index(test_self->category_widgets, i);
if (g_strcmp0(cw->name, "ZZZ import test") == 0) {
found = TRUE;
break;
}
}
g_assert_true(found);
window_test_teardown();
g_unlink(imported_file);
g_free(imported_file);
char *imported_cat = g_build_filename(user_dir, "ZZZ_import_test", NULL);
g_rmdir(imported_cat);
g_free(imported_cat);
g_rmdir(user_dir);
char *moemoji_parent =
g_build_filename(g_get_user_data_dir(), "moemoji", NULL);
g_rmdir(moemoji_parent);
g_free(moemoji_parent);
g_free(user_dir);
g_unlink(fpath);
g_free(fpath);
g_rmdir(cat_dir);
g_free(cat_dir);
g_unlink(archive_path);
g_free(archive_path);
GSubprocess *rm = g_subprocess_new(G_SUBPROCESS_FLAGS_NONE, NULL, "rm", "-rf",
src_dir, NULL);
if (rm) {
g_subprocess_wait(rm, NULL, NULL);
g_object_unref(rm);
}
g_free(src_dir);
}
static void test_category_name_validation(void) {
window_test_setup();
gtk_editable_set_text(GTK_EDITABLE(test_self->category_name_entry), "");
g_assert_false(gtk_widget_get_sensitive(test_self->category_save_button));
gtk_editable_set_text(GTK_EDITABLE(test_self->category_name_entry), " ");
g_assert_false(gtk_widget_get_sensitive(test_self->category_save_button));
gtk_editable_set_text(GTK_EDITABLE(test_self->category_name_entry),
"Happy Faces");
g_assert_true(gtk_widget_get_sensitive(test_self->category_save_button));
gtk_editable_set_text(GTK_EDITABLE(test_self->category_name_entry),
"my-cool_category");
g_assert_true(gtk_widget_get_sensitive(test_self->category_save_button));
gtk_editable_set_text(GTK_EDITABLE(test_self->category_name_entry),
"bad/name");
g_assert_false(gtk_widget_get_sensitive(test_self->category_save_button));
gtk_editable_set_text(GTK_EDITABLE(test_self->category_name_entry),
"bad.name");
g_assert_false(gtk_widget_get_sensitive(test_self->category_save_button));
window_test_teardown();
}
static void test_manage_search_entry(void) {
window_test_setup();
GtkWidget *page =
gtk_stack_get_child_by_name(test_self->view_stack, "manage");
g_assert_nonnull(page);
GtkWidget *search = g_object_get_data(G_OBJECT(page), "manage-search");
g_assert_nonnull(search);
g_assert_true(GTK_IS_SEARCH_ENTRY(search));
window_test_teardown();
}
static void test_manage_populated(void) {
window_test_setup();
g_action_group_activate_action(G_ACTION_GROUP(test_self), "manage", NULL);
GtkWidget *page =
gtk_stack_get_child_by_name(test_self->view_stack, "manage");
GtkWidget *content = g_object_get_data(G_OBJECT(page), "manage-content");
g_assert_nonnull(content);
g_assert_nonnull(gtk_widget_get_first_child(content));
window_test_teardown();
}
static void test_manage_dupe_name_blocked(void) {
window_test_setup();
g_assert_cmpuint(test_self->category_widgets->len, >, 0);
CategoryWidgets *cw = g_ptr_array_index(test_self->category_widgets, 0);
gtk_editable_set_text(GTK_EDITABLE(test_self->category_name_entry), cw->name);
g_assert_false(gtk_widget_get_sensitive(test_self->category_save_button));
window_test_teardown();
}
int main(int argc, char *argv[]) {
g_setenv("MESON_SOURCE_ROOT", SRCDIR, TRUE);
g_test_init(&argc, &argv, NULL);
run_find_kaomoji_bogus();
gboolean have_display = gtk_init_check();
g_test_add_func("/display-name/underscores", test_display_name_underscores);
g_test_add_func("/display-name/no-underscores",
test_display_name_no_underscores);
g_test_add_func("/display-name/already-upper",
test_display_name_already_upper);
g_test_add_func("/display-name/single-char", test_display_name_single_char);
g_test_add_func("/display-name/empty", test_display_name_empty);
g_test_add_func("/find-kaomoji/with-env", test_find_kaomoji_with_env);
g_test_add_func("/find-kaomoji/bogus", test_find_kaomoji_bogus);
g_test_add_func("/sni/category", test_sni_category);
g_test_add_func("/sni/id", test_sni_id);
g_test_add_func("/sni/item-is-menu", test_sni_item_is_menu);
g_test_add_func("/sni/menu", test_sni_menu);
g_test_add_func("/sni/unknown", test_sni_unknown);
g_test_add_func("/dbusmenu/version", test_dbusmenu_version);
g_test_add_func("/dbusmenu/status", test_dbusmenu_status);
g_test_add_func("/dbusmenu/text-direction", test_dbusmenu_text_direction);
g_test_add_func("/dbusmenu/unknown", test_dbusmenu_unknown);
g_test_add_func("/category-widgets/chip-init",
test_category_widgets_chip_init);
if (have_display) {
g_test_add_func("/window/chip-setup", test_window_chip_setup);
g_test_add_func("/window/chip-labels-match", test_window_chip_labels_match);
g_test_add_func("/window/initial-active-chip",
test_window_initial_active_chip);
g_test_add_func("/window/all-categories-visible",
test_window_all_categories_visible);
g_test_add_func("/window/bottom-spacer", test_window_bottom_spacer);
g_test_add_func("/window/view-stack-exists", test_window_view_stack_exists);
g_test_add_func("/window/add-button-navigates",
test_window_add_button_navigates);
g_test_add_func("/window/stack-pages-exist", test_window_stack_pages_exist);
g_test_add_func("/window/category-name-validation",
test_category_name_validation);
g_test_add_func("/window/add-category-creates-dir",
test_add_category_creates_dir);
g_test_add_func("/window/add-entry-creates-file",
test_add_entry_creates_file);
g_test_add_func("/window/export-creates-archive",
test_export_creates_archive);
g_test_add_func("/window/import-extracts-and-loads",
test_import_extracts_and_loads);
g_test_add_func("/window/manage-search-entry", test_manage_search_entry);
g_test_add_func("/window/manage-populated", test_manage_populated);
g_test_add_func("/window/manage-dupe-name-blocked",
test_manage_dupe_name_blocked);
}
return g_test_run();
}