Files
projectm/tests/playlist/PlaylistTest.cpp

516 lines
16 KiB
C++

#include <Playlist.hpp>
#include <gtest/gtest.h>
#include <algorithm>
using ProjectM::Playlist::Playlist;
TEST(projectMPlaylistPlaylist, Create)
{
ASSERT_NO_THROW(Playlist playlist);
}
TEST(projectMPlaylistPlaylist, Size)
{
Playlist playlist;
EXPECT_EQ(playlist.Size(), 0);
EXPECT_TRUE(playlist.AddItem("/some/file", Playlist::InsertAtEnd, false));
EXPECT_EQ(playlist.Size(), 1);
}
TEST(projectMPlaylistPlaylist, Empty)
{
Playlist playlist;
EXPECT_TRUE(playlist.Empty());
EXPECT_TRUE(playlist.AddItem("/some/file", Playlist::InsertAtEnd, false));
EXPECT_FALSE(playlist.Empty());
}
TEST(projectMPlaylistPlaylist, Clear)
{
Playlist playlist;
EXPECT_TRUE(playlist.AddItem("/some/file", Playlist::InsertAtEnd, false));
EXPECT_EQ(playlist.Size(), 1);
playlist.Clear();
EXPECT_EQ(playlist.Size(), 0);
}
TEST(projectMPlaylistPlaylist, Items)
{
Playlist playlist;
EXPECT_TRUE(playlist.AddItem("/some/file", Playlist::InsertAtEnd, false));
EXPECT_TRUE(playlist.AddItem("/some/other/file", Playlist::InsertAtEnd, false));
ASSERT_EQ(playlist.Size(), 2);
const auto& items = playlist.Items();
ASSERT_EQ(items.size(), 2);
EXPECT_EQ(items.at(0).Filename(), "/some/file");
EXPECT_EQ(items.at(1).Filename(), "/some/other/file");
}
TEST(projectMPlaylistPlaylist, AddItemEmptyFilename)
{
Playlist playlist;
EXPECT_FALSE(playlist.AddItem("", Playlist::InsertAtEnd, false));
ASSERT_EQ(playlist.Size(), 0);
}
TEST(projectMPlaylistPlaylist, AddItemAtEnd)
{
Playlist playlist;
EXPECT_TRUE(playlist.AddItem("/some/file", Playlist::InsertAtEnd, false));
EXPECT_TRUE(playlist.AddItem("/some/other/file", Playlist::InsertAtEnd, false));
EXPECT_TRUE(playlist.AddItem("/yet/another/file", Playlist::InsertAtEnd, false));
ASSERT_EQ(playlist.Size(), 3);
const auto& items = playlist.Items();
ASSERT_EQ(items.size(), 3);
EXPECT_EQ(items.at(2).Filename(), "/yet/another/file");
}
TEST(projectMPlaylistPlaylist, AddItemAtFront)
{
Playlist playlist;
EXPECT_TRUE(playlist.AddItem("/some/file", 0, false));
EXPECT_TRUE(playlist.AddItem("/some/other/file", 0, false));
EXPECT_TRUE(playlist.AddItem("/yet/another/file", 0, false));
ASSERT_EQ(playlist.Size(), 3);
const auto& items = playlist.Items();
ASSERT_EQ(items.size(), 3);
EXPECT_EQ(items.at(0).Filename(), "/yet/another/file");
EXPECT_EQ(items.at(1).Filename(), "/some/other/file");
EXPECT_EQ(items.at(2).Filename(), "/some/file");
}
TEST(projectMPlaylistPlaylist, AddItemInMiddle)
{
Playlist playlist;
EXPECT_TRUE(playlist.AddItem("/some/file", 0, false));
EXPECT_TRUE(playlist.AddItem("/some/other/file", Playlist::InsertAtEnd, false));
EXPECT_TRUE(playlist.AddItem("/yet/another/file", 1, false));
ASSERT_EQ(playlist.Size(), 3);
const auto& items = playlist.Items();
ASSERT_EQ(items.size(), 3);
EXPECT_EQ(items.at(0).Filename(), "/some/file");
EXPECT_EQ(items.at(1).Filename(), "/yet/another/file");
EXPECT_EQ(items.at(2).Filename(), "/some/other/file");
}
TEST(projectMPlaylistPlaylist, AddItemDuplicates)
{
Playlist playlist;
EXPECT_TRUE(playlist.AddItem("/some/file", Playlist::InsertAtEnd, true));
EXPECT_TRUE(playlist.AddItem("/some/file", Playlist::InsertAtEnd, true));
EXPECT_TRUE(playlist.AddItem("/some/file", Playlist::InsertAtEnd, true));
ASSERT_EQ(playlist.Size(), 3);
const auto& items = playlist.Items();
ASSERT_EQ(items.size(), 3);
EXPECT_EQ(items.at(2).Filename(), "/some/file");
}
TEST(projectMPlaylistPlaylist, AddItemNoDuplicates)
{
Playlist playlist;
EXPECT_TRUE(playlist.AddItem("/some/file", Playlist::InsertAtEnd, false));
EXPECT_FALSE(playlist.AddItem("/some/file", Playlist::InsertAtEnd, false));
EXPECT_FALSE(playlist.AddItem("/some/file", Playlist::InsertAtEnd, false));
ASSERT_EQ(playlist.Size(), 1);
const auto& items = playlist.Items();
ASSERT_EQ(items.size(), 1);
EXPECT_EQ(items.at(0).Filename(), "/some/file");
}
TEST(projectMPlaylistPlaylist, AddPathRecursively)
{
Playlist playlist;
EXPECT_EQ(playlist.AddPath(PROJECTM_PLAYLIST_TEST_DATA_DIR "/presets", 0, true, false), 4);
ASSERT_EQ(playlist.Size(), 4);
const auto& items = playlist.Items();
ASSERT_EQ(items.size(), 4);
EXPECT_NE(std::find_if(items.cbegin(), items.cend(), [](const ProjectM::Playlist::Item& item) {
return item.Filename().substr(item.Filename().length() - 11, 11) == "Test_D.milk";
}),
items.cend())
<< "Expected file not found in playlist.";
EXPECT_EQ(std::find_if(items.cbegin(), items.cend(), [](const ProjectM::Playlist::Item& item) {
return item.Filename().substr(item.Filename().length() - 10, 10) == "Other.file";
}),
items.cend())
<< "Unexpected file found in playlist.";
}
TEST(projectMPlaylistPlaylist, AddPathRecursivelyNoDuplicates)
{
Playlist playlist;
EXPECT_EQ(playlist.AddPath(PROJECTM_PLAYLIST_TEST_DATA_DIR "/presets", 0, true, false), 4);
EXPECT_EQ(playlist.AddPath(PROJECTM_PLAYLIST_TEST_DATA_DIR "/presets", 0, true, false), 0);
ASSERT_EQ(playlist.Size(), 4);
}
TEST(projectMPlaylistPlaylist, AddPathNonRecursively)
{
Playlist playlist;
EXPECT_EQ(playlist.AddPath(PROJECTM_PLAYLIST_TEST_DATA_DIR "/presets", 0, false, false), 3);
ASSERT_EQ(playlist.Size(), 3);
const auto& items = playlist.Items();
ASSERT_EQ(items.size(), 3);
EXPECT_NE(std::find_if(items.cbegin(), items.cend(), [](const ProjectM::Playlist::Item& item) {
return item.Filename().substr(item.Filename().length() - 11, 11) == "Test_B.milk";
}),
items.cend())
<< "Expected file not found in playlist.";
EXPECT_EQ(std::find_if(items.cbegin(), items.cend(), [](const ProjectM::Playlist::Item& item) {
return item.Filename().substr(item.Filename().length() - 11, 11) == "Test_D.milk";
}),
items.cend())
<< "Unexpected file found in playlist.";
EXPECT_EQ(std::find_if(items.cbegin(), items.cend(), [](const ProjectM::Playlist::Item& item) {
return item.Filename().substr(item.Filename().length() - 10, 10) == "Other.file";
}),
items.cend())
<< "Unexpected file found in playlist.";
}
TEST(projectMPlaylistPlaylist, AddPathnonRecursivelyNoDuplicates)
{
Playlist playlist;
EXPECT_EQ(playlist.AddPath(PROJECTM_PLAYLIST_TEST_DATA_DIR "/presets", 0, false, false), 3);
EXPECT_EQ(playlist.AddPath(PROJECTM_PLAYLIST_TEST_DATA_DIR "/presets", 0, false, false), 0);
ASSERT_EQ(playlist.Size(), 3);
}
TEST(projectMPlaylistPlaylist, RemoveItemFromEnd)
{
Playlist playlist;
EXPECT_TRUE(playlist.AddItem("/some/file", Playlist::InsertAtEnd, false));
EXPECT_TRUE(playlist.AddItem("/some/other/file", Playlist::InsertAtEnd, false));
EXPECT_TRUE(playlist.AddItem("/yet/another/file", Playlist::InsertAtEnd, false));
ASSERT_EQ(playlist.Size(), 3);
EXPECT_TRUE(playlist.RemoveItem(2));
ASSERT_EQ(playlist.Size(), 2);
const auto& items = playlist.Items();
ASSERT_EQ(items.size(), 2);
EXPECT_EQ(items.at(0).Filename(), "/some/file");
EXPECT_EQ(items.at(1).Filename(), "/some/other/file");
}
TEST(projectMPlaylistPlaylist, RemoveItemFromFront)
{
Playlist playlist;
EXPECT_TRUE(playlist.AddItem("/some/file", Playlist::InsertAtEnd, false));
EXPECT_TRUE(playlist.AddItem("/some/other/file", Playlist::InsertAtEnd, false));
EXPECT_TRUE(playlist.AddItem("/yet/another/file", Playlist::InsertAtEnd, false));
ASSERT_EQ(playlist.Size(), 3);
EXPECT_TRUE(playlist.RemoveItem(0));
ASSERT_EQ(playlist.Size(), 2);
const auto& items = playlist.Items();
ASSERT_EQ(items.size(), 2);
EXPECT_EQ(items.at(0).Filename(), "/some/other/file");
EXPECT_EQ(items.at(1).Filename(), "/yet/another/file");
}
TEST(projectMPlaylistPlaylist, RemoveItemFromMiddle)
{
Playlist playlist;
EXPECT_TRUE(playlist.AddItem("/some/file", Playlist::InsertAtEnd, false));
EXPECT_TRUE(playlist.AddItem("/some/other/file", Playlist::InsertAtEnd, false));
EXPECT_TRUE(playlist.AddItem("/yet/another/file", Playlist::InsertAtEnd, false));
ASSERT_EQ(playlist.Size(), 3);
EXPECT_TRUE(playlist.RemoveItem(1));
ASSERT_EQ(playlist.Size(), 2);
const auto& items = playlist.Items();
ASSERT_EQ(items.size(), 2);
EXPECT_EQ(items.at(0).Filename(), "/some/file");
EXPECT_EQ(items.at(1).Filename(), "/yet/another/file");
}
TEST(projectMPlaylistPlaylist, RemoveItemIndexOutOfBounds)
{
Playlist playlist;
EXPECT_TRUE(playlist.AddItem("/some/file", Playlist::InsertAtEnd, false));
EXPECT_TRUE(playlist.AddItem("/some/other/file", Playlist::InsertAtEnd, false));
EXPECT_TRUE(playlist.AddItem("/yet/another/file", Playlist::InsertAtEnd, false));
ASSERT_EQ(playlist.Size(), 3);
EXPECT_FALSE(playlist.RemoveItem(100));
ASSERT_EQ(playlist.Size(), 3);
}
TEST(projectMPlaylistPlaylist, ShuffleEnableDisable)
{
Playlist playlist;
EXPECT_FALSE(playlist.Shuffle());
playlist.SetShuffle(true);
EXPECT_TRUE(playlist.Shuffle());
playlist.SetShuffle(false);
EXPECT_FALSE(playlist.Shuffle());
}
TEST(projectMPlaylistPlaylist, SortFullPathAscending)
{
Playlist playlist;
EXPECT_TRUE(playlist.AddItem("/some/PresetZ.milk", Playlist::InsertAtEnd, false));
EXPECT_TRUE(playlist.AddItem("/some/PresetA.milk", Playlist::InsertAtEnd, false));
EXPECT_TRUE(playlist.AddItem("/some/other/PresetC.milk", Playlist::InsertAtEnd, false));
EXPECT_TRUE(playlist.AddItem("/yet/another/PresetD.milk", Playlist::InsertAtEnd, false));
ASSERT_EQ(playlist.Size(), 4);
playlist.Sort(0, playlist.Size(), Playlist::SortPredicate::FullPath, Playlist::SortOrder::Ascending);
ASSERT_EQ(playlist.Size(), 4);
const auto& items = playlist.Items();
ASSERT_EQ(items.size(), 4);
EXPECT_EQ(items.at(0).Filename(), "/some/PresetA.milk");
EXPECT_EQ(items.at(1).Filename(), "/some/PresetZ.milk");
EXPECT_EQ(items.at(2).Filename(), "/some/other/PresetC.milk");
EXPECT_EQ(items.at(3).Filename(), "/yet/another/PresetD.milk");
}
TEST(projectMPlaylistPlaylist, SortFullPathDescending)
{
Playlist playlist;
EXPECT_TRUE(playlist.AddItem("/some/PresetZ.milk", Playlist::InsertAtEnd, false));
EXPECT_TRUE(playlist.AddItem("/some/PresetA.milk", Playlist::InsertAtEnd, false));
EXPECT_TRUE(playlist.AddItem("/some/other/PresetC.milk", Playlist::InsertAtEnd, false));
EXPECT_TRUE(playlist.AddItem("/yet/another/PresetD.milk", Playlist::InsertAtEnd, false));
ASSERT_EQ(playlist.Size(), 4);
playlist.Sort(0, playlist.Size(), Playlist::SortPredicate::FullPath, Playlist::SortOrder::Descending);
ASSERT_EQ(playlist.Size(), 4);
const auto& items = playlist.Items();
ASSERT_EQ(items.size(), 4);
EXPECT_EQ(items.at(0).Filename(), "/yet/another/PresetD.milk");
EXPECT_EQ(items.at(1).Filename(), "/some/other/PresetC.milk");
EXPECT_EQ(items.at(2).Filename(), "/some/PresetZ.milk");
EXPECT_EQ(items.at(3).Filename(), "/some/PresetA.milk");
}
TEST(projectMPlaylistPlaylist, SortFilenameOnlyAscending)
{
Playlist playlist;
EXPECT_TRUE(playlist.AddItem("/some/PresetZ.milk", Playlist::InsertAtEnd, false));
EXPECT_TRUE(playlist.AddItem("/some/PresetA.milk", Playlist::InsertAtEnd, false));
EXPECT_TRUE(playlist.AddItem("/some/other/PresetC.milk", Playlist::InsertAtEnd, false));
EXPECT_TRUE(playlist.AddItem("/yet/another/PresetD.milk", Playlist::InsertAtEnd, false));
ASSERT_EQ(playlist.Size(), 4);
playlist.Sort(0, playlist.Size(), Playlist::SortPredicate::FilenameOnly, Playlist::SortOrder::Ascending);
ASSERT_EQ(playlist.Size(), 4);
const auto& items = playlist.Items();
ASSERT_EQ(items.size(), 4);
EXPECT_EQ(items.at(0).Filename(), "/some/PresetA.milk");
EXPECT_EQ(items.at(1).Filename(), "/some/other/PresetC.milk");
EXPECT_EQ(items.at(2).Filename(), "/yet/another/PresetD.milk");
EXPECT_EQ(items.at(3).Filename(), "/some/PresetZ.milk");
}
TEST(projectMPlaylistPlaylist, SortFilenameOnlyDescending)
{
Playlist playlist;
EXPECT_TRUE(playlist.AddItem("/some/PresetZ.milk", Playlist::InsertAtEnd, false));
EXPECT_TRUE(playlist.AddItem("/some/PresetA.milk", Playlist::InsertAtEnd, false));
EXPECT_TRUE(playlist.AddItem("/some/other/PresetC.milk", Playlist::InsertAtEnd, false));
EXPECT_TRUE(playlist.AddItem("/yet/another/PresetD.milk", Playlist::InsertAtEnd, false));
ASSERT_EQ(playlist.Size(), 4);
playlist.Sort(0, playlist.Size(), Playlist::SortPredicate::FilenameOnly, Playlist::SortOrder::Descending);
ASSERT_EQ(playlist.Size(), 4);
const auto& items = playlist.Items();
ASSERT_EQ(items.size(), 4);
EXPECT_EQ(items.at(0).Filename(), "/some/PresetZ.milk");
EXPECT_EQ(items.at(1).Filename(), "/yet/another/PresetD.milk");
EXPECT_EQ(items.at(2).Filename(), "/some/other/PresetC.milk");
EXPECT_EQ(items.at(3).Filename(), "/some/PresetA.milk");
}
TEST(projectMPlaylistPlaylist, NextPresetIndexEmptyPlaylist)
{
Playlist playlist;
EXPECT_THROW(playlist.NextPresetIndex(), ProjectM::Playlist::PlaylistEmptyException);
}
TEST(projectMPlaylistPlaylist, NextPresetIndexShuffle)
{
Playlist playlist;
playlist.SetShuffle(true);
EXPECT_TRUE(playlist.AddItem("/some/PresetZ.milk", Playlist::InsertAtEnd, false));
EXPECT_TRUE(playlist.AddItem("/some/PresetA.milk", Playlist::InsertAtEnd, false));
// Shuffle 100 times, this will have an (almost) 100% chance that both presets were played.
std::set<size_t> playlistIndices;
for (int i = 0; i < 100; i++)
{
EXPECT_NO_THROW(playlistIndices.insert(playlist.NextPresetIndex()));
}
EXPECT_TRUE(playlistIndices.find(0) != playlistIndices.end());
EXPECT_TRUE(playlistIndices.find(1) != playlistIndices.end());
}
TEST(projectMPlaylistPlaylist, NextPresetIndexSequential)
{
Playlist playlist;
playlist.SetShuffle(false);
EXPECT_TRUE(playlist.AddItem("/some/PresetZ.milk", Playlist::InsertAtEnd, false));
EXPECT_TRUE(playlist.AddItem("/some/PresetA.milk", Playlist::InsertAtEnd, false));
EXPECT_TRUE(playlist.AddItem("/some/other/PresetC.milk", Playlist::InsertAtEnd, false));
EXPECT_EQ(playlist.NextPresetIndex(), 1);
EXPECT_EQ(playlist.NextPresetIndex(), 2);
// Also test wrap to 0
EXPECT_EQ(playlist.NextPresetIndex(), 0);
EXPECT_EQ(playlist.NextPresetIndex(), 1);
}
TEST(projectMPlaylistPlaylist, SetPresetIndex)
{
Playlist playlist;
EXPECT_TRUE(playlist.AddItem("/some/PresetZ.milk", Playlist::InsertAtEnd, false));
EXPECT_TRUE(playlist.AddItem("/some/PresetA.milk", Playlist::InsertAtEnd, false));
EXPECT_TRUE(playlist.AddItem("/some/other/PresetC.milk", Playlist::InsertAtEnd, false));
EXPECT_EQ(playlist.SetPresetIndex(1), 1);
EXPECT_EQ(playlist.SetPresetIndex(2), 2);
EXPECT_EQ(playlist.SetPresetIndex(0), 0);
}
TEST(projectMPlaylistPlaylist, SetPresetIndexOutOfBounds)
{
Playlist playlist;
EXPECT_TRUE(playlist.AddItem("/some/PresetZ.milk", Playlist::InsertAtEnd, false));
EXPECT_TRUE(playlist.AddItem("/some/PresetA.milk", Playlist::InsertAtEnd, false));
EXPECT_TRUE(playlist.AddItem("/some/other/PresetC.milk", Playlist::InsertAtEnd, false));
EXPECT_EQ(playlist.SetPresetIndex(5), 0);
}
TEST(projectMPlaylistPlaylist, SetPresetIndexException)
{
Playlist playlist;
EXPECT_THROW(playlist.SetPresetIndex(0), ProjectM::Playlist::PlaylistEmptyException);;
}
TEST(projectMPlaylistPlaylist, PresetIndex)
{
Playlist playlist;
EXPECT_TRUE(playlist.AddItem("/some/PresetZ.milk", Playlist::InsertAtEnd, false));
EXPECT_TRUE(playlist.AddItem("/some/PresetA.milk", Playlist::InsertAtEnd, false));
EXPECT_TRUE(playlist.AddItem("/some/other/PresetC.milk", Playlist::InsertAtEnd, false));
EXPECT_EQ(playlist.PresetIndex(), 0);
EXPECT_NO_THROW(playlist.SetPresetIndex(2));
EXPECT_EQ(playlist.PresetIndex(), 2);
}
TEST(projectMPlaylistPlaylist, PresetIndexException)
{
Playlist playlist;
EXPECT_THROW(playlist.PresetIndex(), ProjectM::Playlist::PlaylistEmptyException);;
}