Browse Source

Merge branch 'master' of github.com:icsharpcode/SharpDevelop

pull/505/merge
Peter Forstmeier 11 years ago
parent
commit
2fae041d9d
  1. 49
      src/AddIns/BackendBindings/CSharpBinding/Project/Src/Refactoring/EditorScript.cs
  2. 35
      src/AddIns/BackendBindings/CSharpBinding/Project/Src/Refactoring/InsertionCursorLayer.cs
  3. 2
      src/AddIns/Misc/PackageManagement/Cmdlets/Project/Src/GetPackageCmdlet.cs
  4. 4
      src/AddIns/Misc/PackageManagement/PackageManagement.sln
  5. 9
      src/AddIns/Misc/PackageManagement/Project/Src/Design/FakePackageManagementProject.cs
  6. 2
      src/AddIns/Misc/PackageManagement/Project/Src/IPackageManagementProject.cs
  7. 10
      src/AddIns/Misc/PackageManagement/Project/Src/PackageManagementProject.cs
  8. 8
      src/AddIns/Misc/PackageManagement/Project/Src/PackageManagementSelectedProjects.cs
  9. 9
      src/AddIns/Misc/PackageManagement/Project/Src/ProcessPackageAction.cs
  10. 21
      src/AddIns/Misc/PackageManagement/Project/Src/UpdatedPackages.cs
  11. 2
      src/AddIns/Misc/PackageManagement/Project/Src/UpdatedPackagesViewModel.cs
  12. 1
      src/AddIns/Misc/PackageManagement/Test/PackageManagement.Tests.csproj
  13. 39
      src/AddIns/Misc/PackageManagement/Test/Src/Helpers/FakePackageRepositoryWithConstraintProvider.cs
  14. 22
      src/AddIns/Misc/PackageManagement/Test/Src/PackageManagementProjectTests.cs
  15. 23
      src/AddIns/Misc/PackageManagement/Test/Src/UpdatePackageActionTests.cs
  16. 41
      src/AddIns/Misc/PackageManagement/Test/Src/UpdatedPackagesTests.cs
  17. 27
      src/AddIns/Misc/PackageManagement/Test/Src/UpdatedPackagesViewModelTests.cs

49
src/AddIns/BackendBindings/CSharpBinding/Project/Src/Refactoring/EditorScript.cs

@ -18,6 +18,7 @@
using System; using System;
using System.Collections.Generic; using System.Collections.Generic;
using System.Diagnostics;
using System.Linq; using System.Linq;
using System.Threading.Tasks; using System.Threading.Tasks;
using System.Windows.Threading; using System.Windows.Threading;
@ -132,21 +133,21 @@ namespace CSharpBinding.Refactoring
switch (defaultPosition) { switch (defaultPosition) {
case InsertPosition.Start: case InsertPosition.Start:
layer.CurrentInsertionPoint = 0; layer.CurrentInsertionPointIndex = 0;
break; break;
case InsertPosition.End: case InsertPosition.End:
layer.CurrentInsertionPoint = insertionPoints.Count - 1; layer.CurrentInsertionPointIndex = insertionPoints.Count - 1;
break; break;
case InsertPosition.Before: case InsertPosition.Before:
for (int i = 0; i < insertionPoints.Count; i++) { for (int i = 0; i < insertionPoints.Count; i++) {
if (insertionPoints[i].Location < loc) if (insertionPoints[i].Location < loc)
layer.CurrentInsertionPoint = i; layer.CurrentInsertionPointIndex = i;
} }
break; break;
case InsertPosition.After: case InsertPosition.After:
for (int i = 0; i < insertionPoints.Count; i++) { for (int i = 0; i < insertionPoints.Count; i++) {
if (insertionPoints[i].Location > loc) { if (insertionPoints[i].Location > loc) {
layer.CurrentInsertionPoint = i; layer.CurrentInsertionPointIndex = i;
break; break;
} }
} }
@ -172,13 +173,34 @@ namespace CSharpBinding.Refactoring
args.InsertionPoint.LineBefore == NewLineInsertion.None && nodes.Count > 1) { args.InsertionPoint.LineBefore == NewLineInsertion.None && nodes.Count > 1) {
args.InsertionPoint.LineAfter = NewLineInsertion.BlankLine; args.InsertionPoint.LineAfter = NewLineInsertion.BlankLine;
} }
var insertionPoint = args.InsertionPoint;
if (nodes.All(n => n is EnumMemberDeclaration)) {
insertionPoint.LineAfter = NewLineInsertion.Eol;
insertionPoint.LineBefore = NewLineInsertion.None;
}
int offset = currentScript.GetCurrentOffset(args.InsertionPoint.Location); int offset = currentScript.GetCurrentOffset(insertionPoint.Location);
int indentLevel = currentScript.GetIndentLevelAt(offset); int indentLevel = currentScript.GetIndentLevelAt(Math.Max(0, offset - 1));
foreach (var node in nodes.Reverse()) { foreach (var node in nodes.Reverse()) {
var output = currentScript.OutputNode(indentLevel, node); var output = currentScript.OutputNode(indentLevel, node);
int delta = args.InsertionPoint.Insert(target, output.Text); var text = output.Text;
if (node is EnumMemberDeclaration) {
if (insertionPoint != layer.InsertionPoints.Last()) {
text += ",";
} else {
var parentEnum = currentScript.context.RootNode.GetNodeAt(insertionPoint.Location, n => (n is TypeDeclaration) && ((TypeDeclaration)n).ClassType == ClassType.Enum) as TypeDeclaration;
if (parentEnum != null) {
var lastMember = parentEnum.Members.LastOrDefault();
if (lastMember != null) {
var segment = currentScript.GetSegment(lastMember);
currentScript.InsertText(segment.EndOffset, ",");
}
}
}
}
int delta = insertionPoint.Insert(target, text);
output.RegisterTrackedSegments(currentScript, delta + offset); output.RegisterTrackedSegments(currentScript, delta + offset);
} }
currentScript.FormatText(nodes); currentScript.FormatText(nodes);
@ -239,19 +261,6 @@ namespace CSharpBinding.Refactoring
var layer = new InsertionCursorLayer(area, operation, insertionPoints); var layer = new InsertionCursorLayer(area, operation, insertionPoints);
area.Dispatcher.BeginInvoke(DispatcherPriority.Background, (Action)area.TextView.InvalidateVisual); area.Dispatcher.BeginInvoke(DispatcherPriority.Background, (Action)area.TextView.InvalidateVisual);
if (declaringType.Kind == TypeKind.Enum) {
foreach (var node in nodes.Reverse()) {
int indentLevel = GetIndentLevelAt(area.Document.GetOffset(declaringType.BodyRegion.Begin));
var output = OutputNode(indentLevel, node);
var point = insertionPoints[0];
var offset = area.Document.GetOffset(point.Location);
var text = output.Text + ",";
var delta = point.Insert(area.Document, text);
output.RegisterTrackedSegments(script, delta + offset);
}
tcs.SetResult(script);
return tcs.Task;
}
InsertWithCursorOnLayer(script, layer, tcs, nodes, area.Document); InsertWithCursorOnLayer(script, layer, tcs, nodes, area.Document);
return tcs.Task; return tcs.Task;
} }

35
src/AddIns/BackendBindings/CSharpBinding/Project/Src/Refactoring/InsertionCursorLayer.cs

@ -24,6 +24,7 @@ using System.Windows.Controls;
using System.Windows.Documents; using System.Windows.Documents;
using System.Windows.Input; using System.Windows.Input;
using System.Windows.Media; using System.Windows.Media;
using ICSharpCode.AvalonEdit; using ICSharpCode.AvalonEdit;
using ICSharpCode.AvalonEdit.Editing; using ICSharpCode.AvalonEdit.Editing;
using ICSharpCode.AvalonEdit.Rendering; using ICSharpCode.AvalonEdit.Rendering;
@ -31,6 +32,7 @@ using ICSharpCode.AvalonEdit.Utils;
using ICSharpCode.NRefactory; using ICSharpCode.NRefactory;
using ICSharpCode.SharpDevelop; using ICSharpCode.SharpDevelop;
using ICSharpCode.SharpDevelop.Editor; using ICSharpCode.SharpDevelop.Editor;
namespace CSharpBinding.Refactoring namespace CSharpBinding.Refactoring
{ {
class InsertionCursorLayer : Canvas, IDisposable class InsertionCursorLayer : Canvas, IDisposable
@ -41,9 +43,10 @@ namespace CSharpBinding.Refactoring
readonly TextArea editor; readonly TextArea editor;
public int CurrentInsertionPoint { public int CurrentInsertionPointIndex { get; set; }
get;
set; public InsertionPoint[] InsertionPoints {
get { return insertionPoints; }
} }
int insertionPointNextToMouse = -1; int insertionPointNextToMouse = -1;
@ -73,8 +76,8 @@ namespace CSharpBinding.Refactoring
protected override void OnRender(DrawingContext drawingContext) protected override void OnRender(DrawingContext drawingContext)
{ {
DrawLineForInsertionPoint(CurrentInsertionPoint, markerPen, drawingContext); DrawLineForInsertionPoint(CurrentInsertionPointIndex, markerPen, drawingContext);
if (insertionPointNextToMouse > -1 && insertionPointNextToMouse != CurrentInsertionPoint) if (insertionPointNextToMouse > -1 && insertionPointNextToMouse != CurrentInsertionPointIndex)
DrawLineForInsertionPoint(insertionPointNextToMouse, tempMarkerPen, drawingContext); DrawLineForInsertionPoint(insertionPointNextToMouse, tempMarkerPen, drawingContext);
SetGroupBoxPosition(); SetGroupBoxPosition();
// HACK: why OnRender() override? we could just use Line objects instead // HACK: why OnRender() override? we could just use Line objects instead
@ -128,7 +131,7 @@ namespace CSharpBinding.Refactoring
else { else {
insertionPointNextToMouse = FindNextInsertionPoint(e.GetPosition(this)); insertionPointNextToMouse = FindNextInsertionPoint(e.GetPosition(this));
if (insertionPointNextToMouse >= 0) if (insertionPointNextToMouse >= 0)
CurrentInsertionPoint = insertionPointNextToMouse; CurrentInsertionPointIndex = insertionPointNextToMouse;
InvalidateVisual(); InvalidateVisual();
} }
e.Handled = true; e.Handled = true;
@ -181,9 +184,9 @@ namespace CSharpBinding.Refactoring
{ {
return (sender, e) => { return (sender, e) => {
if (up) if (up)
layer.CurrentInsertionPoint = Math.Max(0, layer.CurrentInsertionPoint - 1); layer.CurrentInsertionPointIndex = Math.Max(0, layer.CurrentInsertionPointIndex - 1);
else else
layer.CurrentInsertionPoint = Math.Min(layer.insertionPoints.Length - 1, layer.CurrentInsertionPoint + 1); layer.CurrentInsertionPointIndex = Math.Min(layer.insertionPoints.Length - 1, layer.CurrentInsertionPointIndex + 1);
layer.InvalidateVisual(); layer.InvalidateVisual();
layer.ScrollToInsertionPoint(); layer.ScrollToInsertionPoint();
}; };
@ -192,9 +195,9 @@ namespace CSharpBinding.Refactoring
ExecutedRoutedEventHandler MoveMarkerPage(bool up) ExecutedRoutedEventHandler MoveMarkerPage(bool up)
{ {
return (sender, e) => { return (sender, e) => {
TextLocation current = layer.insertionPoints[layer.CurrentInsertionPoint].Location; TextLocation current = layer.insertionPoints[layer.CurrentInsertionPointIndex].Location;
double currentVPos = layer.editor.TextView.GetVisualTopByDocumentLine(current.Line); double currentVPos = layer.editor.TextView.GetVisualTopByDocumentLine(current.Line);
int newIndex = layer.CurrentInsertionPoint; int newIndex = layer.CurrentInsertionPointIndex;
double newVPos; double newVPos;
do { do {
if (up) { if (up) {
@ -214,7 +217,7 @@ namespace CSharpBinding.Refactoring
newVPos = layer.editor.TextView.GetVisualTopByDocumentLine(layer.insertionPoints[newIndex].Location.Line); newVPos = layer.editor.TextView.GetVisualTopByDocumentLine(layer.insertionPoints[newIndex].Location.Line);
} }
while (Math.Abs(currentVPos - newVPos) < layer.editor.ActualHeight); while (Math.Abs(currentVPos - newVPos) < layer.editor.ActualHeight);
layer.CurrentInsertionPoint = newIndex; layer.CurrentInsertionPointIndex = newIndex;
layer.InvalidateVisual(); layer.InvalidateVisual();
layer.ScrollToInsertionPoint(); layer.ScrollToInsertionPoint();
}; };
@ -224,9 +227,9 @@ namespace CSharpBinding.Refactoring
{ {
return (sender, e) => { return (sender, e) => {
if (up) if (up)
layer.CurrentInsertionPoint = 0; layer.CurrentInsertionPointIndex = 0;
else else
layer.CurrentInsertionPoint = layer.insertionPoints.Length - 1; layer.CurrentInsertionPointIndex = layer.insertionPoints.Length - 1;
layer.InvalidateVisual(); layer.InvalidateVisual();
layer.ScrollToInsertionPoint(); layer.ScrollToInsertionPoint();
}; };
@ -247,14 +250,14 @@ namespace CSharpBinding.Refactoring
internal void ScrollToInsertionPoint() internal void ScrollToInsertionPoint()
{ {
var location = insertionPoints[CurrentInsertionPoint].Location; var location = insertionPoints[CurrentInsertionPointIndex].Location;
editor.GetService<TextEditor>().ScrollTo(location.Line, location.Column); editor.GetService<TextEditor>().ScrollTo(location.Line, location.Column);
SetGroupBoxPosition(); SetGroupBoxPosition();
} }
void SetGroupBoxPosition() void SetGroupBoxPosition()
{ {
var boxPosition = GetLinePosition(CurrentInsertionPoint) + new Vector(editor.TextView.ActualWidth * 0.6 - 5, -groupBox.ActualHeight / 2.0); var boxPosition = GetLinePosition(CurrentInsertionPointIndex) + new Vector(editor.TextView.ActualWidth * 0.6 - 5, -groupBox.ActualHeight / 2.0);
Canvas.SetTop(groupBox, boxPosition.Y); Canvas.SetTop(groupBox, boxPosition.Y);
Canvas.SetLeft(groupBox, boxPosition.X); Canvas.SetLeft(groupBox, boxPosition.X);
} }
@ -267,7 +270,7 @@ namespace CSharpBinding.Refactoring
void FireExited(bool success) void FireExited(bool success)
{ {
if (Exited != null) { if (Exited != null) {
Exited(this, new InsertionCursorEventArgs(insertionPoints[CurrentInsertionPoint], success)); Exited(this, new InsertionCursorEventArgs(insertionPoints[CurrentInsertionPointIndex], success));
} }
} }

2
src/AddIns/Misc/PackageManagement/Cmdlets/Project/Src/GetPackageCmdlet.cs

@ -200,7 +200,7 @@ namespace ICSharpCode.PackageManagement.Cmdlets
if (project != null) { if (project != null) {
return new UpdatedPackages(project, repository); return new UpdatedPackages(project, repository);
} }
return new UpdatedPackages(GetPackagesInstalledIntoAnyProject(), repository); return new UpdatedPackages(GetPackagesInstalledIntoAnyProject(), repository, NullConstraintProvider.Instance);
} }
IQueryable<IPackage> GetPackagesInstalledIntoAnyProject() IQueryable<IPackage> GetPackagesInstalledIntoAnyProject()

4
src/AddIns/Misc/PackageManagement/PackageManagement.sln

@ -1,7 +1,7 @@
 
Microsoft Visual Studio Solution File, Format Version 11.00 Microsoft Visual Studio Solution File, Format Version 11.00
# Visual Studio 2010 # Visual Studio 2010
# SharpDevelop 4.3 # SharpDevelop 4.4
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "PackageManagement", "Project\PackageManagement.csproj", "{AE4AB0FA-6087-4480-AF37-0FA1452B3DA1}" Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "PackageManagement", "Project\PackageManagement.csproj", "{AE4AB0FA-6087-4480-AF37-0FA1452B3DA1}"
EndProject EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "PackageManagement.Tests", "Test\PackageManagement.Tests.csproj", "{56E98A01-8398-4A08-9578-C7337711A52B}" Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "PackageManagement.Tests", "Test\PackageManagement.Tests.csproj", "{56E98A01-8398-4A08-9578-C7337711A52B}"
@ -85,7 +85,7 @@ Global
{6C55B776-26D4-4DB3-A6AB-87E783B2F3D1}.Debug|Any CPU.Build.0 = Debug|Any CPU {6C55B776-26D4-4DB3-A6AB-87E783B2F3D1}.Debug|Any CPU.Build.0 = Debug|Any CPU
{6C55B776-26D4-4DB3-A6AB-87E783B2F3D1}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {6C55B776-26D4-4DB3-A6AB-87E783B2F3D1}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{6C55B776-26D4-4DB3-A6AB-87E783B2F3D1}.Debug|Any CPU.Build.0 = Debug|Any CPU {6C55B776-26D4-4DB3-A6AB-87E783B2F3D1}.Debug|Any CPU.Build.0 = Debug|Any CPU
{6C55B776-26D4-4DB3-A6AB-87E783B2F3D1}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {6C55B776-26D4-4DB3-A6AB-87E783B2F3D1}.Debug|Any CPU.ActiveCfg = Debug|WithNRefactory
{6C55B776-26D4-4DB3-A6AB-87E783B2F3D1}.Release|Any CPU.Build.0 = Release|Any CPU {6C55B776-26D4-4DB3-A6AB-87E783B2F3D1}.Release|Any CPU.Build.0 = Release|Any CPU
{6C55B776-26D4-4DB3-A6AB-87E783B2F3D1}.Release|Any CPU.ActiveCfg = Release|Any CPU {6C55B776-26D4-4DB3-A6AB-87E783B2F3D1}.Release|Any CPU.ActiveCfg = Release|Any CPU
{6C55B776-26D4-4DB3-A6AB-87E783B2F3D1}.Release|Any CPU.Build.0 = Release|Any CPU {6C55B776-26D4-4DB3-A6AB-87E783B2F3D1}.Release|Any CPU.Build.0 = Release|Any CPU

9
src/AddIns/Misc/PackageManagement/Project/Src/Design/FakePackageManagementProject.cs

@ -39,6 +39,8 @@ namespace ICSharpCode.PackageManagement.Design
FakeUninstallPackageAction = new FakeUninstallPackageAction(this); FakeUninstallPackageAction = new FakeUninstallPackageAction(this);
this.Name = name; this.Name = name;
ConstraintProvider = NullConstraintProvider.Instance;
} }
private FakeInstallPackageAction FakeInstallPackageAction; private FakeInstallPackageAction FakeInstallPackageAction;
@ -232,6 +234,11 @@ namespace ICSharpCode.PackageManagement.Design
FakeSourceRepository.AddFakePackage(packageId); FakeSourceRepository.AddFakePackage(packageId);
} }
public FakePackage AddFakePackageToSourceRepository(string packageId, string version)
{
return FakeSourceRepository.AddFakePackageWithVersion(packageId, version);
}
public void UpdatePackages(UpdatePackagesAction action) public void UpdatePackages(UpdatePackagesAction action)
{ {
} }
@ -274,5 +281,7 @@ namespace ICSharpCode.PackageManagement.Design
{ {
throw new NotImplementedException(); throw new NotImplementedException();
} }
public IPackageConstraintProvider ConstraintProvider { get; set; }
} }
} }

2
src/AddIns/Misc/PackageManagement/Project/Src/IPackageManagementProject.cs

@ -38,6 +38,8 @@ namespace ICSharpCode.PackageManagement
Project ConvertToDTEProject(); Project ConvertToDTEProject();
IPackageConstraintProvider ConstraintProvider { get; }
bool IsPackageInstalled(IPackage package); bool IsPackageInstalled(IPackage package);
bool IsPackageInstalled(string packageId); bool IsPackageInstalled(string packageId);
bool HasOlderPackageInstalled(IPackage package); bool HasOlderPackageInstalled(IPackage package);

10
src/AddIns/Misc/PackageManagement/Project/Src/PackageManagementProject.cs

@ -178,5 +178,15 @@ namespace ICSharpCode.PackageManagement
{ {
packageManager.UpdatePackageReference(package, settings); packageManager.UpdatePackageReference(package, settings);
} }
public IPackageConstraintProvider ConstraintProvider {
get {
var constraintProvider = projectManager.LocalRepository as IPackageConstraintProvider;
if (constraintProvider != null) {
return constraintProvider;
}
return NullConstraintProvider.Instance;
}
}
} }
} }

8
src/AddIns/Misc/PackageManagement/Project/Src/PackageManagementSelectedProjects.cs

@ -157,5 +157,13 @@ namespace ICSharpCode.PackageManagement
} }
return null; return null;
} }
public IPackageConstraintProvider GetConstraintProvider(IPackageRepository repository)
{
if (HasSingleProjectSelected()) {
return GetSingleProjectSelected(repository).ConstraintProvider;
}
return NullConstraintProvider.Instance;
}
} }
} }

9
src/AddIns/Misc/PackageManagement/Project/Src/ProcessPackageAction.cs

@ -134,9 +134,12 @@ namespace ICSharpCode.PackageManagement
void FindPackage() void FindPackage()
{ {
Package = Project Package = Project.SourceRepository.FindPackage(
.SourceRepository PackageId,
.FindPackage(PackageId, PackageVersion, AllowPrereleaseVersions, allowUnlisted: false); PackageVersion,
Project.ConstraintProvider,
AllowPrereleaseVersions,
allowUnlisted: false);
} }
void ThrowPackageNotFoundError(string packageId) void ThrowPackageNotFoundError(string packageId)

21
src/AddIns/Misc/PackageManagement/Project/Src/UpdatedPackages.cs

@ -29,22 +29,26 @@ namespace ICSharpCode.PackageManagement
{ {
IPackageRepository sourceRepository; IPackageRepository sourceRepository;
IQueryable<IPackage> installedPackages; IQueryable<IPackage> installedPackages;
IPackageConstraintProvider constraintProvider;
public UpdatedPackages( public UpdatedPackages(
IPackageManagementProject project, IPackageManagementProject project,
IPackageRepository aggregateRepository) IPackageRepository aggregateRepository)
: this( : this(
project.GetPackages(), project.GetPackages(),
aggregateRepository) aggregateRepository,
project.ConstraintProvider)
{ {
} }
public UpdatedPackages( public UpdatedPackages(
IQueryable<IPackage> installedPackages, IQueryable<IPackage> installedPackages,
IPackageRepository aggregrateRepository) IPackageRepository aggregrateRepository,
IPackageConstraintProvider constraintProvider)
{ {
this.installedPackages = installedPackages; this.installedPackages = installedPackages;
this.sourceRepository = aggregrateRepository; this.sourceRepository = aggregrateRepository;
this.constraintProvider = constraintProvider;
} }
public string SearchTerms { get; set; } public string SearchTerms { get; set; }
@ -54,7 +58,7 @@ namespace ICSharpCode.PackageManagement
IQueryable<IPackage> localPackages = installedPackages; IQueryable<IPackage> localPackages = installedPackages;
localPackages = FilterPackages(localPackages); localPackages = FilterPackages(localPackages);
IEnumerable<IPackage> distinctLocalPackages = DistinctPackages(localPackages); IEnumerable<IPackage> distinctLocalPackages = DistinctPackages(localPackages);
return GetUpdatedPackages(sourceRepository, distinctLocalPackages, includePrerelease); return GetUpdatedPackages(distinctLocalPackages, includePrerelease);
} }
IQueryable<IPackage> GetInstalledPackages() IQueryable<IPackage> GetInstalledPackages()
@ -81,11 +85,18 @@ namespace ICSharpCode.PackageManagement
} }
IEnumerable<IPackage> GetUpdatedPackages( IEnumerable<IPackage> GetUpdatedPackages(
IPackageRepository sourceRepository,
IEnumerable<IPackage> localPackages, IEnumerable<IPackage> localPackages,
bool includePrelease) bool includePrelease)
{ {
return sourceRepository.GetUpdates(localPackages, includePrelease, false); IEnumerable<IVersionSpec> constraints = localPackages
.Select(package => constraintProvider.GetConstraint(package.Id));
return sourceRepository.GetUpdates(
localPackages,
includePrelease,
false,
null,
constraints);
} }
} }
} }

2
src/AddIns/Misc/PackageManagement/Project/Src/UpdatedPackagesViewModel.cs

@ -78,7 +78,7 @@ namespace ICSharpCode.PackageManagement
try { try {
IPackageRepository repository = RegisteredPackageRepositories.ActiveRepository; IPackageRepository repository = RegisteredPackageRepositories.ActiveRepository;
IQueryable<IPackage> installedPackages = GetInstalledPackages(repository); IQueryable<IPackage> installedPackages = GetInstalledPackages(repository);
updatedPackages = new UpdatedPackages(installedPackages, repository); updatedPackages = new UpdatedPackages(installedPackages, repository, selectedProjects.GetConstraintProvider(repository));
} catch (Exception ex) { } catch (Exception ex) {
errorMessage = ex.Message; errorMessage = ex.Message;
} }

1
src/AddIns/Misc/PackageManagement/Test/PackageManagement.Tests.csproj

@ -111,6 +111,7 @@
<Compile Include="Src\Helpers\FakeCmdletLogger.cs" /> <Compile Include="Src\Helpers\FakeCmdletLogger.cs" />
<Compile Include="Src\Helpers\FakeCodeGenerator.cs" /> <Compile Include="Src\Helpers\FakeCodeGenerator.cs" />
<Compile Include="Src\Helpers\FakeOperationAwarePackageRepository.cs" /> <Compile Include="Src\Helpers\FakeOperationAwarePackageRepository.cs" />
<Compile Include="Src\Helpers\FakePackageRepositoryWithConstraintProvider.cs" />
<Compile Include="Src\Helpers\FakeSelectProjectsService.cs" /> <Compile Include="Src\Helpers\FakeSelectProjectsService.cs" />
<Compile Include="Src\Helpers\FakeServiceBasedRepository.cs" /> <Compile Include="Src\Helpers\FakeServiceBasedRepository.cs" />
<Compile Include="Src\Helpers\FakeSolutionPackageRepositoryFactory.cs" /> <Compile Include="Src\Helpers\FakeSolutionPackageRepositoryFactory.cs" />

39
src/AddIns/Misc/PackageManagement/Test/Src/Helpers/FakePackageRepositoryWithConstraintProvider.cs

@ -0,0 +1,39 @@
// Copyright (c) 2014 AlphaSierraPapa for the SharpDevelop Team
//
// Permission is hereby granted, free of charge, to any person obtaining a copy of this
// software and associated documentation files (the "Software"), to deal in the Software
// without restriction, including without limitation the rights to use, copy, modify, merge,
// publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons
// to whom the Software is furnished to do so, subject to the following conditions:
//
// The above copyright notice and this permission notice shall be included in all copies or
// substantial portions of the Software.
//
// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED,
// INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR
// PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE
// FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR
// OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
// DEALINGS IN THE SOFTWARE.
using System;
using ICSharpCode.PackageManagement.Design;
using NuGet;
namespace PackageManagement.Tests.Helpers
{
public class FakePackageRepositoryWithConstraintProvider : FakePackageRepository, IPackageConstraintProvider
{
DefaultConstraintProvider constraintProvider = new DefaultConstraintProvider();
public IVersionSpec GetConstraint(string packageId)
{
return constraintProvider.GetConstraint(packageId);
}
public void AddConstraint(string packageId, IVersionSpec versionSpec)
{
constraintProvider.AddConstraint (packageId, versionSpec);
}
}
}

22
src/AddIns/Misc/PackageManagement/Test/Src/PackageManagementProjectTests.cs

@ -759,5 +759,27 @@ namespace PackageManagement.Tests
Assert.AreEqual(package, fakePackageManager.PackagePassedToUpdatePackageReference); Assert.AreEqual(package, fakePackageManager.PackagePassedToUpdatePackageReference);
Assert.AreEqual(updatePackagesAction, fakePackageManager.SettingsPassedToUpdatePackageReference); Assert.AreEqual(updatePackagesAction, fakePackageManager.SettingsPassedToUpdatePackageReference);
} }
[Test]
public void ConstraintProvider_LocalRepositoryDoesNotImplementIConstraintProvider_ReturnsNullConstraintProviderInstance ()
{
CreateProject ();
IPackageConstraintProvider provider = project.ConstraintProvider;
Assert.AreEqual (NullConstraintProvider.Instance, provider);
}
[Test]
public void ConstraintProvider_LocalRepositoryImplementsIConstraintProvider_ReturnsLocalRepository ()
{
CreateProject ();
var localRepository = new FakePackageRepositoryWithConstraintProvider ();
fakeProjectManager.FakeLocalRepository = localRepository;
IPackageConstraintProvider provider = project.ConstraintProvider;
Assert.AreEqual (localRepository, provider);
}
} }
} }

23
src/AddIns/Misc/PackageManagement/Test/Src/UpdatePackageActionTests.cs

@ -355,5 +355,28 @@ namespace PackageManagement.Tests
Assert.AreEqual(expectedPackage, actualPackage); Assert.AreEqual(expectedPackage, actualPackage);
} }
[Test]
public void Execute_PackageHasConstraint_LatestPackageIsNotUpdatedButPackageWithHighestVersionThatMatchesConstraint ()
{
CreateSolution ();
var constraintProvider = new DefaultConstraintProvider ();
var versionSpec = new VersionSpec ();
versionSpec.MinVersion = new SemanticVersion ("1.0");
versionSpec.IsMinInclusive = true;
versionSpec.IsMaxInclusive = true;
versionSpec.MaxVersion = new SemanticVersion ("2.0");
constraintProvider.AddConstraint ("MyPackage", versionSpec);
fakeProject.ConstraintProvider = constraintProvider;
fakeProject.AddFakePackageToSourceRepository ("MyPackage", "1.0");
FakePackage packageVersion2 = fakeProject.AddFakePackageToSourceRepository ("MyPackage", "2.0");
fakeProject.AddFakePackageToSourceRepository ("MyPackage", "3.0");
fakeProject.FakePackages.Add (new FakePackage ("MyPackage", "1.0"));
action.PackageId = "MyPackage";
action.Execute ();
Assert.AreEqual (packageVersion2, fakeProject.PackagePassedToUpdatePackage);
}
} }
} }

41
src/AddIns/Misc/PackageManagement/Test/Src/UpdatedPackagesTests.cs

@ -20,7 +20,9 @@ using System;
using System.Collections.Generic; using System.Collections.Generic;
using System.Linq; using System.Linq;
using System.Runtime.Versioning; using System.Runtime.Versioning;
using ICSharpCode.PackageManagement; using ICSharpCode.PackageManagement;
using ICSharpCode.PackageManagement.Design;
using NuGet; using NuGet;
using NUnit.Framework; using NUnit.Framework;
using PackageManagement.Tests.Helpers; using PackageManagement.Tests.Helpers;
@ -37,6 +39,7 @@ namespace PackageManagement.Tests
List<IPackage> sourceRepositoryPackages; List<IPackage> sourceRepositoryPackages;
List<IPackage> packagesUsedWhenCheckingForUpdates; List<IPackage> packagesUsedWhenCheckingForUpdates;
bool includePreleaseUsedWhenCheckingForUpdates; bool includePreleaseUsedWhenCheckingForUpdates;
FakePackageManagementProject project;
[SetUp] [SetUp]
public void Init() public void Init()
@ -66,7 +69,17 @@ namespace PackageManagement.Tests
}) })
.Return(sourceRepositoryPackages.AsQueryable()); .Return(sourceRepositoryPackages.AsQueryable());
updatedPackages = new UpdatedPackages(installedPackages.AsQueryable(), sourceRepository); updatedPackages = new UpdatedPackages(installedPackages.AsQueryable(), sourceRepository, NullConstraintProvider.Instance);
}
void CreateProject()
{
project = new FakePackageManagementProject();
}
void CreateUpdatedPackages(IPackageRepository repository)
{
updatedPackages = new UpdatedPackages(project, repository);
} }
IPackage AddPackageToSourceRepository(string id, string version) IPackage AddPackageToSourceRepository(string id, string version)
@ -166,5 +179,31 @@ namespace PackageManagement.Tests
Assert.IsFalse(includePreleaseUsedWhenCheckingForUpdates); Assert.IsFalse(includePreleaseUsedWhenCheckingForUpdates);
} }
[Test]
public void GetUpdatedPackages_OnePackageReferencedWithConstraintAndUpdatesAvailable_LatestVersionReturnedBasedOnConstraint()
{
CreateProject();
project.FakePackages.Add(new FakePackage("Test", "1.0"));
var sourceRepository = new FakePackageRepository();
FakePackage packageVersion2 = sourceRepository.AddFakePackageWithVersion("Test", "2.0");
FakePackage [] expectedPackages = new [] {
packageVersion2
};
sourceRepository.AddFakePackageWithVersion("Test", "3.0");
var versionSpec = new VersionSpec();
versionSpec.MinVersion = new SemanticVersion("1.0");
versionSpec.IsMinInclusive = true;
versionSpec.MaxVersion = new SemanticVersion("2.0");
versionSpec.IsMaxInclusive = true;
var constraintProvider = new DefaultConstraintProvider();
constraintProvider.AddConstraint("Test", versionSpec);
project.ConstraintProvider = constraintProvider;
CreateUpdatedPackages(sourceRepository);
IEnumerable<IPackage> packages = updatedPackages.GetUpdatedPackages();
PackageCollectionAssert.AreEqual(expectedPackages, packages);
}
} }
} }

27
src/AddIns/Misc/PackageManagement/Test/Src/UpdatedPackagesViewModelTests.cs

@ -787,5 +787,32 @@ namespace PackageManagement.Tests
operationAwareRepository.AssertOperationWasStartedAndDisposed(RepositoryOperationNames.Update, null); operationAwareRepository.AssertOperationWasStartedAndDisposed(RepositoryOperationNames.Update, null);
} }
[Test]
public void ReadPackages_TwoPackagesInSourceRepositoryAndTwoNewerPackageVersionAvailableAndProjectHasConstraint_NewerPackageVersionThatMeetsConstraintIsDisplayed()
{
CreateViewModel();
var versionSpec = new VersionSpec();
versionSpec.MinVersion = new SemanticVersion("1.0");
versionSpec.IsMinInclusive = true;
versionSpec.MaxVersion = new SemanticVersion("2.0");
versionSpec.IsMaxInclusive = true;
var constraintProvider = new DefaultConstraintProvider();
constraintProvider.AddConstraint("Test", versionSpec);
solution.FakeProjectToReturnFromGetProject.ConstraintProvider = constraintProvider;
AddPackageToLocalRepository("Test", "1.0.0.0");
AddPackageToActiveRepository("Test", "1.0.0.0");
FakePackage expectedPackage = AddPackageToActiveRepository("Test", "2.0.0.0");
AddPackageToActiveRepository("Test", "3.0.0.0");
viewModel.ReadPackages();
CompleteReadPackagesTask();
var expectedPackages = new FakePackage[] {
expectedPackage
};
PackageCollectionAssert.AreEqual(expectedPackages, viewModel.PackageViewModels);
}
} }
} }

Loading…
Cancel
Save