using Harmonia.Core.Models; using Harmonia.Core.Playlists; using NSubstitute; using Shouldly; using System.ComponentModel; namespace Harmonia.Tests; public class PlaylistTests { [Fact] public void Create_Playlist() { Playlist playlist = new(); playlist.Name.ShouldBeNull(); playlist.Songs.ShouldBeEmpty(); } [Fact] public void Create_Playlist_With_Name() { Playlist playlist = new("My Playlist"); playlist.Name.ShouldBe("My Playlist"); playlist.Songs.ShouldBeEmpty(); } [Fact] public void Set_Playlist_Name() { Playlist playlist = new(); playlist.Name.ShouldBeNull(); playlist.SetName("My Playlist"); playlist.Name.ShouldBe("My Playlist"); } [Fact] public void Add_Songs() { Playlist playlist = new(); Song[] songs = [ new Song() { FileName = "Song1.mp3" }, new Song() { FileName = "Song2.mp3" }, new Song() { FileName = "Song3.mp3" } ]; playlist.AddSongs(songs); playlist.Songs.Count.ShouldBe(3); Song song = new() { FileName = "Song4.mp3" }; playlist.AddSong(song); playlist.Songs.Count.ShouldBe(4); playlist.Songs[3].Song.FileName.ShouldBe("Song4.mp3"); Song song2 = new() { FileName = "Song5.mp3" }; playlist.AddSong(song2, 1); playlist.Songs.Count.ShouldBe(5); playlist.Songs[1].Song.FileName.ShouldBe("Song5.mp3"); } [Fact] public void Move_Songs() { Playlist playlist = new(); Song[] songs = [ new Song() { FileName = "Song1.mp3" }, new Song() { FileName = "Song2.mp3" }, new Song() { FileName = "Song3.mp3" }, new Song() { FileName = "Song4.mp3" }, new Song() { FileName = "Song5.mp3" }, ]; playlist.AddSongs(songs); playlist.MoveSong(2, 3); string[] expectedFileNames = [ "Song1.mp3", "Song2.mp3", "Song4.mp3", "Song3.mp3", "Song5.mp3" ]; playlist.Songs.Select(x => x.Song.FileName).ToArray() .ShouldBeEquivalentTo(expectedFileNames); } [Fact] public void Remove_Duplicate_Songs() { Playlist playlist = new(); Song[] songs = [ new Song() { FileName = "Song1.mp3" }, new Song() { FileName = "Song2.mp3" }, new Song() { FileName = "Song3.mp3" }, new Song() { FileName = "Song4.mp3" }, new Song() { FileName = "Song5.mp3" }, new Song() { FileName = "Song2.mp3" }, new Song() { FileName = "Song3.mp3" }, ]; playlist.AddSongs(songs); playlist.RemoveDuplicateSongs(); string[] expectedFileNames = [ "Song1.mp3", "Song2.mp3", "Song3.mp3", "Song4.mp3", "Song5.mp3" ]; playlist.Songs.Select(x => x.Song.FileName).ToArray() .ShouldBeEquivalentTo(expectedFileNames); } [Fact] public void Sort_Songs() { Playlist playlist = new(); Song[] songs = [ new Song() { FileName = "Song1.mp3", Album = "Album 2", TrackNumber = 2 }, new Song() { FileName = "Song2.mp3", Album = "Album 1", TrackNumber = 2 }, new Song() { FileName = "Song3.mp3", Album = "Album 2", TrackNumber = 1 }, new Song() { FileName = "Song4.mp3", Album = "Album 1", TrackNumber = 1 }, new Song() { FileName = "Song5.mp3", Album = "Album 2", TrackNumber = 3 }, ]; playlist.AddSongs(songs); SortOption[] sortOptions = [ new("Album", ListSortDirection.Ascending), new("TrackNumber", ListSortDirection.Ascending) ]; playlist.SortSongs([.. playlist.Songs], sortOptions); string[] expectedSortedFileNames = [ "Song4.mp3", "Song2.mp3", "Song3.mp3", "Song1.mp3", "Song5.mp3" ]; playlist.Songs.Select(x => x.Song.FileName).ToArray() .ShouldBeEquivalentTo(expectedSortedFileNames); } [Fact] public void Reverse_Songs() { Playlist playlist = new(); Song[] songs = [ new Song() { FileName = "Song1.mp3" }, new Song() { FileName = "Song2.mp3" }, new Song() { FileName = "Song3.mp3" } ]; playlist.AddSongs(songs); PlaylistSong[] playlistSongs = [.. playlist.Songs]; playlist.Reverse(playlistSongs); string[] expectedReversedFileNames = [ "Song3.mp3", "Song2.mp3", "Song1.mp3" ]; playlist.Songs.Select(x => x.Song.FileName).ToArray() .ShouldBeEquivalentTo(expectedReversedFileNames); } [Fact] public void Remove_Songs() { Playlist playlist = new(); Song[] songs = [ new Song() { FileName = "Song1.mp3" }, new Song() { FileName = "Song2.mp3" }, new Song() { FileName = "Song3.mp3" } ]; playlist.AddSongs(songs); playlist.RemoveSong(1); string[] expectedFileNames = [ "Song1.mp3", "Song3.mp3" ]; playlist.Songs.Select(x => x.Song.FileName).ToArray() .ShouldBeEquivalentTo(expectedFileNames); } [Fact] public void Lock_And_Unlock_Playlist() { Playlist playlist = new(); Song[] songs = [ new Song() { FileName = "Song1.mp3" }, new Song() { FileName = "Song2.mp3" }, new Song() { FileName = "Song3.mp3" } ]; playlist.AddSongs(songs); playlist.IsLocked.ShouldBeFalse(); playlist.Lock(); playlist.IsLocked.ShouldBeTrue(); Song song = new() { FileName = "Song4.mp3" }; playlist.AddSong(song); playlist.Songs.Count.ShouldBe(3); playlist.RemoveSong(0); playlist.Songs.Count.ShouldBe(3); playlist.MoveSong(0, 2); string[] expectedMovedFileNamesOnLockedPlaylist = [ "Song1.mp3", "Song2.mp3", "Song3.mp3" ]; playlist.Songs.Select(x => x.Song.FileName).ToArray() .ShouldBeEquivalentTo(expectedMovedFileNamesOnLockedPlaylist); playlist.Unlock(); playlist.IsLocked.ShouldBeFalse(); } }