24 changed files with 674 additions and 8 deletions
@ -0,0 +1,16 @@
@@ -0,0 +1,16 @@
|
||||
// Copyright (c) AlphaSierraPapa for the SharpDevelop Team (for details please see \doc\copyright.txt)
|
||||
// This code is distributed under the GNU LGPL (for details please see \doc\license.txt)
|
||||
|
||||
using System; |
||||
using System.Linq; |
||||
using NuGet; |
||||
|
||||
namespace ICSharpCode.PackageManagement |
||||
{ |
||||
public interface IMachinePackageCache |
||||
{ |
||||
IQueryable<IPackage> GetPackages(); |
||||
void Clear(); |
||||
string Source { get; } |
||||
} |
||||
} |
@ -0,0 +1,12 @@
@@ -0,0 +1,12 @@
|
||||
// Copyright (c) AlphaSierraPapa for the SharpDevelop Team (for details please see \doc\copyright.txt)
|
||||
// This code is distributed under the GNU LGPL (for details please see \doc\license.txt)
|
||||
|
||||
using System; |
||||
|
||||
namespace ICSharpCode.PackageManagement |
||||
{ |
||||
public interface IProcess |
||||
{ |
||||
void Start(string fileName); |
||||
} |
||||
} |
@ -0,0 +1,13 @@
@@ -0,0 +1,13 @@
|
||||
// Copyright (c) AlphaSierraPapa for the SharpDevelop Team (for details please see \doc\copyright.txt)
|
||||
// This code is distributed under the GNU LGPL (for details please see \doc\license.txt)
|
||||
|
||||
using System; |
||||
using NuGet; |
||||
|
||||
namespace ICSharpCode.PackageManagement |
||||
{ |
||||
public interface IRecentPackageRepository : IPackageRepository |
||||
{ |
||||
void Clear(); |
||||
} |
||||
} |
@ -0,0 +1,26 @@
@@ -0,0 +1,26 @@
|
||||
// Copyright (c) AlphaSierraPapa for the SharpDevelop Team (for details please see \doc\copyright.txt)
|
||||
// This code is distributed under the GNU LGPL (for details please see \doc\license.txt)
|
||||
|
||||
using System; |
||||
using System.Linq; |
||||
using NuGet; |
||||
|
||||
namespace ICSharpCode.PackageManagement |
||||
{ |
||||
public class MachinePackageCache : IMachinePackageCache |
||||
{ |
||||
public IQueryable<IPackage> GetPackages() |
||||
{ |
||||
return MachineCache.Default.GetPackages(); |
||||
} |
||||
|
||||
public void Clear() |
||||
{ |
||||
MachineCache.Default.Clear(); |
||||
} |
||||
|
||||
public string Source { |
||||
get { return MachineCache.Default.Source; } |
||||
} |
||||
} |
||||
} |
@ -0,0 +1,59 @@
@@ -0,0 +1,59 @@
|
||||
<gui:OptionPanel |
||||
x:Class="ICSharpCode.PackageManagement.PackageManagementOptionsView" |
||||
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" |
||||
xmlns:gui="clr-namespace:ICSharpCode.SharpDevelop.Gui;assembly=ICSharpCode.SharpDevelop" |
||||
xmlns:pm="clr-namespace:ICSharpCode.PackageManagement" |
||||
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"> |
||||
|
||||
<Grid> |
||||
<Grid.Resources> |
||||
<pm:ViewModelLocator x:Key="ViewModelLocator"/> |
||||
<BooleanToVisibilityConverter x:Key="BoolToVisibility"/> |
||||
</Grid.Resources> |
||||
|
||||
<Grid.DataContext> |
||||
<Binding Source="{StaticResource ViewModelLocator}" Path="PackageManagementOptionsViewModel"/> |
||||
</Grid.DataContext> |
||||
|
||||
<Grid.RowDefinitions> |
||||
<RowDefinition Height="Auto"/> |
||||
<RowDefinition Height="Auto"/> |
||||
</Grid.RowDefinitions> |
||||
|
||||
<GroupBox |
||||
Grid.Row="0" |
||||
Header="_Recent Packages"> |
||||
<StackPanel |
||||
Orientation="Horizontal"> |
||||
<Button |
||||
Padding="7, 2" |
||||
Command="{Binding Path=ClearRecentPackagesCommand}" |
||||
Content="Clear Recent Packages"/> |
||||
<TextBlock |
||||
Margin="4, 4" |
||||
Visibility="{Binding Path=HasNoRecentPackages, Converter={StaticResource BoolToVisibility}}" |
||||
Text="No recent packages"/> |
||||
</StackPanel> |
||||
</GroupBox> |
||||
<GroupBox |
||||
Grid.Row="1" |
||||
Header="Packages _Cache"> |
||||
<StackPanel |
||||
Orientation="Horizontal"> |
||||
<Button |
||||
Padding="7, 2" |
||||
Command="{Binding Path=ClearCachedPackagesCommand}" |
||||
Content="Clear Package Cache"/> |
||||
<Button |
||||
Margin="8, 0, 0, 0" |
||||
Padding="7, 2" |
||||
Command="{Binding Path=BrowseCachedPackagesCommand}" |
||||
Content="..."/> |
||||
<TextBlock |
||||
Margin="4, 4" |
||||
Visibility="{Binding Path=HasNoCachedPackages, Converter={StaticResource BoolToVisibility}}" |
||||
Text="No cached packages"/> |
||||
</StackPanel> |
||||
</GroupBox> |
||||
</Grid> |
||||
</gui:OptionPanel> |
@ -0,0 +1,16 @@
@@ -0,0 +1,16 @@
|
||||
// Copyright (c) AlphaSierraPapa for the SharpDevelop Team (for details please see \doc\copyright.txt)
|
||||
// This code is distributed under the GNU LGPL (for details please see \doc\license.txt)
|
||||
|
||||
using System; |
||||
using ICSharpCode.SharpDevelop.Gui; |
||||
|
||||
namespace ICSharpCode.PackageManagement |
||||
{ |
||||
public partial class PackageManagementOptionsView : OptionPanel |
||||
{ |
||||
public PackageManagementOptionsView() |
||||
{ |
||||
InitializeComponent(); |
||||
} |
||||
} |
||||
} |
@ -0,0 +1,82 @@
@@ -0,0 +1,82 @@
|
||||
// Copyright (c) AlphaSierraPapa for the SharpDevelop Team (for details please see \doc\copyright.txt)
|
||||
// This code is distributed under the GNU LGPL (for details please see \doc\license.txt)
|
||||
|
||||
using System; |
||||
using System.Linq; |
||||
using System.Windows.Input; |
||||
|
||||
namespace ICSharpCode.PackageManagement |
||||
{ |
||||
public class PackageManagementOptionsViewModel : ViewModelBase<PackageManagementOptionsViewModel> |
||||
{ |
||||
IRecentPackageRepository recentPackageRepository; |
||||
IMachinePackageCache machinePackageCache; |
||||
IProcess process; |
||||
|
||||
public PackageManagementOptionsViewModel(IRecentPackageRepository recentPackageRepository) |
||||
: this(recentPackageRepository, new MachinePackageCache(), new Process()) |
||||
{ |
||||
} |
||||
|
||||
public PackageManagementOptionsViewModel( |
||||
IRecentPackageRepository recentPackageRepository, |
||||
IMachinePackageCache machinePackageCache, |
||||
IProcess process) |
||||
{ |
||||
this.recentPackageRepository = recentPackageRepository; |
||||
this.machinePackageCache = machinePackageCache; |
||||
this.process = process; |
||||
|
||||
this.HasNoRecentPackages = !RecentPackageRepositoryHasPackages(); |
||||
this.HasNoCachedPackages = !MachinePackageCacheHasPackages(); |
||||
|
||||
CreateCommands(); |
||||
} |
||||
|
||||
public bool HasNoRecentPackages { get; private set; } |
||||
public bool HasNoCachedPackages { get; private set; } |
||||
|
||||
bool MachinePackageCacheHasPackages() |
||||
{ |
||||
return machinePackageCache.GetPackages().Any(); |
||||
} |
||||
|
||||
bool RecentPackageRepositoryHasPackages() |
||||
{ |
||||
return recentPackageRepository.GetPackages().Any(); |
||||
} |
||||
|
||||
void CreateCommands() |
||||
{ |
||||
ClearRecentPackagesCommand = |
||||
new DelegateCommand(param => ClearRecentPackages(), param => !HasNoRecentPackages); |
||||
ClearCachedPackagesCommand = |
||||
new DelegateCommand(param => ClearCachedPackages(), param => !HasNoCachedPackages); |
||||
BrowseCachedPackagesCommand = |
||||
new DelegateCommand(param => BrowseCachedPackages(), param => !HasNoCachedPackages); |
||||
} |
||||
|
||||
public ICommand ClearRecentPackagesCommand { get; private set; } |
||||
public ICommand ClearCachedPackagesCommand { get; private set; } |
||||
public ICommand BrowseCachedPackagesCommand { get; private set; } |
||||
|
||||
public void ClearRecentPackages() |
||||
{ |
||||
recentPackageRepository.Clear(); |
||||
HasNoRecentPackages = true; |
||||
OnPropertyChanged(viewModel => viewModel.HasNoRecentPackages); |
||||
} |
||||
|
||||
public void ClearCachedPackages() |
||||
{ |
||||
machinePackageCache.Clear(); |
||||
HasNoCachedPackages = true; |
||||
OnPropertyChanged(viewModel => viewModel.HasNoCachedPackages); |
||||
} |
||||
|
||||
public void BrowseCachedPackages() |
||||
{ |
||||
process.Start(machinePackageCache.Source); |
||||
} |
||||
} |
||||
} |
@ -0,0 +1,15 @@
@@ -0,0 +1,15 @@
|
||||
// Copyright (c) AlphaSierraPapa for the SharpDevelop Team (for details please see \doc\copyright.txt)
|
||||
// This code is distributed under the GNU LGPL (for details please see \doc\license.txt)
|
||||
|
||||
using System; |
||||
|
||||
namespace ICSharpCode.PackageManagement |
||||
{ |
||||
public class Process : IProcess |
||||
{ |
||||
public void Start(string fileName) |
||||
{ |
||||
System.Diagnostics.Process.Start(fileName); |
||||
} |
||||
} |
||||
} |
@ -0,0 +1,32 @@
@@ -0,0 +1,32 @@
|
||||
// Copyright (c) AlphaSierraPapa for the SharpDevelop Team (for details please see \doc\copyright.txt)
|
||||
// This code is distributed under the GNU LGPL (for details please see \doc\license.txt)
|
||||
|
||||
using System; |
||||
using System.Collections.Generic; |
||||
using System.Linq; |
||||
|
||||
using ICSharpCode.PackageManagement; |
||||
using ICSharpCode.PackageManagement.Design; |
||||
using NuGet; |
||||
|
||||
namespace PackageManagement.Tests.Helpers |
||||
{ |
||||
public class FakeMachinePackageCache : IMachinePackageCache |
||||
{ |
||||
public List<FakePackage> FakePackages = new List<FakePackage>(); |
||||
|
||||
public IQueryable<IPackage> GetPackages() |
||||
{ |
||||
return FakePackages.AsQueryable(); |
||||
} |
||||
|
||||
public bool IsClearCalled; |
||||
|
||||
public void Clear() |
||||
{ |
||||
IsClearCalled = true; |
||||
} |
||||
|
||||
public string Source { get; set; } |
||||
} |
||||
} |
@ -0,0 +1,18 @@
@@ -0,0 +1,18 @@
|
||||
// Copyright (c) AlphaSierraPapa for the SharpDevelop Team (for details please see \doc\copyright.txt)
|
||||
// This code is distributed under the GNU LGPL (for details please see \doc\license.txt)
|
||||
|
||||
using System; |
||||
using ICSharpCode.PackageManagement; |
||||
|
||||
namespace PackageManagement.Tests.Helpers |
||||
{ |
||||
public class FakeProcess : IProcess |
||||
{ |
||||
public string FileNamePassedToStart; |
||||
|
||||
public void Start(string fileName) |
||||
{ |
||||
FileNamePassedToStart = fileName; |
||||
} |
||||
} |
||||
} |
@ -0,0 +1,38 @@
@@ -0,0 +1,38 @@
|
||||
// Copyright (c) AlphaSierraPapa for the SharpDevelop Team (for details please see \doc\copyright.txt)
|
||||
// This code is distributed under the GNU LGPL (for details please see \doc\license.txt)
|
||||
|
||||
using System; |
||||
using System.Collections.Generic; |
||||
using System.Linq; |
||||
using ICSharpCode.PackageManagement; |
||||
using ICSharpCode.PackageManagement.Design; |
||||
using NuGet; |
||||
|
||||
namespace PackageManagement.Tests.Helpers |
||||
{ |
||||
public class FakeRecentPackageRepository : IRecentPackageRepository |
||||
{ |
||||
public string Source { get; set; } |
||||
public List<FakePackage> FakePackages = new List<FakePackage>(); |
||||
|
||||
public IQueryable<IPackage> GetPackages() |
||||
{ |
||||
return FakePackages.AsQueryable(); |
||||
} |
||||
|
||||
public void AddPackage(IPackage package) |
||||
{ |
||||
} |
||||
|
||||
public void RemovePackage(IPackage package) |
||||
{ |
||||
} |
||||
|
||||
public bool IsClearCalled; |
||||
|
||||
public void Clear() |
||||
{ |
||||
IsClearCalled = true; |
||||
} |
||||
} |
||||
} |
@ -0,0 +1,277 @@
@@ -0,0 +1,277 @@
|
||||
// Copyright (c) AlphaSierraPapa for the SharpDevelop Team (for details please see \doc\copyright.txt)
|
||||
// This code is distributed under the GNU LGPL (for details please see \doc\license.txt)
|
||||
|
||||
using System; |
||||
using System.Collections.Generic; |
||||
using ICSharpCode.PackageManagement; |
||||
using ICSharpCode.PackageManagement.Design; |
||||
using NUnit.Framework; |
||||
using PackageManagement.Tests.Helpers; |
||||
|
||||
namespace PackageManagement.Tests |
||||
{ |
||||
[TestFixture] |
||||
public class PackageManagementOptionsViewModelTests |
||||
{ |
||||
PackageManagementOptionsViewModel viewModel; |
||||
FakeRecentPackageRepository fakeRecentRepository; |
||||
FakeMachinePackageCache fakeMachineCache; |
||||
FakeProcess fakeProcess; |
||||
List<string> propertiesChanged; |
||||
|
||||
void CreateRecentRepository() |
||||
{ |
||||
fakeRecentRepository = new FakeRecentPackageRepository(); |
||||
} |
||||
|
||||
void CreateMachineCache() |
||||
{ |
||||
fakeMachineCache = new FakeMachinePackageCache(); |
||||
} |
||||
|
||||
void CreateViewModelUsingCreatedMachineCache() |
||||
{ |
||||
CreateRecentRepository(); |
||||
fakeProcess = new FakeProcess(); |
||||
viewModel = new PackageManagementOptionsViewModel(fakeRecentRepository, fakeMachineCache, fakeProcess); |
||||
} |
||||
|
||||
void CreateViewModelUsingCreatedRecentRepository() |
||||
{ |
||||
CreateMachineCache(); |
||||
fakeProcess = new FakeProcess(); |
||||
viewModel = new PackageManagementOptionsViewModel(fakeRecentRepository, fakeMachineCache, fakeProcess); |
||||
} |
||||
|
||||
void AddPackageToRecentRepository() |
||||
{ |
||||
fakeRecentRepository.FakePackages.Add(new FakePackage()); |
||||
} |
||||
|
||||
void AddPackageToMachineCache() |
||||
{ |
||||
fakeMachineCache.FakePackages.Add(new FakePackage()); |
||||
} |
||||
|
||||
void RecordPropertyChanges() |
||||
{ |
||||
propertiesChanged = new List<string>(); |
||||
viewModel.PropertyChanged += (sender, e) => propertiesChanged.Add(e.PropertyName); |
||||
} |
||||
|
||||
[Test] |
||||
public void HasNoRecentPackages_RecentPackageRepositoryHasNoPackages_ReturnsTrue() |
||||
{ |
||||
CreateRecentRepository(); |
||||
CreateViewModelUsingCreatedRecentRepository(); |
||||
|
||||
bool hasPackages = viewModel.HasNoRecentPackages; |
||||
|
||||
Assert.IsTrue(hasPackages); |
||||
} |
||||
|
||||
[Test] |
||||
public void HasNoRecentPackages_RecentPackageRepositoryHasOnePackage_ReturnsFalse() |
||||
{ |
||||
CreateRecentRepository(); |
||||
AddPackageToRecentRepository(); |
||||
CreateViewModelUsingCreatedRecentRepository(); |
||||
|
||||
bool hasPackages = viewModel.HasNoRecentPackages; |
||||
|
||||
Assert.IsFalse(hasPackages); |
||||
} |
||||
|
||||
[Test] |
||||
public void HasNoCachedPackages_MachinePackageCacheHasNoPackages_ReturnsTrue() |
||||
{ |
||||
CreateMachineCache(); |
||||
CreateViewModelUsingCreatedMachineCache(); |
||||
|
||||
bool hasPackages = viewModel.HasNoCachedPackages; |
||||
|
||||
Assert.IsTrue(hasPackages); |
||||
} |
||||
|
||||
[Test] |
||||
public void HasNoCachedPackages_MachinePackageCacheHasOnePackage_ReturnsFalse() |
||||
{ |
||||
CreateMachineCache(); |
||||
AddPackageToMachineCache(); |
||||
CreateViewModelUsingCreatedMachineCache(); |
||||
|
||||
bool hasPackages = viewModel.HasNoCachedPackages; |
||||
|
||||
Assert.IsFalse(hasPackages); |
||||
} |
||||
|
||||
[Test] |
||||
public void ClearRecentPackagesCommandCanExecute_OneRecentPackage_CanExecuteReturnsTrue() |
||||
{ |
||||
CreateRecentRepository(); |
||||
AddPackageToRecentRepository(); |
||||
CreateViewModelUsingCreatedRecentRepository(); |
||||
|
||||
bool canExecute = viewModel.ClearRecentPackagesCommand.CanExecute(null); |
||||
|
||||
Assert.IsTrue(canExecute); |
||||
} |
||||
|
||||
[Test] |
||||
public void ClearRecentPackagesCommandCanExecute_NoRecentPackages_CanExecuteReturnsFalse() |
||||
{ |
||||
CreateRecentRepository(); |
||||
CreateViewModelUsingCreatedRecentRepository(); |
||||
|
||||
bool canExecute = viewModel.ClearRecentPackagesCommand.CanExecute(null); |
||||
|
||||
Assert.IsFalse(canExecute); |
||||
} |
||||
|
||||
[Test] |
||||
public void ClearCachedPackagesCommandCanExecute_OneCachedPackage_CanExecuteReturnsTrue() |
||||
{ |
||||
CreateMachineCache(); |
||||
AddPackageToMachineCache(); |
||||
CreateViewModelUsingCreatedMachineCache(); |
||||
|
||||
bool canExecute = viewModel.ClearCachedPackagesCommand.CanExecute(null); |
||||
|
||||
Assert.IsTrue(canExecute); |
||||
} |
||||
|
||||
[Test] |
||||
public void ClearCachedPackagesCommandCanExecute_NoCachedPackages_CanExecuteReturnsFalse() |
||||
{ |
||||
CreateMachineCache(); |
||||
CreateViewModelUsingCreatedMachineCache(); |
||||
|
||||
bool canExecute = viewModel.ClearCachedPackagesCommand.CanExecute(null); |
||||
|
||||
Assert.IsFalse(canExecute); |
||||
} |
||||
|
||||
[Test] |
||||
public void ClearCachedPackagesCommandExecute_OneCachedPackage_ClearsPackagesFromCache() |
||||
{ |
||||
CreateMachineCache(); |
||||
AddPackageToMachineCache(); |
||||
CreateViewModelUsingCreatedMachineCache(); |
||||
|
||||
viewModel.ClearCachedPackagesCommand.Execute(null); |
||||
|
||||
Assert.IsTrue(fakeMachineCache.IsClearCalled); |
||||
} |
||||
|
||||
[Test] |
||||
public void ClearRecentPackagesCommandExecute_OneRecentPackage_ClearsPackages() |
||||
{ |
||||
CreateMachineCache(); |
||||
AddPackageToRecentRepository(); |
||||
CreateViewModelUsingCreatedRecentRepository(); |
||||
|
||||
viewModel.ClearRecentPackagesCommand.Execute(null); |
||||
|
||||
Assert.IsTrue(fakeRecentRepository.IsClearCalled); |
||||
} |
||||
|
||||
[Test] |
||||
public void ClearRecentPackages_OneRecentPackage_HasNoRecentPackagesIsTrue() |
||||
{ |
||||
CreateRecentRepository(); |
||||
AddPackageToRecentRepository(); |
||||
CreateViewModelUsingCreatedRecentRepository(); |
||||
|
||||
RecordPropertyChanges(); |
||||
viewModel.ClearRecentPackages(); |
||||
|
||||
bool hasPackages = viewModel.HasNoRecentPackages; |
||||
|
||||
Assert.IsTrue(hasPackages); |
||||
} |
||||
|
||||
[Test] |
||||
public void ClearCachedPackages_OneCachedPackage_HasNoCachedPackagesReturnsTrue() |
||||
{ |
||||
CreateMachineCache(); |
||||
AddPackageToMachineCache(); |
||||
CreateViewModelUsingCreatedMachineCache(); |
||||
|
||||
RecordPropertyChanges(); |
||||
viewModel.ClearCachedPackages(); |
||||
|
||||
bool hasPackages = viewModel.HasNoCachedPackages; |
||||
|
||||
Assert.IsTrue(hasPackages); |
||||
} |
||||
|
||||
[Test] |
||||
public void ClearRecentPackages_OneRecentPackage_HasNoRecentPackagesPropertyChangedEventFired() |
||||
{ |
||||
CreateRecentRepository(); |
||||
AddPackageToRecentRepository(); |
||||
CreateViewModelUsingCreatedMachineCache(); |
||||
|
||||
RecordPropertyChanges(); |
||||
viewModel.ClearRecentPackages(); |
||||
|
||||
bool fired = propertiesChanged.Contains("HasNoRecentPackages"); |
||||
|
||||
Assert.IsTrue(fired); |
||||
} |
||||
|
||||
[Test] |
||||
public void ClearCachedPackages_OneCachedPackage_HasNoCachedPackagesPropertyChangedEventFired() |
||||
{ |
||||
CreateMachineCache(); |
||||
AddPackageToMachineCache(); |
||||
CreateViewModelUsingCreatedMachineCache(); |
||||
|
||||
RecordPropertyChanges(); |
||||
viewModel.ClearCachedPackages(); |
||||
|
||||
bool fired = propertiesChanged.Contains("HasNoCachedPackages"); |
||||
|
||||
Assert.IsTrue(fired); |
||||
} |
||||
|
||||
[Test] |
||||
public void BrowseCachedPackagesCommandCanExecute_OneCachedPackage_ReturnsTrue() |
||||
{ |
||||
CreateMachineCache(); |
||||
AddPackageToMachineCache(); |
||||
CreateViewModelUsingCreatedMachineCache(); |
||||
|
||||
bool canExecute = viewModel.BrowseCachedPackagesCommand.CanExecute(null); |
||||
|
||||
Assert.IsTrue(canExecute); |
||||
} |
||||
|
||||
[Test] |
||||
public void BrowseCachedPackagesCommandCanExecute_NoCachedPackages_ReturnsFalse() |
||||
{ |
||||
CreateMachineCache(); |
||||
CreateViewModelUsingCreatedMachineCache(); |
||||
|
||||
bool canExecute = viewModel.BrowseCachedPackagesCommand.CanExecute(null); |
||||
|
||||
Assert.IsFalse(canExecute); |
||||
} |
||||
|
||||
[Test] |
||||
public void BrowseCachedPackagesCommandExecute_OneCachedPackage_StartsProcessToOpenMachineCacheFolder() |
||||
{ |
||||
CreateMachineCache(); |
||||
CreateViewModelUsingCreatedMachineCache(); |
||||
|
||||
string expectedFileName = @"d:\projects\nugetpackages"; |
||||
fakeMachineCache.Source = expectedFileName; |
||||
|
||||
viewModel.BrowseCachedPackagesCommand.Execute(null); |
||||
|
||||
string fileName = fakeProcess.FileNamePassedToStart; |
||||
|
||||
Assert.AreEqual(expectedFileName, fileName); |
||||
} |
||||
} |
||||
} |
Loading…
Reference in new issue