diff --git a/src/AddIns/Misc/PackageManagement/Project/PackageManagement.csproj b/src/AddIns/Misc/PackageManagement/Project/PackageManagement.csproj index f8132152b6..b8f8353ecf 100644 --- a/src/AddIns/Misc/PackageManagement/Project/PackageManagement.csproj +++ b/src/AddIns/Misc/PackageManagement/Project/PackageManagement.csproj @@ -77,6 +77,7 @@ + @@ -143,6 +144,7 @@ + diff --git a/src/AddIns/Misc/PackageManagement/Project/Src/Design/FakePackage.cs b/src/AddIns/Misc/PackageManagement/Project/Src/Design/FakePackage.cs index 0c870f67bd..c67a57d442 100644 --- a/src/AddIns/Misc/PackageManagement/Project/Src/Design/FakePackage.cs +++ b/src/AddIns/Misc/PackageManagement/Project/Src/Design/FakePackage.cs @@ -10,15 +10,16 @@ namespace ICSharpCode.PackageManagement.Design { public class FakePackage : IPackage { - List authors = new List(); - List owners = new List(); - Stream stream = null; - List files = new List(); - List assemblyReferences = - new List(); + public Stream Stream = null; + public List AuthorsList = new List(); + public List OwnersList = new List(); + public List FilesList = new List(); public List DependenciesList = new List(); + + public List AssemblyReferenceList = + new List(); public FakePackage() : this(String.Empty) @@ -49,15 +50,15 @@ namespace ICSharpCode.PackageManagement.Design public double Rating { get; set; } public IEnumerable AssemblyReferences { - get { return assemblyReferences; } + get { return AssemblyReferenceList; } } public IEnumerable Authors { - get { return authors; } + get { return AuthorsList; } } public IEnumerable Owners { - get { return owners; } + get { return OwnersList; } } public IEnumerable Dependencies { @@ -66,12 +67,12 @@ namespace ICSharpCode.PackageManagement.Design public IEnumerable GetFiles() { - return files; + return FilesList; } public Stream GetStream() { - return stream; + return Stream; } public override string ToString() @@ -81,8 +82,11 @@ namespace ICSharpCode.PackageManagement.Design public override bool Equals(object obj) { - FakePackage rhs = obj as FakePackage; - return (Id == rhs.Id) && (Version == rhs.Version); + IPackage rhs = obj as IPackage; + if (rhs != null) { + return (Id == rhs.Id) && (Version == rhs.Version); + } + return false; } public override int GetHashCode() @@ -92,7 +96,7 @@ namespace ICSharpCode.PackageManagement.Design public void AddAuthor(string author) { - authors.Add(author); + AuthorsList.Add(author); } public void AddDependency(string id, Version minVersion, Version maxVersion) diff --git a/src/AddIns/Misc/PackageManagement/Project/Src/Design/FakePackageAssemblyReference.cs b/src/AddIns/Misc/PackageManagement/Project/Src/Design/FakePackageAssemblyReference.cs new file mode 100644 index 0000000000..1e04f918e1 --- /dev/null +++ b/src/AddIns/Misc/PackageManagement/Project/Src/Design/FakePackageAssemblyReference.cs @@ -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.IO; +using System.Runtime.Versioning; +using NuGet; + +namespace ICSharpCode.PackageManagement.Design +{ + public class FakePackageAssemblyReference : IPackageAssemblyReference + { + public FrameworkName TargetFramework { + get { + throw new NotImplementedException(); + } + } + + public string Name { get; set; } + + public string Path { + get { + throw new NotImplementedException(); + } + } + + public Stream GetStream() + { + throw new NotImplementedException(); + } + } +} diff --git a/src/AddIns/Misc/PackageManagement/Project/Src/PackageManagementOptions.cs b/src/AddIns/Misc/PackageManagement/Project/Src/PackageManagementOptions.cs index a6f6def689..420c7c1116 100644 --- a/src/AddIns/Misc/PackageManagement/Project/Src/PackageManagementOptions.cs +++ b/src/AddIns/Misc/PackageManagement/Project/Src/PackageManagementOptions.cs @@ -15,13 +15,16 @@ namespace ICSharpCode.PackageManagement const string PackageSourcesPropertyName = "PackageSources"; const string PackageDirectoryPropertyName = "PackagesDirectory"; const string ActivePackageSourcePropertyName = "ActivePackageSource"; + const string RecentPackagesPropertyName = "RecentPackages"; RegisteredPackageSources packageSources; Properties properties; + List recentPackages; public PackageManagementOptions(Properties properties) { this.properties = properties; + properties.Set("MyVersion", new Version(1, 0)); } public PackageManagementOptions() @@ -91,5 +94,20 @@ namespace ICSharpCode.PackageManagement } } } + + public IList RecentPackages { + get { + if (recentPackages == null) { + ReadRecentPackages(); + } + return recentPackages; + } + } + + void ReadRecentPackages() + { + var defaultRecentPackages = new List(); + recentPackages = properties.Get>(RecentPackagesPropertyName, defaultRecentPackages); + } } } diff --git a/src/AddIns/Misc/PackageManagement/Project/Src/PackageManagementService.cs b/src/AddIns/Misc/PackageManagement/Project/Src/PackageManagementService.cs index e5709a8bf3..a6d895c1b8 100644 --- a/src/AddIns/Misc/PackageManagement/Project/Src/PackageManagementService.cs +++ b/src/AddIns/Misc/PackageManagement/Project/Src/PackageManagementService.cs @@ -80,9 +80,10 @@ namespace ICSharpCode.PackageManagement } } - void CreateRecentPackageRepository() + public IPackageRepository CreateRecentPackageRepository() { - recentPackageRepository = new RecentPackageRepository(); + recentPackageRepository = new RecentPackageRepository(this); + return recentPackageRepository; } public IPackageRepository ActivePackageRepository { diff --git a/src/AddIns/Misc/PackageManagement/Project/Src/RecentPackageInfo.cs b/src/AddIns/Misc/PackageManagement/Project/Src/RecentPackageInfo.cs new file mode 100644 index 0000000000..2476af3714 --- /dev/null +++ b/src/AddIns/Misc/PackageManagement/Project/Src/RecentPackageInfo.cs @@ -0,0 +1,45 @@ +// 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 class RecentPackageInfo + { + Version version; + + public RecentPackageInfo() + { + } + + public RecentPackageInfo(IPackage package) + : this(package.Id, package.Version) + { + } + + public RecentPackageInfo(string id, Version version) + { + this.Id = id; + this.version = version; + } + + public string Id { get; set; } + + public string Version { + get { return version.ToString(); } + set { version = new Version(value); } + } + + public override string ToString() + { + return String.Format("[RecentPackageInfo Id={0}, Version={1}]", Id, Version); + } + + public bool IsMatch(IPackage package) + { + return (package.Version.ToString() == Version) && (package.Id == Id); + } + } +} diff --git a/src/AddIns/Misc/PackageManagement/Project/Src/RecentPackageRepository.cs b/src/AddIns/Misc/PackageManagement/Project/Src/RecentPackageRepository.cs index a3de8b175d..e4416a4cae 100644 --- a/src/AddIns/Misc/PackageManagement/Project/Src/RecentPackageRepository.cs +++ b/src/AddIns/Misc/PackageManagement/Project/Src/RecentPackageRepository.cs @@ -14,9 +14,11 @@ namespace ICSharpCode.PackageManagement List packages = new List(); int maximumPackagesCount = DefaultMaximumPackagesCount; + IPackageManagementService packageManagementService; - public RecentPackageRepository() + public RecentPackageRepository(IPackageManagementService packageManagementService) { + this.packageManagementService = packageManagementService; } public string Source { @@ -28,6 +30,7 @@ namespace ICSharpCode.PackageManagement RemovePackageIfAlreadyAdded(package); AddPackageAtBeginning(package); RemoveLastPackageIfCurrentPackageCountExceedsMaximum(); + UpdateRecentPackagesInOptions(); } void RemovePackageIfAlreadyAdded(IPackage package) @@ -60,15 +63,84 @@ namespace ICSharpCode.PackageManagement packages.RemoveAt(packages.Count - 1); } + void UpdateRecentPackagesInOptions() + { + IList recentPackages = packageManagementService.Options.RecentPackages; + recentPackages.Clear(); + recentPackages.AddRange(GetRecentPackagesInfo()); + } + + List GetRecentPackagesInfo() + { + List allRecentPackages = new List(); + foreach (IPackage package in packages) { + var recentPackageInfo = new RecentPackageInfo(package); + allRecentPackages.Add(recentPackageInfo); + } + return allRecentPackages; + } + public void RemovePackage(IPackage package) { } public IQueryable GetPackages() { + UpdatePackages(); return packages.AsQueryable(); } + void UpdatePackages() + { + if (!HasRecentPackagesBeenRead() && HasRecentPackages()) { + IEnumerable recentPackages = GetRecentPackages(); + packages.AddRange(recentPackages); + } + } + + bool HasRecentPackagesBeenRead() + { + return packages.Count > 0; + } + + bool HasRecentPackages() + { + return packageManagementService.Options.RecentPackages.Count > 0; + } + + IEnumerable GetRecentPackages() + { + IEnumerable recentPackages = GetRecentPackagesFilteredById(); + return GetRecentPackagesFilteredByVersion(recentPackages); + } + + IEnumerable GetRecentPackagesFilteredById() + { + IPackageRepository aggregrateRepository = packageManagementService.CreateAggregatePackageRepository(); + IEnumerable recentPackageIds = GetRecentPackageIds(); + return aggregrateRepository.FindPackages(recentPackageIds); + } + + IEnumerable GetRecentPackageIds() + { + foreach (RecentPackageInfo recentPackageInfo in packageManagementService.Options.RecentPackages) { + yield return recentPackageInfo.Id; + } + } + + IEnumerable GetRecentPackagesFilteredByVersion(IEnumerable recentPackages) + { + List filteredRecentPackages = new List(); + foreach (IPackage recentPackage in recentPackages) { + foreach (RecentPackageInfo savedRecentPackageInfo in packageManagementService.Options.RecentPackages) { + if (savedRecentPackageInfo.IsMatch(recentPackage)) { + filteredRecentPackages.Add(recentPackage); + } + } + } + return filteredRecentPackages; + } + public int MaximumPackagesCount { get { return maximumPackagesCount; } set { maximumPackagesCount = value; } diff --git a/src/AddIns/Misc/PackageManagement/Test/PackageManagement.Tests.csproj b/src/AddIns/Misc/PackageManagement/Test/PackageManagement.Tests.csproj index 496952eecd..b35c148687 100644 --- a/src/AddIns/Misc/PackageManagement/Test/PackageManagement.Tests.csproj +++ b/src/AddIns/Misc/PackageManagement/Test/PackageManagement.Tests.csproj @@ -87,6 +87,7 @@ + @@ -123,6 +124,7 @@ + diff --git a/src/AddIns/Misc/PackageManagement/Test/Src/Helpers/FakePackageTests.cs b/src/AddIns/Misc/PackageManagement/Test/Src/Helpers/FakePackageTests.cs index 02ab08b570..0ec8028769 100644 --- a/src/AddIns/Misc/PackageManagement/Test/Src/Helpers/FakePackageTests.cs +++ b/src/AddIns/Misc/PackageManagement/Test/Src/Helpers/FakePackageTests.cs @@ -2,6 +2,7 @@ // This code is distributed under the GNU LGPL (for details please see \doc\license.txt) using System; +using ICSharpCode.PackageManagement; using ICSharpCode.PackageManagement.Design; using NUnit.Framework; @@ -58,5 +59,13 @@ namespace PackageManagement.Tests Assert.IsFalse(result); } + + [Test] + public void Equals_NullPassed_ReturnsFalse() + { + bool result = lhs.Equals(null); + + Assert.IsFalse(result); + } } } diff --git a/src/AddIns/Misc/PackageManagement/Test/Src/Helpers/PackageCollectionAssert.cs b/src/AddIns/Misc/PackageManagement/Test/Src/Helpers/PackageCollectionAssert.cs index a0e2a07334..ab6055e9ba 100644 --- a/src/AddIns/Misc/PackageManagement/Test/Src/Helpers/PackageCollectionAssert.cs +++ b/src/AddIns/Misc/PackageManagement/Test/Src/Helpers/PackageCollectionAssert.cs @@ -13,7 +13,7 @@ namespace PackageManagement.Tests.Helpers { public static void AreEqual(IEnumerable expectedPackages, IEnumerable actualViewModels) { - List expectedPackagesAsList = new List(expectedPackages); + var expectedPackagesAsList = new List(expectedPackages); List actualPackages = ConvertToPackageList(actualViewModels); CollectionAssert.AreEqual(expectedPackagesAsList, actualPackages); @@ -21,7 +21,7 @@ namespace PackageManagement.Tests.Helpers static List ConvertToPackageList(IEnumerable viewModels) { - List packages = new List(); + var packages = new List(); foreach (PackageViewModel viewModel in viewModels) { packages.Add(viewModel.GetPackage()); } @@ -30,10 +30,10 @@ namespace PackageManagement.Tests.Helpers public static void AreEqual(IEnumerable expectedPackages, IEnumerable actualPackages) { - List expectedPackagesAsList = new List(expectedPackages); - List actualPackagesAsList = new List(actualPackages); + var expectedPackagesAsList = new List(expectedPackages); + var actualPackagesAsList = new List(actualPackages); - CollectionAssert.AreEqual(expectedPackagesAsList, actualPackagesAsList); + CollectionAssert.AreEqual(expectedPackagesAsList, actualPackagesAsList); } } } diff --git a/src/AddIns/Misc/PackageManagement/Test/Src/Helpers/RecentPackageInfoCollectionAssert.cs b/src/AddIns/Misc/PackageManagement/Test/Src/Helpers/RecentPackageInfoCollectionAssert.cs new file mode 100644 index 0000000000..d5968e9073 --- /dev/null +++ b/src/AddIns/Misc/PackageManagement/Test/Src/Helpers/RecentPackageInfoCollectionAssert.cs @@ -0,0 +1,30 @@ +// 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 NUnit.Framework; + +namespace PackageManagement.Tests.Helpers +{ + public static class RecentPackageInfoCollectionAssert + { + public static void AreEqual(IEnumerable expectedPackages, IEnumerable actualPackages) + { + var expectedPackagesAsList = ConvertToStringList(expectedPackages); + var actualPackagesAsList = ConvertToStringList(actualPackages); + + CollectionAssert.AreEqual(expectedPackagesAsList, actualPackagesAsList); + } + + static List ConvertToStringList(IEnumerable expectedPackages) + { + List items = new List(); + foreach (RecentPackageInfo recentPackage in expectedPackages) { + items.Add(recentPackage.ToString()); + } + return items; + } + } +} diff --git a/src/AddIns/Misc/PackageManagement/Test/Src/PackageManagementOptionsTests.cs b/src/AddIns/Misc/PackageManagement/Test/Src/PackageManagementOptionsTests.cs index 451e5be79c..84637cd9df 100644 --- a/src/AddIns/Misc/PackageManagement/Test/Src/PackageManagementOptionsTests.cs +++ b/src/AddIns/Misc/PackageManagement/Test/Src/PackageManagementOptionsTests.cs @@ -2,14 +2,16 @@ // This code is distributed under the GNU LGPL (for details please see \doc\license.txt) using System; +using System.Collections.Generic; using System.IO; using System.Text; using System.Xml; - using ICSharpCode.Core; using ICSharpCode.PackageManagement; +using ICSharpCode.PackageManagement.Design; using NuGet; using NUnit.Framework; +using PackageManagement.Tests.Helpers; namespace PackageManagement.Tests { @@ -111,6 +113,34 @@ namespace PackageManagement.Tests var activeSource = options.ActivePackageSource; Assert.IsNull(activeSource); - } + } + + [Test] + public void RecentPackages_OneRecentPackageAddedAndOptionsReloadedFromSavedProperties_ContainsOneRecentPackageThatWasSavedPreviously() + { + CreateOptions(); + var package = new FakePackage("Test"); + var recentPackage = new RecentPackageInfo(package); + options.RecentPackages.Add(recentPackage); + CreateOptions(properties); + + var recentPackages = options.RecentPackages; + + var expectedRecentPackages = new RecentPackageInfo[] { + new RecentPackageInfo(package) + }; + + RecentPackageInfoCollectionAssert.AreEqual(expectedRecentPackages, recentPackages); + } + + [Test] + public void RecentPackages_SaveRecentPackages_DoesNotThrowInvalidOperationException() + { + CreateOptions(); + var recentPackage = new RecentPackageInfo("id", new Version(1, 0)); + options.RecentPackages.Add(recentPackage); + + Assert.DoesNotThrow(() => SaveOptions()); + } } } diff --git a/src/AddIns/Misc/PackageManagement/Test/Src/RecentPackageInfoTests.cs b/src/AddIns/Misc/PackageManagement/Test/Src/RecentPackageInfoTests.cs new file mode 100644 index 0000000000..72621312e9 --- /dev/null +++ b/src/AddIns/Misc/PackageManagement/Test/Src/RecentPackageInfoTests.cs @@ -0,0 +1,92 @@ +// 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.IO; +using System.Text; +using System.Xml; +using ICSharpCode.Core; +using ICSharpCode.PackageManagement; +using ICSharpCode.PackageManagement.Design; +using NUnit.Framework; + +namespace PackageManagement.Tests +{ + [TestFixture] + public class RecentPackageInfoTests + { + [Test] + public void ToString_IdAndVersionSpecified_ContainsIdAndVersion() + { + var recentPackageInfo = new RecentPackageInfo("id", new Version("1.0")); + + string actual = recentPackageInfo.ToString(); + + string expected = "[RecentPackageInfo Id=id, Version=1.0]"; + Assert.AreEqual(expected, actual); + } + + [Test] + public void IsMatch_PackageWithSameIdAndVersionPassed_ReturnsTrue() + { + string id = "id"; + var version = new Version(1, 0); + var recentPackageInfo = new RecentPackageInfo(id, version); + var package = new FakePackage(id); + package.Version = version; + + bool result = recentPackageInfo.IsMatch(package); + + Assert.IsTrue(result); + } + + [Test] + public void IsMatch_PackageWithSameIdButDifferentVersionPassed_ReturnsFalse() + { + string id = "id"; + var version = new Version(1, 0); + var recentPackageInfo = new RecentPackageInfo(id, version); + var package = new FakePackage(id); + package.Version = new Version(2, 0); + + bool result = recentPackageInfo.IsMatch(package); + + Assert.IsFalse(result); + } + + [Test] + public void IsMatch_PackageWithDifferentIdButSameVersionPassed_ReturnsFalse() + { + var version = new Version(1, 0); + var recentPackageInfo = new RecentPackageInfo("id", version); + var package = new FakePackage("different-id"); + package.Version = version; + + bool result = recentPackageInfo.IsMatch(package); + + Assert.IsFalse(result); + } + + [Test] + public void Version_SerializeThenDeserializeRecentPackageInfoInPropertiesObject_ReturnsSameValueAfterDeserialization() + { + var version = new Version(1, 0); + var recentPackageInfo = new RecentPackageInfo("id", version); + var properties = new Properties(); + properties.Set("RecentPackageInfo", recentPackageInfo); + + var xml = new StringBuilder(); + var stringWriter = new StringWriter(xml); + var writer = new XmlTextWriter(stringWriter); + properties.Save(writer); + + var stringReader = new StringReader(xml.ToString()); + var reader = new XmlTextReader(stringReader); + properties = Properties.Load(reader); + + var deserializedRecentPackageInfo = properties.Get("RecentPackageInfo", null); + + Assert.AreEqual(recentPackageInfo.Version, deserializedRecentPackageInfo.Version); + } + } +} diff --git a/src/AddIns/Misc/PackageManagement/Test/Src/RecentPackageRepositoryTests.cs b/src/AddIns/Misc/PackageManagement/Test/Src/RecentPackageRepositoryTests.cs index c1ef68db62..c9ed5db111 100644 --- a/src/AddIns/Misc/PackageManagement/Test/Src/RecentPackageRepositoryTests.cs +++ b/src/AddIns/Misc/PackageManagement/Test/Src/RecentPackageRepositoryTests.cs @@ -4,6 +4,7 @@ using System; using System.Collections.Generic; using System.Linq; +using ICSharpCode.Core; using ICSharpCode.PackageManagement; using ICSharpCode.PackageManagement.Design; using NuGet; @@ -16,10 +17,26 @@ namespace PackageManagement.Tests public class RecentPackageRepositoryTests { RecentPackageRepository repository; + PackageManagementOptions options; + FakePackageRepository aggregateRepository; + FakePackageManagementService packageManagementService; void CreateRepository() { - repository = new RecentPackageRepository(); + CreatePackageManagementService(); + CreateRepository(packageManagementService); + } + + void CreatePackageManagementService() + { + packageManagementService = new FakePackageManagementService(); + options = packageManagementService.Options; + aggregateRepository = packageManagementService.FakeAggregateRepository; + } + + void CreateRepository(IPackageManagementService packageManagementService) + { + repository = new RecentPackageRepository(packageManagementService); } FakePackage AddOnePackageToRepository(string id) @@ -43,6 +60,16 @@ namespace PackageManagement.Tests yield return AddOnePackageToRepository("Test.Package.4"); } + FakePackage CreateRepositoryWithOneRecentPackageSavedInOptions() + { + CreatePackageManagementService(); + var package = new FakePackage("Test"); + aggregateRepository.FakePackages.Add(package); + options.RecentPackages.Add(new RecentPackageInfo(package)); + CreateRepository(packageManagementService); + return package; + } + [Test] public void Source_NewRecentRepositoryCreated_IsRecentPackages() { @@ -89,7 +116,7 @@ namespace PackageManagement.Tests var expectedPackages = packagesAdded.Reverse().Take(3); - PackageCollectionAssert.AreEqual(expectedPackages, packages); + PackageCollectionAssert.AreEqual(expectedPackages, packages); } [Test] @@ -107,5 +134,83 @@ namespace PackageManagement.Tests PackageCollectionAssert.AreEqual(expectedPackages, packages); } + + [Test] + public void AddPackage_RepositoryIsEmptyAndOnePackageAdded_RecentPackageAddedToOptions() + { + CreateRepository(); + var package = AddOnePackageToRepository("Test"); + + var recentPackages = options.RecentPackages; + + var expectedPackages = new RecentPackageInfo[] { + new RecentPackageInfo(package) + }; + + RecentPackageInfoCollectionAssert.AreEqual(expectedPackages, recentPackages); + } + + [Test] + public void AddPackage_RepositoryIsEmptyAndTwoPackagesAddedFromDifferentSources_BothRecentPackagesAddedToOptions() + { + CreateRepository(); + var package1 = AddOnePackageToRepository("Test1"); + var package2 = AddOnePackageToRepository("Test2"); + + var recentPackages = options.RecentPackages; + + var expectedPackages = new RecentPackageInfo[] { + new RecentPackageInfo(package2), + new RecentPackageInfo(package1) + }; + + RecentPackageInfoCollectionAssert.AreEqual(expectedPackages, recentPackages); + } + + [Test] + public void GetPackages_SavedOptionsHasOneRecentPackage_ContainsPackageTakenFromAggregateRepositoryMatchingSavedRecentPackageInfo() + { + var package = CreateRepositoryWithOneRecentPackageSavedInOptions(); + + var recentPackages = repository.GetPackages(); + + var expectedPackages = new FakePackage[] { + package + }; + + PackageCollectionAssert.AreEqual(expectedPackages, recentPackages); + } + + [Test] + public void GetPackages_SavedOptionsHasOneRecentPackageAndGetPackagesCalledTwice_OnePackageReturned() + { + var package = CreateRepositoryWithOneRecentPackageSavedInOptions(); + + repository.GetPackages(); + var recentPackages = repository.GetPackages(); + + var expectedPackages = new FakePackage[] { + package + }; + + PackageCollectionAssert.AreEqual(expectedPackages, recentPackages); + } + + [Test] + public void GetPackages_OneRecentPackageAndAggregrateRepositoryHasTwoPackagesWithSameIdButDifferentVersions_OnePackageReturnedWithMatchingVersion() + { + var package1 = CreateRepositoryWithOneRecentPackageSavedInOptions(); + var package2 = new FakePackage(package1.Id); + package2.Version = new Version(2, 0); + aggregateRepository.FakePackages.Add(package2); + + var recentPackages = repository.GetPackages(); + + var expectedPackages = new FakePackage[] { + package1 + }; + + PackageCollectionAssert.AreEqual(expectedPackages, recentPackages); + } } } diff --git a/src/Main/Core/Project/Src/Services/PropertyService/Properties.cs b/src/Main/Core/Project/Src/Services/PropertyService/Properties.cs index b2d2a0cda3..497bcd0051 100644 --- a/src/Main/Core/Project/Src/Services/PropertyService/Properties.cs +++ b/src/Main/Core/Project/Src/Services/PropertyService/Properties.cs @@ -270,8 +270,14 @@ namespace ICSharpCode.Core public void Save(string fileName) { - using (XmlTextWriter writer = new XmlTextWriter(fileName, Encoding.UTF8)) { - writer.Formatting = Formatting.Indented; + XmlTextWriter writer = new XmlTextWriter(fileName, Encoding.UTF8); + writer.Formatting = Formatting.Indented; + Save(writer); + } + + public void Save(XmlWriter writer) + { + using (writer) { writer.WriteStartElement("Properties"); WriteProperties(writer); writer.WriteEndElement(); @@ -292,7 +298,13 @@ namespace ICSharpCode.Core if (!File.Exists(fileName)) { return null; } - using (XmlTextReader reader = new XmlTextReader(fileName)) { + XmlTextReader reader = new XmlTextReader(fileName); + return Load(reader); + } + + public static Properties Load(XmlReader reader) + { + using (reader) { while (reader.Read()){ if (reader.IsStartElement()) { switch (reader.LocalName) {