ocarina/tests/core/playlists/system.c

287 lines
10 KiB
C

/*
* Copyright 2016 (c) Anna Schumaker.
*/
#include <core/idle.h>
#include <core/playlists/system.h>
#include <core/tags/tags.h>
#include <tests/test.h>
#define __test_playlist_state(queue, ex_size, ex_track0, ex_track1) \
test_equal(queue_size(queue), ex_size); \
test_equal(queue_has(queue, track_get(0)), (bool)ex_track0); \
test_equal(queue_has(queue, track_get(1)), (bool)ex_track1)
#define __test_playlist_random(name, queue) \
test_equal(queue_has_flag(queue, Q_RANDOM), (bool)false); \
pl_system.pl_set_flag(name, Q_RANDOM, true); \
test_equal(queue_has_flag(queue, Q_RANDOM), (bool)true); \
pl_system.pl_set_flag(name, Q_RANDOM, false); \
test_equal(queue_has_flag(queue, Q_RANDOM), (bool)false); \
#define __test_playlist_add(name, queue) \
__test_playlist_state(queue, 0, false, false); \
test_equal(pl_system.pl_add_track(name, track_get(0)), (bool)true); \
test_equal(pl_system.pl_add_track(name, track_get(0)), (bool)false); \
test_equal(pl_system.pl_add_track(name, track_get(1)), (bool)true); \
test_equal(pl_system.pl_add_track(name, track_get(1)), (bool)false); \
__test_playlist_state(queue, 2, true, true)
#define __test_playlist_remove(name, queue) \
test_equal(pl_system.pl_remove_track(name, track_get(0)), (bool)true); \
test_equal(pl_system.pl_remove_track(name, track_get(0)), (bool)false); \
test_equal(pl_system.pl_remove_track(name, track_get(1)), (bool)true); \
test_equal(pl_system.pl_remove_track(name, track_get(1)), (bool)false); \
__test_playlist_state(queue, 0, false, false)
#define __test_playlist_update(name, queue, ex_size, ex_track0, ex_track1) \
pl_system.pl_update(name); \
while (idle_run_task()) {}; \
__test_playlist_state(queue, ex_size, ex_track0, ex_track1)
#define __test_playlist_hide_track(name, queue, ex_size, ex_track0, ex_track1) \
test_equal(pl_system.pl_add_track("Hidden", track_get(0)), (bool)true); \
__test_playlist_state(queue, ex_size, ex_track0, ex_track1); \
test_equal(pl_system.pl_add_track(name, track_get(0)), (bool)false)
#define __test_playlist_unhide_track(name, queue, ex_size, ex_track0, ex_track1) \
test_equal(pl_system.pl_remove_track("Hidden", track_get(0)), (bool)true); \
__test_playlist_state(queue, ex_size, ex_track0, ex_track1)
#define __test_playlist_reinit(queue, ex_size, ex_track0, ex_track1) \
pl_system_deinit(); \
pl_system_init(NULL); \
__test_playlist_state(queue, 0, false, false); \
while (idle_run_task()) {}; \
__test_playlist_state(queue, ex_size, ex_track0, ex_track1)
static void test_init()
{
struct library *library;
idle_init_sync();
tags_init();
pl_system_init(NULL);
while (idle_run_task()) {};
/* Add tracks to the collection. */
library = library_find("tests/Music");
track_add(library, "tests/Music/Hyrule Symphony/01 - Title Theme.ogg");
track_add(library, "tests/Music/Hyrule Symphony/02 - Kokiri Forest.ogg");
}
static void test_invalid()
{
test_init();
test_equal((void *)pl_system.pl_get_queue(NULL), NULL);
test_equal((void *)pl_system.pl_get_queue("Invalid"), NULL);
test_equal(pl_system.pl_new("New Playlist"), (bool)false);
test_equal(pl_system.pl_delete("Favorites"), (bool)false);
test_equal(pl_system.pl_add_track(NULL, track_get(0)), (bool)false);
test_equal(pl_system.pl_remove_track(NULL, track_get(0)), (bool)false);
}
static void test_favorites()
{
struct queue *queue = pl_system.pl_get_queue("Favorites");
test_not_equal((void *)queue, NULL);
test_equal(queue_has_flag(queue, Q_ADD_FRONT), (bool)false);
__test_playlist_random("Favorites", queue);
__test_playlist_add("Favorites", queue);
__test_playlist_reinit(queue, 2, true, true);
__test_playlist_update("Favorites", queue, 2, true, true);
__test_playlist_remove("Favorites", queue);
}
static void test_hidden()
{
struct queue *queue = pl_system.pl_get_queue("Hidden");
test_not_equal((void *)queue, NULL);
test_equal((void *)pl_system.pl_get_queue("Banned"), (void *)queue);
test_equal(queue_has_flag(queue, Q_ADD_FRONT), (bool)false);
__test_playlist_random("Hidden", queue);
__test_playlist_add("Hidden", queue);
__test_playlist_reinit(queue, 2, true, true);
__test_playlist_update("Hidden", queue, 2, true, true);
__test_playlist_remove("Hidden", queue);
}
static void test_collection()
{
struct queue *queue = pl_system.pl_get_queue("Collection");
pl_system_deinit();
pl_system_init(NULL);
test_not_equal((void *)queue, NULL);
test_equal(queue_has_flag(queue, Q_ADD_FRONT), (bool)true);
__test_playlist_random("Collection", queue);
__test_playlist_add("Collection", queue);
__test_playlist_hide_track("Collection", queue, 1, false, true);
__test_playlist_reinit(queue, 1, false, true);
__test_playlist_update("Collection", queue, 1, false, true);
__test_playlist_unhide_track("Collection", queue, 2, true, true);
}
static void test_history()
{
struct queue *queue = pl_system.pl_get_queue("History");
test_not_equal((void *)queue, NULL);
test_equal(queue_has_flag(queue, Q_ADD_FRONT), (bool)true);
test_equal(queue_has_flag(queue, Q_NO_SORT), (bool)true);
test_equal(g_slist_length(queue->q_sort), 0);
pl_system.pl_sort("History", COMPARE_TRACK, true);
test_equal(g_slist_length(queue->q_sort), 0);
test_equal(queue_has_flag(queue, Q_RANDOM), (bool)false);
pl_system.pl_set_flag("History", Q_RANDOM, true);
test_equal(queue_has_flag(queue, Q_RANDOM), (bool)false);
__test_playlist_state(queue, 0, false, false);
test_equal(pl_system.pl_add_track("History", track_get(0)), (bool)true);
test_equal(pl_system.pl_add_track("History", track_get(0)), (bool)true);
test_equal(pl_system.pl_add_track("History", track_get(1)), (bool)true);
test_equal(pl_system.pl_add_track("History", track_get(1)), (bool)true);
__test_playlist_state(queue, 4, true, true);
test_equal((void *)queue_next(queue), (void *)track_get(1));
test_equal((void *)queue_next(queue), (void *)track_get(0));
test_equal(queue_size(queue), 4);
test_equal(pl_system.pl_add_track("History", track_get(1)), (bool)true);
test_equal(queue_size(queue), 5);
test_equal((void *)queue_next(queue), (void *)track_get(1));
__test_playlist_remove("History", queue);
__test_playlist_update("History", queue, 0, false, false);
}
static void test_unplayed()
{
struct queue *queue = pl_system.pl_get_queue("Unplayed");
pl_system_deinit();
pl_system_init(NULL);
test_not_equal((void *)queue, NULL);
test_equal(queue_has_flag(queue, Q_ADD_FRONT), (bool)true);
__test_playlist_random("Unplayed", queue);
__test_playlist_reinit(queue, 2, true, true);
__test_playlist_remove("Unplayed", queue);
track_get(1)->tr_count = 1;
test_equal(pl_system.pl_add_track("Unplayed", track_get(0)), (bool)true);
test_equal(pl_system.pl_add_track("Unplayed", track_get(0)), (bool)false);
test_equal(queue_size(queue), 1);
track_get(0)->tr_count = 1;
track_get(1)->tr_count = 0;
__test_playlist_update("Unplayed", queue, 1, false, true);
track_get(0)->tr_count = 0;
__test_playlist_update("Unplayed", queue, 2, true, true);
__test_playlist_hide_track("Unplayed", queue, 1, false, true);
__test_playlist_reinit(queue, 1, false, true);
__test_playlist_update("Unplayed", queue, 1, false, true);
__test_playlist_unhide_track("Unplayed", queue, 2, true, true);
}
static void test_most_played()
{
struct queue *most = pl_system.pl_get_queue("Most Played");
/* Set average = (4 / 2) = 2 */
track_played(track_get(0));
track_played(track_get(1));
track_played(track_get(1));
track_played(track_get(1));
pl_system_deinit();
pl_system_init(NULL);
__test_playlist_random("Most Played", most);
__test_playlist_reinit(most, 1, false, true);
test_equal(pl_system.pl_remove_track("Most Played", track_get(0)), (bool)false);
test_equal(pl_system.pl_remove_track("Most Played", track_get(1)), (bool)true);
test_equal(pl_system.pl_remove_track("Most Played", track_get(1)), (bool)false);
__test_playlist_state(most, 0, false, false);
test_equal(pl_system.pl_add_track("Most Played", track_get(0)), (bool)false);
test_equal(pl_system.pl_add_track("Most Played", track_get(1)), (bool)true);
test_equal(pl_system.pl_add_track("Most Played", track_get(1)), (bool)false);
__test_playlist_state(most, 1, false, true);
track_get(0)->tr_count = 3;
track_get(1)->tr_count = 1;
__test_playlist_update("Most Played", most, 1, true, false);
__test_playlist_hide_track("Most Played", most, 0, false, false);
__test_playlist_reinit(most, 0, false, false);
__test_playlist_update("Most Played", most, 0, false, false);
__test_playlist_unhide_track("Most Played", most, 1, true, false);
}
static void test_least_played()
{
struct queue *least = pl_system.pl_get_queue("Least Played");
/* Reset playcounts so track 1 is "least played" */
track_get(0)->tr_count = 3;
track_get(1)->tr_count = 1;
pl_system_deinit();
pl_system_init(NULL);
test_not_equal((void *)least, NULL);
test_equal(queue_has_flag(least, Q_ADD_FRONT), (bool)true);
__test_playlist_random("Least Played", least);
__test_playlist_reinit(least, 1, false, true);
test_equal(pl_system.pl_remove_track("Least Played", track_get(0)), (bool)false);
test_equal(pl_system.pl_remove_track("Least Played", track_get(1)), (bool)true);
test_equal(pl_system.pl_remove_track("Least Played", track_get(1)), (bool)false);
__test_playlist_state(least, 0, false, false);
test_equal(pl_system.pl_add_track("Least Played", track_get(0)), (bool)false);
test_equal(pl_system.pl_add_track("Least Played", track_get(1)), (bool)true);
test_equal(pl_system.pl_add_track("Least Played", track_get(1)), (bool)false);
__test_playlist_state(least, 1, false, true);
track_get(0)->tr_count = 1;
track_get(1)->tr_count = 3;
__test_playlist_update("Least Played", least, 1, true, false);
__test_playlist_hide_track("Least Played", least, 0, false, false);
__test_playlist_reinit(least, 0, false, false);
__test_playlist_update("Least Played", least, 0, false, false);
__test_playlist_unhide_track("Least Played", least, 1, true, false);
pl_system_deinit();
tags_deinit();
idle_deinit();
}
DECLARE_UNIT_TESTS(
UNIT_TEST("Invalid Playlist", test_invalid),
UNIT_TEST("Favorites Playlist", test_favorites),
UNIT_TEST("Hidden Playlist", test_hidden),
UNIT_TEST("Collection Playlist", test_collection),
UNIT_TEST("History Playlist", test_history),
UNIT_TEST("Unplayed Tracks Playlist", test_unplayed),
UNIT_TEST("Most Played Tracks Playlist", test_most_played),
UNIT_TEST("Least Played Tracks Playlist", test_least_played),
);