/* * Copyright 2013 (c) Anna Schumaker. */ #include #include #include #include #include #include #include #include void gen_library() { system("tests/library/gen_library.sh"); print("\n"); } void check_ret(const std :: string &test, bool ret, bool expected) { print("Test %s: ", test.c_str()); if (ret == expected) print("Success!\n"); else print("Failed.\n"); } template void check_ret(const std :: string &test, long ret, long expected) { print("Test %s: ", test.c_str()); if (ret == expected) print("Success!\n"); else print("Failed (Expected %ld but got %ld)\n", expected, ret); } void check_error(int error, int expected) { if (expected == 0) { if (error == 0) print("Success!\n"); else print("Failed with error: %d\n", error); } else { if (error == 0) print("Failed (expected error: %d)\n", expected); else print("Success!\n"); } } void call_func(const std :: string &test, void (*func)(), int expected) { print("Test %s: ", test.c_str()); try { func(); check_error(0, expected); } catch (int error) { check_error(error, expected); } } void call_func(const std :: string &test, void (*func)(long), long arg, int expected) { print("Test %s: ", test.c_str()); try { func(arg); check_error(0, expected); } catch (int error) { check_error(error, expected); } } /* Call various functions without a track loaded */ void test_0() { call_func("0a", audio :: play, 0); call_func("0b", audio :: pause, 0); call_func("0c", audio :: seek_to, 10, 0); call_func("0d", audio :: next, -E_EXIST); call_func("0e", audio :: stop, 0); check_ret("0f", audio :: position(), 0); check_ret("0g", audio :: duration(), 0); try { print("Test 0h: "); audio :: current_trackid(); check_error(0, -E_EXIST); } catch (int error) { check_error(error, -E_EXIST); } call_func("0i", audio :: previous, -E_EXIST); print("\n"); } void test_1() { library :: Song song; library :: lookup(0, &song); call_func("1a", audio :: next, 0); call_func("1b", audio :: play, 0); call_func("1c", audio :: pause, 0); call_func("1d", audio :: seek_to, 1 * GST_SECOND, 0); call_func("1e", audio :: stop, 0); check_ret("1f", audio :: current_trackid() == 0, true); check_ret("1g", audio :: position(), 0); call_func("1h", audio :: previous, 0); check_ret("1i", audio :: current_trackid() == 0, true); audio :: next(); audio :: next(); call_func("1j", audio :: previous, 0); check_ret("1k", audio :: current_trackid() == 1, true); call_func("1l", audio :: previous, 0); check_ret("1m", audio :: current_trackid() == 0, true); print("\n"); } /* Test pause_after() */ unsigned int test_2_count = 0; int test_2_cb(gpointer data) { long seek_pos, pos, max; library :: Song song; GMainLoop *loop = (GMainLoop *)data; library :: lookup(audio :: current_trackid(), &song); pos = audio :: position(); switch (test_2_count) { case 0: break; case 1: check_ret("2g", audio :: duration(), song.track->length * GST_SECOND); seek_pos = (song.track->length * GST_SECOND) - GST_SECOND; call_func("2h", audio :: seek_to, seek_pos, 0); break; case 2: max = (song.track->length * GST_SECOND) - GST_SECOND + (501 * GST_MSECOND); check_ret("2i", pos <= max, true); call_func("2j", audio :: stop, 0); break; case 3: check_ret("2k", pos, 0); call_func("2l", audio :: play, 0); call_func("2m", audio :: seek_to, audio :: duration() - 1, 0); break; case 4: check_ret("2n", audio :: pause_count(), (long)2); call_func("2o", audio :: seek_to, audio :: duration() - 1, 0); break; case 5: check_ret("2p", audio :: pause_count(), (long)1); call_func("2q", audio :: seek_to, audio :: duration() - 1, 0); break; case 6: check_ret("2r", audio :: pause_count(), (long)0); call_func("2s", audio :: seek_to, audio :: duration() - 1, 0); break; case 7: check_ret("2t", audio :: pause_enabled(), false); check_ret("2u", audio :: pause_count(), (long)0); break; case 8: pos = audio :: position(); check_ret("2v", (0 <= pos) && (pos <= GST_MSECOND), true); break; case 9: pos = audio :: position(); check_ret("2w", (0 <= pos) && (pos <= GST_MSECOND), true); default: g_main_quit(loop); } test_2_count++; return true; } void test_2() { GMainLoop *loop; check_ret("2a", audio :: pause_enabled(), false); check_ret("2b", audio :: pause_count(), (long)0); audio :: pause_after(true, 3); check_ret("2c", audio :: pause_enabled(), true); check_ret("2d", audio :: pause_count(), (long)3); audio :: next(); check_ret("2e", audio :: pause_enabled(), true); check_ret("2f", audio :: pause_count(), (long)3); audio :: play(); loop = g_main_loop_new(NULL, FALSE); g_timeout_add(500, test_2_cb, loop); g_main_loop_run(loop); } int main(int argc, char **argv) { Playqueue *pqueue; gen_library(); /* Initialize before testing */ audio :: init(&argc, &argv); test_0(); /* Read in library, set up a playlist */ library::init(); deck::init(); library :: reset(); library :: add_path("/tmp/library/0"); while (idle :: run_task()); pqueue = deck :: create(false); for (unsigned int i = 0; i < 150; i++) pqueue->add(i); test_1(); test_2(); audio :: quit(); return 0; }