diff --git a/src/AddIns/Misc/AddInManager2/AddInManager2.Tests/AddInSetupTests.cs b/src/AddIns/Misc/AddInManager2/AddInManager2.Tests/AddInSetupTests.cs index f1f3e722e9..b6f2b60afe 100644 --- a/src/AddIns/Misc/AddInManager2/AddInManager2.Tests/AddInSetupTests.cs +++ b/src/AddIns/Misc/AddInManager2/AddInManager2.Tests/AddInSetupTests.cs @@ -29,6 +29,7 @@ namespace ICSharpCode.AddInManager2.Tests AddIn _addIn2; AddIn _addIn2_new; AddIn _addIn_noIdentity; + AddIn _addIn_noVersion; public AddInSetupTests() { @@ -71,6 +72,54 @@ namespace ICSharpCode.AddInManager2.Tests { _addIn_noIdentity = AddIn.Load(_addInTree, streamReader); } + + using (StreamReader streamReader = new StreamReader(@"TestResources\AddInManager2Test_noVersion.addin")) + { + _addIn_noVersion = AddIn.Load(_addInTree, streamReader); + } + } + + [Test] + public void CompareAddInToPackageVersion() + { + CreateAddIns(); + + // Prepare all (fake) services needed for AddInSetup and its instance, itself + PrepareAddInSetup(); + + // Create fake packages + FakePackage fakePackageEqual = new FakePackage() + { + Id = _addIn1.Manifest.PrimaryIdentity, + Version = new SemanticVersion(_addIn1.Version) + }; + FakePackage fakePackageGreater = new FakePackage() + { + Id = _addIn1.Manifest.PrimaryIdentity, + Version = new SemanticVersion("9.9.9.9") + }; + FakePackage fakePackageLess = new FakePackage() + { + Id = _addIn1.Manifest.PrimaryIdentity, + Version = new SemanticVersion("0.0.0.0") + }; + + // Ensure we have no __nuGet... attributes in manifest + if (_addIn1.Properties.Contains(ManagedAddIn.NuGetPackageVersionManifestAttribute)) + { + _addIn1.Properties.Remove(ManagedAddIn.NuGetPackageVersionManifestAttribute); + } + + Assert.That(_addInSetup.CompareAddInToPackageVersion(_addIn1, fakePackageEqual), Is.EqualTo(0), "Comparing AddIn 1.0.0.0 and NuGet package 1.0.0.0"); + Assert.That(_addInSetup.CompareAddInToPackageVersion(_addIn1, fakePackageGreater), Is.LessThan(0), "Comparing AddIn 1.0.0.0 and NuGet package 9.9.9.9"); + Assert.That(_addInSetup.CompareAddInToPackageVersion(_addIn1, fakePackageLess), Is.GreaterThan(0), "Comparing AddIn 1.0.0.0 and NuGet package 0.0.0.0"); + + // Comparison if there's no version in manifest + Assert.That(_addInSetup.CompareAddInToPackageVersion(_addIn_noVersion, fakePackageEqual), Is.LessThan(0), "Comparing AddIn and NuGet package 1.0.0.0"); + + // Comparison if there's no regular version in manifest, but there is one in __nuGet... attribute + _addIn_noVersion.Properties.Set(ManagedAddIn.NuGetPackageVersionManifestAttribute, fakePackageEqual.Version.ToString()); + Assert.That(_addInSetup.CompareAddInToPackageVersion(_addIn_noVersion, fakePackageEqual), Is.EqualTo(0), "Comparing AddIn (NuGet: 1.0.0.0) and NuGet package 1.0.0.0"); } [Test, Description("AddIn must be installed from external *.addin manifest file. Pending installation must be cancellable.")] diff --git a/src/AddIns/Misc/AddInManager2/AddInManager2.Tests/AvailableAddInsViewModelTests.cs b/src/AddIns/Misc/AddInManager2/AddInManager2.Tests/AvailableAddInsViewModelTests.cs index d7fd4fd629..9d1fd91d7d 100644 --- a/src/AddIns/Misc/AddInManager2/AddInManager2.Tests/AvailableAddInsViewModelTests.cs +++ b/src/AddIns/Misc/AddInManager2/AddInManager2.Tests/AvailableAddInsViewModelTests.cs @@ -25,6 +25,7 @@ namespace ICSharpCode.AddInManager2.Tests AddIn _addIn1_new; AddIn _addIn2; AddIn _addIn2_new; + AddIn _addIn_noVersion; public AvailableAddInsViewModelTests() { @@ -54,6 +55,11 @@ namespace ICSharpCode.AddInManager2.Tests { _addIn2_new = AddIn.Load(_addInTree, streamReader); } + + using (StreamReader streamReader = new StreamReader(@"TestResources\AddInManager2Test_noVersion.addin")) + { + _addIn_noVersion = AddIn.Load(_addInTree, streamReader); + } } [SetUp] @@ -248,6 +254,200 @@ namespace ICSharpCode.AddInManager2.Tests CreateAddIns(); _addIn1.Enabled = true; + // Package to be shown in repository + FakePackage fakePackage1 = new FakePackage() + { + Id = _addIn1.Manifest.PrimaryIdentity, + Version = new SemanticVersion(_addIn1.Version), + Tags = SharpDevelopAddInTag + }; + FakePackage fakePackage2 = new FakePackage() + { + Id = _addIn2.Manifest.PrimaryIdentity, + Version = new SemanticVersion(_addIn2.Version), + Tags = SharpDevelopAddInTag + }; + + _addIn1.Properties.Set(ManagedAddIn.NuGetPackageIDManifestAttribute, fakePackage1.Id); + _addIn1.Properties.Set(ManagedAddIn.NuGetPackageVersionManifestAttribute, fakePackage1.Version.ToString()); + _addIn2.Properties.Set(ManagedAddIn.NuGetPackageIDManifestAttribute, fakePackage2.Id); + _addIn2.Properties.Set(ManagedAddIn.NuGetPackageVersionManifestAttribute, fakePackage2.Version.ToString()); + + // List of NuGet repositories + List registeredPackageSources = new List(); + registeredPackageSources.Add(new PackageSource("", "Test Repository")); + _services.FakeRepositories.RegisteredPackageSources = registeredPackageSources; + + List registeredPackageRepositories = new List(); + FakeCorePackageRepository remoteRepository = new FakeCorePackageRepository(); + remoteRepository.Source = registeredPackageSources[0].Source; + remoteRepository.ReturnedPackages = (new IPackage[] { fakePackage1, fakePackage2 }).AsQueryable(); + _services.FakeRepositories.RegisteredPackageRepositories = registeredPackageRepositories; + + // PackageRepository service should return remoteRepository instance + _services.FakeRepositories.GetRepositoryFromSourceCallback = delegate(PackageSource packageSource) + { + return remoteRepository; + }; + + FakeCorePackageRepository localRepository = new FakeCorePackageRepository(); + _services.FakeNuGet.FakeCorePackageManager.LocalRepository = localRepository; + localRepository.ReturnedPackages = (new IPackage[] { fakePackage1, fakePackage2 }).AsQueryable(); + + // Simulate list of AddIns + _services.FakeSDAddInManagement.RegisteredAddIns.Add(_addIn1); + _services.FakeSDAddInManagement.RegisteredAddIns.Add(_addIn2); + + // Simulation of resolving AddIns <-> NuGet packages + _services.FakeSetup.GetAddInForNuGetPackageCallback = delegate(IPackage package, bool withAddInsMarkedForInstallation) + { + if (package.Id == _addIn1.Properties[ManagedAddIn.NuGetPackageIDManifestAttribute]) + { + return _addIn1; + } + else if (package.Id == _addIn2.Properties[ManagedAddIn.NuGetPackageIDManifestAttribute]) + { + return _addIn2; + } + + return null; + }; + + var viewModel = new AvailableAddInsViewModel(_services); + viewModel.ReadPackagesAndWaitForUpdate(); + + Assert.That(viewModel.AddInPackages.Count, Is.EqualTo(2), "AddIn list must contain 2 items."); + + AddInPackageViewModelBase firstAddIn = viewModel.AddInPackages[0]; + Assert.That(firstAddIn.Id, Is.EqualTo(_addIn1.Manifest.PrimaryIdentity), "Primary identity of 1st AddIn"); + Assert.That(firstAddIn.Name, Is.EqualTo(_addIn1.Manifest.PrimaryIdentity), "Name of 1st AddIn"); + Assert.That(firstAddIn.Version, Is.EqualTo(_addIn1.Version), "Version of 1st AddIn"); + Assert.That(firstAddIn.IsInstalled, Is.True, "1st AddIn must be 'installed''"); + Assert.That(firstAddIn.IsOffline, Is.False, "1st AddIn must not be 'offline'"); + Assert.That(firstAddIn.IsEnabled, Is.True, "1st AddIn must be 'enabled'"); + Assert.That(firstAddIn.IsUpdate, Is.False, "1st AddIn must not be 'update'"); + Assert.That(firstAddIn.IsAdded, Is.False, "1st AddIn must not be 'added'"); + Assert.That(firstAddIn.IsRemoved, Is.False, "1st AddIn must not be 'removed'"); + Assert.That(firstAddIn.HasNuGetConnection, Is.False, "1st AddIn must not have 'NuGet connection'"); + Assert.That(viewModel.AddInPackages[0].IsExternallyReferenced, Is.False, "1st AddIn must not be 'externally referenced'"); + Assert.That(viewModel.AddInPackages[1].IsExternallyReferenced, Is.False, "2nd AddIn must not be 'externally referenced'"); + + AddInPackageViewModelBase secondAddIn = viewModel.AddInPackages[1]; + Assert.That(secondAddIn.Id, Is.EqualTo(_addIn2.Manifest.PrimaryIdentity), "Primary identity of 2nd AddIn"); + Assert.That(secondAddIn.Name, Is.EqualTo(_addIn2.Manifest.PrimaryIdentity), "Name of 2nd AddIn"); + Assert.That(secondAddIn.Version, Is.EqualTo(_addIn2.Version), "Version of 2nd AddIn"); + Assert.That(secondAddIn.IsInstalled, Is.True, "2nd AddIn must be 'installed''"); + Assert.That(secondAddIn.IsOffline, Is.False, "2nd AddIn must not be 'offline'"); + Assert.That(secondAddIn.IsEnabled, Is.True, "2nd AddIn must be 'enabled'"); + Assert.That(secondAddIn.IsUpdate, Is.False, "2nd AddIn mustnot be 'update'"); + Assert.That(secondAddIn.IsAdded, Is.False, "2nd AddIn must not be 'added'"); + Assert.That(secondAddIn.IsRemoved, Is.False, "2nd AddIn must not be 'removed'"); + Assert.That(secondAddIn.HasNuGetConnection, Is.False, "2nd AddIn must not have 'NuGet connection'"); + } + + [Test] + public void ShowAlreadyInstalledAddInsWithoutManifestVersion() + { + CreateAddIns(); + _addIn_noVersion.Enabled = true; + + // Package to be shown in repository + FakePackage fakePackage1 = new FakePackage() + { + Id = _addIn_noVersion.Manifest.PrimaryIdentity, + Version = new SemanticVersion("1.0.2.0"), + Tags = SharpDevelopAddInTag + }; + FakePackage fakePackage2 = new FakePackage() + { + Id = _addIn2.Manifest.PrimaryIdentity, + Version = new SemanticVersion(_addIn2.Version), + Tags = SharpDevelopAddInTag + }; + + _addIn_noVersion.Properties.Set(ManagedAddIn.NuGetPackageIDManifestAttribute, fakePackage1.Id); + _addIn_noVersion.Properties.Set(ManagedAddIn.NuGetPackageVersionManifestAttribute, fakePackage1.Version.ToString()); + _addIn2.Properties.Set(ManagedAddIn.NuGetPackageIDManifestAttribute, fakePackage2.Id); + _addIn2.Properties.Set(ManagedAddIn.NuGetPackageVersionManifestAttribute, fakePackage2.Version.ToString()); + + // List of NuGet repositories + List registeredPackageSources = new List(); + registeredPackageSources.Add(new PackageSource("", "Test Repository")); + _services.FakeRepositories.RegisteredPackageSources = registeredPackageSources; + + List registeredPackageRepositories = new List(); + FakeCorePackageRepository remoteRepository = new FakeCorePackageRepository(); + remoteRepository.Source = registeredPackageSources[0].Source; + remoteRepository.ReturnedPackages = (new IPackage[] { fakePackage1, fakePackage2 }).AsQueryable(); + _services.FakeRepositories.RegisteredPackageRepositories = registeredPackageRepositories; + + // PackageRepository service should return remoteRepository instance + _services.FakeRepositories.GetRepositoryFromSourceCallback = delegate(PackageSource packageSource) + { + return remoteRepository; + }; + + FakeCorePackageRepository localRepository = new FakeCorePackageRepository(); + _services.FakeNuGet.FakeCorePackageManager.LocalRepository = localRepository; + localRepository.ReturnedPackages = (new IPackage[] { fakePackage1, fakePackage2 }).AsQueryable(); + + // Simulate list of AddIns + _services.FakeSDAddInManagement.RegisteredAddIns.Add(_addIn_noVersion); + _services.FakeSDAddInManagement.RegisteredAddIns.Add(_addIn2); + + // Simulation of resolving AddIns <-> NuGet packages + _services.FakeSetup.GetAddInForNuGetPackageCallback = delegate(IPackage package, bool withAddInsMarkedForInstallation) + { + if (package.Id == _addIn_noVersion.Properties[ManagedAddIn.NuGetPackageIDManifestAttribute]) + { + return _addIn_noVersion; + } + else if (package.Id == _addIn2.Properties[ManagedAddIn.NuGetPackageIDManifestAttribute]) + { + return _addIn2; + } + + return null; + }; + + var viewModel = new AvailableAddInsViewModel(_services); + viewModel.ReadPackagesAndWaitForUpdate(); + + Assert.That(viewModel.AddInPackages.Count, Is.EqualTo(2), "AddIn list must contain 2 items."); + + AddInPackageViewModelBase firstAddIn = viewModel.AddInPackages[0]; + Assert.That(firstAddIn.Id, Is.EqualTo(_addIn_noVersion.Manifest.PrimaryIdentity), "Primary identity of 1st AddIn"); + Assert.That(firstAddIn.Name, Is.EqualTo(_addIn_noVersion.Manifest.PrimaryIdentity), "Name of 1st AddIn"); + Assert.That(firstAddIn.Version, Is.EqualTo(fakePackage1.Version.Version), "Version of 1st AddIn"); + Assert.That(firstAddIn.IsInstalled, Is.True, "1st AddIn must be 'installed''"); + Assert.That(firstAddIn.IsOffline, Is.False, "1st AddIn must not be 'offline'"); + Assert.That(firstAddIn.IsEnabled, Is.True, "1st AddIn must be 'enabled'"); + Assert.That(firstAddIn.IsUpdate, Is.False, "1st AddIn must not be 'update'"); + Assert.That(firstAddIn.IsAdded, Is.False, "1st AddIn must not be 'added'"); + Assert.That(firstAddIn.IsRemoved, Is.False, "1st AddIn must not be 'removed'"); + Assert.That(firstAddIn.HasNuGetConnection, Is.False, "1st AddIn must not have 'NuGet connection'"); + Assert.That(viewModel.AddInPackages[0].IsExternallyReferenced, Is.False, "1st AddIn must not be 'externally referenced'"); + Assert.That(viewModel.AddInPackages[1].IsExternallyReferenced, Is.False, "2nd AddIn must not be 'externally referenced'"); + + AddInPackageViewModelBase secondAddIn = viewModel.AddInPackages[1]; + Assert.That(secondAddIn.Id, Is.EqualTo(_addIn2.Manifest.PrimaryIdentity), "Primary identity of 2nd AddIn"); + Assert.That(secondAddIn.Name, Is.EqualTo(_addIn2.Manifest.PrimaryIdentity), "Name of 2nd AddIn"); + Assert.That(secondAddIn.Version, Is.EqualTo(_addIn2.Version), "Version of 2nd AddIn"); + Assert.That(secondAddIn.IsInstalled, Is.True, "2nd AddIn must be 'installed''"); + Assert.That(secondAddIn.IsOffline, Is.False, "2nd AddIn must not be 'offline'"); + Assert.That(secondAddIn.IsEnabled, Is.True, "2nd AddIn must be 'enabled'"); + Assert.That(secondAddIn.IsUpdate, Is.False, "2nd AddIn mustnot be 'update'"); + Assert.That(secondAddIn.IsAdded, Is.False, "2nd AddIn must not be 'added'"); + Assert.That(secondAddIn.IsRemoved, Is.False, "2nd AddIn must not be 'removed'"); + Assert.That(secondAddIn.HasNuGetConnection, Is.False, "2nd AddIn must not have 'NuGet connection'"); + } + + [Test] + public void ShowUpdatableAddIns() + { + CreateAddIns(); + _addIn1.Enabled = true; + // Package to be shown in repository FakePackage fakePackage1_old = new FakePackage() { @@ -271,6 +471,7 @@ namespace ICSharpCode.AddInManager2.Tests _addIn1.Properties.Set(ManagedAddIn.NuGetPackageIDManifestAttribute, fakePackage1_old.Id); _addIn1.Properties.Set(ManagedAddIn.NuGetPackageVersionManifestAttribute, fakePackage1_old.Version.ToString()); _addIn2.Properties.Set(ManagedAddIn.NuGetPackageIDManifestAttribute, fakePackage2.Id); + _addIn2.Properties.Set(ManagedAddIn.NuGetPackageVersionManifestAttribute, fakePackage2.Version.ToString()); // List of NuGet repositories List registeredPackageSources = new List(); diff --git a/src/AddIns/Misc/AddInManager2/AddInManager2.Tests/Fakes/FakeAddInSetup.cs b/src/AddIns/Misc/AddInManager2/AddInManager2.Tests/Fakes/FakeAddInSetup.cs index cc1073a623..fb3fe15cd7 100644 --- a/src/AddIns/Misc/AddInManager2/AddInManager2.Tests/Fakes/FakeAddInSetup.cs +++ b/src/AddIns/Misc/AddInManager2/AddInManager2.Tests/Fakes/FakeAddInSetup.cs @@ -288,7 +288,7 @@ namespace ICSharpCode.AddInManager2.Tests.Fakes } } - return addIn.Version.CompareTo(nuGetPackage.Version.Version); + return addInVersion.CompareTo(nuGetPackage.Version.Version); } } } diff --git a/src/AddIns/Misc/AddInManager2/Project/Src/Model/AddInSetup.cs b/src/AddIns/Misc/AddInManager2/Project/Src/Model/AddInSetup.cs index 8ab197e71c..fcd54bbb9e 100644 --- a/src/AddIns/Misc/AddInManager2/Project/Src/Model/AddInSetup.cs +++ b/src/AddIns/Misc/AddInManager2/Project/Src/Model/AddInSetup.cs @@ -773,7 +773,7 @@ namespace ICSharpCode.AddInManager2.Model } } - return addIn.Version.CompareTo(nuGetPackage.Version.Version); + return addInVersion.CompareTo(nuGetPackage.Version.Version); } public void RemoveUnreferencedNuGetPackages()