diff --git a/gui/model.c b/gui/model.c index e284e1ce..8cbf4c19 100644 --- a/gui/model.c +++ b/gui/model.c @@ -2,6 +2,7 @@ * Copyright 2016 (c) Anna Schumaker. */ #include +#include #include static const GTypeInfo queue_type_info; @@ -75,6 +76,54 @@ static GtkTreePath *_queue_model_get_path(GtkTreeModel *model, GtkTreeIter *iter return path; } +static void _queue_model_get_value(GtkTreeModel *model, GtkTreeIter *iter, + gint column, GValue *value) +{ + struct track *track = iter->user_data2; + gchar *str; + + g_return_if_fail(iter != NULL); + g_return_if_fail(iter->user_data2 != NULL); + g_return_if_fail(column < Q_MODEL_N_COLUMNS); + + g_value_init(value, queue_columns[column]); + + switch (column) { + case Q_MODEL_TRACK_NR: + g_value_set_uint(value, track->tr_track); + break; + case Q_MODEL_TITLE: + g_value_set_static_string(value, track->tr_title); + break; + case Q_MODEL_LENGTH: + g_value_take_string(value, string_sec2str(track->tr_length)); + break; + case Q_MODEL_ARTIST: + g_value_set_static_string(value, track->tr_artist->ar_name); + break; + case Q_MODEL_ALBUM: + g_value_set_static_string(value, track->tr_album->al_name); + break; + case Q_MODEL_YEAR: + g_value_set_uint(value, track->tr_album->al_year); + break; + case Q_MODEL_GENRE: + g_value_set_static_string(value, track->tr_genre->ge_name); + break; + case Q_MODEL_COUNT: + g_value_set_uint(value, track->tr_count); + break; + case Q_MODEL_LAST_PLAY: + g_value_take_string(value, track_last_play(track)); + break; + case Q_MODEL_FILE_PATH: + str = track_path(track); + g_value_take_string(value, g_markup_escape_text(str, -1)); + g_free(str); + break; + } +} + static void _queue_model_init(GuiQueueModel *model) { model->gqm_stamp = g_random_int(); @@ -102,6 +151,7 @@ static void _queue_tree_model_init(GtkTreeModelIface *iface) iface->get_column_type = _queue_model_get_column_type; iface->get_iter = _queue_model_get_iter; iface->get_path = _queue_model_get_path; + iface->get_value = _queue_model_get_value; } diff --git a/tests/gui/model.c b/tests/gui/model.c index 217f5808..1a3c2d20 100644 --- a/tests/gui/model.c +++ b/tests/gui/model.c @@ -9,17 +9,12 @@ struct core_init_data init_data; -static void test_model() +static void test_init() { GtkTreeModel *treemodel; GuiQueueModel *model; - GtkTreePath *path; - GtkTreeIter iter; - int argc = 0; GType type; - core_init(&argc, NULL, &init_data); - model = gui_queue_model_new(collection_get_queue()); test_not_equal((void *)model, NULL); test_equal(GTK_IS_TREE_MODEL(model), true); @@ -54,27 +49,112 @@ static void test_model() type = gtk_tree_model_get_column_type(treemodel, Q_MODEL_N_COLUMNS); test_equal(type, G_TYPE_INVALID); - /* Tests before adding tracks to the collection */ - test_equal(gtk_tree_model_get_iter_first(treemodel, &iter), false); - test_equal((void *)gtk_tree_model_get_path(treemodel, &iter), NULL); - - /* Okay, now scan a directory and test again */ - collection_add("tests/Music/Hyrule Symphony"); - while (idle_run_task() == true) {} - test_equal(queue_size(collection_get_queue()), 13); - - test_equal(gtk_tree_model_get_iter_first(treemodel, &iter), true); - test_equal(((struct track *)iter.user_data2)->tr_track, 1); - - path = gtk_tree_model_get_path(treemodel, &iter); - test_not_equal((void *)path, NULL); - test_equal(gtk_tree_path_get_indices(path)[0], 0); - gtk_tree_path_free(path); - 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(collection_get_queue())); + 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); + + /* 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); + + g_object_unref(model); +} + +static void test_model() +{ + struct track *track; + GtkTreeModel *model; + GtkTreePath *path; + GtkTreeIter iter; + GValue value; + int argc = 0; + + model = GTK_TREE_MODEL(gui_queue_model_new(collection_get_queue())); + memset(&value, 0, sizeof(GValue)); + + /* Okay, now scan a directory ... */ + core_init(&argc, NULL, &init_data); + collection_add("tests/Music/Hyrule Symphony"); + while (idle_run_task() == true) {} + test_equal(queue_size(collection_get_queue()), 13); + + /* ... and test again */ + test_equal(gtk_tree_model_get_iter_first(model, &iter), true); + track = iter.user_data2; + test_equal(track->tr_track, 1); + + path = gtk_tree_model_get_path(model, &iter); + test_not_equal((void *)path, NULL); + test_equal(gtk_tree_path_get_indices(path)[0], 0); + 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); + + 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), );