From ce4caf8a3349358ef6afed816215ff5e1b8e69b0 Mon Sep 17 00:00:00 2001 From: Matt Ward Date: Mon, 19 Dec 2011 12:13:54 +0000 Subject: [PATCH] Show WCF service references in Projects window with different icons. --- .../Project/ICSharpCode.SharpDevelop.csproj | 3 + .../ProjectBrowser/TreeNodes/DirectoryNode.cs | 6 +- .../TreeNodes/DirectoryNodeFactory.cs | 9 +- .../TreeNodes/ServiceReferenceNode.cs | 18 ++++ .../TreeNodes/ServiceReferencesFolderNode.cs | 35 ++++++ .../Project/Src/Project/Items/ItemType.cs | 9 ++ .../Items/ServiceReferencesProjectItem.cs | 44 ++++++++ .../Src/Project/MSBuildBasedProject.cs | 3 + .../ICSharpCode.SharpDevelop.Tests.csproj | 10 ++ .../DirectoryNodeFactoryTests.cs | 95 +++++++++++++++++ .../Test/ServiceReferences/ItemTypeTests.cs | 49 +++++++++ .../MSBuildBasedProjectTests.cs | 40 +++++++ .../ServiceReferenceNodeTests.cs | 56 ++++++++++ .../ServiceReferencesFolderNodeTests.cs | 100 ++++++++++++++++++ .../ServiceReferencesProjectItemTests.cs | 86 +++++++++++++++ 15 files changed, 560 insertions(+), 3 deletions(-) create mode 100644 src/Main/Base/Project/Src/Gui/Pads/ProjectBrowser/TreeNodes/ServiceReferenceNode.cs create mode 100644 src/Main/Base/Project/Src/Gui/Pads/ProjectBrowser/TreeNodes/ServiceReferencesFolderNode.cs create mode 100644 src/Main/Base/Project/Src/Project/Items/ServiceReferencesProjectItem.cs create mode 100644 src/Main/Base/Test/ServiceReferences/DirectoryNodeFactoryTests.cs create mode 100644 src/Main/Base/Test/ServiceReferences/ItemTypeTests.cs create mode 100644 src/Main/Base/Test/ServiceReferences/MSBuildBasedProjectTests.cs create mode 100644 src/Main/Base/Test/ServiceReferences/ServiceReferenceNodeTests.cs create mode 100644 src/Main/Base/Test/ServiceReferences/ServiceReferencesFolderNodeTests.cs create mode 100644 src/Main/Base/Test/ServiceReferences/ServiceReferencesProjectItemTests.cs diff --git a/src/Main/Base/Project/ICSharpCode.SharpDevelop.csproj b/src/Main/Base/Project/ICSharpCode.SharpDevelop.csproj index 2668dcc121..b01e8bbd10 100644 --- a/src/Main/Base/Project/ICSharpCode.SharpDevelop.csproj +++ b/src/Main/Base/Project/ICSharpCode.SharpDevelop.csproj @@ -289,6 +289,8 @@ + + @@ -320,6 +322,7 @@ + diff --git a/src/Main/Base/Project/Src/Gui/Pads/ProjectBrowser/TreeNodes/DirectoryNode.cs b/src/Main/Base/Project/Src/Gui/Pads/ProjectBrowser/TreeNodes/DirectoryNode.cs index b73f96d4cd..bc348eef6f 100644 --- a/src/Main/Base/Project/Src/Gui/Pads/ProjectBrowser/TreeNodes/DirectoryNode.cs +++ b/src/Main/Base/Project/Src/Gui/Pads/ProjectBrowser/TreeNodes/DirectoryNode.cs @@ -56,6 +56,8 @@ namespace ICSharpCode.SharpDevelop.Project public enum SpecialFolder { None, AppDesigner, + ServiceReference, + ServiceReferencesFolder, WebReference, WebReferencesFolder } @@ -171,10 +173,12 @@ namespace ICSharpCode.SharpDevelop.Project OpenedImage = "ProjectBrowser.PropertyFolder.Open"; ClosedImage = "ProjectBrowser.PropertyFolder.Closed"; break; + case SpecialFolder.ServiceReferencesFolder: case SpecialFolder.WebReferencesFolder: OpenedImage = "ProjectBrowser.WebReferenceFolder.Open"; ClosedImage = "ProjectBrowser.WebReferenceFolder.Closed"; break; + case SpecialFolder.ServiceReference: case SpecialFolder.WebReference: OpenedImage = "ProjectBrowser.WebReference"; ClosedImage = "ProjectBrowser.WebReference"; @@ -332,7 +336,7 @@ namespace ICSharpCode.SharpDevelop.Project continue; } - if (item.ItemType == ItemType.Folder || item.ItemType == ItemType.WebReferences) { + if (item.ItemType.IsFolder()) { DirectoryNode node; if (directoryNodeList.TryGetValue(fileName, out node)) { if (node.FileNodeStatus == FileNodeStatus.None) { diff --git a/src/Main/Base/Project/Src/Gui/Pads/ProjectBrowser/TreeNodes/DirectoryNodeFactory.cs b/src/Main/Base/Project/Src/Gui/Pads/ProjectBrowser/TreeNodes/DirectoryNodeFactory.cs index e93fa269b0..19dc2939db 100644 --- a/src/Main/Base/Project/Src/Gui/Pads/ProjectBrowser/TreeNodes/DirectoryNodeFactory.cs +++ b/src/Main/Base/Project/Src/Gui/Pads/ProjectBrowser/TreeNodes/DirectoryNodeFactory.cs @@ -5,7 +5,7 @@ using System; using System.Collections.Generic; using System.IO; using System.Windows.Forms; - +using Gui.Pads.ProjectBrowser.TreeNodes; using ICSharpCode.Core; using ICSharpCode.SharpDevelop.Project.Commands; @@ -16,7 +16,6 @@ namespace ICSharpCode.SharpDevelop.Project /// public static class DirectoryNodeFactory { - public static DirectoryNode CreateDirectoryNode(TreeNode parent, IProject project, string directory) { DirectoryNode node = new DirectoryNode(directory); @@ -28,6 +27,10 @@ namespace ICSharpCode.SharpDevelop.Project node = new WebReferencesFolderNode(directory); } else if (parent != null && parent is WebReferencesFolderNode) { node = new WebReferenceNode(directory); + } else if (ServiceReferencesProjectItem.IsServiceReferencesFolder(project, directory)) { + node = new ServiceReferencesFolderNode(directory); + } else if (parent is ServiceReferencesFolderNode) { + node = new ServiceReferenceNode(directory); } return node; } @@ -38,6 +41,8 @@ namespace ICSharpCode.SharpDevelop.Project if (item is WebReferencesProjectItem) { node = new WebReferencesFolderNode((WebReferencesProjectItem)item); node.FileNodeStatus = status; + } else if (item is ServiceReferencesProjectItem) { + node = new ServiceReferencesFolderNode(item, status); } else { node = new DirectoryNode(item.FileName.Trim('\\', '/'), status); node.ProjectItem = item; diff --git a/src/Main/Base/Project/Src/Gui/Pads/ProjectBrowser/TreeNodes/ServiceReferenceNode.cs b/src/Main/Base/Project/Src/Gui/Pads/ProjectBrowser/TreeNodes/ServiceReferenceNode.cs new file mode 100644 index 0000000000..5a24e8af3a --- /dev/null +++ b/src/Main/Base/Project/Src/Gui/Pads/ProjectBrowser/TreeNodes/ServiceReferenceNode.cs @@ -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 ICSharpCode.SharpDevelop.Project; + +namespace Gui.Pads.ProjectBrowser.TreeNodes +{ + public class ServiceReferenceNode : DirectoryNode + { + public ServiceReferenceNode(string directory) + : base(directory) + { + this.ContextmenuAddinTreePath = "/SharpDevelop/Pads/ProjectBrowser/ContextMenu/ServiceReferenceNode"; + this.SpecialFolder = SpecialFolder.ServiceReference; + } + } +} diff --git a/src/Main/Base/Project/Src/Gui/Pads/ProjectBrowser/TreeNodes/ServiceReferencesFolderNode.cs b/src/Main/Base/Project/Src/Gui/Pads/ProjectBrowser/TreeNodes/ServiceReferencesFolderNode.cs new file mode 100644 index 0000000000..13c30caa8a --- /dev/null +++ b/src/Main/Base/Project/Src/Gui/Pads/ProjectBrowser/TreeNodes/ServiceReferencesFolderNode.cs @@ -0,0 +1,35 @@ +// 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 Gui.Pads.ProjectBrowser.TreeNodes +{ + public class ServiceReferencesFolderNode : DirectoryNode + { + public ServiceReferencesFolderNode(ProjectItem projectItem, FileNodeStatus status) + : this((ServiceReferencesProjectItem)projectItem, status) + { + } + + public ServiceReferencesFolderNode(ServiceReferencesProjectItem projectItem, FileNodeStatus status) + : this(projectItem.Directory, status) + { + this.ProjectItem = projectItem; + } + + public ServiceReferencesFolderNode(string directory) + : this(directory, FileNodeStatus.None) + { + } + + public ServiceReferencesFolderNode(string directory, FileNodeStatus status) + : base(directory, status) + { + this.ContextmenuAddinTreePath = "/SharpDevelop/Pads/ProjectBrowser/ContextMenu/ServiceReferencesFolderNode"; + this.sortOrder = 0; + this.SpecialFolder = SpecialFolder.ServiceReferencesFolder; + } + } +} diff --git a/src/Main/Base/Project/Src/Project/Items/ItemType.cs b/src/Main/Base/Project/Src/Project/Items/ItemType.cs index 01edf5212f..a9410418ed 100644 --- a/src/Main/Base/Project/Src/Project/Items/ItemType.cs +++ b/src/Main/Base/Project/Src/Project/Items/ItemType.cs @@ -51,6 +51,7 @@ namespace ICSharpCode.SharpDevelop.Project public static readonly ItemType Resource = new ItemType("Resource"); public static readonly ItemType Folder = new ItemType("Folder"); public static readonly ItemType WebReferences = new ItemType("WebReferences"); + public static readonly ItemType ServiceReferences = new ItemType("WCFMetadata"); /// /// Gets a collection of item types that are known not to be used for files. @@ -113,5 +114,13 @@ namespace ICSharpCode.SharpDevelop.Project { return itemName.CompareTo(other.itemName); } + + public bool IsFolder() + { + return + (this == ItemType.Folder) || + (this == ItemType.WebReferences) || + (this == ItemType.ServiceReferences); + } } } diff --git a/src/Main/Base/Project/Src/Project/Items/ServiceReferencesProjectItem.cs b/src/Main/Base/Project/Src/Project/Items/ServiceReferencesProjectItem.cs new file mode 100644 index 0000000000..1f37b2000b --- /dev/null +++ b/src/Main/Base/Project/Src/Project/Items/ServiceReferencesProjectItem.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.ComponentModel; +using System.IO; +using ICSharpCode.Core; + +namespace ICSharpCode.SharpDevelop.Project +{ + public class ServiceReferencesProjectItem : FileProjectItem + { + public ServiceReferencesProjectItem(IProject project) + : base(project, ItemType.ServiceReferences) + { + } + + internal ServiceReferencesProjectItem(IProject project, IProjectItemBackendStore buildItem) + : base(project, buildItem) + { + } + + [Browsable(false)] + public string Directory { + get { return Path.Combine(Project.Directory, Include).Trim('\\'); } + } + + public static bool IsServiceReferencesFolder(IProject project, string folder) + { + foreach (ProjectItem item in project.GetItemsOfType(ItemType.ServiceReferences)) { + var serviceReferenceProjectItem = (ServiceReferencesProjectItem)item; + if (serviceReferenceProjectItem.IsDirectoryMatch(folder)) { + return true; + } + } + return false; + } + + public bool IsDirectoryMatch(string directory) + { + return FileUtility.IsEqualFileName(this.Directory, directory); + } + } +} diff --git a/src/Main/Base/Project/Src/Project/MSBuildBasedProject.cs b/src/Main/Base/Project/Src/Project/MSBuildBasedProject.cs index ac7453f5ef..83612ac927 100644 --- a/src/Main/Base/Project/Src/Project/MSBuildBasedProject.cs +++ b/src/Main/Base/Project/Src/Project/MSBuildBasedProject.cs @@ -177,6 +177,9 @@ namespace ICSharpCode.SharpDevelop.Project case "WebReferences": return new WebReferencesProjectItem(this, item); + + case "WCFMetadata": + return new ServiceReferencesProjectItem(this, item); default: if (this.AvailableFileItemTypes.Contains(item.ItemType) diff --git a/src/Main/Base/Test/ICSharpCode.SharpDevelop.Tests.csproj b/src/Main/Base/Test/ICSharpCode.SharpDevelop.Tests.csproj index 9147ba976f..6d1e1eeb0d 100644 --- a/src/Main/Base/Test/ICSharpCode.SharpDevelop.Tests.csproj +++ b/src/Main/Base/Test/ICSharpCode.SharpDevelop.Tests.csproj @@ -40,6 +40,9 @@ 3.0 + + ..\..\..\AddIns\Analysis\MachineSpecifications\Libraries\RhinoMocks.3.6\Rhino.Mocks.dll + @@ -89,6 +92,12 @@ + + + + + + @@ -162,6 +171,7 @@ ICSharpCode.Core + diff --git a/src/Main/Base/Test/ServiceReferences/DirectoryNodeFactoryTests.cs b/src/Main/Base/Test/ServiceReferences/DirectoryNodeFactoryTests.cs new file mode 100644 index 0000000000..558c78a193 --- /dev/null +++ b/src/Main/Base/Test/ServiceReferences/DirectoryNodeFactoryTests.cs @@ -0,0 +1,95 @@ +// 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 Gui.Pads.ProjectBrowser.TreeNodes; +using ICSharpCode.SharpDevelop.Project; +using ICSharpCode.SharpDevelop.Tests.WebReferences; +using NUnit.Framework; + +namespace ICSharpCode.SharpDevelop.Tests.ServiceReferences +{ + [TestFixture] + public class DirectoryNodeFactoryTests + { + MSBuildBasedProject project; + + void CreateProject() + { + project = WebReferenceTestHelper.CreateTestProject("C#"); + } + + ServiceReferencesProjectItem AddWCFMetadataProjectItemToProject() + { + var projectItem = new ServiceReferencesProjectItem(project); + projectItem.Include = @"Service References\"; + ProjectService.AddProjectItem(project, projectItem); + return projectItem; + } + + [Test] + public void CreateDirectoryNode_WCFMetadataProjectItem_CreatesServiceReferencesFolderNode() + { + CreateProject(); + ServiceReferencesProjectItem projectItem = AddWCFMetadataProjectItemToProject(); + + DirectoryNode node = DirectoryNodeFactory.CreateDirectoryNode(projectItem, FileNodeStatus.None); + + Assert.IsTrue(node is ServiceReferencesFolderNode); + } + + [Test] + public void CreateDirectoryNode_WCFMetadataProjectItem_FileNodeStatusPassedToDirectoryNodeCreated() + { + CreateProject(); + ServiceReferencesProjectItem projectItem = AddWCFMetadataProjectItemToProject(); + + DirectoryNode node = DirectoryNodeFactory.CreateDirectoryNode(projectItem, FileNodeStatus.Missing); + FileNodeStatus nodeStatus = node.FileNodeStatus; + + Assert.AreEqual(FileNodeStatus.Missing, nodeStatus); + } + + [Test] + public void CreateDirectoryNode_WCFMetadataProjectItem_ProjectItemPassedToDirectoryNodeCreated() + { + CreateProject(); + ServiceReferencesProjectItem expectedProjectItem = AddWCFMetadataProjectItemToProject(); + + DirectoryNode node = DirectoryNodeFactory.CreateDirectoryNode(expectedProjectItem, FileNodeStatus.None); + ProjectItem projectItem = node.ProjectItem; + + Assert.AreEqual(expectedProjectItem, projectItem); + } + + [Test] + public void CreateDirectoryNode_ParentIsServiceReferencesFolderNode_CreatesServiceReferenceNode() + { + CreateProject(); + ServiceReferencesProjectItem expectedProjectItem = AddWCFMetadataProjectItemToProject(); + DirectoryNode parentServiceReferencesFolderNode = + DirectoryNodeFactory.CreateDirectoryNode(expectedProjectItem, FileNodeStatus.None); + string directory = "ServiceReference1"; + + ServiceReferenceNode node = + DirectoryNodeFactory.CreateDirectoryNode(parentServiceReferencesFolderNode, project, directory) as ServiceReferenceNode; + + Assert.AreEqual("ServiceReference1", node.Directory); + } + + [Test] + public void CreateDirectoryNode_ProjectHasServiceReferencesItemAndDirectoryMatchesServiceReferencesPath_CreatesServiceReferencesFolderNode() + { + CreateProject(); + project.FileName = @"d:\projects\MyProject\MyProject.csproj"; + ServiceReferencesProjectItem projectItem = AddWCFMetadataProjectItemToProject(); + projectItem.Include = @"Service References\"; + + string directory = @"d:\projects\MyProject\Service References"; + ServiceReferencesFolderNode referencesNode = + DirectoryNodeFactory.CreateDirectoryNode(null, project, directory) as ServiceReferencesFolderNode; + + Assert.AreEqual(directory, referencesNode.Directory); + } + } +} diff --git a/src/Main/Base/Test/ServiceReferences/ItemTypeTests.cs b/src/Main/Base/Test/ServiceReferences/ItemTypeTests.cs new file mode 100644 index 0000000000..c4e26c0f19 --- /dev/null +++ b/src/Main/Base/Test/ServiceReferences/ItemTypeTests.cs @@ -0,0 +1,49 @@ +// 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; +using NUnit.Framework; + +namespace ICSharpCode.SharpDevelop.Tests.ServiceReferences +{ + [TestFixture] + public class ItemTypeTests + { + [Test] + public void IsFolder_ItemTypeIsFolder_ReturnsTrue() + { + var itemType = ItemType.Folder; + bool result = itemType.IsFolder(); + + Assert.IsTrue(result); + } + + [Test] + public void IsFolder_ItemTypeIsResource_ReturnsFalse() + { + var itemType = ItemType.Resource; + bool result = itemType.IsFolder(); + + Assert.IsFalse(result); + } + + [Test] + public void IsFolder_ItemTypeIsWebReferences_ReturnsTrue() + { + var itemType = ItemType.WebReferences; + bool result = itemType.IsFolder(); + + Assert.IsTrue(result); + } + + [Test] + public void IsFolder_ItemTypeIsServiceReferences_ReturnsTrue() + { + var itemType = ItemType.ServiceReferences; + bool result = itemType.IsFolder(); + + Assert.IsTrue(result); + } + } +} diff --git a/src/Main/Base/Test/ServiceReferences/MSBuildBasedProjectTests.cs b/src/Main/Base/Test/ServiceReferences/MSBuildBasedProjectTests.cs new file mode 100644 index 0000000000..f1fabc9810 --- /dev/null +++ b/src/Main/Base/Test/ServiceReferences/MSBuildBasedProjectTests.cs @@ -0,0 +1,40 @@ +// 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; +using ICSharpCode.SharpDevelop.Tests.WebReferences; +using NUnit.Framework; +using Rhino.Mocks; + +namespace ICSharpCode.SharpDevelop.Tests.ServiceReferences +{ + [TestFixture] + public class MSBuildBasedProjectTests + { + MSBuildBasedProject project; + IProjectItemBackendStore backendStore; + + void CreateProject() + { + project = WebReferenceTestHelper.CreateTestProject("C#"); + } + + void CreateProjectItemBackendStore() + { + backendStore = MockRepository.GenerateStub(); + } + + [Test] + public void Create_ItemTypeIsWCFMetadata_ReturnsServiceReferenceProjectItem() + { + CreateProject(); + CreateProjectItemBackendStore(); + backendStore.ItemType = new ItemType("WCFMetadata"); + + var projectItem = project.CreateProjectItem(backendStore) as ServiceReferencesProjectItem; + + Assert.IsNotNull(projectItem); + } + } +} diff --git a/src/Main/Base/Test/ServiceReferences/ServiceReferenceNodeTests.cs b/src/Main/Base/Test/ServiceReferences/ServiceReferenceNodeTests.cs new file mode 100644 index 0000000000..a22bd8b946 --- /dev/null +++ b/src/Main/Base/Test/ServiceReferences/ServiceReferenceNodeTests.cs @@ -0,0 +1,56 @@ +// 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 Gui.Pads.ProjectBrowser.TreeNodes; +using ICSharpCode.SharpDevelop.Project; +using NUnit.Framework; + +namespace ICSharpCode.SharpDevelop.Tests.ServiceReferences +{ + [TestFixture] + public class ServiceReferenceNodeTests + { + ServiceReferenceNode referenceNode; + + void CreateNode() + { + referenceNode = new ServiceReferenceNode("ServiceReference1"); + referenceNode.FileNodeStatus = FileNodeStatus.InProject; + } + + [Test] + public void SpecialFolder_CustomSpecialFolderUsedByServiceReferenceNode_ReturnsServiceReferenceSpecialFolder() + { + CreateNode(); + + Assert.AreEqual(SpecialFolder.ServiceReference, referenceNode.SpecialFolder); + } + + [Test] + public void ContextmenuAddinTreePath_CustomContextMenuPathUsed_ReturnsServiceReferenceContextMenuAddinTreePath() + { + CreateNode(); + + string expectedPath = "/SharpDevelop/Pads/ProjectBrowser/ContextMenu/ServiceReferenceNode"; + + Assert.AreEqual(expectedPath, referenceNode.ContextmenuAddinTreePath); + } + + [Test] + public void OpenedImage_CustomOpenedImageUsed_ReturnsWebReferenceImage() + { + CreateNode(); + + Assert.AreEqual("ProjectBrowser.WebReference", referenceNode.OpenedImage); + } + + [Test] + public void ClosedImage_CustomOpenedImageUsed_ReturnsWebReferenceImage() + { + CreateNode(); + + Assert.AreEqual("ProjectBrowser.WebReference", referenceNode.ClosedImage); + } + } +} diff --git a/src/Main/Base/Test/ServiceReferences/ServiceReferencesFolderNodeTests.cs b/src/Main/Base/Test/ServiceReferences/ServiceReferencesFolderNodeTests.cs new file mode 100644 index 0000000000..23f0f5689c --- /dev/null +++ b/src/Main/Base/Test/ServiceReferences/ServiceReferencesFolderNodeTests.cs @@ -0,0 +1,100 @@ +// 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 Gui.Pads.ProjectBrowser.TreeNodes; +using ICSharpCode.SharpDevelop.Project; +using ICSharpCode.SharpDevelop.Tests.WebReferences; +using NUnit.Framework; + +namespace ICSharpCode.SharpDevelop.Tests.ServiceReferences +{ + [TestFixture] + public class ServiceReferencesFolderNodeTests + { + MSBuildBasedProject project; + ServiceReferencesProjectItem projectItem; + ServiceReferencesFolderNode folderNode; + + void CreateProject() + { + project = WebReferenceTestHelper.CreateTestProject("C#"); + } + + void CreateServiceReferenceProjectItem() + { + CreateProject(); + projectItem = new ServiceReferencesProjectItem(project); + } + + void CreateFolderNode() + { + CreateFolderNode(FileNodeStatus.None); + } + + void CreateFolderNode(FileNodeStatus status) + { + folderNode = new ServiceReferencesFolderNode(projectItem, status); + } + + [Test] + public void Directory_ProjectItemHasServiceReferenceDirectory_ReturnsFullPathToServiceReferencesDirectory() + { + CreateServiceReferenceProjectItem(); + project.FileName = @"d:\projects\MyProject\MyProject.csproj"; + projectItem.Include = @"Service References\"; + CreateFolderNode(); + + string directory = folderNode.Directory; + + Assert.AreEqual(@"d:\projects\MyProject\Service References", directory); + } + + [Test] + public void SortOrder_ServiceReferencesFolderNodeShouldAppearAtTopOfProjectsWindow_ReturnsZero() + { + CreateServiceReferenceProjectItem(); + CreateFolderNode(); + + Assert.AreEqual(0, folderNode.SortOrder); + } + + [Test] + public void SpecialFolder_ServiceReferencesFolderNodeIdentifiedAsSpecialFolder_ReturnsSpecialFolderServicesReferencesFolder() + { + CreateServiceReferenceProjectItem(); + CreateFolderNode(); + + Assert.AreEqual(SpecialFolder.ServiceReferencesFolder, folderNode.SpecialFolder); + } + + [Test] + public void ContextMenuAddinTreePath_ServiceReferencesFolderNodeHasContextMenuAddinTreePath_ReturnsContextMenuAddinTreePathForServiceReferences() + { + CreateServiceReferenceProjectItem(); + CreateFolderNode(); + + string expectedPath = "/SharpDevelop/Pads/ProjectBrowser/ContextMenu/ServiceReferencesFolderNode"; + + Assert.AreEqual(expectedPath, folderNode.ContextmenuAddinTreePath); + } + + [Test] + public void OpenedImage_ServiceReferencesFolderNodeHasCustomIcon_ReturnsWebReferenceFolderIcon() + { + CreateServiceReferenceProjectItem(); + CreateFolderNode(FileNodeStatus.InProject); + + Assert.AreEqual("ProjectBrowser.WebReferenceFolder.Open", folderNode.OpenedImage); + } + + [Test] + public void ClosedImage_ServiceReferencesFolderNodeHasCustomIcon_ReturnsWebReferenceFolderIcon() + { + CreateServiceReferenceProjectItem(); + CreateFolderNode(FileNodeStatus.InProject); + + Assert.AreEqual("ProjectBrowser.WebReferenceFolder.Closed", folderNode.ClosedImage); + } + } +} diff --git a/src/Main/Base/Test/ServiceReferences/ServiceReferencesProjectItemTests.cs b/src/Main/Base/Test/ServiceReferences/ServiceReferencesProjectItemTests.cs new file mode 100644 index 0000000000..b1a4378b19 --- /dev/null +++ b/src/Main/Base/Test/ServiceReferences/ServiceReferencesProjectItemTests.cs @@ -0,0 +1,86 @@ +// 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; +using ICSharpCode.SharpDevelop.Tests.WebReferences; +using NUnit.Framework; + +namespace ICSharpCode.SharpDevelop.Tests.ServiceReferences +{ + [TestFixture] + public class ServiceReferencesProjectItemTests + { + MSBuildBasedProject project; + ServiceReferencesProjectItem projectItem; + + void CreateProjectItem() + { + project = WebReferenceTestHelper.CreateTestProject("C#"); + projectItem = new ServiceReferencesProjectItem(project); + projectItem.Include = @"Service References\"; + ProjectService.AddProjectItem(project, projectItem); + } + + [Test] + public void ItemType_DefaultValue_IsItemTypeServiceReferences() + { + CreateProjectItem(); + + ItemType itemType = projectItem.ItemType; + + Assert.AreEqual(ItemType.ServiceReferences, itemType); + } + + [Test] + public void Directory_ProjectItemIncludePathEndsWithForwardSlash_ReturnsFullPathOfServiceReferencesFolder() + { + CreateProjectItem(); + project.FileName = @"C:\Projects\MyProject\MyProject.csproj"; + projectItem.Include = @"Service References\"; + + string directory = projectItem.Directory; + + Assert.AreEqual(@"C:\Projects\MyProject\Service References", directory); + } + + [Test] + public void IsServiceReferencesFolder_FolderMatchesServiceReferencesFolder_ReturnsTrue() + { + CreateProjectItem(); + project.FileName = @"C:\Projects\MyProject\MyProject.csproj"; + projectItem.Include = @"Service References\"; + string folder = @"C:\Projects\MyProject\Service References"; + + bool result = ServiceReferencesProjectItem.IsServiceReferencesFolder(project, folder); + + Assert.IsTrue(result); + } + + [Test] + public void IsServiceReferencesFolder_FolderDoesNotMatcheServiceReferencesFolder_ReturnsFalse() + { + CreateProjectItem(); + project.FileName = @"C:\Projects\MyProject\MyProject.csproj"; + projectItem.Include = @"Service References\"; + string folder = @"d:\projects\MyProject\Test"; + + bool result = ServiceReferencesProjectItem.IsServiceReferencesFolder(project, folder); + + Assert.IsFalse(result); + } + + [Test] + public void IsServiceReferencesFolder_FolderMatchesServiceReferencesFolderButWithDifferentCase_ReturnsTrue() + { + CreateProjectItem(); + project.FileName = @"C:\Projects\MyProject\MyProject.csproj"; + projectItem.Include = @"Service References\"; + string folder = @"c:\projects\myproject\service references"; + + bool result = ServiceReferencesProjectItem.IsServiceReferencesFolder(project, folder); + + Assert.IsTrue(result); + } + } +}