From fcb7abb0a7d0516439b1598c62e3ba95fc386f6d Mon Sep 17 00:00:00 2001 From: Matt Ward Date: Sun, 15 Jan 2012 14:12:34 +0000 Subject: [PATCH] Add reference to System.ServiceModel assembly when adding a service reference. --- .../IProjectWithServiceReferences.cs | 1 + .../ProjectWithServiceReferences.cs | 27 ++++++ .../ServiceReferenceGenerator.cs | 4 +- .../ProjectWithServiceReferencesTests.cs | 82 +++++++++++++++++++ .../ServiceReferenceGeneratorTests.cs | 29 +++++++ 5 files changed, 141 insertions(+), 2 deletions(-) diff --git a/src/Main/Base/Project/Src/Gui/Dialogs/ReferenceDialog/ServiceReference/IProjectWithServiceReferences.cs b/src/Main/Base/Project/Src/Gui/Dialogs/ReferenceDialog/ServiceReference/IProjectWithServiceReferences.cs index 58f0bbc739..26f041abb6 100644 --- a/src/Main/Base/Project/Src/Gui/Dialogs/ReferenceDialog/ServiceReference/IProjectWithServiceReferences.cs +++ b/src/Main/Base/Project/Src/Gui/Dialogs/ReferenceDialog/ServiceReference/IProjectWithServiceReferences.cs @@ -15,5 +15,6 @@ namespace ICSharpCode.SharpDevelop.Gui.Dialogs.ReferenceDialog.ServiceReference void AddServiceReferenceProxyFile(ServiceReferenceFileName fileName); void AddServiceReferenceMapFile(ServiceReferenceMapFileName fileName); void Save(); + void AddAssemblyReference(string referenceName); } } diff --git a/src/Main/Base/Project/Src/Gui/Dialogs/ReferenceDialog/ServiceReference/ProjectWithServiceReferences.cs b/src/Main/Base/Project/Src/Gui/Dialogs/ReferenceDialog/ServiceReference/ProjectWithServiceReferences.cs index eb5ffe4abe..16a155f91f 100644 --- a/src/Main/Base/Project/Src/Gui/Dialogs/ReferenceDialog/ServiceReference/ProjectWithServiceReferences.cs +++ b/src/Main/Base/Project/Src/Gui/Dialogs/ReferenceDialog/ServiceReference/ProjectWithServiceReferences.cs @@ -4,6 +4,8 @@ using System; using System.CodeDom.Compiler; using System.IO; +using System.Linq; + using ICSharpCode.SharpDevelop.Project; namespace ICSharpCode.SharpDevelop.Gui.Dialogs.ReferenceDialog.ServiceReference @@ -96,5 +98,30 @@ namespace ICSharpCode.SharpDevelop.Gui.Dialogs.ReferenceDialog.ServiceReference var projectItem = new ServiceReferenceMapFileProjectItem(project, fileName.Path); AddProjectItemToProject(projectItem); } + + public void AddAssemblyReference(string referenceName) + { + if (!AssemblyReferenceExists(referenceName)) { + var projectItem = new ReferenceProjectItem(project, referenceName); + AddProjectItemToProject(projectItem); + } + } + + bool AssemblyReferenceExists(string referenceName) + { + return project + .GetItemsOfType(ItemType.Reference) + .Any(item => IsAssemblyReferenceMatch((ReferenceProjectItem)item, referenceName)); + } + + bool IsAssemblyReferenceMatch(ReferenceProjectItem item, string referenceName) + { + return IsMatchIgnoringCase(item.AssemblyName.ShortName, referenceName); + } + + static bool IsMatchIgnoringCase(string a, string b) + { + return String.Equals(a, b, StringComparison.OrdinalIgnoreCase); + } } } diff --git a/src/Main/Base/Project/Src/Gui/Dialogs/ReferenceDialog/ServiceReference/ServiceReferenceGenerator.cs b/src/Main/Base/Project/Src/Gui/Dialogs/ReferenceDialog/ServiceReference/ServiceReferenceGenerator.cs index 7180fd116c..07b30a0d75 100644 --- a/src/Main/Base/Project/Src/Gui/Dialogs/ReferenceDialog/ServiceReference/ServiceReferenceGenerator.cs +++ b/src/Main/Base/Project/Src/Gui/Dialogs/ReferenceDialog/ServiceReference/ServiceReferenceGenerator.cs @@ -43,6 +43,8 @@ namespace ICSharpCode.SharpDevelop.Gui.Dialogs.ReferenceDialog.ServiceReference public void AddServiceReference(MetadataSet metadata) { GenerateServiceReferenceProxy(metadata); + project.AddAssemblyReference("System.ServiceModel"); + project.Save(); } void GenerateServiceReferenceProxy(MetadataSet metadata) @@ -58,8 +60,6 @@ namespace ICSharpCode.SharpDevelop.Gui.Dialogs.ReferenceDialog.ServiceReference project.AddServiceReferenceProxyFile(referenceFileName); project.AddServiceReferenceMapFile(mapFileName); - - project.Save(); } void CreateFolderForFileIfFolderMissing(string fileName) diff --git a/src/Main/Base/Test/ServiceReferences/ProjectWithServiceReferencesTests.cs b/src/Main/Base/Test/ServiceReferences/ProjectWithServiceReferencesTests.cs index 4719d3d2e2..9d7766d088 100644 --- a/src/Main/Base/Test/ServiceReferences/ProjectWithServiceReferencesTests.cs +++ b/src/Main/Base/Test/ServiceReferences/ProjectWithServiceReferencesTests.cs @@ -67,6 +67,24 @@ namespace ICSharpCode.SharpDevelop.Tests.ServiceReferences return msbuildProject.Items.Single(item => item.FileName == fileName) as FileProjectItem; } + ReferenceProjectItem GetReferenceFromMSBuildProject(string name) + { + return msbuildProject + .GetItemsOfType(ItemType.Reference) + .SingleOrDefault(item => item.Include == name) as ReferenceProjectItem; + } + + void AddAssemblyReferenceToMSBuildProject(string name) + { + var item = new ReferenceProjectItem(msbuildProject, name); + ProjectService.AddProjectItem(msbuildProject, item); + } + + int CountAssemblyReferencesInMSBuildProject() + { + return msbuildProject.GetItemsOfType(ItemType.Reference).Count(); + } + [Test] public void ServiceReferencesFolder_ProjectHasNoServiceReferences_ReturnsServiceReferencesFolderAsProjectSubFolder() { @@ -188,5 +206,69 @@ namespace ICSharpCode.SharpDevelop.Tests.ServiceReferences Assert.AreEqual("Reference.cs", lastGenOutput); Assert.AreEqual("WCF Proxy Generator", generator); } + + [Test] + public void AddAssemblyReference_SystemServiceModelAddedToProjectWithoutReference_AssemblyReferenceAdded() + { + CreateProjectWithMSBuildProject(); + + project.AddAssemblyReference("System.ServiceModel"); + + ReferenceProjectItem item = GetReferenceFromMSBuildProject("System.ServiceModel"); + + Assert.IsNotNull(item); + } + + [Test] + public void AddAssemblyReference_SystemServiceModelAddedToProjectThatHasSystemServiceModelReference_AssemblyReferenceIsNotAdded() + { + CreateProjectWithMSBuildProject(); + AddAssemblyReferenceToMSBuildProject("System.ServiceModel"); + + project.AddAssemblyReference("System.ServiceModel"); + + int count = CountAssemblyReferencesInMSBuildProject(); + + Assert.AreEqual(1, count); + } + + [Test] + public void AddAssemblyReference_SystemServiceModelAddedToProjectThatHasOneReferenceToSystemXml_ProjectHasTwoReferences() + { + CreateProjectWithMSBuildProject(); + AddAssemblyReferenceToMSBuildProject("System.Xml"); + + project.AddAssemblyReference("System.ServiceModel"); + + int count = CountAssemblyReferencesInMSBuildProject(); + + Assert.AreEqual(2, count); + } + + [Test] + public void AddAssemblyReference_SystemServiceModelAddedToProjectThatHasSystemServiceModelReferenceInDifferentCase_AssemblyReferenceIsNotAdded() + { + CreateProjectWithMSBuildProject(); + AddAssemblyReferenceToMSBuildProject("system.serviceModel"); + + project.AddAssemblyReference("System.ServiceModel"); + + int count = CountAssemblyReferencesInMSBuildProject(); + + Assert.AreEqual(1, count); + } + + [Test] + public void AddAssemblyReference_SystemServiceModelAddedToProjectThatHasSystemServiceModelReferenceUsingFullAssemblyNa_AssemblyReferenceIsNotAdded() + { + CreateProjectWithMSBuildProject(); + AddAssemblyReferenceToMSBuildProject("System.ServiceModel, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089"); + + project.AddAssemblyReference("System.ServiceModel"); + + int count = CountAssemblyReferencesInMSBuildProject(); + + Assert.AreEqual(1, count); + } } } diff --git a/src/Main/Base/Test/ServiceReferences/ServiceReferenceGeneratorTests.cs b/src/Main/Base/Test/ServiceReferences/ServiceReferenceGeneratorTests.cs index 7b0fe50ab0..10be3a2bb1 100644 --- a/src/Main/Base/Test/ServiceReferences/ServiceReferenceGeneratorTests.cs +++ b/src/Main/Base/Test/ServiceReferences/ServiceReferenceGeneratorTests.cs @@ -159,5 +159,34 @@ namespace ICSharpCode.SharpDevelop.Tests.ServiceReferences fakeProject.AssertWasCalled(p => p.AddServiceReferenceMapFile(expectedMapFileName)); } + + [Test] + public void AddServiceReference_ProjectDoesNotHaveSystemServiceModelReference_SystemServiceModelReferenceAddedToProject() + { + CreateGenerator(); + AddProxyFileNameForServiceName("MyService"); + AddMapFileNameForServiceName("MyService"); + generator.Namespace = "MyService"; + + generator.AddServiceReference(metadata); + + fakeProject.AssertWasCalled(p => p.AddAssemblyReference("System.ServiceModel")); + } + + [Test] + public void AddServiceReference_ProjectDoesNotHaveSystemServiceModelReference_ProjectIsSavedAfterReferenceIsAdded() + { + CreateGenerator(); + AddProxyFileNameForServiceName("MyService"); + AddMapFileNameForServiceName("MyService"); + generator.Namespace = "MyService"; + + fakeProject + .Stub(p => p.Save()) + .WhenCalled(new Action( + mi => fakeProject.AssertWasCalled(p => p.AddAssemblyReference("System.ServiceModel")))); + + generator.AddServiceReference(metadata); + } } }