ocarina/tests/gui/model.c

272 lines
9.9 KiB
C

/*
* Copyright 2016 (c) Anna Schumaker.
*/
#include <core/audio.h>
#include <core/collection.h>
#include <core/idle.h>
#include <core/core.h>
#include <core/playlist.h>
#include <gui/model.h>
#include <tests/test.h>
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),
);