Ejemplo n.º 1
0
 private static IReadOnlyCollection <DiscModel> GetAdviseSetDiscs(AdviseSetModel adviseSet)
 {
     return(DiscLibrary.Discs
            .Where(x => x.AdviseSetInfo?.AdviseSet.Id == adviseSet.Id)
            .OrderBy(x => x.AdviseSetInfo.Order)
            .ToList());
 }
        public void CalculateAdviseSetRank_ForAdviseSetWithMultipleDiscs_ReturnsCorrectRank()
        {
            // Arrange

            var disc1     = CreateTestDisc("1.1", new[] { CreateTestSong(1, RatingModel.R5, new DateTime(2021, 08, 28)) });
            var disc2     = CreateTestDisc("1.2", new[] { CreateTestSong(2, RatingModel.R7, new DateTime(2021, 08, 28)) });
            var adviseSet = new AdviseSetModel {
                Id = new ItemId("1")
            };

            disc1.AdviseSetInfo = new AdviseSetInfo(adviseSet, 1);
            disc2.AdviseSetInfo = new AdviseSetInfo(adviseSet, 2);

            var adviseGroupContent1 = new AdviseGroupContent("1", isFavorite: false);

            adviseGroupContent1.AddDisc(disc1);
            adviseGroupContent1.AddDisc(disc2);

            var adviseGroupContent2 = CreateTestAdviseGroupContent("2", Enumerable.Range(11, 10).Select(id => CreateTestSong(id, RatingModel.R5, new DateTime(2021, 08, 27))));
            var adviseGroupContent3 = CreateTestAdviseGroupContent("3", Enumerable.Range(21, 10).Select(id => CreateTestSong(id, RatingModel.R5, new DateTime(2021, 08, 29))));

            var playbacksInfo = new PlaybacksInfo(new[] { adviseGroupContent1, adviseGroupContent2, adviseGroupContent3 });

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

            // Act

            var rank = target.CalculateAdviseSetRank(adviseGroupContent1.AdviseSets.Single(), playbacksInfo);

            // Assert

            // (rating: 1.5 ^ 6) * (playbacks age: 1)
            rank.Should().Be(11.390625);
        }
Ejemplo n.º 3
0
        public async Task RemoveDiscs(AdviseSetModel adviseSet, IEnumerable <DiscModel> removedDiscs, CancellationToken cancellationToken)
        {
            var removedDiscsMap = removedDiscs.ToDictionary(x => x.Id, x => x);

            var nextOrder = 1;

            foreach (var disc in GetAdviseSetDiscs(adviseSet))
            {
                if (removedDiscsMap.TryGetValue(disc.Id, out var removedDisc))
                {
                    disc.AdviseSetInfo = null;
                    await discsRepository.UpdateDisc(disc, cancellationToken);

                    removedDisc.AdviseSetInfo = null;
                }
                else
                {
                    if (disc.AdviseSetInfo.Order != nextOrder)
                    {
                        disc.AdviseSetInfo = disc.AdviseSetInfo.WithOrder(nextOrder);
                        await discsRepository.UpdateDisc(disc, cancellationToken);
                    }

                    ++nextOrder;
                }
            }
        }
Ejemplo n.º 4
0
        public async Task Load_IfSomeDiscsAreDeleted_LoadsOnlyActiveDiscs()
        {
            // Arrange

            var adviseSet = new AdviseSetModel {
                Id = new ItemId("1")
            };
            var discs = new[]
            {
                new DiscModel {
                    Id = new ItemId("1"), AdviseSetInfo = new AdviseSetInfo(adviseSet, 1)
                }.MakeActive(),
                new DiscModel {
                    Id = new ItemId("2"), AdviseSetInfo = new AdviseSetInfo(adviseSet, 2)
                }.MakeDeleted(),
                new DiscModel {
                    Id = new ItemId("3"), AdviseSetInfo = new AdviseSetInfo(adviseSet, 3)
                }.MakeActive(),
            };

            var mocker = StubServices(new[] { adviseSet }, discs);
            var target = mocker.CreateInstance <AdviseSetsEditorViewModel>();

            // Act

            await target.Load(CancellationToken.None);

            target.SelectedAdviseSet = adviseSet;

            // Assert

            var availableDiscsViewModelMock = mocker.GetMock <IAvailableDiscsViewModel>();

            availableDiscsViewModelMock.Verify(x => x.LoadDiscs(new[] { discs[0], discs[2] }, It.IsAny <CancellationToken>()), Times.Once);
        }
        public async Task CreateAdviseSet_ForExistingAdviseSetName_Throws()
        {
            // Arrange

            var referenceData = GetReferenceData();

            var newAdviseSet = new AdviseSetModel
            {
                Name = referenceData.AdviseSet1.Name,
            };

            var target = CreateTestTarget();

            // Act

            Func <Task> call = () => target.CreateAdviseSet(newAdviseSet, CancellationToken.None);

            // Assert

            await call.Should().ThrowAsync <DbUpdateException>();

            var expectedAdviseSets = new[]
            {
                referenceData.AdviseSet2,
                referenceData.AdviseSet1,
            };

            var allAdviseSets = await target.GetAllAdviseSets(CancellationToken.None);

            allAdviseSets.Should().BeEquivalentTo(expectedAdviseSets, x => x.WithStrictOrdering());

            await CheckLibraryConsistency();
        }
Ejemplo n.º 6
0
        public async Task DeleteAdviseSetCommandHandler_IfDeletionIsConfirmed_DeleteAdviseSet()
        {
            // Arrange

            var adviseSet = new AdviseSetModel {
                Id = new ItemId("1")
            };

            var windowServiceStub = new Mock <IWindowService>();

            windowServiceStub.Setup(x => x.ShowMessageBox(It.IsAny <string>(), It.IsAny <string>(), It.IsAny <ShowMessageBoxButton>(), It.IsAny <ShowMessageBoxIcon>())).Returns(ShowMessageBoxResult.Yes);

            var mocker = StubServices(new[] { adviseSet }, Array.Empty <DiscModel>());

            mocker.Use(windowServiceStub);

            var target = mocker.CreateInstance <AdviseSetsEditorViewModel>();

            await target.Load(CancellationToken.None);

            target.SelectedAdviseSet = adviseSet;

            // Act

            target.DeleteAdviseSetCommand.Execute(null);

            // Assert

            var adviseSetServiceMock = mocker.GetMock <IAdviseSetService>();

            adviseSetServiceMock.Verify(x => x.DeleteAdviseSet(adviseSet, It.IsAny <CancellationToken>()), Times.Once);
        }
Ejemplo n.º 7
0
        public async Task CanDeleteAdviseSetGetter_IfNoAdviseSetSelected_ReturnsFalse()
        {
            // Arrange

            var adviseSet = new AdviseSetModel {
                Id = new ItemId("1")
            };
            var discs = new[] { new DiscModel {
                                    Id = new ItemId("1"), AdviseSetInfo = new AdviseSetInfo(adviseSet, 1)
                                }.MakeActive() };

            var mocker = StubServices(new[] { adviseSet }, discs);
            var target = mocker.CreateInstance <AdviseSetsEditorViewModel>();

            await target.Load(CancellationToken.None);

            target.SelectedAdviseSet = null;

            // Act

            var result = target.CanDeleteAdviseSet;

            // Assert

            result.Should().BeFalse();
        }
Ejemplo n.º 8
0
        public async Task CanAddDiscsGetter_IfSomeAdviseSetIsSelectedAndSelectedDiscsCanBeAddedToAdviseSet_ReturnsTrue()
        {
            // Arrange

            var adviseSet = new AdviseSetModel {
                Id = new ItemId("1")
            };
            var discs = new[] { new DiscModel {
                                    Id = new ItemId("1"), AdviseSetInfo = new AdviseSetInfo(adviseSet, 1)
                                }.MakeActive() };

            var availableDiscsViewModelStub = new Mock <IAvailableDiscsViewModel>();

            availableDiscsViewModelStub.Setup(x => x.SelectedDiscsCanBeAddedToAdviseSet(discs)).Returns(true);

            var mocker = StubServices(new[] { adviseSet }, discs);

            mocker.Use(availableDiscsViewModelStub);

            var target = mocker.CreateInstance <AdviseSetsEditorViewModel>();

            await target.Load(CancellationToken.None);

            target.SelectedAdviseSet = adviseSet;

            // Act

            var result = target.CanAddDiscs;

            // Assert

            result.Should().BeTrue();
        }
Ejemplo n.º 9
0
        public void ForAdviseSet_ForExplicitAdviseSet_FillsTitleCorrectly()
        {
            // Arrange

            var adviseSet = new AdviseSetModel {
                Id = new ItemId("Advise Set Id"), Name = "Some Advise Set"
            };

            var disc1 = new DiscModel {
                Id = new ItemId("1"), AdviseSetInfo = new AdviseSetInfo(adviseSet, 1), Title = "Disc 1"
            };
            var disc2 = new DiscModel {
                Id = new ItemId("2"), AdviseSetInfo = new AdviseSetInfo(adviseSet, 2), Title = "Disc 2"
            };

            var folder = new FolderModel {
                Name = "Some Artist"
            };

            folder.AddDiscs(disc1, disc2);

            var adviseSetContent = new AdviseSetContent("AdviseSetContent Id");

            adviseSetContent.AddDisc(disc1);
            adviseSetContent.AddDisc(disc2);

            // Act

            var target = AdvisedPlaylist.ForAdviseSet(adviseSetContent);

            // Assert

            target.Title.Should().Be("Some Advise Set");
        }
Ejemplo n.º 10
0
        public async Task CanRemoveDiscGetter_IfSomeAdviseSetIsSelectedButNoDiscSelected_ReturnsTrue()
        {
            // Arrange

            var adviseSet = new AdviseSetModel {
                Id = new ItemId("1")
            };
            var discs = new[] { new DiscModel {
                                    Id = new ItemId("1"), AdviseSetInfo = new AdviseSetInfo(adviseSet, 1)
                                }.MakeActive() };

            var mocker = StubServices(new[] { adviseSet }, discs);
            var target = mocker.CreateInstance <AdviseSetsEditorViewModel>();

            await target.Load(CancellationToken.None);

            target.SelectedAdviseSet     = adviseSet;
            target.SelectedAdviseSetDisc = discs.First();

            // Act

            var result = target.CanRemoveDisc;

            // Assert

            result.Should().BeTrue();
        }
Ejemplo n.º 11
0
        public async Task SelectedAdviseSetSetter_IfNoAdviseSetSelected_ClearsCurrentAdviseSetDiscs()
        {
            // Arrange

            var adviseSet = new AdviseSetModel {
                Id = new ItemId("1")
            };

            var discs = new[]
            {
                new DiscModel {
                    Id = new ItemId("1"), AdviseSetInfo = new AdviseSetInfo(adviseSet, 1)
                }.MakeActive(),
                new DiscModel {
                    Id = new ItemId("2")
                }.MakeActive(),
            };

            var availableDiscsViewModelMock = new Mock <IAvailableDiscsViewModel>();

            var mocker = StubServices(new[] { adviseSet }, discs);

            mocker.Use(availableDiscsViewModelMock);

            var target = mocker.CreateInstance <AdviseSetsEditorViewModel>();

            await target.Load(CancellationToken.None);

            target.SelectedAdviseSet = adviseSet;
            target.CurrentAdviseSetDiscs.Should().NotBeEmpty();

            availableDiscsViewModelMock.Invocations.Clear();

            var propertyChangedEvents = new List <PropertyChangedEventArgs>();

            target.PropertyChanged += (_, e) => propertyChangedEvents.Add(e);

            // Act

            target.SelectedAdviseSet = null;

            // Assert

            target.CurrentAdviseSetDiscs.Should().BeEmpty();

            availableDiscsViewModelMock.Verify(x => x.LoadAvailableDiscsForAdviseSet(new ObservableCollection <DiscModel>()), Times.Once);

            var expectedProperties = new[]
            {
                nameof(AdviseSetsEditorViewModel.SelectedAdviseSet),
                nameof(AdviseSetsEditorViewModel.CanDeleteAdviseSet),
                nameof(AdviseSetsEditorViewModel.CanAddDiscs),
                nameof(AdviseSetsEditorViewModel.CanRemoveDisc),
                nameof(AdviseSetsEditorViewModel.CanMoveDiscUp),
                nameof(AdviseSetsEditorViewModel.CanMoveDiscDown),
            };

            propertyChangedEvents.Select(e => e.PropertyName).Should().BeEquivalentTo(expectedProperties);
        }
Ejemplo n.º 12
0
        public async Task LoadAvailableDiscsForAdviseSet_IfDiscBelongsToAnotherFolder_DoesNotAddSuchDiscsToList()
        {
            // Arrange

            var adviseSet = new AdviseSetModel {
                Id = new ItemId("1")
            };

            var discs = new[]
            {
                new DiscModel {
                    Id = new ItemId("1"), TreeTitle = "Disc 1", AdviseSetInfo = new AdviseSetInfo(adviseSet, 1)
                },
                new DiscModel {
                    Id = new ItemId("2"), TreeTitle = "Disc 2"
                },
                new DiscModel {
                    Id = new ItemId("3"), TreeTitle = "Disc 3"
                },
            };

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

            folder1.AddSubfolders(folder2);
            folder2.AddSubfolders(folder3);
            folder2.AddDiscs(discs[0], discs[2]);
            folder3.AddDiscs(discs[1]);

            var adviseSetDiscs = new[]
            {
                discs[0],
            };

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

            await target.LoadDiscs(discs, CancellationToken.None);

            // Act

            target.LoadAvailableDiscsForAdviseSet(adviseSetDiscs);

            // Assert

            var expectedAvailableDiscs = new[]
            {
                new AvailableDiscViewModel(discs[2], "/Folder 1/Disc 3"),
            };

            target.AvailableDiscs.Should().BeEquivalentTo(expectedAvailableDiscs, x => x.WithStrictOrdering());
        }
Ejemplo n.º 13
0
 public static AdviseSetEntity ToEntity(this AdviseSetModel adviseSet)
 {
     return(new()
     {
         Id = adviseSet.Id?.ToInt32() ?? default,
         Name = adviseSet.Name,
     });
 }
Ejemplo n.º 14
0
        public async Task DeleteAdviseSet(AdviseSetModel adviseSet, CancellationToken cancellationToken)
        {
            await using var context = contextFactory.CreateDbContext();

            var entity = await FindAdviseSet(context, adviseSet.Id, cancellationToken);

            context.AdviseSets.Remove(entity);

            await context.SaveChangesAsync(cancellationToken);
        }
Ejemplo n.º 15
0
        public async Task AddDiscs(AdviseSetModel adviseSet, IEnumerable <DiscModel> addedDiscs, CancellationToken cancellationToken)
        {
            var lastAdviseSetInfo = GetAdviseSetDiscs(adviseSet).LastOrDefault()?.AdviseSetInfo;
            var nextOrder         = (lastAdviseSetInfo?.Order ?? 0) + 1;

            foreach (var addedDisc in addedDiscs)
            {
                addedDisc.AdviseSetInfo = new AdviseSetInfo(adviseSet, nextOrder++);
                await discsRepository.UpdateDisc(addedDisc, cancellationToken);
            }
        }
Ejemplo n.º 16
0
        public async Task CreateAdviseSet(AdviseSetModel adviseSet, CancellationToken cancellationToken)
        {
            var adviseSetEntity = adviseSet.ToEntity();

            await using var context = contextFactory.CreateDbContext();
            await context.AdviseSets.AddAsync(adviseSetEntity, cancellationToken);

            await context.SaveChangesAsync(cancellationToken);

            adviseSet.Id = adviseSetEntity.Id.ToItemId();
        }
Ejemplo n.º 17
0
        public async Task UpdateAdviseSet(AdviseSetModel adviseSet, CancellationToken cancellationToken)
        {
            await using var context = contextFactory.CreateDbContext();

            var currentEntity = await FindAdviseSet(context, adviseSet.Id, cancellationToken);

            var updatedEntity = adviseSet.ToEntity();

            context.Entry(currentEntity).CurrentValues.SetValues(updatedEntity);

            await context.SaveChangesAsync(cancellationToken);
        }
Ejemplo n.º 18
0
        public async Task MoveDiscDownCommandHandler_IfNotLastDiscIsSelected_ReordersDiscsCorrectly()
        {
            // Arrange

            var adviseSet = new AdviseSetModel {
                Id = new ItemId("1")
            };
            var discs = new[]
            {
                new DiscModel {
                    Id = new ItemId("1"), AdviseSetInfo = new AdviseSetInfo(adviseSet, 1)
                }.MakeActive(),
                new DiscModel {
                    Id = new ItemId("2"), AdviseSetInfo = new AdviseSetInfo(adviseSet, 2)
                }.MakeActive(),
                new DiscModel {
                    Id = new ItemId("3"), AdviseSetInfo = new AdviseSetInfo(adviseSet, 3)
                }.MakeActive(),
            };

            var mocker = StubServices(new[] { adviseSet }, discs);

            var adviseSetServiceMock = mocker.GetMock <IAdviseSetService>();

            adviseSetServiceMock.Setup(x => x.ReorderDiscs(adviseSet, new[] { discs[0], discs[2], discs[1] }, It.IsAny <CancellationToken>()))
            .Callback <AdviseSetModel, IEnumerable <DiscModel>, CancellationToken>((_, newDiscsOrder, _) =>
            {
                // Emulate logic of ReorderDiscs call for correct check of order for CurrentAdviseSetDiscs.
                var newDiscsOrderList = newDiscsOrder.ToList();
                newDiscsOrderList[0].AdviseSetInfo = new AdviseSetInfo(adviseSet, 1);
                newDiscsOrderList[1].AdviseSetInfo = new AdviseSetInfo(adviseSet, 2);
                newDiscsOrderList[2].AdviseSetInfo = new AdviseSetInfo(adviseSet, 3);
            });

            var target = mocker.CreateInstance <AdviseSetsEditorViewModel>();

            await target.Load(CancellationToken.None);

            target.SelectedAdviseSet     = adviseSet;
            target.SelectedAdviseSetDisc = discs[1];

            // Act

            target.MoveDiscDownCommand.Execute(null);

            // Assert

            adviseSetServiceMock.Verify(x => x.ReorderDiscs(adviseSet, new[] { discs[0], discs[2], discs[1] }, It.IsAny <CancellationToken>()), Times.Once);

            target.CurrentAdviseSetDiscs.Should().BeEquivalentTo(new[] { discs[0], discs[2], discs[1] }, x => x.WithStrictOrdering());
            target.SelectedAdviseSetDisc.Should().Be(discs[1]);
        }
Ejemplo n.º 19
0
        public async Task DeleteAdviseSet(AdviseSetModel adviseSet, CancellationToken cancellationToken)
        {
            var currentDiscs = GetAdviseSetDiscs(adviseSet);

            foreach (var disc in currentDiscs)
            {
                disc.AdviseSetInfo = null;
                await discsRepository.UpdateDisc(disc, cancellationToken);
            }

            await adviseSetRepository.DeleteAdviseSet(adviseSet, cancellationToken);

            DiscLibrary.DeleteAdviseSet(adviseSet);
        }
Ejemplo n.º 20
0
        public async Task DeleteAdviseSetCommandHandler_IfAdviseSetIsDeleted_ClearsAdviseSetForDiscs()
        {
            // Arrange

            var adviseSet1 = new AdviseSetModel {
                Id = new ItemId("1")
            };
            var adviseSet2 = new AdviseSetModel {
                Id = new ItemId("2")
            };

            var disc11 = new DiscModel {
                Id = new ItemId("1"), AdviseSetInfo = new AdviseSetInfo(adviseSet1, 1)
            }.MakeActive();
            var disc12 = new DiscModel {
                Id = new ItemId("2"), AdviseSetInfo = new AdviseSetInfo(adviseSet1, 2)
            }.MakeActive();
            var disc21 = new DiscModel {
                Id = new ItemId("3"), AdviseSetInfo = new AdviseSetInfo(adviseSet2, 1)
            }.MakeActive();

            var discs = new[] { disc11, disc12, disc21 };

            var windowServiceStub = new Mock <IWindowService>();

            windowServiceStub.Setup(x => x.ShowMessageBox(It.IsAny <string>(), It.IsAny <string>(), It.IsAny <ShowMessageBoxButton>(), It.IsAny <ShowMessageBoxIcon>())).Returns(ShowMessageBoxResult.Yes);

            var mocker = StubServices(new[] { adviseSet1, adviseSet2 }, discs);

            mocker.Use(windowServiceStub);

            var target = mocker.CreateInstance <AdviseSetsEditorViewModel>();

            await target.Load(CancellationToken.None);

            target.SelectedAdviseSet = adviseSet1;

            // Act

            target.DeleteAdviseSetCommand.Execute(null);

            // Assert

            disc11.AdviseSetInfo.Should().BeNull();
            disc12.AdviseSetInfo.Should().BeNull();
            disc21.AdviseSetInfo.Should().BeEquivalentTo(new AdviseSetInfo(adviseSet2, 1));
        }
Ejemplo n.º 21
0
        public async Task GroupLibraryDiscs_IfDiscsBelongToSameAdviseSet_AssignsDiscsToSameAdviseSetContent()
        {
            // Arrange

            var adviseSet1 = new AdviseSetModel {
                Id = new ItemId("Advise Set 1")
            };
            var adviseSet2 = new AdviseSetModel {
                Id = new ItemId("Advise Set 2")
            };

            var disc11 = new DiscModel {
                AdviseSetInfo = new AdviseSetInfo(adviseSet1, 1)
            };
            var disc12 = new DiscModel {
                AdviseSetInfo = new AdviseSetInfo(adviseSet1, 2)
            };
            var disc21 = new DiscModel {
                AdviseSetInfo = new AdviseSetInfo(adviseSet2, 1)
            };

            var rootFolder = new FolderModel {
                Id = new ItemId("Root Folder")
            };

            rootFolder.AddDiscs(disc11, disc12, disc21);

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

            // Act

            var adviseGroups = await target.GroupLibraryDiscs(new[] { disc11, disc21, disc12 }, CancellationToken.None);

            // Assert

            adviseGroups.Count.Should().Be(1);

            var adviseSets = adviseGroups.Single().AdviseSets.ToList();

            adviseSets.Count.Should().Be(2);

            adviseSets[0].Discs.Should().BeEquivalentTo(new[] { disc11, disc12 }, x => x.WithStrictOrdering());
            adviseSets[1].Discs.Should().BeEquivalentTo(new[] { disc21 }, x => x.WithStrictOrdering());
        }
Ejemplo n.º 22
0
        public async Task SelectedAdviseSetDiscSetter_RaisesPropertyChangedEventsCorrectly()
        {
            // Arrange

            var adviseSet = new AdviseSetModel {
                Id = new ItemId("1")
            };
            var discs = new[] { new DiscModel {
                                    Id = new ItemId("1"), AdviseSetInfo = new AdviseSetInfo(adviseSet, 1)
                                }.MakeActive() };

            var mocker = StubServices(new[] { adviseSet }, discs);
            var target = mocker.CreateInstance <AdviseSetsEditorViewModel>();

            await target.Load(CancellationToken.None);

            target.SelectedAdviseSet = adviseSet;

            var propertyChangedEvents = new List <PropertyChangedEventArgs>();

            target.PropertyChanged += (_, e) => propertyChangedEvents.Add(e);

            // Act

            target.SelectedAdviseSetDisc = discs.First();

            // Assert

            var expectedProperties = new[]
            {
                nameof(AdviseSetsEditorViewModel.SelectedAdviseSetDisc),
                nameof(AdviseSetsEditorViewModel.CanDeleteAdviseSet),
                nameof(AdviseSetsEditorViewModel.CanAddDiscs),
                nameof(AdviseSetsEditorViewModel.CanRemoveDisc),
                nameof(AdviseSetsEditorViewModel.CanMoveDiscUp),
                nameof(AdviseSetsEditorViewModel.CanMoveDiscDown),
            };

            propertyChangedEvents.Select(e => e.PropertyName).Should().BeEquivalentTo(expectedProperties);
        }
        public async Task CreateAdviseSet_ForNonExistingAdviseSetName_CreatesAdviseSetSuccessfully()
        {
            // Arrange

            var newAdviseSet = new AdviseSetModel
            {
                Name = "Вершки и корешки",
            };

            var target = CreateTestTarget();

            // Act

            await target.CreateAdviseSet(newAdviseSet, CancellationToken.None);

            // Assert

            var expectedAdviseSet = new AdviseSetModel
            {
                Id   = ReferenceData.NextAdviseSetId,
                Name = "Вершки и корешки",
            };

            newAdviseSet.Should().BeEquivalentTo(expectedAdviseSet, x => x.WithStrictOrdering());

            var referenceData      = GetReferenceData();
            var expectedAdviseSets = new[]
            {
                referenceData.AdviseSet2,
                referenceData.AdviseSet1,
                expectedAdviseSet,
            };

            var allAdviseSets = await target.GetAllAdviseSets(CancellationToken.None);

            allAdviseSets.Should().BeEquivalentTo(expectedAdviseSets, x => x.WithStrictOrdering());

            await CheckLibraryConsistency();
        }
        public void PlaylistLoadedEventHandler_AllSongsBelongToSameAdviseSet_OpensDiscForCurrentPlaylistSong()
        {
            // Arrange

            var adviseSet = new AdviseSetModel {
                Id = new ItemId("Some Advise Set")
            };
            var discFolder = new FolderModel {
                Id = new ItemId("Some Folder")
            };
            var disc1 = new DiscModel {
                Id = new ItemId("Some Disc 1"), AdviseSetInfo = new AdviseSetInfo(adviseSet, 1)
            }.AddToFolder(discFolder);
            var disc2 = new DiscModel {
                Id = new ItemId("Some Disc 2"), AdviseSetInfo = new AdviseSetInfo(adviseSet, 2)
            }.AddToFolder(discFolder);

            var song1 = new SongModel {
                Id = new ItemId("1")
            }.AddToDisc(disc1);
            var song2 = new SongModel {
                Id = new ItemId("2")
            }.AddToDisc(disc2);

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

            // Act

            Messenger.Default.Send(new PlaylistLoadedEventArgs(new[] { song1, song2 }, song2, 1));

            // Assert

            var itemListViewModelMock = mocker.GetMock <ILibraryExplorerItemListViewModel>();

            itemListViewModelMock.Verify(x => x.LoadFolderItems(discFolder), Times.Once);
            itemListViewModelMock.Verify(x => x.SelectDisc(new ItemId("Some Disc 2")), Times.Once);
        }
Ejemplo n.º 25
0
        public async Task ReorderDiscs(AdviseSetModel adviseSet, IEnumerable <DiscModel> newDiscsOrder, CancellationToken cancellationToken)
        {
            var currentDiscs      = GetAdviseSetDiscs(adviseSet).ToList();
            var newDiscsOrderList = newDiscsOrder.ToList();

            var oldOrders = currentDiscs.ToDictionary(x => x.Id, x => x.AdviseSetInfo.Order);
            var newOrders = newDiscsOrderList
                            .Select((x, i) => (Disc: x, Order: i + 1))
                            .ToDictionary(x => x.Disc.Id, x => x.Order);

            var discsChanged = currentDiscs.Except(newDiscsOrderList, new DiscEqualityComparer()).Any() ||
                               newDiscsOrderList.Except(currentDiscs, new DiscEqualityComparer()).Any();

            if (discsChanged)
            {
                throw new InvalidOperationException("Can not reorder advise set discs because advise set was modified");
            }

            // For satisfying unique order constraint, for discs with changed order we have to clear existing order at first.
            foreach (var disc in newDiscsOrderList)
            {
                if (newOrders[disc.Id] != oldOrders[disc.Id])
                {
                    disc.AdviseSetInfo = null;
                    await discsRepository.UpdateDisc(disc, cancellationToken);
                }
            }

            // Finally saving new order.
            foreach (var disc in newDiscsOrderList)
            {
                if (disc.AdviseSetInfo == null)
                {
                    disc.AdviseSetInfo = new AdviseSetInfo(adviseSet, newOrders[disc.Id]);
                    await discsRepository.UpdateDisc(disc, cancellationToken);
                }
            }
        }
Ejemplo n.º 26
0
        public async Task CanMoveDiscDownGetter_IfNotLastDiscIsSelected_ReturnsTrue()
        {
            // Arrange

            var adviseSet = new AdviseSetModel {
                Id = new ItemId("1")
            };
            var discs = new[]
            {
                new DiscModel {
                    Id = new ItemId("1"), AdviseSetInfo = new AdviseSetInfo(adviseSet, 1)
                }.MakeActive(),
                new DiscModel {
                    Id = new ItemId("2"), AdviseSetInfo = new AdviseSetInfo(adviseSet, 2)
                }.MakeActive(),
                new DiscModel {
                    Id = new ItemId("3"), AdviseSetInfo = new AdviseSetInfo(adviseSet, 3)
                }.MakeActive(),
            };

            var mocker = StubServices(new[] { adviseSet }, discs);
            var target = mocker.CreateInstance <AdviseSetsEditorViewModel>();

            await target.Load(CancellationToken.None);

            target.SelectedAdviseSet     = adviseSet;
            target.SelectedAdviseSetDisc = discs[1];

            // Act

            var result = target.CanMoveDiscDown;

            // Assert

            result.Should().BeTrue();
        }
Ejemplo n.º 27
0
 public AdviseSetCreatedEventArgs(AdviseSetModel adviseSet)
 {
     AdviseSet = adviseSet ?? throw new ArgumentNullException(nameof(adviseSet));
 }
Ejemplo n.º 28
0
 public Task UpdateAdviseSet(AdviseSetModel adviseSet, CancellationToken cancellationToken)
 {
     return(adviseSetRepository.UpdateAdviseSet(adviseSet, cancellationToken));
 }
Ejemplo n.º 29
0
        public async Task SelectedAdviseSetSetter_IfSomeAdviseSetSelected_FillsCurrentAdviseSetDiscsCorrectly()
        {
            // Arrange

            var adviseSet1 = new AdviseSetModel {
                Id = new ItemId("1")
            };
            var adviseSet2 = new AdviseSetModel {
                Id = new ItemId("2")
            };

            var adviseSetServiceStub = new Mock <IAdviseSetService>();

            adviseSetServiceStub.Setup(x => x.GetAllAdviseSets(It.IsAny <CancellationToken>())).ReturnsAsync(new[] { adviseSet1, adviseSet2 });

            var disc1 = new DiscModel {
                Id = new ItemId("2_1"), AdviseSetInfo = new AdviseSetInfo(adviseSet2, 1)
            }.MakeActive();
            var disc2 = new DiscModel {
                Id = new ItemId("2_2"), AdviseSetInfo = new AdviseSetInfo(adviseSet2, 2)
            }.MakeActive();

            var discs = new[]
            {
                new DiscModel {
                    Id = new ItemId("1_1"), AdviseSetInfo = new AdviseSetInfo(adviseSet1, 1)
                }.MakeActive(),
                disc1,
                disc2,
                new DiscModel {
                    Id = new ItemId("3_1")
                }.MakeActive(),
            };

            var availableDiscsViewModelMock = new Mock <IAvailableDiscsViewModel>();

            var mocker = StubServices(new[] { adviseSet1, adviseSet2 }, discs);

            mocker.Use(availableDiscsViewModelMock);

            var target = mocker.CreateInstance <AdviseSetsEditorViewModel>();

            await target.Load(CancellationToken.None);

            target.SelectedAdviseSet = adviseSet1;
            target.CurrentAdviseSetDiscs.Should().NotBeEmpty();

            availableDiscsViewModelMock.Invocations.Clear();

            var propertyChangedEvents = new List <PropertyChangedEventArgs>();

            target.PropertyChanged += (_, e) => propertyChangedEvents.Add(e);

            // Act

            target.SelectedAdviseSet = adviseSet2;

            // Assert

            target.CurrentAdviseSetDiscs.Should().BeEquivalentTo(new[] { disc1, disc2 }, x => x.WithStrictOrdering());

            Func <ObservableCollection <DiscModel>, bool> verifyDiscs = ds => ds.SequenceEqual(new[] { disc1, disc2 });

            availableDiscsViewModelMock.Verify(x => x.LoadAvailableDiscsForAdviseSet(It.Is <ObservableCollection <DiscModel> >(ds => verifyDiscs(ds))), Times.Once);

            var expectedProperties = new[]
            {
                nameof(AdviseSetsEditorViewModel.SelectedAdviseSet),
                nameof(AdviseSetsEditorViewModel.CanDeleteAdviseSet),
                nameof(AdviseSetsEditorViewModel.CanAddDiscs),
                nameof(AdviseSetsEditorViewModel.CanRemoveDisc),
                nameof(AdviseSetsEditorViewModel.CanMoveDiscUp),
                nameof(AdviseSetsEditorViewModel.CanMoveDiscDown),
            };

            propertyChangedEvents.Select(e => e.PropertyName).Should().BeEquivalentTo(expectedProperties);
        }
Ejemplo n.º 30
0
        public async Task CreateAdviseSet(AdviseSetModel adviseSet, CancellationToken cancellationToken)
        {
            await adviseSetRepository.CreateAdviseSet(adviseSet, cancellationToken);

            DiscLibrary.AddAdviseSet(adviseSet);
        }