diff --git a/Source/ViewModels/AchievementsListViewModel.cs b/Source/ViewModels/AchievementsListViewModel.cs index a005c92d..b01bdea1 100644 --- a/Source/ViewModels/AchievementsListViewModel.cs +++ b/Source/ViewModels/AchievementsListViewModel.cs @@ -15,8 +15,26 @@ namespace RATools.ViewModels { public class AchievementsListViewModel : ViewerViewModelBase { - public AchievementsListViewModel(GameViewModel owner, AchievementSet achievementSet, IEnumerable navigationNodes) + public AchievementsListViewModel(GameViewModel owner, AchievementSet achievementSet) : base(owner) + { + Title = achievementSet.Title; + _badgeName = achievementSet.BadgeName; + _id = (achievementSet != null) ? achievementSet.Id : 0; + + ExportCommand = new DelegateCommand(Export); + + Achievements = Enumerable.Empty(); + } + + private readonly int _id; + private readonly string _badgeName; + + public override string ViewerType => "AchievementList"; + + public override int ViewerId { get { return _id; } } + + public void Refresh(AchievementSet achievementSet, IEnumerable navigationNodes) { AchievementViewModel[] achievements; @@ -27,23 +45,17 @@ public AchievementsListViewModel(GameViewModel owner, AchievementSet achievement } else { - achievements = owner.Editors.OfType() + achievements = _owner.Editors.OfType() .Where(a => a.BelongsToSet(achievementSet)).ToArray(); } - Achievements = achievements; - - Title = achievementSet.Title; CountAchievements(achievements); - _badgeName = achievementSet?.BadgeName; - - _id = (achievementSet != null) ? achievementSet.Id : 0; - ExportCommand = new DelegateCommand(Export); + Achievements = achievements; + OnPropertyChanged(() => Achievements); + OnPropertyChanged(() => Points); } - private readonly int _id; - private void CountAchievements(AchievementViewModel[] achievements) { var description = new StringBuilder(); @@ -102,12 +114,6 @@ private void CountAchievements(AchievementViewModel[] achievements) PointsSummary = points.ToString(); } - private readonly string _badgeName; - - public override string ViewerType => "AchievementList"; - - public override int ViewerId { get { return _id; } } - public static readonly ModelProperty BadgeProperty = ModelProperty.RegisterDependant(typeof(AchievementsListViewModel), "Badge", typeof(ImageSource), new ModelProperty[0], GetBadge); public ImageSource Badge { diff --git a/Source/ViewModels/Navigation/AchievementsFolderNavigationViewModel.cs b/Source/ViewModels/Navigation/AchievementsFolderNavigationViewModel.cs index 763b2a50..34047134 100644 --- a/Source/ViewModels/Navigation/AchievementsFolderNavigationViewModel.cs +++ b/Source/ViewModels/Navigation/AchievementsFolderNavigationViewModel.cs @@ -1,4 +1,5 @@ using RATools.Data; +using System.ComponentModel; using System.Linq; namespace RATools.ViewModels.Navigation @@ -20,9 +21,20 @@ public ViewerViewModelBase Editor { get { - _editor ??= new AchievementsListViewModel(_game, _achievementSet, Children.OfType()); + _editor ??= new AchievementsListViewModel(_game, _achievementSet); return _editor; } } + + protected override void OnPropertyChanged(PropertyChangedEventArgs e) + { + if (e.PropertyName == "IsSelected" && IsSelected) + { + if (_editor != null) + _editor.Refresh(_achievementSet, Children.OfType()); + } + + base.OnPropertyChanged(e); + } } } diff --git a/Tests/ViewModels/AchievementListViewModelTests.cs b/Tests/ViewModels/AchievementListViewModelTests.cs new file mode 100644 index 00000000..a2f0a0f0 --- /dev/null +++ b/Tests/ViewModels/AchievementListViewModelTests.cs @@ -0,0 +1,163 @@ +using Jamiras.Components; +using Jamiras.Services; +using Moq; +using NUnit.Framework; +using RATools.Data; +using RATools.Services; +using RATools.ViewModels; +using RATools.ViewModels.Navigation; +using System; +using System.Linq; + +namespace RATools.Tests.ViewModels +{ + [TestFixture] + class AchievementListViewModelTests + { + [OneTimeSetUp] + public void FixtureSetup() + { + ServiceRepository.Reset(); + + var mockSettings = new Mock(); + mockSettings.Setup(s => s.HexValues).Returns(true); + ServiceRepository.Instance.RegisterInstance(mockSettings.Object); + } + + private class MockGameViewModel : GameViewModel + { + public MockGameViewModel() + : base(99, "Game", new Mock().Object, new Mock().Object, new Mock().Object) + { + SerializationContext = new SerializationContext(); + } + } + + [Test] + public void TestInitialization() + { + var game = new MockGameViewModel(); + var set = new AchievementSet { Id = 2, Title = "Set2", BadgeName = "01234" }; + + var listViewModel = new AchievementsListViewModel(game, set); + Assert.That(listViewModel.Title, Is.EqualTo("Set2")); + Assert.That(listViewModel.ViewerType, Is.EqualTo("AchievementList")); + Assert.That(listViewModel.ViewerId, Is.EqualTo(2)); + Assert.That(listViewModel.Achievements, Is.Not.Null); + Assert.That(listViewModel.Achievements.Count(), Is.EqualTo(0)); + Assert.That(listViewModel.Points, Is.EqualTo(0)); + Assert.That(listViewModel.PointsSummary, Is.EqualTo("")); + } + + [Test] + public void TestRefreshPromotedOnly() + { + var game = new MockGameViewModel(); + var set = new AchievementSet { Id = 2, Title = "Set2", BadgeName = "01234" }; + var listViewModel = new AchievementsListViewModel(game, set); + + var achievement1ViewModel = new AchievementViewModel(game); + achievement1ViewModel.Published.Asset = new Achievement + { + Points = 5, + Category = 3, + }; + achievement1ViewModel.Refresh(); + + var achievement2ViewModel = new AchievementViewModel(game); + achievement2ViewModel.Published.Asset = new Achievement + { + Points = 10, + Category = 3, + }; + achievement2ViewModel.Refresh(); + + listViewModel.Refresh(set, new[] + { + new AchievementNavigationViewModel(achievement1ViewModel), + new AchievementNavigationViewModel(achievement2ViewModel), + }); + + Assert.That(listViewModel.Achievements.Count(), Is.EqualTo(2)); + Assert.That(listViewModel.Achievements.First(), Is.SameAs(achievement1ViewModel)); + Assert.That(listViewModel.Achievements.ElementAt(1), Is.SameAs(achievement2ViewModel)); + + Assert.That(listViewModel.Points, Is.EqualTo(15)); + Assert.That(listViewModel.Description, Is.EqualTo("2 achievements")); + Assert.That(listViewModel.PointsSummary, Is.EqualTo("15 points")); + } + + [Test] + public void TestRefreshLocalOnly() + { + var game = new MockGameViewModel(); + var set = new AchievementSet { Id = 2, Title = "Set2", BadgeName = "01234" }; + var listViewModel = new AchievementsListViewModel(game, set); + + var achievement1ViewModel = new AchievementViewModel(game); + achievement1ViewModel.Local.Asset = new Achievement + { + Points = 5, + }; + achievement1ViewModel.Refresh(); + + var achievement2ViewModel = new AchievementViewModel(game); + achievement2ViewModel.Local.Asset = new Achievement + { + Points = 10, + }; + achievement2ViewModel.Refresh(); + + listViewModel.Refresh(set, new[] + { + new AchievementNavigationViewModel(achievement1ViewModel), + new AchievementNavigationViewModel(achievement2ViewModel), + }); + + Assert.That(listViewModel.Achievements.Count(), Is.EqualTo(2)); + Assert.That(listViewModel.Achievements.First(), Is.SameAs(achievement1ViewModel)); + Assert.That(listViewModel.Achievements.ElementAt(1), Is.SameAs(achievement2ViewModel)); + + Assert.That(listViewModel.Points, Is.EqualTo(15)); + Assert.That(listViewModel.Description, Is.EqualTo("2 achievements")); + Assert.That(listViewModel.PointsSummary, Is.EqualTo("15 points")); + } + + [Test] + public void TestRefreshPublishedAndLocal() + { + var game = new MockGameViewModel(); + var set = new AchievementSet { Id = 2, Title = "Set2", BadgeName = "01234" }; + var listViewModel = new AchievementsListViewModel(game, set); + + var achievement1ViewModel = new AchievementViewModel(game); + achievement1ViewModel.Published.Asset = new Achievement + { + Points = 5, + Category = 3, + }; + achievement1ViewModel.Refresh(); + + var achievement2ViewModel = new AchievementViewModel(game); + achievement2ViewModel.Local.Asset = new Achievement + { + Points = 10, + }; + achievement2ViewModel.Refresh(); + + listViewModel.Refresh(set, new[] + { + new AchievementNavigationViewModel(achievement1ViewModel), + new AchievementNavigationViewModel(achievement2ViewModel), + }); + + Assert.That(listViewModel.Achievements.Count(), Is.EqualTo(2)); + Assert.That(listViewModel.Achievements.First(), Is.SameAs(achievement1ViewModel)); + Assert.That(listViewModel.Achievements.ElementAt(1), Is.SameAs(achievement2ViewModel)); + + Assert.That(listViewModel.Points, Is.EqualTo(15)); + Assert.That(listViewModel.Description, Is.EqualTo("2 achievements (1 promoted, 1 local)")); + Assert.That(listViewModel.PointsSummary, Is.EqualTo("15 points (5 promoted, 10 local)")); + } + } +} diff --git a/Tests/ViewModels/Nagivation/AchievementsFolderNavigationViewModelTests.cs b/Tests/ViewModels/Nagivation/AchievementsFolderNavigationViewModelTests.cs new file mode 100644 index 00000000..1f8a8702 --- /dev/null +++ b/Tests/ViewModels/Nagivation/AchievementsFolderNavigationViewModelTests.cs @@ -0,0 +1,84 @@ +using Jamiras.Components; +using Jamiras.Services; +using Moq; +using NUnit.Framework; +using RATools.Data; +using RATools.Services; +using RATools.ViewModels; +using RATools.ViewModels.Navigation; +using System.Collections.Generic; +using System.Linq; + +namespace RATools.Tests.ViewModels.Nagivation +{ + [TestFixture] + class AchievementsFolderNavigationViewModelTests + { + [OneTimeSetUp] + public void FixtureSetup() + { + ServiceRepository.Reset(); + + var mockSettings = new Mock(); + mockSettings.Setup(s => s.HexValues).Returns(true); + ServiceRepository.Instance.RegisterInstance(mockSettings.Object); + } + + private class MockGameViewModel : GameViewModel + { + public MockGameViewModel() + : base(99, "Game", new Mock().Object, new Mock().Object, new Mock().Object) + { + SerializationContext = new SerializationContext(); + } + } + + [Test] + public void TestInitialState() + { + var game = new MockGameViewModel(); + var set = new AchievementSet { Id = 2, Title = "Set2", BadgeName = "01234" }; + var harness = new AchievementsFolderNavigationViewModel(game, set); + + Assert.That(harness.ImageName, Is.EqualTo("folder")); + Assert.That(harness.ImageResourcePath, Is.EqualTo("/RATools;component/Resources/folder.png")); + Assert.That(harness.ImageTooltip, Is.EqualTo("Folder")); + + Assert.That(harness.Label, Is.EqualTo("Achievements")); + + Assert.That(harness.ModificationMessage, Is.Null); + Assert.That(harness.CompareState, Is.EqualTo(GeneratedCompareState.Same)); + + Assert.That(harness.IsExpanded, Is.True); + Assert.That(harness.Children, Is.Not.Null); + Assert.That(harness.Children.Count(), Is.EqualTo(0)); + + Assert.That(harness.ContextMenu, Is.Null); + } + + [Test] + public void TestEditorInitializedOnSelect() + { + var game = new MockGameViewModel(); + var set = new AchievementSet { Id = 2, Title = "Set2", BadgeName = "01234" }; + var harness = new AchievementsFolderNavigationViewModel(game, set); + + var achievement1ViewModel = new AchievementViewModel(game); + achievement1ViewModel.Published.Asset = new Achievement + { + Points = 5, + Category = 3, + }; + achievement1ViewModel.Refresh(); + harness.AddChild(new AchievementNavigationViewModel(achievement1ViewModel)); + + Assert.That(harness.Editor, Is.Not.Null.And.InstanceOf()); + var editor = (AchievementsListViewModel)harness.Editor; + Assert.That(editor.Achievements.Count(), Is.EqualTo(0)); + + harness.IsSelected = true; + Assert.That(editor.Achievements.Count(), Is.EqualTo(1)); + Assert.That(editor.Achievements.First(), Is.SameAs(achievement1ViewModel)); + } + } +} diff --git a/Tests/ViewModels/Nagivation/NavigationListViewModelTests.cs b/Tests/ViewModels/Nagivation/NavigationListViewModelTests.cs index b0f3496f..6fc5a423 100644 --- a/Tests/ViewModels/Nagivation/NavigationListViewModelTests.cs +++ b/Tests/ViewModels/Nagivation/NavigationListViewModelTests.cs @@ -110,7 +110,7 @@ public MockGameViewModel(IFileSystemService fileSystemService) AssociateRACacheDirectory("C:\\RACache\\"); } - public List AchievementSets + public new List AchievementSets { get { return _achievementSets; } }