Browse Source

Add reference to System.ServiceModel assembly when adding a service reference.

pull/18/head
Matt Ward 14 years ago
parent
commit
fcb7abb0a7
  1. 1
      src/Main/Base/Project/Src/Gui/Dialogs/ReferenceDialog/ServiceReference/IProjectWithServiceReferences.cs
  2. 27
      src/Main/Base/Project/Src/Gui/Dialogs/ReferenceDialog/ServiceReference/ProjectWithServiceReferences.cs
  3. 4
      src/Main/Base/Project/Src/Gui/Dialogs/ReferenceDialog/ServiceReference/ServiceReferenceGenerator.cs
  4. 82
      src/Main/Base/Test/ServiceReferences/ProjectWithServiceReferencesTests.cs
  5. 29
      src/Main/Base/Test/ServiceReferences/ServiceReferenceGeneratorTests.cs

1
src/Main/Base/Project/Src/Gui/Dialogs/ReferenceDialog/ServiceReference/IProjectWithServiceReferences.cs

@ -15,5 +15,6 @@ namespace ICSharpCode.SharpDevelop.Gui.Dialogs.ReferenceDialog.ServiceReference @@ -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);
}
}

27
src/Main/Base/Project/Src/Gui/Dialogs/ReferenceDialog/ServiceReference/ProjectWithServiceReferences.cs

@ -4,6 +4,8 @@ @@ -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 @@ -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);
}
}
}

4
src/Main/Base/Project/Src/Gui/Dialogs/ReferenceDialog/ServiceReference/ServiceReferenceGenerator.cs

@ -43,6 +43,8 @@ namespace ICSharpCode.SharpDevelop.Gui.Dialogs.ReferenceDialog.ServiceReference @@ -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 @@ -58,8 +60,6 @@ namespace ICSharpCode.SharpDevelop.Gui.Dialogs.ReferenceDialog.ServiceReference
project.AddServiceReferenceProxyFile(referenceFileName);
project.AddServiceReferenceMapFile(mapFileName);
project.Save();
}
void CreateFolderForFileIfFolderMissing(string fileName)

82
src/Main/Base/Test/ServiceReferences/ProjectWithServiceReferencesTests.cs

@ -67,6 +67,24 @@ namespace ICSharpCode.SharpDevelop.Tests.ServiceReferences @@ -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 @@ -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);
}
}
}

29
src/Main/Base/Test/ServiceReferences/ServiceReferenceGeneratorTests.cs

@ -159,5 +159,34 @@ namespace ICSharpCode.SharpDevelop.Tests.ServiceReferences @@ -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<MethodInvocation>(
mi => fakeProject.AssertWasCalled(p => p.AddAssemblyReference("System.ServiceModel"))));
generator.AddServiceReference(metadata);
}
}
}

Loading…
Cancel
Save