20 changed files with 811 additions and 21 deletions
@ -0,0 +1,15 @@ |
|||||||
|
// 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.CodeDom; |
||||||
|
|
||||||
|
namespace ICSharpCode.SharpDevelop.Gui.Dialogs.ReferenceDialog.ServiceReference |
||||||
|
{ |
||||||
|
public interface ICodeDomProvider |
||||||
|
{ |
||||||
|
string FileExtension { get; } |
||||||
|
|
||||||
|
void GenerateCodeFromCompileUnit(CodeCompileUnit compileUnit, string fileName); |
||||||
|
} |
||||||
|
} |
||||||
@ -0,0 +1,12 @@ |
|||||||
|
// 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; |
||||||
|
|
||||||
|
namespace ICSharpCode.SharpDevelop.Gui.Dialogs.ReferenceDialog.ServiceReference |
||||||
|
{ |
||||||
|
public interface IFileSystem |
||||||
|
{ |
||||||
|
void CreateDirectoryIfMissing(string path); |
||||||
|
} |
||||||
|
} |
||||||
@ -0,0 +1,17 @@ |
|||||||
|
// 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; |
||||||
|
|
||||||
|
namespace ICSharpCode.SharpDevelop.Gui.Dialogs.ReferenceDialog.ServiceReference |
||||||
|
{ |
||||||
|
public interface IProjectWithServiceReferences |
||||||
|
{ |
||||||
|
string ServiceReferencesFolder { get; } |
||||||
|
ICodeDomProvider CodeDomProvider { get; } |
||||||
|
|
||||||
|
string GetServiceReferenceFileName(string serviceReferenceName); |
||||||
|
void AddServiceReferenceProxyFile(string fileName); |
||||||
|
void Save(); |
||||||
|
} |
||||||
|
} |
||||||
@ -0,0 +1,15 @@ |
|||||||
|
// 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.CodeDom; |
||||||
|
using System.ServiceModel.Description; |
||||||
|
|
||||||
|
namespace ICSharpCode.SharpDevelop.Gui.Dialogs.ReferenceDialog.ServiceReference |
||||||
|
{ |
||||||
|
public interface IServiceReferenceCodeDomBuilder |
||||||
|
{ |
||||||
|
CodeCompileUnit GenerateCompileUnit(MetadataSet metadata); |
||||||
|
|
||||||
|
} |
||||||
|
} |
||||||
@ -0,0 +1,15 @@ |
|||||||
|
// 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.ServiceModel.Description; |
||||||
|
|
||||||
|
namespace ICSharpCode.SharpDevelop.Gui.Dialogs.ReferenceDialog.ServiceReference |
||||||
|
{ |
||||||
|
public interface IServiceReferenceProxyGenerator |
||||||
|
{ |
||||||
|
string ServiceReferenceNamespace { get; set; } |
||||||
|
|
||||||
|
void GenerateProxy(MetadataSet metadata, string proxyFileName); |
||||||
|
} |
||||||
|
} |
||||||
@ -0,0 +1,80 @@ |
|||||||
|
// 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.CodeDom.Compiler; |
||||||
|
using System.IO; |
||||||
|
using ICSharpCode.SharpDevelop.Project; |
||||||
|
|
||||||
|
namespace ICSharpCode.SharpDevelop.Gui.Dialogs.ReferenceDialog.ServiceReference |
||||||
|
{ |
||||||
|
public class ProjectWithServiceReferences : IProjectWithServiceReferences |
||||||
|
{ |
||||||
|
IProject project; |
||||||
|
string serviceReferencesFolder; |
||||||
|
|
||||||
|
public static readonly string DefaultServiceReferencesFolderName = "Service References"; |
||||||
|
|
||||||
|
public ProjectWithServiceReferences(IProject project) |
||||||
|
: this(project, new ServiceReferenceCodeDomProvider(project)) |
||||||
|
{ |
||||||
|
} |
||||||
|
|
||||||
|
public ProjectWithServiceReferences(IProject project, ICodeDomProvider codeDomProvider) |
||||||
|
{ |
||||||
|
this.project = project; |
||||||
|
this.CodeDomProvider = codeDomProvider; |
||||||
|
} |
||||||
|
|
||||||
|
public string ServiceReferencesFolder { |
||||||
|
get { |
||||||
|
if (serviceReferencesFolder == null) { |
||||||
|
GetServiceReferencesFolder(); |
||||||
|
} |
||||||
|
return serviceReferencesFolder; |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
void GetServiceReferencesFolder() |
||||||
|
{ |
||||||
|
serviceReferencesFolder = Path.Combine(project.Directory, DefaultServiceReferencesFolderName); |
||||||
|
} |
||||||
|
|
||||||
|
public ICodeDomProvider CodeDomProvider { get; private set; } |
||||||
|
|
||||||
|
public string GetServiceReferenceFileName(string serviceReferenceName) |
||||||
|
{ |
||||||
|
return Path.Combine(ServiceReferencesFolder, serviceReferenceName, "Reference.cs"); |
||||||
|
} |
||||||
|
|
||||||
|
public void AddServiceReferenceProxyFile(string fileName) |
||||||
|
{ |
||||||
|
AddServiceReferenceFileToProject(fileName); |
||||||
|
AddServiceReferencesItemToProject(); |
||||||
|
} |
||||||
|
|
||||||
|
void AddServiceReferenceFileToProject(string fileName) |
||||||
|
{ |
||||||
|
var projectItem = new FileProjectItem(project, ItemType.Compile); |
||||||
|
projectItem.FileName = fileName; |
||||||
|
AddProjectItemToProject(projectItem); |
||||||
|
} |
||||||
|
|
||||||
|
void AddProjectItemToProject(ProjectItem item) |
||||||
|
{ |
||||||
|
ProjectService.AddProjectItem(project, item); |
||||||
|
} |
||||||
|
|
||||||
|
void AddServiceReferencesItemToProject() |
||||||
|
{ |
||||||
|
var projectItem = new ServiceReferencesProjectItem(project); |
||||||
|
projectItem.Include = "Service References"; |
||||||
|
AddProjectItemToProject(projectItem); |
||||||
|
} |
||||||
|
|
||||||
|
public void Save() |
||||||
|
{ |
||||||
|
project.Save(); |
||||||
|
} |
||||||
|
} |
||||||
|
} |
||||||
@ -0,0 +1,25 @@ |
|||||||
|
// 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.CodeDom; |
||||||
|
using System.ServiceModel.Description; |
||||||
|
|
||||||
|
namespace ICSharpCode.SharpDevelop.Gui.Dialogs.ReferenceDialog.ServiceReference |
||||||
|
{ |
||||||
|
public class ServiceReferenceCodeDomBuilder : IServiceReferenceCodeDomBuilder |
||||||
|
{ |
||||||
|
public CodeCompileUnit GenerateCompileUnit(MetadataSet metadata) |
||||||
|
{ |
||||||
|
var importer = new WsdlImporter(metadata); |
||||||
|
var contractGenerator = new ServiceContractGenerator(); |
||||||
|
contractGenerator.Options = ServiceContractGenerationOptions.ClientClass; |
||||||
|
|
||||||
|
foreach (ContractDescription contract in importer.ImportAllContracts()) { |
||||||
|
contractGenerator.GenerateServiceContractType(contract); |
||||||
|
} |
||||||
|
|
||||||
|
return contractGenerator.TargetCompileUnit; |
||||||
|
} |
||||||
|
} |
||||||
|
} |
||||||
@ -0,0 +1,42 @@ |
|||||||
|
// 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.CodeDom; |
||||||
|
using System.CodeDom.Compiler; |
||||||
|
using System.IO; |
||||||
|
using ICSharpCode.SharpDevelop.Project; |
||||||
|
|
||||||
|
namespace ICSharpCode.SharpDevelop.Gui.Dialogs.ReferenceDialog.ServiceReference |
||||||
|
{ |
||||||
|
public class ServiceReferenceCodeDomProvider : ICodeDomProvider |
||||||
|
{ |
||||||
|
IProject project; |
||||||
|
CodeDomProvider codeDomProvider; |
||||||
|
|
||||||
|
public ServiceReferenceCodeDomProvider(IProject project) |
||||||
|
{ |
||||||
|
this.project = project; |
||||||
|
} |
||||||
|
|
||||||
|
public string FileExtension { |
||||||
|
get { return CodeDomProvider.FileExtension; } |
||||||
|
} |
||||||
|
|
||||||
|
CodeDomProvider CodeDomProvider { |
||||||
|
get { |
||||||
|
if (codeDomProvider == null) { |
||||||
|
codeDomProvider = project.LanguageProperties.CodeDomProvider; |
||||||
|
} |
||||||
|
return codeDomProvider; |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
public void GenerateCodeFromCompileUnit(CodeCompileUnit compileUnit, string fileName) |
||||||
|
{ |
||||||
|
using (var writer = new StreamWriter(fileName)) { |
||||||
|
CodeDomProvider.GenerateCodeFromCompileUnit(compileUnit, writer, null); |
||||||
|
} |
||||||
|
} |
||||||
|
} |
||||||
|
} |
||||||
@ -0,0 +1,18 @@ |
|||||||
|
// 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; |
||||||
|
|
||||||
|
namespace ICSharpCode.SharpDevelop.Gui.Dialogs.ReferenceDialog.ServiceReference |
||||||
|
{ |
||||||
|
public class ServiceReferenceFileSystem : IFileSystem |
||||||
|
{ |
||||||
|
public void CreateDirectoryIfMissing(string path) |
||||||
|
{ |
||||||
|
if (!Directory.Exists(path)) { |
||||||
|
Directory.CreateDirectory(path); |
||||||
|
} |
||||||
|
} |
||||||
|
} |
||||||
|
} |
||||||
@ -0,0 +1,66 @@ |
|||||||
|
// 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.ServiceModel.Description; |
||||||
|
|
||||||
|
using ICSharpCode.SharpDevelop.Project; |
||||||
|
|
||||||
|
namespace ICSharpCode.SharpDevelop.Gui.Dialogs.ReferenceDialog.ServiceReference |
||||||
|
{ |
||||||
|
public class ServiceReferenceGenerator |
||||||
|
{ |
||||||
|
IProjectWithServiceReferences project; |
||||||
|
IServiceReferenceProxyGenerator proxyGenerator; |
||||||
|
IFileSystem fileSystem; |
||||||
|
|
||||||
|
public ServiceReferenceGenerator(IProject project) |
||||||
|
: this(new ProjectWithServiceReferences(project)) |
||||||
|
{ |
||||||
|
} |
||||||
|
|
||||||
|
public ServiceReferenceGenerator(IProjectWithServiceReferences project) |
||||||
|
: this( |
||||||
|
project, |
||||||
|
new ServiceReferenceProxyGenerator(project.CodeDomProvider), |
||||||
|
new ServiceReferenceFileSystem()) |
||||||
|
{ |
||||||
|
} |
||||||
|
|
||||||
|
public ServiceReferenceGenerator( |
||||||
|
IProjectWithServiceReferences project, |
||||||
|
IServiceReferenceProxyGenerator proxyGenerator, |
||||||
|
IFileSystem fileSystem) |
||||||
|
{ |
||||||
|
this.project = project; |
||||||
|
this.proxyGenerator = proxyGenerator; |
||||||
|
this.fileSystem = fileSystem; |
||||||
|
} |
||||||
|
|
||||||
|
public string Namespace { get; set; } |
||||||
|
|
||||||
|
public void AddServiceReference(MetadataSet metadata) |
||||||
|
{ |
||||||
|
GenerateServiceReferenceProxy(metadata); |
||||||
|
} |
||||||
|
|
||||||
|
void GenerateServiceReferenceProxy(MetadataSet metadata) |
||||||
|
{ |
||||||
|
string fileName = project.GetServiceReferenceFileName(Namespace); |
||||||
|
CreateFolderForFileIfFolderMissing(fileName); |
||||||
|
|
||||||
|
proxyGenerator.GenerateProxy(metadata, fileName); |
||||||
|
|
||||||
|
project.AddServiceReferenceProxyFile(fileName); |
||||||
|
|
||||||
|
project.Save(); |
||||||
|
} |
||||||
|
|
||||||
|
void CreateFolderForFileIfFolderMissing(string fileName) |
||||||
|
{ |
||||||
|
string folder = Path.GetDirectoryName(fileName); |
||||||
|
fileSystem.CreateDirectoryIfMissing(folder); |
||||||
|
} |
||||||
|
} |
||||||
|
} |
||||||
@ -0,0 +1,42 @@ |
|||||||
|
// 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.CodeDom; |
||||||
|
using System.IO; |
||||||
|
using System.ServiceModel.Description; |
||||||
|
|
||||||
|
namespace ICSharpCode.SharpDevelop.Gui.Dialogs.ReferenceDialog.ServiceReference |
||||||
|
{ |
||||||
|
public class ServiceReferenceProxyGenerator : IServiceReferenceProxyGenerator |
||||||
|
{ |
||||||
|
IServiceReferenceCodeDomBuilder codeDomBuilder; |
||||||
|
ICodeDomProvider codeDomProvider; |
||||||
|
|
||||||
|
public ServiceReferenceProxyGenerator(ICodeDomProvider codeDomProvider) |
||||||
|
: this(codeDomProvider, new ServiceReferenceCodeDomBuilder()) |
||||||
|
{ |
||||||
|
} |
||||||
|
|
||||||
|
public ServiceReferenceProxyGenerator( |
||||||
|
ICodeDomProvider codeDomProvider, |
||||||
|
IServiceReferenceCodeDomBuilder codeDomBuilder) |
||||||
|
{ |
||||||
|
this.codeDomProvider = codeDomProvider; |
||||||
|
this.codeDomBuilder = codeDomBuilder; |
||||||
|
} |
||||||
|
|
||||||
|
public string ServiceReferenceNamespace { get; set; } |
||||||
|
|
||||||
|
public void GenerateProxy(MetadataSet metadata, string proxyFileName) |
||||||
|
{ |
||||||
|
CodeCompileUnit compileUnit = codeDomBuilder.GenerateCompileUnit(metadata); |
||||||
|
GenerateProxy(compileUnit, proxyFileName); |
||||||
|
} |
||||||
|
|
||||||
|
void GenerateProxy(CodeCompileUnit compileUnit, string fileName) |
||||||
|
{ |
||||||
|
codeDomProvider.GenerateCodeFromCompileUnit(compileUnit, fileName); |
||||||
|
} |
||||||
|
} |
||||||
|
} |
||||||
@ -0,0 +1,50 @@ |
|||||||
|
// 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.ServiceModel.Description; |
||||||
|
using System.Xml.Schema; |
||||||
|
|
||||||
|
using WSDescription = System.Web.Services.Description; |
||||||
|
using WSDiscovery = System.Web.Services.Discovery; |
||||||
|
|
||||||
|
namespace ICSharpCode.SharpDevelop.Gui.Dialogs.ReferenceDialog.ServiceReference |
||||||
|
{ |
||||||
|
public class WebServiceMetadataSet : MetadataSet |
||||||
|
{ |
||||||
|
public static readonly string EmptyMetadataIdentifier = String.Empty; |
||||||
|
|
||||||
|
public WebServiceMetadataSet(WSDiscovery.DiscoveryClientProtocol discoveryClient) |
||||||
|
{ |
||||||
|
AddToMetadata(discoveryClient.Documents); |
||||||
|
} |
||||||
|
|
||||||
|
void AddToMetadata(WSDiscovery.DiscoveryClientDocumentCollection documents) |
||||||
|
{ |
||||||
|
foreach (object document in documents.Values) { |
||||||
|
AddToMetadataIfNotNull(document as WSDescription.ServiceDescription); |
||||||
|
AddToMetadataIfNotNull(document as XmlSchema); |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
void AddToMetadataIfNotNull(WSDescription.ServiceDescription serviceDescription) |
||||||
|
{ |
||||||
|
if (serviceDescription != null) { |
||||||
|
AddMetadataSection(MetadataSection.ServiceDescriptionDialect, serviceDescription); |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
void AddMetadataSection(string dialect, object metadata) |
||||||
|
{ |
||||||
|
var metadataSection = new MetadataSection(dialect, EmptyMetadataIdentifier, metadata); |
||||||
|
MetadataSections.Add(metadataSection); |
||||||
|
} |
||||||
|
|
||||||
|
void AddToMetadataIfNotNull(XmlSchema schema) |
||||||
|
{ |
||||||
|
if (schema != null) { |
||||||
|
AddMetadataSection(MetadataSection.XmlSchemaDialect, schema); |
||||||
|
} |
||||||
|
} |
||||||
|
} |
||||||
|
} |
||||||
@ -0,0 +1,131 @@ |
|||||||
|
// 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.CodeDom.Compiler; |
||||||
|
using System.Collections.Generic; |
||||||
|
using System.Linq; |
||||||
|
using ICSharpCode.SharpDevelop.Dom; |
||||||
|
using ICSharpCode.SharpDevelop.Gui.Dialogs.ReferenceDialog.ServiceReference; |
||||||
|
using ICSharpCode.SharpDevelop.Project; |
||||||
|
using ICSharpCode.SharpDevelop.Tests.WebReferences; |
||||||
|
using Microsoft.CSharp; |
||||||
|
using NUnit.Framework; |
||||||
|
using Rhino.Mocks; |
||||||
|
|
||||||
|
namespace ICSharpCode.SharpDevelop.Tests.ServiceReferences |
||||||
|
{ |
||||||
|
[TestFixture] |
||||||
|
public class ProjectWithServiceReferencesTests |
||||||
|
{ |
||||||
|
IProject fakeProject; |
||||||
|
ProjectWithServiceReferences project; |
||||||
|
List<ProjectItem> projectItemsAddedToProject; |
||||||
|
MSBuildBasedProject msbuildProject; |
||||||
|
|
||||||
|
void CreateProject() |
||||||
|
{ |
||||||
|
projectItemsAddedToProject = new List<ProjectItem>(); |
||||||
|
fakeProject = MockRepository.GenerateStub<IProject>(); |
||||||
|
project = new ProjectWithServiceReferences(fakeProject); |
||||||
|
} |
||||||
|
|
||||||
|
void CreateProjectWithMSBuildProject() |
||||||
|
{ |
||||||
|
msbuildProject = WebReferenceTestHelper.CreateTestProject("C#"); |
||||||
|
project = new ProjectWithServiceReferences(msbuildProject); |
||||||
|
} |
||||||
|
|
||||||
|
void SetProjectDirectory(string directory) |
||||||
|
{ |
||||||
|
fakeProject.Stub(p => p.Directory).Return(directory); |
||||||
|
} |
||||||
|
|
||||||
|
void SetProjectCodeDomProvider(LanguageProperties languageProperties) |
||||||
|
{ |
||||||
|
fakeProject.Stub(p => p.LanguageProperties).Return(languageProperties); |
||||||
|
} |
||||||
|
|
||||||
|
ProjectItem GetFirstServiceReferenceFileInMSBuildProject(string fileName) |
||||||
|
{ |
||||||
|
return msbuildProject.Items.SingleOrDefault(item => item.FileName == fileName); |
||||||
|
} |
||||||
|
|
||||||
|
ServiceReferencesProjectItem GetFirstWCFMetadataItemInMSBuildProject() |
||||||
|
{ |
||||||
|
return msbuildProject.GetItemsOfType(ItemType.ServiceReferences).SingleOrDefault() as ServiceReferencesProjectItem; |
||||||
|
} |
||||||
|
|
||||||
|
[Test] |
||||||
|
public void ServiceReferencesFolder_ProjectHasNoServiceReferences_ReturnsServiceReferencesFolderAsProjectSubFolder() |
||||||
|
{ |
||||||
|
CreateProject(); |
||||||
|
SetProjectDirectory(@"d:\projects\MyProject"); |
||||||
|
|
||||||
|
string folder = project.ServiceReferencesFolder; |
||||||
|
string expectedFolder = @"d:\projects\MyProject\Service References"; |
||||||
|
|
||||||
|
Assert.AreEqual(expectedFolder, folder); |
||||||
|
} |
||||||
|
|
||||||
|
[Test] |
||||||
|
public void CodeDomProvider_UnderlyingProjectUsesCSharpCodeDomProvider_ProjectUsesCSharpCodeDomProvider() |
||||||
|
{ |
||||||
|
CreateProject(); |
||||||
|
SetProjectCodeDomProvider(LanguageProperties.CSharp); |
||||||
|
|
||||||
|
ICodeDomProvider codeDomProvider = project.CodeDomProvider; |
||||||
|
string fileExtension = codeDomProvider.FileExtension; |
||||||
|
|
||||||
|
Assert.AreEqual("cs", fileExtension); |
||||||
|
} |
||||||
|
|
||||||
|
[Test] |
||||||
|
public void GetServiceReferenceProxyFileName_ProjectHasNoServiceReferences_ReturnsFileNameInServiceReferencesFolderWithSubFolderNamedAfterServiceReference() |
||||||
|
{ |
||||||
|
CreateProject(); |
||||||
|
SetProjectDirectory(@"d:\projects\MyProject"); |
||||||
|
|
||||||
|
string fileName = project.GetServiceReferenceFileName("Service1"); |
||||||
|
string expectedFileName = @"d:\projects\MyProject\Service References\Service1\Reference.cs"; |
||||||
|
|
||||||
|
Assert.AreEqual(expectedFileName, fileName); |
||||||
|
} |
||||||
|
|
||||||
|
[Test] |
||||||
|
public void AddServiceReferenceProxyFile_ProjectHasNoServiceReferences_ProxyFileAddedToProjectAsFileToCompile() |
||||||
|
{ |
||||||
|
CreateProjectWithMSBuildProject(); |
||||||
|
|
||||||
|
string proxyFileName = @"d:\projects\MyProject\Service References\Service1\Reference.cs"; |
||||||
|
project.AddServiceReferenceProxyFile(proxyFileName); |
||||||
|
|
||||||
|
ProjectItem item = GetFirstServiceReferenceFileInMSBuildProject(proxyFileName); |
||||||
|
|
||||||
|
Assert.AreEqual(ItemType.Compile, item.ItemType); |
||||||
|
} |
||||||
|
|
||||||
|
[Test] |
||||||
|
public void Save_SaveProjectChanges_UnderlyingProjectIsSaved() |
||||||
|
{ |
||||||
|
CreateProject(); |
||||||
|
|
||||||
|
project.Save(); |
||||||
|
|
||||||
|
fakeProject.AssertWasCalled(p => p.Save()); |
||||||
|
} |
||||||
|
|
||||||
|
[Test] |
||||||
|
public void AddServiceReferenceProxyFile_ProjectHasNoServiceReferences_WCFMetadataItemAddedToProjectForServiceReferencesFolder() |
||||||
|
{ |
||||||
|
CreateProjectWithMSBuildProject(); |
||||||
|
|
||||||
|
string proxyFileName = @"d:\projects\MyProject\Service References\Service1\Reference.cs"; |
||||||
|
project.AddServiceReferenceProxyFile(proxyFileName); |
||||||
|
|
||||||
|
ServiceReferencesProjectItem item = GetFirstWCFMetadataItemInMSBuildProject(); |
||||||
|
|
||||||
|
Assert.AreEqual("Service References", item.Include); |
||||||
|
} |
||||||
|
} |
||||||
|
} |
||||||
@ -0,0 +1,88 @@ |
|||||||
|
// 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.ServiceModel.Description; |
||||||
|
using ICSharpCode.SharpDevelop.Gui.Dialogs.ReferenceDialog.ServiceReference; |
||||||
|
using ICSharpCode.SharpDevelop.Project; |
||||||
|
using NUnit.Framework; |
||||||
|
using Rhino.Mocks; |
||||||
|
|
||||||
|
namespace ICSharpCode.SharpDevelop.Tests.ServiceReferences |
||||||
|
{ |
||||||
|
[TestFixture] |
||||||
|
public class ServiceReferenceGeneratorTests |
||||||
|
{ |
||||||
|
IProjectWithServiceReferences fakeProject; |
||||||
|
IServiceReferenceProxyGenerator fakeProxyGenerator; |
||||||
|
ServiceReferenceGenerator generator; |
||||||
|
IFileSystem fakeFileSystem; |
||||||
|
MetadataSet metadata; |
||||||
|
|
||||||
|
void CreateGenerator() |
||||||
|
{ |
||||||
|
metadata = new MetadataSet(); |
||||||
|
|
||||||
|
fakeProject = MockRepository.GenerateStub<IProjectWithServiceReferences>(); |
||||||
|
fakeProxyGenerator = MockRepository.GenerateStub<IServiceReferenceProxyGenerator>(); |
||||||
|
fakeFileSystem = MockRepository.GenerateStub<IFileSystem>(); |
||||||
|
generator = new ServiceReferenceGenerator(fakeProject, fakeProxyGenerator, fakeFileSystem); |
||||||
|
} |
||||||
|
|
||||||
|
void SetServiceReferenceFileName(string serviceReferenceName, string fileName) |
||||||
|
{ |
||||||
|
fakeProject.Stub(p => p.GetServiceReferenceFileName(serviceReferenceName)).Return(fileName); |
||||||
|
} |
||||||
|
|
||||||
|
[Test] |
||||||
|
public void AddServiceReference_GeneratesServiceReference_MetadataPassedToProxyGenerator() |
||||||
|
{ |
||||||
|
CreateGenerator(); |
||||||
|
string expectedProxyFileName = @"d:\projects\MyProject\Service References\MyServiceRef\Reference.cs"; |
||||||
|
SetServiceReferenceFileName("MyServiceRef", expectedProxyFileName); |
||||||
|
generator.Namespace = "MyServiceRef"; |
||||||
|
|
||||||
|
generator.AddServiceReference(metadata); |
||||||
|
|
||||||
|
fakeProxyGenerator.AssertWasCalled(p => p.GenerateProxy(metadata, expectedProxyFileName)); |
||||||
|
} |
||||||
|
|
||||||
|
[Test] |
||||||
|
public void AddServiceReference_ServiceReferenceDoesNotExist_ServiceReferenceFolderCreated() |
||||||
|
{ |
||||||
|
CreateGenerator(); |
||||||
|
string proxyFileName = @"d:\projects\MyProject\Service References\MyService1\Reference.cs"; |
||||||
|
SetServiceReferenceFileName("MyService1", proxyFileName); |
||||||
|
generator.Namespace = "MyService1"; |
||||||
|
|
||||||
|
generator.AddServiceReference(metadata); |
||||||
|
|
||||||
|
string expectedDirectory = @"d:\projects\MyProject\Service References\MyService1"; |
||||||
|
|
||||||
|
fakeFileSystem.AssertWasCalled(f => f.CreateDirectoryIfMissing(expectedDirectory)); |
||||||
|
} |
||||||
|
|
||||||
|
[Test] |
||||||
|
public void AddServiceReference_GeneratesServiceReference_ServiceReferenceProxyFileAddedToProject() |
||||||
|
{ |
||||||
|
CreateGenerator(); |
||||||
|
string expectedProxyFileName = @"d:\projects\MyProject\Service References\MyServiceRef\Reference.cs"; |
||||||
|
SetServiceReferenceFileName("MyServiceRef", expectedProxyFileName); |
||||||
|
generator.Namespace = "MyServiceRef"; |
||||||
|
|
||||||
|
generator.AddServiceReference(metadata); |
||||||
|
|
||||||
|
fakeProject.AssertWasCalled(p => p.AddServiceReferenceProxyFile(expectedProxyFileName)); |
||||||
|
} |
||||||
|
|
||||||
|
[Test] |
||||||
|
public void AddServiceReference_GeneratesServiceReference_ProjectIsSaved() |
||||||
|
{ |
||||||
|
CreateGenerator(); |
||||||
|
|
||||||
|
generator.AddServiceReference(metadata); |
||||||
|
|
||||||
|
fakeProject.AssertWasCalled(p => p.Save()); |
||||||
|
} |
||||||
|
} |
||||||
|
} |
||||||
@ -0,0 +1,52 @@ |
|||||||
|
// 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.CodeDom; |
||||||
|
using System.ServiceModel.Description; |
||||||
|
using ICSharpCode.SharpDevelop.Gui.Dialogs.ReferenceDialog.ServiceReference; |
||||||
|
using NUnit.Framework; |
||||||
|
using Rhino.Mocks; |
||||||
|
|
||||||
|
namespace ICSharpCode.SharpDevelop.Tests.ServiceReferences |
||||||
|
{ |
||||||
|
[TestFixture] |
||||||
|
public class ServiceReferenceProxyGeneratorTests |
||||||
|
{ |
||||||
|
ServiceReferenceProxyGenerator proxyGenerator; |
||||||
|
IProjectWithServiceReferences fakeProject; |
||||||
|
IServiceReferenceCodeDomBuilder fakeCodeDomBuilder; |
||||||
|
ICodeDomProvider fakeCodeDomProvider; |
||||||
|
MetadataSet metadata; |
||||||
|
|
||||||
|
void CreateProxyGenerator() |
||||||
|
{ |
||||||
|
metadata = new MetadataSet(); |
||||||
|
|
||||||
|
fakeCodeDomBuilder = MockRepository.GenerateStub<IServiceReferenceCodeDomBuilder>(); |
||||||
|
fakeProject = MockRepository.GenerateStub<IProjectWithServiceReferences>(); |
||||||
|
fakeCodeDomProvider = MockRepository.GenerateStub<ICodeDomProvider>(); |
||||||
|
proxyGenerator = new ServiceReferenceProxyGenerator(fakeCodeDomProvider, fakeCodeDomBuilder); |
||||||
|
} |
||||||
|
|
||||||
|
CodeCompileUnit CreateCompileUnitToReturnFromCodeDomBuilder(MetadataSet metadata) |
||||||
|
{ |
||||||
|
var compileUnit = new CodeCompileUnit(); |
||||||
|
fakeCodeDomBuilder.Stub(c => c.GenerateCompileUnit(metadata)).Return(compileUnit); |
||||||
|
return compileUnit; |
||||||
|
} |
||||||
|
|
||||||
|
[Test] |
||||||
|
public void GenerateProxy_ProxyToBeGeneratedForMetadata_CodeGeneratedFromCodeDomForProxyFileInProjectSubFolder() |
||||||
|
{ |
||||||
|
CreateProxyGenerator(); |
||||||
|
CodeCompileUnit compileUnit = CreateCompileUnitToReturnFromCodeDomBuilder(metadata); |
||||||
|
proxyGenerator.ServiceReferenceNamespace = "Test"; |
||||||
|
string expectedProxyFileName = @"d:\projects\MyProject\Service References\Test\Service1\Reference.cs"; |
||||||
|
|
||||||
|
proxyGenerator.GenerateProxy(metadata, expectedProxyFileName); |
||||||
|
|
||||||
|
fakeCodeDomProvider.AssertWasCalled(p => p.GenerateCodeFromCompileUnit(compileUnit, expectedProxyFileName)); |
||||||
|
} |
||||||
|
} |
||||||
|
} |
||||||
@ -0,0 +1,97 @@ |
|||||||
|
// 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.Linq; |
||||||
|
using System.ServiceModel.Description; |
||||||
|
using System.Web.Services.Discovery; |
||||||
|
using System.Xml.Schema; |
||||||
|
using ICSharpCode.SharpDevelop.Gui.Dialogs.ReferenceDialog.ServiceReference; |
||||||
|
using NUnit.Framework; |
||||||
|
using WSDescription = System.Web.Services.Description; |
||||||
|
using WSDiscovery = System.Web.Services.Discovery; |
||||||
|
|
||||||
|
namespace ICSharpCode.SharpDevelop.Tests.ServiceReferences |
||||||
|
{ |
||||||
|
[TestFixture] |
||||||
|
public class WebServiceMetadataSetTests |
||||||
|
{ |
||||||
|
DiscoveryClientProtocol discoveryProtocol; |
||||||
|
WebServiceMetadataSet metadata; |
||||||
|
|
||||||
|
void CreateDiscoveryProtocol() |
||||||
|
{ |
||||||
|
discoveryProtocol = new DiscoveryClientProtocol(); |
||||||
|
} |
||||||
|
|
||||||
|
WSDescription.ServiceDescription AddServiceDescriptionToDiscoveryProtocol() |
||||||
|
{ |
||||||
|
var serviceDescription = new WSDescription.ServiceDescription(); |
||||||
|
discoveryProtocol.Documents.Add("http://ServiceDescription", serviceDescription); |
||||||
|
return serviceDescription; |
||||||
|
} |
||||||
|
|
||||||
|
void CreateMetadata() |
||||||
|
{ |
||||||
|
metadata = new WebServiceMetadataSet(discoveryProtocol); |
||||||
|
} |
||||||
|
|
||||||
|
XmlSchema AddXmlSchemaToDiscoveryProtocol() |
||||||
|
{ |
||||||
|
var schema = new XmlSchema(); |
||||||
|
discoveryProtocol.Documents.Add("http://XmlSchema", schema); |
||||||
|
return schema; |
||||||
|
} |
||||||
|
|
||||||
|
[Test] |
||||||
|
public void Constructor_DiscoveryProtocolHasOneServiceDescription_ServiceDescriptionAddedToMetadata() |
||||||
|
{ |
||||||
|
CreateDiscoveryProtocol(); |
||||||
|
WSDescription.ServiceDescription serviceDescription = |
||||||
|
AddServiceDescriptionToDiscoveryProtocol(); |
||||||
|
CreateMetadata(); |
||||||
|
|
||||||
|
MetadataSection section = metadata.MetadataSections.First(); |
||||||
|
|
||||||
|
Assert.AreEqual(serviceDescription, section.Metadata); |
||||||
|
} |
||||||
|
|
||||||
|
[Test] |
||||||
|
public void Constructor_DiscoveryProtocolHasOneServiceDescription_ServiceDescriptionMetadataHasServiceDescriptionDialect() |
||||||
|
{ |
||||||
|
CreateDiscoveryProtocol(); |
||||||
|
WSDescription.ServiceDescription serviceDescription = |
||||||
|
AddServiceDescriptionToDiscoveryProtocol(); |
||||||
|
CreateMetadata(); |
||||||
|
|
||||||
|
MetadataSection section = metadata.MetadataSections.First(); |
||||||
|
|
||||||
|
Assert.AreEqual(MetadataSection.ServiceDescriptionDialect, section.Dialect); |
||||||
|
} |
||||||
|
|
||||||
|
[Test] |
||||||
|
public void Constructor_DiscoveryProtocolHasOneXmlSchema_XmlSchemaAddedToMetadata() |
||||||
|
{ |
||||||
|
CreateDiscoveryProtocol(); |
||||||
|
XmlSchema schema = AddXmlSchemaToDiscoveryProtocol(); |
||||||
|
CreateMetadata(); |
||||||
|
|
||||||
|
MetadataSection section = metadata.MetadataSections.First(); |
||||||
|
|
||||||
|
Assert.AreEqual(schema, section.Metadata); |
||||||
|
} |
||||||
|
|
||||||
|
[Test] |
||||||
|
public void Constructor_DiscoveryProtocolHasOneXmlSchema_XmlSchemaAddedToMetadataHasXmlSchemaDialect() |
||||||
|
{ |
||||||
|
CreateDiscoveryProtocol(); |
||||||
|
XmlSchema schema = AddXmlSchemaToDiscoveryProtocol(); |
||||||
|
CreateMetadata(); |
||||||
|
|
||||||
|
MetadataSection section = metadata.MetadataSections.First(); |
||||||
|
|
||||||
|
Assert.AreEqual(MetadataSection.XmlSchemaDialect, section.Dialect); |
||||||
|
} |
||||||
|
|
||||||
|
} |
||||||
|
} |
||||||
Loading…
Reference in new issue