diff --git a/src/Main/Base/Project/ICSharpCode.SharpDevelop.csproj b/src/Main/Base/Project/ICSharpCode.SharpDevelop.csproj index 7b02d6607b..8df38e7d67 100644 --- a/src/Main/Base/Project/ICSharpCode.SharpDevelop.csproj +++ b/src/Main/Base/Project/ICSharpCode.SharpDevelop.csproj @@ -269,17 +269,27 @@ Code + + + + + + + + + + diff --git a/src/Main/Base/Project/Src/Gui/Dialogs/ReferenceDialog/ServiceReference/ClientOptions.cs b/src/Main/Base/Project/Src/Gui/Dialogs/ReferenceDialog/ServiceReference/ClientOptions.cs new file mode 100644 index 0000000000..dd51f825d8 --- /dev/null +++ b/src/Main/Base/Project/Src/Gui/Dialogs/ReferenceDialog/ServiceReference/ClientOptions.cs @@ -0,0 +1,29 @@ +// 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 class ClientOptions + { + public ClientOptions() + { + EnableDataBinding = true; + GenerateSerializableTypes = true; + Serializer = "Auto"; + UseSerializerForFaults = true; + ReferenceAllAssemblies = true; + } + + public bool GenerateAsynchronousMethods { get; set; } + public bool EnableDataBinding { get; set; } + public bool ImportXmlTypes { get; set; } + public bool GenerateInternalTypes { get; set; } + public bool GenerateMessageContracts { get; set; } + public bool GenerateSerializableTypes { get; set; } + public string Serializer { get; set; } + public bool UseSerializerForFaults { get; set; } + public bool ReferenceAllAssemblies { get; set; } + } +} 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 4f80de835e..58f0bbc739 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 @@ -11,7 +11,9 @@ namespace ICSharpCode.SharpDevelop.Gui.Dialogs.ReferenceDialog.ServiceReference ICodeDomProvider CodeDomProvider { get; } ServiceReferenceFileName GetServiceReferenceFileName(string serviceReferenceName); + ServiceReferenceMapFileName GetServiceReferenceMapFileName(string serviceReferenceName); void AddServiceReferenceProxyFile(ServiceReferenceFileName fileName); + void AddServiceReferenceMapFile(ServiceReferenceMapFileName fileName); void Save(); } } diff --git a/src/Main/Base/Project/Src/Gui/Dialogs/ReferenceDialog/ServiceReference/IServiceReferenceFileGenerator.cs b/src/Main/Base/Project/Src/Gui/Dialogs/ReferenceDialog/ServiceReference/IServiceReferenceFileGenerator.cs new file mode 100644 index 0000000000..95f876fdbf --- /dev/null +++ b/src/Main/Base/Project/Src/Gui/Dialogs/ReferenceDialog/ServiceReference/IServiceReferenceFileGenerator.cs @@ -0,0 +1,11 @@ +// 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 IServiceReferenceFileGenerator : IServiceReferenceProxyGenerator, IServiceReferenceMapGenerator + { + } +} diff --git a/src/Main/Base/Project/Src/Gui/Dialogs/ReferenceDialog/ServiceReference/IServiceReferenceMapGenerator.cs b/src/Main/Base/Project/Src/Gui/Dialogs/ReferenceDialog/ServiceReference/IServiceReferenceMapGenerator.cs new file mode 100644 index 0000000000..144b224674 --- /dev/null +++ b/src/Main/Base/Project/Src/Gui/Dialogs/ReferenceDialog/ServiceReference/IServiceReferenceMapGenerator.cs @@ -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 IServiceReferenceMapGenerator + { + void GenerateServiceReferenceMapFile(ServiceReferenceMapFile mapFile); + } +} diff --git a/src/Main/Base/Project/Src/Gui/Dialogs/ReferenceDialog/ServiceReference/IServiceReferenceProxyGenerator.cs b/src/Main/Base/Project/Src/Gui/Dialogs/ReferenceDialog/ServiceReference/IServiceReferenceProxyGenerator.cs index 9c3d2c31d0..9b117b442e 100644 --- a/src/Main/Base/Project/Src/Gui/Dialogs/ReferenceDialog/ServiceReference/IServiceReferenceProxyGenerator.cs +++ b/src/Main/Base/Project/Src/Gui/Dialogs/ReferenceDialog/ServiceReference/IServiceReferenceProxyGenerator.cs @@ -10,6 +10,6 @@ namespace ICSharpCode.SharpDevelop.Gui.Dialogs.ReferenceDialog.ServiceReference { string ServiceReferenceNamespace { get; set; } - void GenerateProxy(MetadataSet metadata, string proxyFileName); + void GenerateProxyFile(MetadataSet metadata, string proxyFileName); } } diff --git a/src/Main/Base/Project/Src/Gui/Dialogs/ReferenceDialog/ServiceReference/MetadataFile.cs b/src/Main/Base/Project/Src/Gui/Dialogs/ReferenceDialog/ServiceReference/MetadataFile.cs new file mode 100644 index 0000000000..82205976d4 --- /dev/null +++ b/src/Main/Base/Project/Src/Gui/Dialogs/ReferenceDialog/ServiceReference/MetadataFile.cs @@ -0,0 +1,14 @@ +// 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 class MetadataFile + { + public MetadataFile() + { + } + } +} diff --git a/src/Main/Base/Project/Src/Gui/Dialogs/ReferenceDialog/ServiceReference/MetadataSource.cs b/src/Main/Base/Project/Src/Gui/Dialogs/ReferenceDialog/ServiceReference/MetadataSource.cs new file mode 100644 index 0000000000..918f8ec9c3 --- /dev/null +++ b/src/Main/Base/Project/Src/Gui/Dialogs/ReferenceDialog/ServiceReference/MetadataSource.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.Xml.Serialization; + +namespace ICSharpCode.SharpDevelop.Gui.Dialogs.ReferenceDialog.ServiceReference +{ + public class MetadataSource + { + public MetadataSource() + { + } + + public MetadataSource(string url) + { + Address = url; + Protocol = "http"; + } + + [XmlAttribute] + public string Address { get; set; } + + [XmlAttribute] + public string Protocol { get; set; } + + [XmlAttribute] + public string SourceId { get; set; } + } +} 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 88e89cf6d7..24519e9a72 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 @@ -47,6 +47,11 @@ namespace ICSharpCode.SharpDevelop.Gui.Dialogs.ReferenceDialog.ServiceReference return new ServiceReferenceFileName(ServiceReferencesFolder, serviceReferenceName); } + public ServiceReferenceMapFileName GetServiceReferenceMapFileName(string serviceReferenceName) + { + return new ServiceReferenceMapFileName(ServiceReferencesFolder, serviceReferenceName); + } + public void AddServiceReferenceProxyFile(ServiceReferenceFileName fileName) { AddServiceReferenceFileToProject(fileName); @@ -58,6 +63,7 @@ namespace ICSharpCode.SharpDevelop.Gui.Dialogs.ReferenceDialog.ServiceReference { var projectItem = new FileProjectItem(project, ItemType.Compile); projectItem.FileName = fileName.Path; + projectItem.DependentUpon = "Reference.svcmap"; AddProjectItemToProject(projectItem); } @@ -84,5 +90,11 @@ namespace ICSharpCode.SharpDevelop.Gui.Dialogs.ReferenceDialog.ServiceReference { project.Save(); } + + public void AddServiceReferenceMapFile(ServiceReferenceMapFileName fileName) + { + var projectItem = new ServiceReferenceMapFileProjectItem(project, fileName.Path); + AddProjectItemToProject(projectItem); + } } } diff --git a/src/Main/Base/Project/Src/Gui/Dialogs/ReferenceDialog/ServiceReference/ServiceReferenceFileGenerator.cs b/src/Main/Base/Project/Src/Gui/Dialogs/ReferenceDialog/ServiceReference/ServiceReferenceFileGenerator.cs new file mode 100644 index 0000000000..93654abfdf --- /dev/null +++ b/src/Main/Base/Project/Src/Gui/Dialogs/ReferenceDialog/ServiceReference/ServiceReferenceFileGenerator.cs @@ -0,0 +1,44 @@ +// 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 class ServiceReferenceFileGenerator : IServiceReferenceFileGenerator + { + IServiceReferenceProxyGenerator proxyGenerator; + IServiceReferenceMapGenerator mapGenerator; + + public ServiceReferenceFileGenerator(ICodeDomProvider codeDomProvider) + : this( + new ServiceReferenceProxyGenerator(codeDomProvider), + new ServiceReferenceMapGenerator()) + { + } + + public ServiceReferenceFileGenerator( + IServiceReferenceProxyGenerator proxyGenerator, + IServiceReferenceMapGenerator mapGenerator) + { + this.proxyGenerator = proxyGenerator; + this.mapGenerator = mapGenerator; + } + + public string ServiceReferenceNamespace { + get { return proxyGenerator.ServiceReferenceNamespace; } + set { proxyGenerator.ServiceReferenceNamespace = value; } + } + + public void GenerateProxyFile(MetadataSet metadata, string proxyFileName) + { + proxyGenerator.GenerateProxyFile(metadata, proxyFileName); + } + + public void GenerateServiceReferenceMapFile(ServiceReferenceMapFile mapFile) + { + mapGenerator.GenerateServiceReferenceMapFile(mapFile); + } + } +} 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 9a134285cf..7180fd116c 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 @@ -12,7 +12,7 @@ namespace ICSharpCode.SharpDevelop.Gui.Dialogs.ReferenceDialog.ServiceReference public class ServiceReferenceGenerator { IProjectWithServiceReferences project; - IServiceReferenceProxyGenerator proxyGenerator; + IServiceReferenceFileGenerator fileGenerator; IFileSystem fileSystem; public ServiceReferenceGenerator(IProject project) @@ -23,18 +23,18 @@ namespace ICSharpCode.SharpDevelop.Gui.Dialogs.ReferenceDialog.ServiceReference public ServiceReferenceGenerator(IProjectWithServiceReferences project) : this( project, - new ServiceReferenceProxyGenerator(project.CodeDomProvider), + new ServiceReferenceFileGenerator(project.CodeDomProvider), new ServiceReferenceFileSystem()) { } public ServiceReferenceGenerator( IProjectWithServiceReferences project, - IServiceReferenceProxyGenerator proxyGenerator, + IServiceReferenceFileGenerator fileGenerator, IFileSystem fileSystem) { this.project = project; - this.proxyGenerator = proxyGenerator; + this.fileGenerator = fileGenerator; this.fileSystem = fileSystem; } @@ -47,12 +47,17 @@ namespace ICSharpCode.SharpDevelop.Gui.Dialogs.ReferenceDialog.ServiceReference void GenerateServiceReferenceProxy(MetadataSet metadata) { - ServiceReferenceFileName fileName = project.GetServiceReferenceFileName(Namespace); - CreateFolderForFileIfFolderMissing(fileName.Path); + ServiceReferenceFileName referenceFileName = project.GetServiceReferenceFileName(Namespace); + CreateFolderForFileIfFolderMissing(referenceFileName.Path); - proxyGenerator.GenerateProxy(metadata, fileName.Path); + fileGenerator.GenerateProxyFile(metadata, referenceFileName.Path); - project.AddServiceReferenceProxyFile(fileName); + ServiceReferenceMapFileName mapFileName = project.GetServiceReferenceMapFileName(Namespace); + var mapFile = new ServiceReferenceMapFile(mapFileName); + fileGenerator.GenerateServiceReferenceMapFile(mapFile); + + project.AddServiceReferenceProxyFile(referenceFileName); + project.AddServiceReferenceMapFile(mapFileName); project.Save(); } diff --git a/src/Main/Base/Project/Src/Gui/Dialogs/ReferenceDialog/ServiceReference/ServiceReferenceMapFile.cs b/src/Main/Base/Project/Src/Gui/Dialogs/ReferenceDialog/ServiceReference/ServiceReferenceMapFile.cs new file mode 100644 index 0000000000..7877589728 --- /dev/null +++ b/src/Main/Base/Project/Src/Gui/Dialogs/ReferenceDialog/ServiceReference/ServiceReferenceMapFile.cs @@ -0,0 +1,71 @@ +// 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 System.Xml.Serialization; + +namespace ICSharpCode.SharpDevelop.Gui.Dialogs.ReferenceDialog.ServiceReference +{ + [XmlRoot(ElementName = "ReferenceGroup", Namespace = "urn:schemas-microsoft-com:xml-wcfservicemap")] + public class ServiceReferenceMapFile + { + ClientOptions clientOptions = new ClientOptions(); + List metadataSources = new List(); + List metadata = new List(); + + public ServiceReferenceMapFile() + { + ID = Guid.NewGuid().ToString(); + } + + public ServiceReferenceMapFile(ServiceReferenceMapFileName fileName) + : this() + { + FileName = fileName.Path; + } + + public override bool Equals(object obj) + { + var rhs = obj as ServiceReferenceMapFile; + return FileName == rhs.FileName; + } + + public override int GetHashCode() + { + return base.GetHashCode(); + } + + public static ServiceReferenceMapFile CreateMapFileWithUrl(string url) + { + var mapFile = new ServiceReferenceMapFile(); + mapFile.AddMetadataSourceForUrl(url); + return mapFile; + } + + public void AddMetadataSourceForUrl(string url) + { + var metadataSource = new MetadataSource(url) { SourceId = "1" }; + metadataSources.Add(metadataSource); + } + + [XmlIgnoreAttribute] + public string FileName { get; set; } + + [XmlAttribute] + public string ID { get; set; } + + public ClientOptions ClientOptions { + get { return clientOptions; } + set { clientOptions = value; } + } + + public List MetadataSources { + get { return metadataSources; } + } + + public List Metadata { + get { return metadata; } + } + } +} diff --git a/src/Main/Base/Project/Src/Gui/Dialogs/ReferenceDialog/ServiceReference/ServiceReferenceMapFileName.cs b/src/Main/Base/Project/Src/Gui/Dialogs/ReferenceDialog/ServiceReference/ServiceReferenceMapFileName.cs new file mode 100644 index 0000000000..700fba010d --- /dev/null +++ b/src/Main/Base/Project/Src/Gui/Dialogs/ReferenceDialog/ServiceReference/ServiceReferenceMapFileName.cs @@ -0,0 +1,22 @@ +// 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 IO = System.IO; + +namespace ICSharpCode.SharpDevelop.Gui.Dialogs.ReferenceDialog.ServiceReference +{ + public class ServiceReferenceMapFileName + { + string path; + + public ServiceReferenceMapFileName(string serviceReferencesFolder, string serviceName) + { + path = IO.Path.Combine(serviceReferencesFolder, serviceName, "Reference.svcmap"); + } + + public string Path { + get { return path; } + } + } +} diff --git a/src/Main/Base/Project/Src/Gui/Dialogs/ReferenceDialog/ServiceReference/ServiceReferenceMapFileProjectItem.cs b/src/Main/Base/Project/Src/Gui/Dialogs/ReferenceDialog/ServiceReference/ServiceReferenceMapFileProjectItem.cs new file mode 100644 index 0000000000..86e5458e6d --- /dev/null +++ b/src/Main/Base/Project/Src/Gui/Dialogs/ReferenceDialog/ServiceReference/ServiceReferenceMapFileProjectItem.cs @@ -0,0 +1,26 @@ +// 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 ICSharpCode.SharpDevelop.Project; + +namespace ICSharpCode.SharpDevelop.Gui.Dialogs.ReferenceDialog.ServiceReference +{ + public class ServiceReferenceMapFileProjectItem : FileProjectItem + { + public ServiceReferenceMapFileProjectItem( + IProject project, + string fileName) + : base(project, ItemType.None) + { + this.FileName = fileName; + AddMetadata(); + } + + void AddMetadata() + { + SetMetadata("LastGenOutput", "Reference.cs"); + SetMetadata("Generator", "WCF Proxy Generator"); + } + } +} diff --git a/src/Main/Base/Project/Src/Gui/Dialogs/ReferenceDialog/ServiceReference/ServiceReferenceMapGenerator.cs b/src/Main/Base/Project/Src/Gui/Dialogs/ReferenceDialog/ServiceReference/ServiceReferenceMapGenerator.cs new file mode 100644 index 0000000000..5be219b9ab --- /dev/null +++ b/src/Main/Base/Project/Src/Gui/Dialogs/ReferenceDialog/ServiceReference/ServiceReferenceMapGenerator.cs @@ -0,0 +1,24 @@ +// 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.Xml.Serialization; + +namespace ICSharpCode.SharpDevelop.Gui.Dialogs.ReferenceDialog.ServiceReference +{ + public class ServiceReferenceMapGenerator : IServiceReferenceMapGenerator + { + public void GenerateServiceReferenceMapFile(ServiceReferenceMapFile mapFile) + { + var writer = new StreamWriter(mapFile.FileName); + GenerateServiceReferenceMapFile(writer, mapFile); + } + + public void GenerateServiceReferenceMapFile(TextWriter textWriter, ServiceReferenceMapFile mapFile) + { + var serializer = new XmlSerializer(typeof(ServiceReferenceMapFile)); + serializer.Serialize(textWriter, mapFile); + } + } +} diff --git a/src/Main/Base/Project/Src/Gui/Dialogs/ReferenceDialog/ServiceReference/ServiceReferenceProxyGenerator.cs b/src/Main/Base/Project/Src/Gui/Dialogs/ReferenceDialog/ServiceReference/ServiceReferenceProxyGenerator.cs index 9b07bdf0bd..bc1e405b51 100644 --- a/src/Main/Base/Project/Src/Gui/Dialogs/ReferenceDialog/ServiceReference/ServiceReferenceProxyGenerator.cs +++ b/src/Main/Base/Project/Src/Gui/Dialogs/ReferenceDialog/ServiceReference/ServiceReferenceProxyGenerator.cs @@ -28,7 +28,7 @@ namespace ICSharpCode.SharpDevelop.Gui.Dialogs.ReferenceDialog.ServiceReference public string ServiceReferenceNamespace { get; set; } - public void GenerateProxy(MetadataSet metadata, string proxyFileName) + public void GenerateProxyFile(MetadataSet metadata, string proxyFileName) { CodeCompileUnit compileUnit = codeDomBuilder.GenerateCompileUnit(metadata); GenerateProxy(compileUnit, proxyFileName); diff --git a/src/Main/Base/Test/ICSharpCode.SharpDevelop.Tests.csproj b/src/Main/Base/Test/ICSharpCode.SharpDevelop.Tests.csproj index 6ff0ebca7b..c8b842d0eb 100644 --- a/src/Main/Base/Test/ICSharpCode.SharpDevelop.Tests.csproj +++ b/src/Main/Base/Test/ICSharpCode.SharpDevelop.Tests.csproj @@ -101,6 +101,8 @@ + + diff --git a/src/Main/Base/Test/ServiceReferences/ProjectWithServiceReferencesTests.cs b/src/Main/Base/Test/ServiceReferences/ProjectWithServiceReferencesTests.cs index 20a11fbd81..c2f5aa721f 100644 --- a/src/Main/Base/Test/ServiceReferences/ProjectWithServiceReferencesTests.cs +++ b/src/Main/Base/Test/ServiceReferences/ProjectWithServiceReferencesTests.cs @@ -4,6 +4,7 @@ using System; using System.CodeDom.Compiler; using System.Collections.Generic; +using System.IO; using System.Linq; using ICSharpCode.SharpDevelop.Dom; using ICSharpCode.SharpDevelop.Gui.Dialogs.ReferenceDialog.ServiceReference; @@ -61,6 +62,11 @@ namespace ICSharpCode.SharpDevelop.Tests.ServiceReferences return msbuildProject.GetItemsOfType(ItemType.ServiceReference).SingleOrDefault() as ServiceReferenceProjectItem; } + FileProjectItem GetFileFromMSBuildProject(string fileName) + { + return msbuildProject.Items.Single(item => item.FileName == fileName) as FileProjectItem; + } + [Test] public void ServiceReferencesFolder_ProjectHasNoServiceReferences_ReturnsServiceReferencesFolderAsProjectSubFolder() { @@ -110,7 +116,10 @@ namespace ICSharpCode.SharpDevelop.Tests.ServiceReferences ProjectItem item = GetFirstServiceReferenceFileInMSBuildProject(proxyFileName); + string dependentUpon = item.GetMetadata("DependentUpon"); + Assert.AreEqual(ItemType.Compile, item.ItemType); + Assert.AreEqual("Reference.svcmap", dependentUpon); } [Test] @@ -148,5 +157,36 @@ namespace ICSharpCode.SharpDevelop.Tests.ServiceReferences Assert.AreEqual("Service1", item.Include); } + + [Test] + public void GetServiceReferenceMapFileName_ProjectHasNoServiceReferences_ReturnsMapFileNameInServiceReferencesFolderWithSubFolderNamedAfterServiceReference() + { + CreateProject(); + SetProjectDirectory(@"d:\projects\MyProject"); + + ServiceReferenceMapFileName fileName = project.GetServiceReferenceMapFileName("Service1"); + string expectedFileName = @"d:\projects\MyProject\Service References\Service1\Reference.svcmap"; + + Assert.AreEqual(expectedFileName, fileName.Path); + } + + [Test] + public void AddServiceReferenceMapFile_ProjectHasNoServiceReferences_ServiceReferenceMapAddedToProject() + { + CreateProjectWithMSBuildProject(); + + var mapFileName = new ServiceReferenceMapFileName(@"d:\projects\MyProject\Service References", "Service1"); + project.AddServiceReferenceMapFile(mapFileName); + + string fileName = @"d:\projects\MyProject\Service References\Service1\Reference.svcmap"; + FileProjectItem item = GetFileFromMSBuildProject(fileName); + + string lastGenOutput = item.GetMetadata("LastGenOutput"); + string generator = item.GetMetadata("Generator"); + + Assert.AreEqual(ItemType.None, item.ItemType); + Assert.AreEqual("Reference.cs", lastGenOutput); + Assert.AreEqual("WCF Proxy Generator", generator); + } } } diff --git a/src/Main/Base/Test/ServiceReferences/ServiceReferenceGeneratorTests.cs b/src/Main/Base/Test/ServiceReferences/ServiceReferenceGeneratorTests.cs index a6e34da6cc..7b0fe50ab0 100644 --- a/src/Main/Base/Test/ServiceReferences/ServiceReferenceGeneratorTests.cs +++ b/src/Main/Base/Test/ServiceReferences/ServiceReferenceGeneratorTests.cs @@ -15,7 +15,9 @@ namespace ICSharpCode.SharpDevelop.Tests.ServiceReferences { IProjectWithServiceReferences fakeProject; IServiceReferenceProxyGenerator fakeProxyGenerator; + IServiceReferenceMapGenerator fakeReferenceMapGenerator; ServiceReferenceGenerator generator; + ServiceReferenceFileGenerator fileGenerator; IFileSystem fakeFileSystem; MetadataSet metadata; @@ -25,8 +27,11 @@ namespace ICSharpCode.SharpDevelop.Tests.ServiceReferences fakeProject = MockRepository.GenerateStub(); fakeProxyGenerator = MockRepository.GenerateStub(); + fakeReferenceMapGenerator = MockRepository.GenerateStub(); + fileGenerator = new ServiceReferenceFileGenerator(fakeProxyGenerator, fakeReferenceMapGenerator); fakeFileSystem = MockRepository.GenerateStub(); - generator = new ServiceReferenceGenerator(fakeProject, fakeProxyGenerator, fakeFileSystem); + + generator = new ServiceReferenceGenerator(fakeProject, fileGenerator, fakeFileSystem); } void SetServiceReferenceFileName(string serviceReferenceName, ServiceReferenceFileName fileName) @@ -51,18 +56,35 @@ namespace ICSharpCode.SharpDevelop.Tests.ServiceReferences return proxyFileName; } + ServiceReferenceMapFileName AddMapFileNameForServiceName(string serviceName) + { + return AddMapFileNameForServiceName(@"d:\projects\MyProject\Service References", serviceName); + } + + ServiceReferenceMapFileName AddMapFileNameForServiceName(string serviceReferencesFolder, string serviceName) + { + var fileName = new ServiceReferenceMapFileName(serviceReferencesFolder, serviceName); + SetServiceReferenceMapFileName(serviceName, fileName); + return fileName; + } + + void SetServiceReferenceMapFileName(string serviceName, ServiceReferenceMapFileName fileName) + { + fakeProject.Stub(p => p.GetServiceReferenceMapFileName(serviceName)).Return(fileName); + } + [Test] public void AddServiceReference_GeneratesServiceReference_MetadataPassedToProxyGenerator() { CreateGenerator(); - ServiceReferenceFileName proxyFileName = - AddProxyFileNameForServiceName(@"d:\projects\MyProject\Service References", "MyServiceRef"); + AddProxyFileNameForServiceName(@"d:\projects\MyProject\Service References", "MyServiceRef"); + AddMapFileNameForServiceName("MyServiceRef"); generator.Namespace = "MyServiceRef"; generator.AddServiceReference(metadata); string expectedProxyFileName = @"d:\projects\MyProject\Service References\MyServiceRef\Reference.cs"; - fakeProxyGenerator.AssertWasCalled(p => p.GenerateProxy(metadata, expectedProxyFileName)); + fakeProxyGenerator.AssertWasCalled(p => p.GenerateProxyFile(metadata, expectedProxyFileName)); } [Test] @@ -70,6 +92,7 @@ namespace ICSharpCode.SharpDevelop.Tests.ServiceReferences { CreateGenerator(); AddProxyFileNameForServiceName(@"d:\projects\MyProject\Service References", "MyService1"); + AddMapFileNameForServiceName("MyService1"); generator.Namespace = "MyService1"; generator.AddServiceReference(metadata); @@ -85,6 +108,7 @@ namespace ICSharpCode.SharpDevelop.Tests.ServiceReferences CreateGenerator(); ServiceReferenceFileName expectedProxyFileName = AddProxyFileNameForServiceName(@"d:\projects\MyProject\Service References", "MyServiceRef"); + AddMapFileNameForServiceName("MyServiceRef"); generator.Namespace = "MyServiceRef"; generator.AddServiceReference(metadata); @@ -97,11 +121,43 @@ namespace ICSharpCode.SharpDevelop.Tests.ServiceReferences { CreateGenerator(); AddProxyFileNameForServiceName("MyServiceRef"); + AddMapFileNameForServiceName("MyServiceRef"); generator.Namespace = "MyServiceRef"; generator.AddServiceReference(metadata); fakeProject.AssertWasCalled(p => p.Save()); } + + [Test] + public void AddServiceReference_GeneratesServiceReference_ReferenceServiceMapFileIsCreated() + { + CreateGenerator(); + AddProxyFileNameForServiceName(@"d:\projects\MyProject\Service References", "MyServiceRef"); + AddMapFileNameForServiceName(@"d:\projects\MyProject\Service References", "MyServiceRef"); + generator.Namespace = "MyServiceRef"; + + generator.AddServiceReference(metadata); + + var expectedMapFile = new ServiceReferenceMapFile() { + FileName = @"d:\projects\MyProject\Service References\MyServiceRef\Reference.svcmap" + }; + + fakeReferenceMapGenerator.AssertWasCalled(gen => gen.GenerateServiceReferenceMapFile(expectedMapFile)); + } + + [Test] + public void AddServiceReference_GeneratesServiceReference_ReferenceServiceMapFileIsAddedToProject() + { + CreateGenerator(); + AddProxyFileNameForServiceName("MyServiceRef"); + ServiceReferenceMapFileName expectedMapFileName = + AddMapFileNameForServiceName(@"d:\projects\MyProject\Service References", "MyServiceRef"); + generator.Namespace = "MyServiceRef"; + + generator.AddServiceReference(metadata); + + fakeProject.AssertWasCalled(p => p.AddServiceReferenceMapFile(expectedMapFileName)); + } } } diff --git a/src/Main/Base/Test/ServiceReferences/ServiceReferenceMapFileGeneratorTests.cs b/src/Main/Base/Test/ServiceReferences/ServiceReferenceMapFileGeneratorTests.cs new file mode 100644 index 0000000000..89fed0bd40 --- /dev/null +++ b/src/Main/Base/Test/ServiceReferences/ServiceReferenceMapFileGeneratorTests.cs @@ -0,0 +1,69 @@ +// 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 ICSharpCode.SharpDevelop.Gui.Dialogs.ReferenceDialog.ServiceReference; +using NUnit.Framework; + +namespace ICSharpCode.SharpDevelop.Tests.ServiceReferences +{ + [TestFixture] + public class ServiceReferenceMapFileGeneratorTests + { + ServiceReferenceMapGenerator generator; + + void CreateFileGenerator() + { + generator = new ServiceReferenceMapGenerator(); + } + + string GenerateMapFile(ServiceReferenceMapFile mapFile) + { + var output = new StringBuilder(); + var writer = new StringWriter(output); + + generator.GenerateServiceReferenceMapFile(writer, mapFile); + + return output.ToString(); + } + + ServiceReferenceMapFile CreateServiceReferenceMapFileWithUrl(string url) + { + return ServiceReferenceMapFile.CreateMapFileWithUrl(url); + } + + [Test] + public void GenerateServiceReferenceMapFile_MapFileWrittenToStringWriter_SerialisesReferenceGroup() + { + CreateFileGenerator(); + ServiceReferenceMapFile mapFile = CreateServiceReferenceMapFileWithUrl("http://localhost/MyService1.svc"); + mapFile.ID = "a606bbd6-26e5-4025-a25e-b8c262422f2a"; + string output = GenerateMapFile(mapFile); + + string expectedOutput = +@" + + + false + true + false + false + false + true + Auto + true + true + + + + + +"; + + Assert.AreEqual(expectedOutput, output); + } + } +} diff --git a/src/Main/Base/Test/ServiceReferences/ServiceReferenceMapFileTests.cs b/src/Main/Base/Test/ServiceReferences/ServiceReferenceMapFileTests.cs new file mode 100644 index 0000000000..48b915f67a --- /dev/null +++ b/src/Main/Base/Test/ServiceReferences/ServiceReferenceMapFileTests.cs @@ -0,0 +1,57 @@ +// 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 ICSharpCode.SharpDevelop.Gui.Dialogs.ReferenceDialog.ServiceReference; +using NUnit.Framework; + +namespace ICSharpCode.SharpDevelop.Tests.ServiceReferences +{ + [TestFixture] + public class ServiceReferenceMapFileTests + { + ServiceReferenceMapFile lhs; + ServiceReferenceMapFile rhs; + + void CreateMapFilesToCompare() + { + lhs = new ServiceReferenceMapFile(); + rhs = new ServiceReferenceMapFile(); + } + + void AssertFilesAreEqual() + { + bool result = AreFilesEqual(); + Assert.IsTrue(result); + } + + bool AreFilesEqual() + { + return lhs.Equals(rhs); + } + + void AssertFilesAreNotEqual() + { + bool result = AreFilesEqual(); + Assert.IsFalse(result); + } + + [Test] + public void Equals_FilesAreSame_ReturnsTrue() + { + CreateMapFilesToCompare(); + + AssertFilesAreEqual(); + } + + [Test] + public void Equals_FilesHaveDifferentFileNames_ReturnsFalse() + { + CreateMapFilesToCompare(); + lhs.FileName = "a"; + rhs.FileName = "b"; + + AssertFilesAreNotEqual(); + } + } +} diff --git a/src/Main/Base/Test/ServiceReferences/ServiceReferenceProxyGeneratorTests.cs b/src/Main/Base/Test/ServiceReferences/ServiceReferenceProxyGeneratorTests.cs index de26d1ae1d..c44305f56e 100644 --- a/src/Main/Base/Test/ServiceReferences/ServiceReferenceProxyGeneratorTests.cs +++ b/src/Main/Base/Test/ServiceReferences/ServiceReferenceProxyGeneratorTests.cs @@ -37,14 +37,14 @@ namespace ICSharpCode.SharpDevelop.Tests.ServiceReferences } [Test] - public void GenerateProxy_ProxyToBeGeneratedForMetadata_CodeGeneratedFromCodeDomForProxyFileInProjectSubFolder() + public void GenerateProxyFile_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); + proxyGenerator.GenerateProxyFile(metadata, expectedProxyFileName); fakeCodeDomProvider.AssertWasCalled(p => p.GenerateCodeFromCompileUnit(compileUnit, expectedProxyFileName)); }