Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
40 changes: 23 additions & 17 deletions Source/ViewModels/AchievementsListViewModel.cs
Original file line number Diff line number Diff line change
Expand Up @@ -15,8 +15,26 @@ namespace RATools.ViewModels
{
public class AchievementsListViewModel : ViewerViewModelBase
{
public AchievementsListViewModel(GameViewModel owner, AchievementSet achievementSet, IEnumerable<NavigationViewModelBase> 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<AchievementViewModel>();
}

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<NavigationViewModelBase> navigationNodes)
{
AchievementViewModel[] achievements;

Expand All @@ -27,23 +45,17 @@ public AchievementsListViewModel(GameViewModel owner, AchievementSet achievement
}
else
{
achievements = owner.Editors.OfType<AchievementViewModel>()
achievements = _owner.Editors.OfType<AchievementViewModel>()
.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();
Expand Down Expand Up @@ -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
{
Expand Down
Original file line number Diff line number Diff line change
@@ -1,4 +1,5 @@
using RATools.Data;
using System.ComponentModel;
using System.Linq;

namespace RATools.ViewModels.Navigation
Expand All @@ -20,9 +21,20 @@ public ViewerViewModelBase Editor
{
get
{
_editor ??= new AchievementsListViewModel(_game, _achievementSet, Children.OfType<AchievementNavigationViewModel>());
_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<AchievementNavigationViewModel>());
}

base.OnPropertyChanged(e);
}
}
}
163 changes: 163 additions & 0 deletions Tests/ViewModels/AchievementListViewModelTests.cs
Original file line number Diff line number Diff line change
@@ -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<ISettings>();
mockSettings.Setup(s => s.HexValues).Returns(true);
ServiceRepository.Instance.RegisterInstance<ISettings>(mockSettings.Object);
}

private class MockGameViewModel : GameViewModel
{
public MockGameViewModel()
: base(99, "Game", new Mock<ILogger>().Object, new Mock<IFileSystemService>().Object, new Mock<ISettings>().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)"));
}
}
}
Original file line number Diff line number Diff line change
@@ -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<ISettings>();
mockSettings.Setup(s => s.HexValues).Returns(true);
ServiceRepository.Instance.RegisterInstance<ISettings>(mockSettings.Object);
}

private class MockGameViewModel : GameViewModel
{
public MockGameViewModel()
: base(99, "Game", new Mock<ILogger>().Object, new Mock<IFileSystemService>().Object, new Mock<ISettings>().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<AchievementsListViewModel>());
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));
}
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -110,7 +110,7 @@ public MockGameViewModel(IFileSystemService fileSystemService)
AssociateRACacheDirectory("C:\\RACache\\");
}

public List<AchievementSetViewModel> AchievementSets
public new List<AchievementSetViewModel> AchievementSets
{
get { return _achievementSets; }
}
Expand Down
Loading