/* * Copyright 2016 (c) Anna Schumaker. */ #include #include #include #include #include #include #include unsigned int count_insert = 0; unsigned int count_delete = 0; unsigned int count_update = 0; void on_row_inserted(GtkTreeModel *model, GtkTreePath *path, GtkTreeIter *iter, gpointer data) { count_insert++; } void on_row_deleted(GtkTreeModel *model, GtkTreePath *path, gpointer data) { count_delete++; } void on_row_changed(GtkTreeModel *model, GtkTreePath *path, GtkTreeIter *iter, gpointer data) { count_update++; } void *test_queue_init(struct queue *queue, void *data) { return NULL; } void test_queue_deinit(struct queue *queue) { } void test_queue_added(struct queue *queue, unsigned int row) { if (queue->q_private) gui_queue_model_add(queue->q_private, row); } void test_queue_removed(struct queue *queue, unsigned int row) { gui_queue_model_remove(queue->q_private, row); } void test_queue_cleared(struct queue *queue, unsigned int n) { gui_queue_model_get_type(queue->q_private, n); } void test_queue_save(struct queue *queue, enum queue_flags flag) {} void test_queue_updated(struct queue *queue, unsigned int row) { gui_queue_model_update(queue->q_private, row); } void test_on_load(struct track *track) {} void test_on_state_change(GstState state) {} void test_on_config_pause(int count) {} struct queue_ops test_ops = { .qop_init = test_queue_init, .qop_deinit = test_queue_deinit, .qop_added = test_queue_added, .qop_removed = test_queue_removed, .qop_cleared = test_queue_cleared, .qop_save = test_queue_save, .qop_updated = test_queue_updated, }; struct audio_ops test_audio_ops = { .on_load = test_on_load, .on_state_change = test_on_state_change, .on_config_pause = test_on_config_pause, }; struct core_init_data init_data = { .playlist_ops = &test_ops, .audio_ops = &test_audio_ops, }; static void test_init() { GtkTreeModel *treemodel; GuiQueueModel *model; GType type; model = gui_queue_model_new(playlist_get_queue("Collection")); test_not_equal((void *)model, NULL); test_equal(GTK_IS_TREE_MODEL(model), true); test_equal((void *)model->gqm_queue, (void *)playlist_get_queue("Collection")); treemodel = GTK_TREE_MODEL(model); test_equal(gtk_tree_model_get_flags(treemodel), GTK_TREE_MODEL_LIST_ONLY); test_equal(gtk_tree_model_get_n_columns(treemodel), 11); type = gtk_tree_model_get_column_type(treemodel, Q_MODEL_TRACK_NR); test_equal(type, G_TYPE_UINT); type = gtk_tree_model_get_column_type(treemodel, Q_MODEL_TITLE); test_equal(type, G_TYPE_STRING); type = gtk_tree_model_get_column_type(treemodel, Q_MODEL_LENGTH); test_equal(type, G_TYPE_STRING); type = gtk_tree_model_get_column_type(treemodel, Q_MODEL_ARTIST); test_equal(type, G_TYPE_STRING); type = gtk_tree_model_get_column_type(treemodel, Q_MODEL_ALBUM); test_equal(type, G_TYPE_STRING); type = gtk_tree_model_get_column_type(treemodel, Q_MODEL_YEAR); test_equal(type, G_TYPE_UINT); type = gtk_tree_model_get_column_type(treemodel, Q_MODEL_GENRE); test_equal(type, G_TYPE_STRING); type = gtk_tree_model_get_column_type(treemodel, Q_MODEL_COUNT); test_equal(type, G_TYPE_UINT); type = gtk_tree_model_get_column_type(treemodel, Q_MODEL_LAST_PLAY); test_equal(type, G_TYPE_STRING); type = gtk_tree_model_get_column_type(treemodel, Q_MODEL_FILE_PATH); test_equal(type, G_TYPE_STRING); type = gtk_tree_model_get_column_type(treemodel, Q_MODEL_FONT); test_equal(type, G_TYPE_STRING); /* This should trigger an assertion failure */ type = gtk_tree_model_get_column_type(treemodel, Q_MODEL_N_COLUMNS); test_equal(type, G_TYPE_INVALID); g_object_unref(model); test_equal(G_IS_OBJECT(model), false); } static void test_empty() { GtkTreeModel *model; GtkTreeIter iter; GValue value; model = GTK_TREE_MODEL(gui_queue_model_new(playlist_get_queue("Collection"))); memset(&value, 0, sizeof(GValue)); test_equal(gtk_tree_model_get_iter_first(model, &iter), false); test_equal((void *)gtk_tree_model_get_path(model, &iter), NULL); test_equal((void *)gui_queue_model_iter_get_track(GUI_QUEUE_MODEL(model), &iter), NULL); /* These will all trigger assertion failures ... sorry */ gtk_tree_model_get_value(model, &iter, Q_MODEL_TRACK_NR, &value); test_equal(G_IS_VALUE(&value), false); gtk_tree_model_get_value(model, &iter, Q_MODEL_TITLE, &value); test_equal(G_IS_VALUE(&value), false); gtk_tree_model_get_value(model, &iter, Q_MODEL_LENGTH, &value); test_equal(G_IS_VALUE(&value), false); gtk_tree_model_get_value(model, &iter, Q_MODEL_ARTIST, &value); test_equal(G_IS_VALUE(&value), false); gtk_tree_model_get_value(model, &iter, Q_MODEL_ALBUM, &value); test_equal(G_IS_VALUE(&value), false); gtk_tree_model_get_value(model, &iter, Q_MODEL_YEAR, &value); test_equal(G_IS_VALUE(&value), false); gtk_tree_model_get_value(model, &iter, Q_MODEL_GENRE, &value); test_equal(G_IS_VALUE(&value), false); gtk_tree_model_get_value(model, &iter, Q_MODEL_COUNT, &value); test_equal(G_IS_VALUE(&value), false); gtk_tree_model_get_value(model, &iter, Q_MODEL_LAST_PLAY, &value); test_equal(G_IS_VALUE(&value), false); gtk_tree_model_get_value(model, &iter, Q_MODEL_FILE_PATH, &value); test_equal(G_IS_VALUE(&value), false); gtk_tree_model_get_value(model, &iter, Q_MODEL_FONT, &value); test_equal(G_IS_VALUE(&value), false); test_equal(gtk_tree_model_iter_next(model, &iter), false); test_equal(gtk_tree_model_iter_children(model, &iter, NULL), false); test_equal(gtk_tree_model_iter_has_child(model, &iter), false); test_equal(gtk_tree_model_iter_n_children(model, &iter), 0); test_equal(gtk_tree_model_iter_n_children(model, NULL), 0); test_equal(gtk_tree_model_iter_nth_child(model, &iter, NULL, 3), false); test_equal(gtk_tree_model_iter_parent(model, &iter, &iter), false); g_object_unref(model); } static void test_model() { struct db_entry *dbe, *next; struct track *track; GtkTreeModel *model; GtkTreePath *path; GtkTreeIter iter; GValue value; int argc = 0; core_init(&argc, NULL, &init_data); while (idle_run_task() == true) {} model = GTK_TREE_MODEL(gui_queue_model_new(playlist_get_queue("Collection"))); memset(&value, 0, sizeof(GValue)); g_signal_connect(model, "row-inserted", (GCallback)on_row_inserted, NULL); g_signal_connect(model, "row-deleted", (GCallback)on_row_deleted, NULL); g_signal_connect(model, "row-changed", (GCallback)on_row_changed, NULL); /* Okay, now scan a directory ... */ playlist_get_queue("Collection")->q_private = model; collection_add("tests/Music/Hyrule Symphony"); while (idle_run_task() == true) {} test_equal(playlist_size("Collection"), 13); test_equal(count_insert, 13); queue_resort(playlist_get_queue("Collection")); test_equal(count_update, 13); /* ... and test again */ test_equal(gtk_tree_model_get_iter_first(model, &iter), true); track = gui_queue_model_iter_get_track(GUI_QUEUE_MODEL(model), &iter); test_equal(track->tr_track, 1); audio_load(track); path = gtk_tree_model_get_path(model, &iter); test_not_equal((void *)path, NULL); test_equal(gtk_tree_path_get_indices(path)[0], 0); test_equal((void *)gui_queue_model_path_get_track(GUI_QUEUE_MODEL(model), path), (void *)track); gtk_tree_path_free(path); gtk_tree_model_get_value(model, &iter, Q_MODEL_TRACK_NR, &value); test_equal(g_value_get_uint(&value), track->tr_track); g_value_unset(&value); gtk_tree_model_get_value(model, &iter, Q_MODEL_TITLE, &value); test_equal(g_value_get_string(&value), "Title Theme"); g_value_unset(&value); gtk_tree_model_get_value(model, &iter, Q_MODEL_LENGTH, &value); test_equal(g_value_get_string(&value), "4:03"); g_value_unset(&value); gtk_tree_model_get_value(model, &iter, Q_MODEL_ARTIST, &value); test_equal(g_value_get_string(&value), "Koji Kondo"); g_value_unset(&value); gtk_tree_model_get_value(model, &iter, Q_MODEL_ALBUM, &value); test_equal(g_value_get_string(&value), "Hyrule Symphony"); g_value_unset(&value); gtk_tree_model_get_value(model, &iter, Q_MODEL_YEAR, &value); test_equal(g_value_get_uint(&value), 1998); g_value_unset(&value); gtk_tree_model_get_value(model, &iter, Q_MODEL_GENRE, &value); test_equal(g_value_get_string(&value), "Game"); g_value_unset(&value); gtk_tree_model_get_value(model, &iter, Q_MODEL_COUNT, &value); test_equal(g_value_get_uint(&value), 0); g_value_unset(&value); gtk_tree_model_get_value(model, &iter, Q_MODEL_LAST_PLAY, &value); test_equal(g_value_get_string(&value), "Never"); g_value_unset(&value); gtk_tree_model_get_value(model, &iter, Q_MODEL_FILE_PATH, &value); test_equal(g_value_get_string(&value), "tests/Music/Hyrule Symphony/01 - Title Theme.ogg"); g_value_unset(&value); gtk_tree_model_get_value(model, &iter, Q_MODEL_FONT, &value); test_equal(g_value_get_string(&value), "bold"); g_value_unset(&value); test_equal(gtk_tree_model_iter_next(model, &iter), true); track = gui_queue_model_iter_get_track(GUI_QUEUE_MODEL(model), &iter); test_equal(track->tr_track, 2); gtk_tree_model_get_value(model, &iter, Q_MODEL_FONT, &value); test_equal(g_value_get_string(&value), ""); g_value_unset(&value); test_equal(gtk_tree_model_iter_children(model, &iter, NULL), true); track = gui_queue_model_iter_get_track(GUI_QUEUE_MODEL(model), &iter); test_equal(track->tr_track, 1); test_equal(gtk_tree_model_iter_has_child(model, &iter), false); test_equal(gtk_tree_model_iter_n_children(model, &iter), 0); test_equal(gtk_tree_model_iter_n_children(model, NULL), 13); test_equal(gtk_tree_model_iter_nth_child(model, &iter, NULL, 3), true); track = gui_queue_model_iter_get_track(GUI_QUEUE_MODEL(model), &iter); test_equal(track->tr_track, 4); test_equal(gtk_tree_model_iter_parent(model, &iter, &iter), false); db_for_each(dbe, next, track_db_get()) playlist_remove("Collection", TRACK(dbe)); test_equal(count_delete, 13); core_deinit(); g_object_unref(model); } DECLARE_UNIT_TESTS( UNIT_TEST("Queue Model Init", test_init), UNIT_TEST("Queue Model (Empty Queue)", test_empty), UNIT_TEST("Queue Model", test_model), );