public void LoadFolderItems_IfTitlesContainSpecialLocalCharacters_OrdersItemsCorrectly()
        {
            // Arrange

            var folder1 = new FolderModel {
                Name = "Елена Никитаева"
            };
            var folder2 = new FolderModel {
                Name = "Ёлка"
            };
            var folder3 = new FolderModel {
                Name = "Жанна Агузарова"
            };

            var disc1 = new DiscModel {
                TreeTitle = "Елена Никитаева"
            }.MakeActive();
            var disc2 = new DiscModel {
                TreeTitle = "Ёлка"
            }.MakeActive();
            var disc3 = new DiscModel {
                TreeTitle = "Жанна Агузарова"
            }.MakeActive();

            var folder = new FolderModel();

            folder.AddSubfolders(folder3, folder1, folder2);
            folder.AddDiscs(disc3, disc1, disc2);

            var mocker = new AutoMocker();
            var target = mocker.CreateInstance <LibraryExplorerItemListViewModel>();

            // Act

            target.LoadFolderItems(folder);

            // Assert

            var expectedItems = new BasicExplorerItem[]
            {
                new FolderExplorerItem(folder1),
                new FolderExplorerItem(folder2),
                new FolderExplorerItem(folder3),

                new DiscExplorerItem(disc1),
                new DiscExplorerItem(disc2),
                new DiscExplorerItem(disc3),
            };

            target.Items.Should().BeEquivalentTo(expectedItems, x => x.WithStrictOrdering());
            target.SelectedItem.Should().Be(target.Items.First());
        }
        public void LoadFolderItems_ForTitlesInDifferentCase_IgnoresCaseDuringOrdering()
        {
            // Arrange

            var folder1 = new FolderModel {
                Name = "A Folder"
            };
            var folder2 = new FolderModel {
                Name = "b Folder"
            };
            var folder3 = new FolderModel {
                Name = "C Folder"
            };

            var disc1 = new DiscModel {
                TreeTitle = "A Disc"
            }.MakeActive();
            var disc2 = new DiscModel {
                TreeTitle = "b Disc"
            }.MakeActive();
            var disc3 = new DiscModel {
                TreeTitle = "C Disc"
            }.MakeActive();

            var folder = new FolderModel();

            folder.AddSubfolders(folder3, folder1, folder2);
            folder.AddDiscs(disc3, disc1, disc2);

            var mocker = new AutoMocker();
            var target = mocker.CreateInstance <LibraryExplorerItemListViewModel>();

            // Act

            target.LoadFolderItems(folder);

            // Assert

            var expectedItems = new BasicExplorerItem[]
            {
                new FolderExplorerItem(folder1),
                new FolderExplorerItem(folder2),
                new FolderExplorerItem(folder3),

                new DiscExplorerItem(disc1),
                new DiscExplorerItem(disc2),
                new DiscExplorerItem(disc3),
            };

            target.Items.Should().BeEquivalentTo(expectedItems, x => x.WithStrictOrdering());
            target.SelectedItem.Should().Be(target.Items.First());
        }
        public void LoadFolderItems_ForFolderWithSubfoldersAndDiscs_OrdersItemsCorrectly()
        {
            // Arrange

            var folder1 = new FolderModel {
                Name = "21 - Folder 1"
            };
            var folder2 = new FolderModel {
                Name = "22 - Folder 2"
            };
            var folder3 = new FolderModel {
                Name = "23 - Folder 3"
            };

            var disc1 = new DiscModel {
                TreeTitle = "11 - Disc 1"
            }.MakeActive();
            var disc2 = new DiscModel {
                TreeTitle = "12 - Disc 2"
            }.MakeActive();
            var disc3 = new DiscModel {
                TreeTitle = "13 - Disc 3"
            }.MakeActive();

            var folder = new FolderModel();

            folder.AddSubfolders(folder3, folder1, folder2);
            folder.AddDiscs(disc3, disc1, disc2);

            var mocker = new AutoMocker();
            var target = mocker.CreateInstance <LibraryExplorerItemListViewModel>();

            // Act

            target.LoadFolderItems(folder);

            // Assert

            var expectedItems = new BasicExplorerItem[]
            {
                new FolderExplorerItem(folder1),
                new FolderExplorerItem(folder2),
                new FolderExplorerItem(folder3),

                new DiscExplorerItem(disc1),
                new DiscExplorerItem(disc2),
                new DiscExplorerItem(disc3),
            };

            target.Items.Should().BeEquivalentTo(expectedItems, x => x.WithStrictOrdering());
            target.SelectedItem.Should().Be(target.Items.First());
        }
        public void LoadFolderItems_IfSomeItemsWereLoadedBefore_ClearsPreviousItems()
        {
            // Arrange

            var oldFolder = new FolderModel();

            oldFolder.AddSubfolders(new FolderModel {
                Id = new ItemId("OldSubfolder"), Name = "Old Folder"
            });
            oldFolder.AddDiscs(new DiscModel {
                Id = new ItemId("OldDisc"), TreeTitle = "Old Disc"
            }.AddSongs(new SongModel {
                Id = new ItemId("1")
            }));

            var newSubfolder = new FolderModel {
                Id = new ItemId("NewSubfolder"), Name = "New Folder"
            };
            var newDisc = new DiscModel {
                Id = new ItemId("NewSubfolder"), TreeTitle = "New Disc"
            }.AddSongs(new SongModel {
                Id = new ItemId("2")
            });
            var newFolder = new FolderModel {
                Id = new ItemId("NewFolder")
            };

            newFolder.AddSubfolders(newSubfolder);
            newFolder.AddDiscs(newDisc);

            var mocker = new AutoMocker();
            var target = mocker.CreateInstance <LibraryExplorerItemListViewModel>();

            target.LoadFolderItems(oldFolder);
            target.SelectedItem = target.Items[1];

            // Act

            target.LoadFolderItems(newFolder);

            // Assert

            var expectedItems = new BasicExplorerItem[]
            {
                new FolderExplorerItem(newSubfolder),
                new DiscExplorerItem(newDisc),
            };

            target.Items.Should().BeEquivalentTo(expectedItems, x => x.WithStrictOrdering());
            target.SelectedItem.Should().Be(target.Items.First());
        }
        public void LoadFolderItems_ShowDeletedContentIsTrue_LoadsDeletedContent()
        {
            // Arrange

            var subfolder1 = new FolderModel {
                Name = "Subfolder 1"
            };
            var subfolder2 = new FolderModel {
                Name = "Subfolder 2", DeleteDate = new DateTime(2021, 07, 25)
            };
            var subfolder3 = new FolderModel {
                Name = "Subfolder 3"
            };

            var disc1 = new DiscModel {
                TreeTitle = "Disc 1"
            }.MakeActive();
            var disc2 = new DiscModel {
                TreeTitle = "Disc 2"
            }.MakeDeleted();
            var disc3 = new DiscModel {
                TreeTitle = "Disc 3"
            }.MakeActive();

            var folder = new FolderModel();

            folder.AddSubfolders(subfolder1, subfolder2, subfolder3);
            folder.AddDiscs(disc1, disc2, disc3);

            var mocker = new AutoMocker();
            var target = mocker.CreateInstance <LibraryExplorerItemListViewModel>();

            // Act

            target.LoadFolderItems(folder);
            target.ShowDeletedContent = true;

            // Assert

            var expectedItems = new BasicExplorerItem[]
            {
                new FolderExplorerItem(subfolder1),
                new FolderExplorerItem(subfolder2),
                new FolderExplorerItem(subfolder3),
                new DiscExplorerItem(disc1),
                new DiscExplorerItem(disc2),
                new DiscExplorerItem(disc3),
            };

            target.Items.Should().BeEquivalentTo(expectedItems, x => x.WithStrictOrdering().RespectingRuntimeTypes());
        }
        public async Task OnDiscDeleted_IfDeletedContentIsShown_ReloadsCurrentFolder()
        {
            // Arrange

            var oldDisc = new DiscModel {
                Id = new ItemId("Old Disc Id"), TreeTitle = "Old Disc"
            }.AddSongs(new SongModel {
                Id = new ItemId("1")
            });

            var folder = new FolderModel();

            folder.AddDiscs(oldDisc);

            var mocker = new AutoMocker();
            var target = mocker.CreateInstance <LibraryExplorerItemListViewModel>();

            target.LoadFolderItems(folder);
            target.ShowDeletedContent = true;

            // We add new items to the current folder for checking that LoadFolderItems() was called once again for the current folder.
            var newSubfolder = new FolderModel {
                Id = new ItemId("New Subfolder Id"), Name = "New Subfolder"
            };
            var newDisc = new DiscModel {
                Id = new ItemId("New Disc Id"), TreeTitle = "New Disc"
            }.AddSongs(new SongModel {
                Id = new ItemId("2")
            });

            folder.AddSubfolders(newSubfolder);
            folder.AddDiscs(newDisc);

            // Act

            await target.OnDiscDeleted(new ItemId("Old Disc Id"));

            // Assert

            var expectedItems = new BasicExplorerItem[]
            {
                new FolderExplorerItem(newSubfolder),
                new DiscExplorerItem(newDisc),
                new DiscExplorerItem(oldDisc),
            };

            target.Items.Should().BeEquivalentTo(expectedItems, x => x.WithStrictOrdering());
        }
        public async Task OnFolderDeleted_IfDeletedContentIsHiddenAndFolderPresentsInList_RemovesThisFolder()
        {
            // Arrange

            var folder1 = new FolderModel {
                Id = new ItemId("1"), Name = "Folder 1"
            };
            var folder2 = new FolderModel {
                Id = new ItemId("2"), Name = "Folder 2"
            };
            var folder3 = new FolderModel {
                Id = new ItemId("3"), Name = "Folder 3"
            };

            // Using the same id as for requested folder, just in case.
            var disc = new DiscModel {
                Id = new ItemId("2"), TreeTitle = "Some Disc"
            }.MakeActive();

            var folder = new FolderModel();

            folder.AddSubfolders(folder1, folder2, folder3);
            folder.AddDiscs(disc);

            var mocker = new AutoMocker();
            var target = mocker.CreateInstance <LibraryExplorerItemListViewModel>();

            target.LoadFolderItems(folder);
            target.ShowDeletedContent = false;

            // Act

            await target.OnFolderDeleted(new ItemId("2"));

            // Assert

            var expectedItems = new BasicExplorerItem[]
            {
                new FolderExplorerItem(folder1),
                new FolderExplorerItem(folder3),
                new DiscExplorerItem(disc),
            };

            target.Items.Should().BeEquivalentTo(expectedItems, x => x.WithStrictOrdering());
        }
        public async Task OnDiscDeleted_IfDeletedContentIsHiddenAndDiscDoesNotPresentInList_DoesNothing()
        {
            // Arrange

            // Using the same id as for requested disc, just in case.
            var subfolder = new FolderModel {
                Id = new ItemId("1"), Name = "Some Subfolder"
            };
            var disc = new DiscModel {
                Id = new ItemId("Disc Id"), TreeTitle = "Some Disc"
            }.MakeActive();

            var folder = new FolderModel();

            folder.AddSubfolders(subfolder);
            folder.AddDiscs(disc);

            var mocker = new AutoMocker();
            var target = mocker.CreateInstance <LibraryExplorerItemListViewModel>();

            target.LoadFolderItems(folder);
            target.ShowDeletedContent = false;

            // Act

            await target.OnDiscDeleted(new ItemId("1"));

            // Assert

            var expectedItems = new BasicExplorerItem[]
            {
                new FolderExplorerItem(subfolder),
                new DiscExplorerItem(disc),
            };

            target.Items.Should().BeEquivalentTo(expectedItems, x => x.WithStrictOrdering());
        }