ocarina/tests/src/tags.cpp

308 lines
8.4 KiB
C++

/*
* Copyright 2014 (c) Anna Schumaker.
* Test a DatabaseEntry
*/
#include <filter.h>
#include <print.h>
#include <tags.h>
#include <set>
#include <stdlib.h>
#include <unistd.h>
unsigned int test_num = 0;
void test_results(bool success, unsigned int line)
{
print(" %u: ", test_num);
if (success)
print("Success!\n");
else {
print("FAILED (%u) =(\n", line);
exit(1);
}
test_num++;
}
template <class T>
void save_tag(const std::string &file, T &tag)
{
File f(file);
f.open(OPEN_WRITE);
tag.write(f);
f.close();
}
template <class T>
void load_tag(const std::string &file, T &tag)
{
File f(file);
f.open(OPEN_READ);
tag.read(f);
f.close();
}
void artist_test_tags(Artist &artist)
{
test_results(artist.name == "Artist Name", __LINE__);
test_results(artist.lower == "artist name", __LINE__);
test_results(artist.primary_key() == "Artist Name", __LINE__);
}
void artist_test()
{
Artist artist("Artist Name"), artist2;
artist_test_tags(artist);
save_tag("artist.txt", artist);
load_tag("artist.txt", artist2);
artist_test_tags(artist2);
}
void album_test_tags(Album &album)
{
test_results(album.name == "Album Name", __LINE__);
test_results(album.lower == "album name", __LINE__);
test_results(album.year == 2014, __LINE__);
test_results(album.primary_key() == "2014.Album Name", __LINE__);
}
void album_test()
{
Album album("Album Name", 2014), album2;
album_test_tags(album);
save_tag("album.txt", album);
load_tag("album.txt", album2);
album_test_tags(album2);
}
void genre_test_tags(Genre &genre)
{
test_results(genre.name == "Genre Name", __LINE__);
test_results(genre.lower == "genre name", __LINE__);
test_results(genre.primary_key() == "Genre Name", __LINE__);
}
void genre_test()
{
Genre genre("Genre Name"), genre2;
genre_test_tags(genre);
save_tag("genre.txt", genre);
load_tag("genre.txt", genre2);
genre_test_tags(genre2);
}
void library_test_tags(Library &library)
{
test_results(library.root_path == "/home/user/Music", __LINE__);
test_results(library.count == 0, __LINE__);
test_results(library.enabled == true, __LINE__);
test_results(library.primary_key() == "/home/user/Music", __LINE__);
}
void library_test()
{
Library library("/home/user/Music"), library2;
library_test_tags(library);
test_results(library2.enabled == false, __LINE__);
save_tag("library.txt", library);
load_tag("library.txt", library2);
library_test_tags(library2);
}
void track_test_tags(Track &track, Library *library)
{
test_results(track.filepath == "1.ogg", __LINE__);
test_results(track.path() == "Music/1.ogg", __LINE__);
test_results(track.primary_key() == "Music/1.ogg", __LINE__);
test_results(track.library == library, __LINE__);
test_results(track.play_count == 0, __LINE__);
test_results(track.last_year == 0, __LINE__);
test_results(track.last_month == 0, __LINE__);
test_results(track.last_day == 0, __LINE__);
}
void track_test_search(const std::string &term, unsigned int expected,
unsigned int line)
{
std::set<unsigned int> s;
filter :: search(term, s);
test_results(s.size() == 1 && s.find(expected) != s.end(), line);
}
void track_test_basics(Library *library)
{
Track track("Music/1.ogg", library), track2;
track_test_tags(track, library);
test_results(track.artist == NULL, __LINE__);
test_results(track.album == NULL, __LINE__);
test_results(track.genre == NULL, __LINE__);
track.tag();
track_test_tags(track, library);
test_results(track.artist->name == "Artist", __LINE__);
test_results(track.album->name == "Album", __LINE__);
test_results(track.album->year == 2014, __LINE__);
test_results(track.genre->name == "Silence", __LINE__);
test_results(track.track == 1, __LINE__);
test_results(track.length == 1, __LINE__);
test_results(track.title == "One", __LINE__);
test_results(track.title_lower == "one", __LINE__);
track_test_search("One", track.id, __LINE__);
track_test_search("Artist", track.id, __LINE__);
track_test_search("Album", track.id, __LINE__);
save_tag("track.txt", track);
load_tag("track.txt", track2);
track_test_tags(track2, library);
test_results(track.artist == track2.artist, __LINE__);
test_results(track.album == track2.album, __LINE__);
test_results(track.genre == track2.genre, __LINE__);
test_results(track.track == track2.track, __LINE__);
test_results(track.length == track2.length, __LINE__);
test_results(track.length_str == track2.length_str, __LINE__);
test_results(track.title == track2.title, __LINE__);
test_results(track.title_lower == track2.title_lower, __LINE__);
}
void track_test_lenstrs(const std::string &file, const std::string &expected,
Library *library, unsigned int line)
{
Track track(file, library);
track.tag();
test_results(track.length_str == expected, line);
}
void track_test_lenstrs(Library *library)
{
track_test_lenstrs("Music/1.ogg", "0:01", library, __LINE__);
track_test_lenstrs("Music/10.ogg", "0:10", library, __LINE__);
track_test_lenstrs("Music/15.ogg", "0:15", library, __LINE__);
track_test_lenstrs("Music/60.ogg", "1:00", library, __LINE__);
track_test_lenstrs("Music/90.ogg", "1:30", library, __LINE__);
track_test_lenstrs("Music/600.ogg", "10:00", library, __LINE__);
track_test_lenstrs("Music/666.ogg", "11:06", library, __LINE__);
}
void test_track_sorting()
{
Track track1, track2;
Artist artist1("a"), artist2("b");
Album album1("a", 2000), album2("b", 2014);
Genre genre1("a"), genre2("b");
track1.artist = &artist1;
track1.album = &album1;
track1.genre = &genre1;
track1.length = 10;
track1.play_count = 0;
track1.last_year = 2013;
track1.title_lower = "a";
track1.track = 1;
track2.artist = &artist2;
track2.album = &album2;
track2.genre = &genre2;
track2.length = 20;
track2.play_count = 1;
track2.last_year = 2014;
track2.title_lower = "b";
track2.track = 2;
test_results(track1.less_than(&track1, SORT_ARTIST) == 0, __LINE__);
test_results(track1.less_than(&track2, SORT_ARTIST) < 0, __LINE__);
test_results(track2.less_than(&track1, SORT_ARTIST) > 0, __LINE__);
test_results(track1.less_than(&track1, SORT_ALBUM) == 0, __LINE__);
test_results(track1.less_than(&track2, SORT_ALBUM) < 0, __LINE__);
test_results(track2.less_than(&track1, SORT_ALBUM) > 0, __LINE__);
test_results(track1.less_than(&track1, SORT_GENRE) == 0, __LINE__);
test_results(track1.less_than(&track2, SORT_GENRE) < 0, __LINE__);
test_results(track2.less_than(&track1, SORT_GENRE) > 0, __LINE__);
test_results(track1.less_than(&track1, SORT_LENGTH) == 0, __LINE__);
test_results(track1.less_than(&track2, SORT_LENGTH) < 0, __LINE__);
test_results(track2.less_than(&track1, SORT_LENGTH) > 0, __LINE__);
test_results(track1.less_than(&track1, SORT_PLAYED) == 0, __LINE__);
test_results(track1.less_than(&track2, SORT_PLAYED) < 0, __LINE__);
test_results(track2.less_than(&track1, SORT_PLAYED) > 0, __LINE__);
track1.last_year = 2014;
track1.last_month = 3;
track2.last_month = 4;
test_results(track1.less_than(&track1, SORT_PLAYED) == 0, __LINE__);
test_results(track1.less_than(&track2, SORT_PLAYED) < 0, __LINE__);
test_results(track2.less_than(&track1, SORT_PLAYED) > 0, __LINE__);
track1.last_month = 4;
track1.last_day = 10;
track2.last_day = 11;
test_results(track1.less_than(&track1, SORT_PLAYED) == 0, __LINE__);
test_results(track1.less_than(&track2, SORT_PLAYED) < 0, __LINE__);
test_results(track2.less_than(&track1, SORT_PLAYED) > 0, __LINE__);
test_results(track1.less_than(&track1, SORT_TITLE) == 0, __LINE__);
test_results(track1.less_than(&track2, SORT_TITLE) < 0, __LINE__);
test_results(track2.less_than(&track1, SORT_TITLE) > 0, __LINE__);
test_results(track1.less_than(&track1, SORT_TRACK) == 0, __LINE__);
test_results(track1.less_than(&track2, SORT_TRACK) < 0, __LINE__);
test_results(track2.less_than(&track1, SORT_TRACK) > 0, __LINE__);
test_results(track1.less_than(&track1, SORT_YEAR) == 0, __LINE__);
test_results(track1.less_than(&track2, SORT_YEAR) < 0, __LINE__);
test_results(track2.less_than(&track1, SORT_YEAR) > 0, __LINE__);
}
void track_test()
{
Library *library = tagdb :: add_library("Music");
track_test_basics(library);
track_test_lenstrs(library);
test_track_sorting();
}
int main(int argc, char **argv)
{
char c;
while ((c = getopt(argc, argv, "aAglt")) != -1) {
switch (c) {
case 'a':
artist_test();
break;
case 'A':
album_test();
break;
case 'g':
genre_test();
break;
case 'l':
library_test();
break;
case 't':
track_test();
break;
}
}
return 0;
}