Browse Source

Store IIS Express and IIS settings in project file.

Set the IsDirty flag when changes made to Web project options.
pull/18/head
Matt Ward 14 years ago
parent
commit
915b36334a
  1. 2
      src/AddIns/BackendBindings/AspNet.Mvc/AspNet.Mvc.sln
  2. 7
      src/AddIns/BackendBindings/AspNet.Mvc/Project/AspNet.Mvc.csproj
  3. 154
      src/AddIns/BackendBindings/AspNet.Mvc/Project/Src/ViewInBrowser.cs
  4. 64
      src/AddIns/BackendBindings/AspNet.Mvc/Project/Src/VisualStudioProjectExtension.cs
  5. 183
      src/AddIns/BackendBindings/AspNet.Mvc/Project/Src/WebBehavior.cs
  6. 78
      src/AddIns/BackendBindings/AspNet.Mvc/Project/Src/WebProject.cs
  7. 71
      src/AddIns/BackendBindings/AspNet.Mvc/Project/Src/WebProjectOptions/WebProjectOptions.cs
  8. 11
      src/AddIns/BackendBindings/AspNet.Mvc/Project/Src/WebProjectOptions/WebProjectOptionsPanel.xaml
  9. 180
      src/AddIns/BackendBindings/AspNet.Mvc/Project/Src/WebProjectOptions/WebProjectOptionsPanel.xaml.cs
  10. 148
      src/AddIns/BackendBindings/AspNet.Mvc/Project/Src/WebProjectProperties.cs
  11. 11
      src/AddIns/BackendBindings/AspNet.Mvc/Project/Src/WebProjectService.cs
  12. 10
      src/AddIns/BackendBindings/AspNet.Mvc/Test/AspNet.Mvc.Tests.csproj
  13. 21
      src/AddIns/BackendBindings/AspNet.Mvc/Test/Helpers/MSBuildProjectHelper.cs
  14. 104
      src/AddIns/BackendBindings/AspNet.Mvc/Test/Src/VisualStudioProjectExtensionTests.cs
  15. 282
      src/AddIns/BackendBindings/AspNet.Mvc/Test/Src/WebProjectPropertiesTests.cs
  16. 276
      src/AddIns/BackendBindings/AspNet.Mvc/Test/Src/WebProjectTests.cs
  17. BIN
      src/AddIns/BackendBindings/AspNet.Mvc/Test/lib/Rhino.Mocks.dll
  18. 25
      src/AddIns/BackendBindings/AspNet.Mvc/Test/lib/Rhino.Mocks.license.txt
  19. 20
      src/Main/Base/Project/Src/Gui/Dialogs/OptionPanels/ProjectOptions/DebugOptions.xaml.cs
  20. 12
      src/Main/Base/Project/Src/Project/AbstractProject.cs
  21. 43
      src/Main/Base/Project/Src/Project/MSBuildBasedProject.cs
  22. 22
      src/Main/Base/Test/ServiceReferences/MSBuildBasedProjectTests.cs

2
src/AddIns/BackendBindings/AspNet.Mvc/AspNet.Mvc.sln

@ -1,7 +1,7 @@ @@ -1,7 +1,7 @@

Microsoft Visual Studio Solution File, Format Version 11.00
# Visual Studio 2010
# SharpDevelop 4.2.0.8299-alpha
# SharpDevelop 4.2.0.8564-beta
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "AspNet.Mvc", "Project\AspNet.Mvc.csproj", "{D781721F-C2A7-4E95-B76F-247170AC3B13}"
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "AspNet.Mvc.Tests", "Test\AspNet.Mvc.Tests.csproj", "{0B12A079-B2DB-42B9-8A8E-AA5CBC2B3225}"

7
src/AddIns/BackendBindings/AspNet.Mvc/Project/AspNet.Mvc.csproj

@ -49,6 +49,9 @@ @@ -49,6 +49,9 @@
<RequiredTargetFramework>4.0</RequiredTargetFramework>
</Reference>
<Reference Include="System.Xml" />
<Reference Include="System.Xml.Linq">
<RequiredTargetFramework>3.5</RequiredTargetFramework>
</Reference>
<Reference Include="WindowsBase" />
</ItemGroup>
<ItemGroup>
@ -224,11 +227,13 @@ @@ -224,11 +227,13 @@
<Compile Include="Src\SlideBehaviour.cs" />
<Compile Include="Src\ViewInBrowser.cs" />
<Compile Include="Src\ViewModelBase.cs" />
<Compile Include="Src\VisualStudioProjectExtension.cs" />
<Compile Include="Src\WebBehavior.cs" />
<Compile Include="Src\WebProjectOptions\WebProjectOptions.cs" />
<Compile Include="Src\WebProject.cs" />
<Compile Include="Src\WebProjectOptions\WebProjectOptionsPanel.xaml.cs">
<DependentUpon>WebProjectOptionsPanel.xaml</DependentUpon>
</Compile>
<Compile Include="Src\WebProjectProperties.cs" />
<Compile Include="Src\WebProjectService.cs" />
</ItemGroup>
<ItemGroup>

154
src/AddIns/BackendBindings/AspNet.Mvc/Project/Src/ViewInBrowser.cs

@ -1,77 +1,77 @@ @@ -1,77 +1,77 @@
// 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.Linq;
using ICSharpCode.Core;
using ICSharpCode.SharpDevelop.Gui.OptionPanels;
using ICSharpCode.SharpDevelop.Project;
using ICSharpCode.SharpDevelop.Project.Commands;
namespace ICSharpCode.AspNet.Mvc
{
public class ViewInBrowser : AbstractMenuCommand
{
public override void Run()
{
var node = ProjectBrowserPad.Instance.SelectedNode as FileNode;
if (node == null) {
return;
}
var project = ProjectService.CurrentProject as CompilableProject;
if (project == null) {
return;
}
if (!project.IsWebProject) {
MessageService.ShowError("${res:ProjectComponent.ContextMenu.NotAWebProject}");
return;
}
if (!WebProjectService.IsIISOrIISExpressInstalled) {
MessageService.ShowError("${res:ICSharpCode.WebProjectOptionsPanel.IISNotFound}");
return;
}
string fileName = node.FileName;
// // set project options
// project.StartAction = StartAction.StartURL;
// string directoryName = Path.GetDirectoryName(project.FileName) + "\\";
// project.StartUrl = fileName.Replace(directoryName, "/").Replace("\\", "/");
// set web server options
string projectName = project.Name;
WebProjectOptions existingOptions = WebProjectsOptions.Instance.GetWebProjectOptions(projectName);
var options = new WebProjectOptions {
Data = new WebProjectDebugData {
WebServer = WebProjectService.IsIISExpressInstalled ? WebServer.IISExpress : WebServer.IIS,
Port = (existingOptions != null && existingOptions.Data != null) ? existingOptions.Data.Port : "8080", //TODO: port collision detection
ProjectUrl = string.Format("{0}/{1}", WebBehavior.LocalHost, project.Name)
},
ProjectName = projectName
};
if (options.Data.WebServer == WebServer.IISExpress) {
options.Data.ProjectUrl = string.Format(
@"{0}:{1}/{2}", WebBehavior.LocalHost, options.Data.Port, projectName);
}
WebProjectsOptions.Instance.SetWebProjectOptions(projectName, options);
// create virtual directory
string error = WebProjectService.CreateVirtualDirectory(
options.Data.WebServer,
projectName,
Path.GetDirectoryName(ProjectService.CurrentProject.FileName));
LoggingService.Info(error ?? string.Empty);
// RunProject
new RunProject().Run();
}
}
}
//// 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.Linq;
//
//using ICSharpCode.Core;
//using ICSharpCode.SharpDevelop.Gui.OptionPanels;
//using ICSharpCode.SharpDevelop.Project;
//using ICSharpCode.SharpDevelop.Project.Commands;
//
//namespace ICSharpCode.AspNet.Mvc
//{
// public class ViewInBrowser : AbstractMenuCommand
// {
// public override void Run()
// {
// var node = ProjectBrowserPad.Instance.SelectedNode as FileNode;
// if (node == null) {
// return;
// }
//
// var project = ProjectService.CurrentProject as CompilableProject;
// if (project == null) {
// return;
// }
//
// if (!project.IsWebProject) {
// MessageService.ShowError("${res:ProjectComponent.ContextMenu.NotAWebProject}");
// return;
// }
//
// if (!WebProjectService.IsIISOrIISExpressInstalled) {
// MessageService.ShowError("${res:ICSharpCode.WebProjectOptionsPanel.IISNotFound}");
// return;
// }
//
// string fileName = node.FileName;
//
//// // set project options
//// project.StartAction = StartAction.StartURL;
//// string directoryName = Path.GetDirectoryName(project.FileName) + "\\";
//// project.StartUrl = fileName.Replace(directoryName, "/").Replace("\\", "/");
//
// // set web server options
// string projectName = project.Name;
// WebProjectOptions existingOptions = WebProjectsOptions.Instance.GetWebProjectOptions(projectName);
//
// var options = new WebProjectOptions {
// Data = new WebProjectDebugData {
// WebServer = WebProjectService.IsIISExpressInstalled ? WebServer.IISExpress : WebServer.IIS,
// Port = (existingOptions != null && existingOptions.Data != null) ? existingOptions.Data.Port : "8080", //TODO: port collision detection
// ProjectUrl = string.Format("{0}/{1}", WebBehavior.LocalHost, project.Name)
// },
// ProjectName = projectName
// };
//
// if (options.Data.WebServer == WebServer.IISExpress) {
// options.Data.ProjectUrl = string.Format(
// @"{0}:{1}/{2}", WebBehavior.LocalHost, options.Data.Port, projectName);
// }
//
// WebProjectsOptions.Instance.SetWebProjectOptions(projectName, options);
//
// // create virtual directory
// string error = WebProjectService.CreateVirtualDirectory(
// options.Data.WebServer,
// projectName,
// Path.GetDirectoryName(ProjectService.CurrentProject.FileName));
// LoggingService.Info(error ?? string.Empty);
//
// // RunProject
// new RunProject().Run();
// }
// }
//}

64
src/AddIns/BackendBindings/AspNet.Mvc/Project/Src/VisualStudioProjectExtension.cs

@ -0,0 +1,64 @@ @@ -0,0 +1,64 @@
// 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.Xml.Linq;
using ICSharpCode.SharpDevelop.Project;
namespace ICSharpCode.AspNet.Mvc
{
public class VisualStudioProjectExtension
{
public static readonly string ProjectExtensionName = "VisualStudio";
public static readonly string FlavorPropertiesName = "FlavorProperties";
WebProjectProperties webProjectProperties;
MSBuildBasedProject msbuildProject;
public VisualStudioProjectExtension(WebProjectProperties properties)
{
this.webProjectProperties = properties;
}
public VisualStudioProjectExtension(MSBuildBasedProject msbuildProject)
{
this.msbuildProject = msbuildProject;
}
public string Name {
get { return ProjectExtensionName; }
}
public XElement ToXElement()
{
var flavorProperties = new XElement(FlavorPropertiesName);
flavorProperties.SetAttributeValue("GUID", "{349C5851-65DF-11DA-9384-00065B846F21}");
flavorProperties.Add(webProjectProperties.ToXElement());
return flavorProperties;
}
public static bool ProjectContainsExtension(MSBuildBasedProject msbuildProject)
{
return msbuildProject.ContainsProjectExtension(ProjectExtensionName);
}
public WebProjectProperties GetWebProjectProperties()
{
XElement element = msbuildProject.LoadProjectExtensions(ProjectExtensionName);
return new WebProjectProperties(element.Descendants().First());
}
public void Save(MSBuildBasedProject msbuildProject)
{
msbuildProject.SaveProjectExtensions(ProjectExtensionName, ToXElement());
}
public bool ContainsWebProjectProperties()
{
XElement element = msbuildProject.LoadProjectExtensions(ProjectExtensionName);
return element.Element("WebProjectProperties") != null;
}
}
}

183
src/AddIns/BackendBindings/AspNet.Mvc/Project/Src/WebBehavior.cs

@ -18,6 +18,7 @@ namespace ICSharpCode.AspNet.Mvc @@ -18,6 +18,7 @@ namespace ICSharpCode.AspNet.Mvc
public const string LocalHost = "http://localhost";
ProcessMonitor monitor;
WebProject webProject;
public string StartProgram {
get { return GetProjectProperty("StartProgram"); }
@ -43,6 +44,19 @@ namespace ICSharpCode.AspNet.Mvc @@ -43,6 +44,19 @@ namespace ICSharpCode.AspNet.Mvc
get { return (MSBuildBasedProject)Project; }
}
CompilableProject CompilableProject {
get { return (CompilableProject)Project; }
}
WebProject WebProject {
get {
if (webProject == null) {
webProject = new WebProject(MSBuildProject);
}
return webProject;
}
}
public override bool IsStartable {
get { return true; }
}
@ -54,111 +68,88 @@ namespace ICSharpCode.AspNet.Mvc @@ -54,111 +68,88 @@ namespace ICSharpCode.AspNet.Mvc
public override void Start(bool withDebugging)
{
ProcessStartInfo processStartInfo = MSBuildProject.CreateStartInfo();
if (FileUtility.IsUrl(processStartInfo.FileName)) {
if (!CheckWebProjectStartInfo())
return;
// we deal with a WebProject
try {
var project = ProjectService.OpenSolution.StartupProject as CompilableProject;
WebProjectOptions options = WebProjectsOptions.Instance.GetWebProjectOptions(project.Name);
string processName = WebProjectService.GetWorkerProcessName(options.Data.WebServer);
// try find the worker process directly or using the process monitor callback
Process[] processes = System.Diagnostics.Process.GetProcesses();
int index = processes.FindIndex(p => p.ProcessName.Equals(processName, StringComparison.OrdinalIgnoreCase));
if (index > -1) {
if (withDebugging)
DebuggerService.CurrentDebugger.Attach(processes[index]);
} else {
if (options.Data.WebServer == WebServer.IISExpress) {
// start IIS express and attach to it
if (WebProjectService.IsIISExpressInstalled) {
DebuggerService.CurrentDebugger.Start(new ProcessStartInfo(WebProjectService.IISExpressProcessLocation));
} else {
DisposeProcessMonitor();
MessageService.ShowError("${res:ICSharpCode.WepProjectOptionsPanel.NoProjectUrlOrProgramAction}");
return;
}
if (!CheckWebProjectStartInfo())
return;
try {
WebProjectProperties properties = WebProject.GetWebProjectProperties();
string processName = WebProjectService.GetWorkerProcessName(properties);
// try find the worker process directly or using the process monitor callback
Process[] processes = System.Diagnostics.Process.GetProcesses();
int index = processes.FindIndex(p => p.ProcessName.Equals(processName, StringComparison.OrdinalIgnoreCase));
if (index > -1) {
if (withDebugging)
DebuggerService.CurrentDebugger.Attach(processes[index]);
} else {
if (properties.UseIISExpress) {
// start IIS express and attach to it
if (WebProjectService.IsIISExpressInstalled) {
DebuggerService.CurrentDebugger.Start(new ProcessStartInfo(WebProjectService.IISExpressProcessLocation));
} else {
DisposeProcessMonitor();
this.monitor = new ProcessMonitor(processName);
this.monitor.ProcessCreated += delegate {
WorkbenchSingleton.SafeThreadCall((Action)(() => OnProcessCreated(options, withDebugging)));
};
this.monitor.Start();
MessageService.ShowError("${res:ICSharpCode.WepProjectOptionsPanel.NoProjectUrlOrProgramAction}");
return;
}
} else {
DisposeProcessMonitor();
this.monitor = new ProcessMonitor(processName);
this.monitor.ProcessCreated += delegate {
WorkbenchSingleton.SafeThreadCall((Action)(() => OnProcessCreated(properties, withDebugging)));
};
this.monitor.Start();
}
// start default application(e.g. browser) or the one specified
switch (project.StartAction) {
case StartAction.Project:
if (FileUtility.IsUrl(options.Data.ProjectUrl)) {
Process.Start(options.Data.ProjectUrl);
}
// start default application(e.g. browser) or the one specified
switch (CompilableProject.StartAction) {
case StartAction.Project:
if (FileUtility.IsUrl(properties.IISUrl)) {
Process.Start(properties.IISUrl);
} else {
MessageService.ShowError("${res:ICSharpCode.WebProjectOptionsPanel.NoProjectUrlOrProgramAction}");
DisposeProcessMonitor();
}
break;
case StartAction.Program:
Process.Start(StartProgram);
break;
case StartAction.StartURL:
if (FileUtility.IsUrl(StartUrl)) {
Process.Start(StartUrl);
} else {
string url = string.Concat(properties.IISUrl, StartUrl);
if (FileUtility.IsUrl(url)) {
Process.Start(url);
} else {
MessageService.ShowError("${res:ICSharpCode.WebProjectOptionsPanel.NoProjectUrlOrProgramAction}");
DisposeProcessMonitor();
return;
}
break;
case StartAction.Program:
Process.Start(StartProgram);
break;
case StartAction.StartURL:
if (FileUtility.IsUrl(StartUrl)) {
Process.Start(StartUrl);
} else {
string url = string.Concat(options.Data.ProjectUrl, StartUrl);
if (FileUtility.IsUrl(url)) {
Process.Start(url);
} else {
MessageService.ShowError("${res:ICSharpCode.WebProjectOptionsPanel.NoProjectUrlOrProgramAction}");
DisposeProcessMonitor();
return;
}
}
break;
default:
throw new System.Exception("Invalid value for StartAction");
}
} catch (System.Exception ex) {
string err = "Error: " + ex.Message;
MessageService.ShowError(err);
LoggingService.Error(err);
DisposeProcessMonitor();
}
break;
default:
throw new Exception("Invalid value for StartAction");
}
} catch (Exception ex) {
MessageService.ShowError(ex.Message);
LoggingService.Error(ex.ToString());
DisposeProcessMonitor();
}
}
bool CheckWebProjectStartInfo()
{
// check if we have startup project
var project = ProjectService.OpenSolution.StartupProject as CompilableProject;
if (project == null) {
MessageService.ShowError("${res:ICSharpCode.NoStartupProject}");
return false;
}
// check if we have options
if (WebProjectsOptions.Instance == null) {
MessageService.ShowError("${res:ICSharpCode.WebProjectOptionsPanel.NoProjectUrlOrProgramAction}");
return false;
if (WebProject.HasWebProjectProperties() && WebProject.GetWebProjectProperties().IsConfigured()) {
return true;
}
// check the options
WebProjectOptions options = WebProjectsOptions.Instance.GetWebProjectOptions(project.Name);
if (options == null || options.Data == null || string.IsNullOrEmpty(options.ProjectName) ||
options.Data.WebServer == WebServer.None) {
MessageService.ShowError("${res:ICSharpCode.WebProjectOptionsPanel.NoProjectUrlOrProgramAction}");
return false;
}
return true;
MessageService.ShowError("${res:ICSharpCode.WebProjectOptionsPanel.NoProjectUrlOrProgramAction}");
return false;
}
void OnProcessCreated(WebProjectOptions options, bool withDebugging)
void OnProcessCreated(WebProjectProperties properties, bool withDebugging)
{
string processName = WebProjectService.GetWorkerProcessName(options.Data.WebServer);
string processName = WebProjectService.GetWorkerProcessName(properties);
Process[] processes = Process.GetProcesses();
int index = processes.FindIndex(p => p.ProcessName.Equals(processName, StringComparison.OrdinalIgnoreCase));
if (index == -1)
@ -167,7 +158,7 @@ namespace ICSharpCode.AspNet.Mvc @@ -167,7 +158,7 @@ namespace ICSharpCode.AspNet.Mvc
DebuggerService.CurrentDebugger.Attach(processes[index]);
if (!DebuggerService.CurrentDebugger.IsAttached) {
if(options.Data.WebServer == WebServer.IIS) {
if(properties.UseIIS) {
string format = ResourceService.GetString("ICSharpCode.WebProjectOptionsPanel.NoIISWP");
MessageService.ShowMessage(string.Format(format, processName));
}
@ -183,21 +174,5 @@ namespace ICSharpCode.AspNet.Mvc @@ -183,21 +174,5 @@ namespace ICSharpCode.AspNet.Mvc
monitor = null;
}
}
public override Properties CreateMemento()
{
Properties properties = base.CreateMemento();
WebProjectOptions webOptions = WebProjectsOptions.Instance.GetWebProjectOptions(Project.Name);
if (webOptions != null)
properties.Set("WebProjectOptions", webOptions);
return properties;
}
public override void SetMemento(Properties memento)
{
// web project properties
WebProjectsOptions.Instance.SetWebProjectOptions(Project.Name, memento.Get("WebProjectOptions", new WebProjectOptions()) as WebProjectOptions);
base.SetMemento(memento);
}
}
}

78
src/AddIns/BackendBindings/AspNet.Mvc/Project/Src/WebProject.cs

@ -0,0 +1,78 @@ @@ -0,0 +1,78 @@
// 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.AspNet.Mvc
{
public class WebProject
{
public static readonly WebProjectProperties DefaultProperties = new WebProjectProperties
{
DevelopmentServerPort = 8080,
DevelopmentServerVPath = "/"
};
MSBuildBasedProject msbuildProject;
public WebProject(MSBuildBasedProject msbuildProject)
{
this.msbuildProject = msbuildProject;
}
public bool HasWebProjectProperties()
{
if (VisualStudioProjectExtension.ProjectContainsExtension(msbuildProject)) {
var projectExtension = new VisualStudioProjectExtension(msbuildProject);
return projectExtension.ContainsWebProjectProperties();
}
return false;
}
public WebProjectProperties GetWebProjectProperties()
{
if (HasWebProjectProperties()) {
var projectExtension = new VisualStudioProjectExtension(msbuildProject);
WebProjectProperties properties = projectExtension.GetWebProjectProperties();
properties.UseIISExpress = UseIISExpress;
return properties;
}
return DefaultProperties;
}
public bool UseIISExpress
{
get { return GetUseIISExpress(); }
}
bool GetUseIISExpress()
{
string value = GetMSBuildProperty("UseIISExpress");
bool result = false;
Boolean.TryParse(value, out result);
return result;
}
string GetMSBuildProperty(string propertyName)
{
string value = msbuildProject.GetEvaluatedProperty(propertyName);
if (value != null) {
return value;
}
return String.Empty;
}
public void UpdateWebProjectProperties(WebProjectProperties properties)
{
var projectExtension = new VisualStudioProjectExtension(properties);
projectExtension.Save(msbuildProject);
SetMSBuildProperty("UseIISExpress", properties.UseIISExpress);
}
void SetMSBuildProperty(string propertyName, bool value)
{
msbuildProject.SetProperty(propertyName, value.ToString());
}
}
}

71
src/AddIns/BackendBindings/AspNet.Mvc/Project/Src/WebProjectOptions/WebProjectOptions.cs

@ -1,71 +0,0 @@ @@ -1,71 +0,0 @@
// 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.ComponentModel;
using ICSharpCode.Core;
using ICSharpCode.SharpDevelop.Project;
namespace ICSharpCode.AspNet.Mvc
{
public sealed class WebProjectsOptions
{
private WebProjectsOptions() { }
private static readonly WebProjectsOptions _Instance = new WebProjectsOptions();
private List<WebProjectOptions> options = new List<WebProjectOptions>();
public WebProjectOptions GetWebProjectOptions(string projectName) {
return options.Find(o => o.ProjectName == projectName);
}
public void SetWebProjectOptions(string projectName, WebProjectOptions data)
{
var d = GetWebProjectOptions(projectName);
if (d == null)
{
if (data == null)
data = new WebProjectOptions() { ProjectName = projectName };
options.Add(data);
}
else
{
int index = options.IndexOf(d);
options[index] = data;
}
}
public static WebProjectsOptions Instance {
get {
return _Instance;
}
}
}
[Serializable]
public class WebProjectOptions
{
[DefaultValue(null)]
public string ProjectName { get; set; }
[DefaultValue(null)]
public WebProjectDebugData Data { get; set; }
}
[Serializable]
public class WebProjectDebugData
{
[DefaultValue(null)]
public string ProjectUrl { get; set; }
[DefaultValue("8080")]
public string Port { get; set; }
[DefaultValue(WebServer.None)]
public WebServer WebServer { get; set; }
}
}

11
src/AddIns/BackendBindings/AspNet.Mvc/Project/Src/WebProjectOptions/WebProjectOptionsPanel.xaml

@ -67,20 +67,27 @@ @@ -67,20 +67,27 @@
FontWeight="Bold"
TextWrapping="Wrap"
Name="StatusLabel" />
<widgets:UniformGridWithSpacing Columns="2" SpaceBetweenColumns="10">
<Grid>
<Grid.ColumnDefinitions>
<ColumnDefinition Width="Auto" />
<ColumnDefinition Width="Auto" />
</Grid.ColumnDefinitions>
<Button
IsEnabled="False"
Margin="0,2,0,2"
Style="{x:Static core:GlobalStyles.ButtonStyle}"
HorizontalAlignment="Left"
Name="CreateVirtualDirectoryButton"
Content="{core:Localize ICSharpCode.WebProjectOptionsPanel.CreateVirtualDir}"
Click="CreateVirtualDirectory_Click" />
<Button
Grid.Column="1"
Margin="0,2,2,2"
Style="{x:Static core:GlobalStyles.ButtonStyle}"
Name="ClearWebServerButton"
HorizontalAlignment="Left"
Content="{core:Localize ICSharpCode.WebProjectOptionsPanel.DisableWebServerButton}"
Click="ClearWebServerButton_Click" />
</widgets:UniformGridWithSpacing>
</Grid>
</widgets:StackPanelWithSpacing>
</options:ProjectOptionPanel>

180
src/AddIns/BackendBindings/AspNet.Mvc/Project/Src/WebProjectOptions/WebProjectOptionsPanel.xaml.cs

@ -6,6 +6,8 @@ using System.IO; @@ -6,6 +6,8 @@ using System.IO;
using System.Web.Services.Description;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Input;
using ICSharpCode.Core;
using ICSharpCode.SharpDevelop.Gui.OptionPanels;
using ICSharpCode.SharpDevelop.Project;
@ -14,146 +16,141 @@ namespace ICSharpCode.AspNet.Mvc @@ -14,146 +16,141 @@ namespace ICSharpCode.AspNet.Mvc
{
public partial class WebProjectOptionsPanel : ProjectOptionPanel
{
WebProject webProject;
WebProjectProperties properties;
public WebProjectOptionsPanel()
{
InitializeComponent();
if (CurrentProjectDebugData == null)
CurrentProjectDebugData = new WebProjectDebugData();
Loaded += OnLoaded;
}
void OnLoaded(object sender, RoutedEventArgs e)
protected override void Load(MSBuildBasedProject project, string configuration, string platform)
{
CreateWebProject(project);
if (!WebProjectService.IsIISOrIISExpressInstalled) {
StatusLabel.Text = ResourceService.GetString("ICSharpCode.WebProjectOptionsPanel.IISNotFound");
return;
}
switch (CurrentProjectDebugData.WebServer)
{
case WebServer.IISExpress:
if (WebProjectService.IsIISExpressInstalled) {
UseIISExpress.IsChecked = true;
PortTextBox.Text = CurrentProjectDebugData.Port ?? "8080";
SelectIISExpress();
}
break;
case WebServer.IIS:
if (WebProjectService.IISVersion != IISVersion.None) {
UseLocalIIS.IsChecked = true;
ProjectUrl.Text = CurrentProjectDebugData.ProjectUrl ?? string.Empty;
SelectLocalIIS();
}
break;
default:
// do nothing
break;
if (properties.UseIISExpress) {
if (WebProjectService.IsIISExpressInstalled) {
UseIISExpress.IsChecked = true;
PortTextBox.Text = properties.DevelopmentServerPort.ToString();
SelectIISExpress();
}
} else if (properties.UseIIS) {
if (WebProjectService.IISVersion != IISVersion.None) {
UseLocalIIS.IsChecked = true;
ProjectUrl.Text = properties.IISUrl;
SelectLocalIIS();
}
}
}
void CreateWebProject(MSBuildBasedProject project)
{
webProject = new WebProject(project);
properties = webProject.GetWebProjectProperties();
}
WebProjectDebugData CurrentProjectDebugData {
get {
var data = WebProjectsOptions.Instance.GetWebProjectOptions(ProjectService.CurrentProject.Name);
if (data != null)
return data.Data;
return null;
}
set {
WebProjectOptions data;
if (value != null)
{
data = new WebProjectOptions() {
ProjectName = ProjectService.CurrentProject.Name,
Data = value
};
}
else
data = new WebProjectOptions();
WebProjectsOptions.Instance.SetWebProjectOptions(ProjectService.CurrentProject.Name, data);
protected override bool Save(MSBuildBasedProject project, string configuration, string platform)
{
if (IsDirty) {
webProject.UpdateWebProjectProperties(properties);
//project.Save();
}
IsDirty = false;
return true;
}
void CreateVirtualDirectory_Click(object sender, RoutedEventArgs e)
{
string error = WebProjectService.CreateVirtualDirectory(
CurrentProjectDebugData.WebServer,
GetWebServer(),
ProjectService.CurrentProject.Name,
Path.GetDirectoryName(ProjectService.CurrentProject.FileName));
if (!string.IsNullOrEmpty(error))
if (!string.IsNullOrEmpty(error)) {
MessageService.ShowError(error);
else {
} else {
MessageService.ShowMessage(ResourceService.GetString("ICSharpCode.WebProjectOptionsPanel.VirtualDirCreated"));
}
}
WebServer GetWebServer()
{
if (properties.UseIISExpress) {
return WebServer.IISExpress;
}
return WebServer.IIS;
}
void UseIISExpress_Click(object sender, RoutedEventArgs e)
{
SelectIISExpress();
OnWebProjectPropertiesChanged();
}
void SelectIISExpress()
{
WebProjectDebugData data = new WebProjectDebugData();
data.WebServer = WebServer.IISExpress;
data.Port = PortTextBox.Text;
data.ProjectUrl = string.Format(@"http://localhost:{0}/" + ProjectService.CurrentProject.Name, PortTextBox.Text);
properties.UseIISExpress = true;
properties.UseIIS = false;
properties.DevelopmentServerPort = Int32.Parse(PortTextBox.Text);
if (String.IsNullOrEmpty(properties.IISUrl)) {
properties.IISUrl = String.Format(@"http://localhost:{0}/" + ProjectService.CurrentProject.Name, PortTextBox.Text);
OnWebProjectPropertiesChanged();
}
bool isIISExpressInstalled = WebProjectService.IsIISExpressInstalled;
if (!isIISExpressInstalled) {
UseIISExpress.IsChecked = false;
data.WebServer = WebServer.None;
properties.UseIISExpress = false;
StatusLabel.Text = ResourceService.GetString("ICSharpCode.WebProjectOptionsPanel.IISNotFound");
data.ProjectUrl = string.Empty;
} else {
StatusLabel.Text = String.Empty;
}
else
StatusLabel.Text = string.Empty;
IISExpressGroup.IsEnabled = CreateVirtualDirectoryButton.IsEnabled = isIISExpressInstalled;
LocalIISGroup.IsEnabled = false;
CurrentProjectDebugData = data;
}
void UseLocalIIS_Click(object sender, RoutedEventArgs e)
{
SelectLocalIIS();
OnWebProjectPropertiesChanged();
}
void SelectLocalIIS()
{
WebProjectDebugData data = new WebProjectDebugData();
data.WebServer = WebServer.IIS;
data.Port = string.Empty;
properties.UseIISExpress = false;
properties.UseIIS = true;
bool isIISInstalled = WebProjectService.IISVersion != IISVersion.None;
if (!isIISInstalled) {
StatusLabel.Text = ResourceService.GetString("ICSharpCode.WebProjectOptionsPanel.IISNotFound");
ProjectUrl.Text = string.Empty;
data.WebServer = WebServer.None;
ProjectUrl.Text = String.Empty;
UseLocalIIS.IsChecked = false;
} else {
StatusLabel.Text = string.Empty;
ProjectUrl.Text = string.Format("{0}/{1}", WebBehavior.LocalHost, ProjectService.CurrentProject.Name);
StatusLabel.Text = String.Empty;
if (String.IsNullOrEmpty(properties.IISUrl)) {
properties.IISUrl = String.Format("{0}/{1}", WebBehavior.LocalHost, ProjectService.CurrentProject.Name);
OnWebProjectPropertiesChanged();
}
ProjectUrl.Text = properties.IISUrl;
}
data.ProjectUrl = ProjectUrl.Text;
LocalIISGroup.IsEnabled = CreateVirtualDirectoryButton.IsEnabled = isIISInstalled;
IISExpressGroup.IsEnabled = false;
CurrentProjectDebugData = data;
}
void ProjectUrl_TextChanged(object sender, TextChangedEventArgs e)
{
WebProjectDebugData data = new WebProjectDebugData();
data.WebServer = WebServer.IIS;
data.ProjectUrl = ProjectUrl.Text;
CurrentProjectDebugData = data;
properties.IISUrl = ProjectUrl.Text;
OnWebProjectPropertiesChanged();
}
void OnWebProjectPropertiesChanged()
{
IsDirty = true;
}
void ClearWebServerButton_Click(object sender, RoutedEventArgs e)
@ -161,40 +158,37 @@ namespace ICSharpCode.AspNet.Mvc @@ -161,40 +158,37 @@ namespace ICSharpCode.AspNet.Mvc
UseIISExpress.IsChecked = false;
UseLocalIIS.IsChecked = false;
CreateVirtualDirectoryButton.IsEnabled = false;
ProjectUrl.Text = string.Empty;
ProjectUrl.Text = String.Empty;
LocalIISGroup.IsEnabled = false;
IISExpressGroup.IsEnabled = false;
WebProjectDebugData data = new WebProjectDebugData();
data.WebServer = WebServer.None;
data.ProjectUrl = string.Empty;
CurrentProjectDebugData = data;
properties.UseIISExpress = false;
properties.UseIIS = false;
OnWebProjectPropertiesChanged();
}
bool AreAllValidNumericChars(string str)
{
foreach(char c in str)
{
if(!Char.IsNumber(c)) return false;
foreach(char c in str) {
if (!Char.IsNumber(c)) return false;
}
return true;
}
void PortTextBox_PreviewTextInput(object sender, System.Windows.Input.TextCompositionEventArgs e)
void PortTextBox_PreviewTextInput(object sender, TextCompositionEventArgs e)
{
e.Handled = !AreAllValidNumericChars(e.Text);
if (AreAllValidNumericChars(e.Text)) {
OnWebProjectPropertiesChanged();
} else {
e.Handled = true;
}
base.OnPreviewTextInput(e);
}
void PortTextBox_KeyUp(object sender, System.Windows.Input.KeyEventArgs e)
void PortTextBox_KeyUp(object sender, KeyEventArgs e)
{
WebProjectDebugData data = new WebProjectDebugData();
data.WebServer = WebServer.IISExpress;
data.Port = PortTextBox.Text;
data.ProjectUrl = string.Format(@"{0}:{1}/{2}", WebBehavior.LocalHost, PortTextBox.Text, ProjectService.CurrentProject.Name);
CurrentProjectDebugData = data;
properties.DevelopmentServerPort = Int32.Parse(PortTextBox.Text);
properties.IISUrl = String.Format(@"{0}:{1}/{2}", WebBehavior.LocalHost, PortTextBox.Text, ProjectService.CurrentProject.Name);
}
}
}

148
src/AddIns/BackendBindings/AspNet.Mvc/Project/Src/WebProjectProperties.cs

@ -0,0 +1,148 @@ @@ -0,0 +1,148 @@
// 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;
using System.Xml.Linq;
namespace ICSharpCode.AspNet.Mvc
{
public class WebProjectProperties
{
public WebProjectProperties()
{
this.CustomServerUrl = String.Empty;
this.DevelopmentServerVPath = String.Empty;
this.IISUrl = String.Empty;
}
public WebProjectProperties(XElement element)
{
Load(element);
}
void Load(XElement element)
{
AutoAssignPort = GetChildElementBoolean("AutoAssignPort", element);
CustomServerUrl = GetChildElementString("CustomServerUrl", element);
DevelopmentServerPort = GetChildElementInteger("DevelopmentServerPort", element);
DevelopmentServerVPath = GetChildElementString("DevelopmentServerVPath", element);
IISUrl = GetChildElementString("IISUrl", element);
NTLMAuthentication = GetChildElementBoolean("NTLMAuthentication", element);
SaveServerSettingsInUserFile = GetChildElementBoolean("SaveServerSettingsInUserFile", element);
UseCustomServer = GetChildElementBoolean("UseCustomServer", element);
UseIIS = GetChildElementBoolean("UseIIS", element);
}
string GetChildElementString(string name, XElement element)
{
XElement childElement = element.Element(name);
if (childElement != null) {
return childElement.Value;
}
return String.Empty;
}
int GetChildElementInteger(string name, XElement element)
{
string value = GetChildElementString(name, element);
int result = 0;
Int32.TryParse(value, out result);
return result;
}
bool GetChildElementBoolean(string name, XElement element)
{
string value = GetChildElementString(name, element);
bool result = false;
Boolean.TryParse(value, out result);
return result;
}
public override bool Equals(object obj)
{
var properties = obj as WebProjectProperties;
if (properties != null) {
return Equals(properties);
}
return false;
}
bool Equals(WebProjectProperties properties)
{
return
(AutoAssignPort == properties.AutoAssignPort) &&
(UseIIS == properties.UseIIS) &&
(DevelopmentServerVPath == properties.DevelopmentServerVPath) &&
(DevelopmentServerPort == properties.DevelopmentServerPort) &&
(CustomServerUrl == properties.CustomServerUrl) &&
(UseCustomServer == properties.UseCustomServer) &&
(SaveServerSettingsInUserFile == properties.SaveServerSettingsInUserFile) &&
(UseIISExpress == properties.UseIISExpress) &&
(NTLMAuthentication == properties.NTLMAuthentication) &&
(IISUrl == properties.IISUrl);
}
public override int GetHashCode()
{
return base.GetHashCode();
}
public override string ToString()
{
return String.Format(
"[WebProjectProperties IISUrl=\"{0}\", UseIISExpress={1}, UseIIS={2}, SaveServerSettingsInUserFile={3}]",
IISUrl,
UseIISExpress,
UseIIS,
SaveServerSettingsInUserFile);
}
public bool AutoAssignPort { get; set; }
public string DevelopmentServerVPath { get; set; }
public int DevelopmentServerPort { get; set; }
public bool NTLMAuthentication { get; set; }
public bool UseIIS { get; set; }
public string IISUrl { get; set; }
public bool UseIISExpress { get; set; }
public bool SaveServerSettingsInUserFile { get; set; }
public bool UseCustomServer { get; set; }
public string CustomServerUrl { get; set; }
public XElement ToXElement()
{
return new XElement(
"WebProjectProperties",
CreateBooleanXElement("UseIIS", UseIIS),
CreateBooleanXElement("AutoAssignPort", AutoAssignPort),
new XElement("DevelopmentServerPort", DevelopmentServerPort),
new XElement("DevelopmentServerVPath", DevelopmentServerVPath),
new XElement("IISUrl", IISUrl),
CreateBooleanXElement("NTLMAuthentication", NTLMAuthentication),
CreateBooleanXElement("UseCustomServer", UseCustomServer),
new XElement("CustomServerUrl", CustomServerUrl),
CreateBooleanXElement("SaveServerSettingsInUserFile", SaveServerSettingsInUserFile));
}
XElement CreateBooleanXElement(string name, bool value)
{
return new XElement(name, value.ToString());
}
public bool IsConfigured()
{
return
(UseIIS || UseIISExpress) && IsValidIISUrl();
}
bool IsValidIISUrl()
{
return !String.IsNullOrEmpty(IISUrl);
}
}
}

11
src/AddIns/BackendBindings/AspNet.Mvc/Project/Src/WebProjectService.cs

@ -83,6 +83,14 @@ namespace ICSharpCode.AspNet.Mvc @@ -83,6 +83,14 @@ namespace ICSharpCode.AspNet.Mvc
return GetIISWorkerProcessName();
}
public static string GetWorkerProcessName(WebProjectProperties properties)
{
if (properties.UseIISExpress) {
return GetIISExpressWorkerProcessName();
}
return GetIISWorkerProcessName();
}
public static string GetIISExpressWorkerProcessName()
{
if (!IsIISExpressInstalled)
@ -97,8 +105,7 @@ namespace ICSharpCode.AspNet.Mvc @@ -97,8 +105,7 @@ namespace ICSharpCode.AspNet.Mvc
return ResourceService.GetString("ICSharpCode.WebProjectOptionsPanel.IISNotFound");
try {
switch (IISVersion)
{
switch (IISVersion) {
case IISVersion.IIS5:
return IIS_5_PROCESS_NAME;
default:

10
src/AddIns/BackendBindings/AspNet.Mvc/Test/AspNet.Mvc.Tests.csproj

@ -29,6 +29,7 @@ @@ -29,6 +29,7 @@
<DefineConstants>TRACE</DefineConstants>
</PropertyGroup>
<ItemGroup>
<Reference Include="Microsoft.Build" />
<Reference Include="Mono.TextTemplating">
<HintPath>..\..\..\Misc\TextTemplating\Project\lib\Mono.TextTemplating.dll</HintPath>
</Reference>
@ -42,7 +43,7 @@ @@ -42,7 +43,7 @@
<RequiredTargetFramework>3.0</RequiredTargetFramework>
</Reference>
<Reference Include="Rhino.Mocks">
<HintPath>lib\Rhino.Mocks.dll</HintPath>
<HintPath>..\..\..\..\Libraries\RhinoMocks\Rhino.Mocks.dll</HintPath>
</Reference>
<Reference Include="System" />
<Reference Include="System.Core">
@ -53,6 +54,9 @@ @@ -53,6 +54,9 @@
<RequiredTargetFramework>4.0</RequiredTargetFramework>
</Reference>
<Reference Include="System.Xml" />
<Reference Include="System.Xml.Linq">
<RequiredTargetFramework>3.5</RequiredTargetFramework>
</Reference>
<Reference Include="WindowsBase">
<RequiredTargetFramework>3.0</RequiredTargetFramework>
</Reference>
@ -79,6 +83,7 @@ @@ -79,6 +83,7 @@
<Compile Include="Helpers\FakeMvcViewFileGenerator.cs" />
<Compile Include="Helpers\FakeSelectedFolderNodeInProjectsView.cs" />
<Compile Include="Helpers\FakeSelectedMvcFolder.cs" />
<Compile Include="Helpers\MSBuildProjectHelper.cs" />
<Compile Include="Helpers\MvcControllerTextTemplateCollectionAssert.cs" />
<Compile Include="Helpers\MvcProjectFileAssert.cs" />
<Compile Include="Helpers\MvcProjectFileCollectionAssert.cs" />
@ -144,6 +149,9 @@ @@ -144,6 +149,9 @@
<Compile Include="Src\MvcViewFileGeneratorTests.cs" />
<Compile Include="Src\SelectedFolderNodeInProjectsViewTests.cs" />
<Compile Include="Src\SelectedMvcViewFolderTests.cs" />
<Compile Include="Src\VisualStudioProjectExtensionTests.cs" />
<Compile Include="Src\WebProjectPropertiesTests.cs" />
<Compile Include="Src\WebProjectTests.cs" />
</ItemGroup>
<ItemGroup>
<ProjectReference Include="..\..\..\..\Libraries\AvalonEdit\ICSharpCode.AvalonEdit\ICSharpCode.AvalonEdit.csproj">

21
src/AddIns/BackendBindings/AspNet.Mvc/Test/Helpers/MSBuildProjectHelper.cs

@ -0,0 +1,21 @@ @@ -0,0 +1,21 @@
// 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.Internal.Templates;
using ICSharpCode.SharpDevelop.Project;
using Rhino.Mocks;
namespace AspNet.Mvc.Tests.Helpers
{
public static class MSBuildProjectHelper
{
public static MSBuildBasedProject CreateCSharpProject()
{
var createInfo = new ProjectCreateInformation();
createInfo.Solution = new Solution(MockRepository.GenerateStub<IProjectChangeWatcher>());
createInfo.OutputProjectFileName = @"d:\projects\MyProject\MyProject.csproj";
return new MSBuildBasedProject(createInfo);
}
}
}

104
src/AddIns/BackendBindings/AspNet.Mvc/Test/Src/VisualStudioProjectExtensionTests.cs

@ -0,0 +1,104 @@ @@ -0,0 +1,104 @@
// 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.Linq;
using AspNet.Mvc.Tests.Helpers;
using ICSharpCode.AspNet.Mvc;
using ICSharpCode.SharpDevelop.Project;
using NUnit.Framework;
namespace AspNet.Mvc.Tests
{
[TestFixture]
public class VisualStudioProjectExtensionTests
{
VisualStudioProjectExtension extension;
MSBuildBasedProject msbuildProject;
void CreateExtension()
{
msbuildProject = MSBuildProjectHelper.CreateCSharpProject();
CreateExtension(msbuildProject);
}
void CreateExtension(MSBuildBasedProject msbuildProject)
{
extension = new VisualStudioProjectExtension(msbuildProject);
}
void CreateMSBuildProject()
{
msbuildProject = MSBuildProjectHelper.CreateCSharpProject();
}
void CreateMSBuildProjectWithWebProjectProperties()
{
CreateMSBuildProject();
var properties = new WebProjectProperties();
var extension = new VisualStudioProjectExtension(properties);
extension.Save(msbuildProject);
}
void AddVisualStudioExtensionWithChildElement(string childElementName)
{
msbuildProject.SaveProjectExtensions(VisualStudioProjectExtension.ProjectExtensionName, new XElement(childElementName));
}
[Test]
public void ProjectContainsExtension_MSBuildProjectHasNoVisualStudioExtension_ReturnsFalse()
{
CreateMSBuildProject();
bool exists = VisualStudioProjectExtension.ProjectContainsExtension(msbuildProject);
Assert.IsFalse(exists);
}
[Test]
public void ProjectContainsExtension_MSBuildProjectHasVisualStudioExtension_ReturnsTrue()
{
CreateMSBuildProject();
AddVisualStudioExtensionWithChildElement("Test");
bool exists = VisualStudioProjectExtension.ProjectContainsExtension(msbuildProject);
Assert.IsTrue(exists);
}
[Test]
public void ContainsWebProjectProperties_MSBuildProjectHasWebProjectProperties_ReturnsTrue()
{
CreateMSBuildProjectWithWebProjectProperties();
CreateExtension(msbuildProject);
bool contains = extension.ContainsWebProjectProperties();
Assert.IsTrue(contains);
}
[Test]
public void ContainsWebProjectProperties_MSBuildProjectDoesNotHaveWebProjectProperties_ReturnsFalse()
{
CreateMSBuildProject();
CreateExtension();
bool contains = extension.ContainsWebProjectProperties();
Assert.IsFalse(contains);
}
[Test]
public void ContainsWebProjectProperties_MSBuildProjectDoesNotHaveWebProjectPropertiesButHasVisualStudioExtension_ReturnsFalse()
{
CreateMSBuildProject();
AddVisualStudioExtensionWithChildElement("Test");
CreateExtension(msbuildProject);
bool contains = extension.ContainsWebProjectProperties();
Assert.IsFalse(contains);
}
}
}

282
src/AddIns/BackendBindings/AspNet.Mvc/Test/Src/WebProjectPropertiesTests.cs

@ -0,0 +1,282 @@ @@ -0,0 +1,282 @@
// 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.Linq;
using ICSharpCode.AspNet.Mvc;
using NUnit.Framework;
namespace AspNet.Mvc.Tests
{
[TestFixture]
public class WebProjectPropertiesTests
{
WebProjectProperties lhs;
WebProjectProperties rhs;
void CreateTwoWebProjectProperties()
{
lhs = new WebProjectProperties();
rhs = new WebProjectProperties();
}
[Test]
public void Equals_AllPropertiesAreTheSame_ReturnsTrue()
{
CreateTwoWebProjectProperties();
Assert.AreEqual(lhs, rhs);
}
[Test]
public void Equals_UseIISPropertyIsDifferent_ReturnsFalse()
{
CreateTwoWebProjectProperties();
lhs.UseIIS = false;
rhs.UseIIS = true;
Assert.AreNotEqual(lhs, rhs);
}
[Test]
public void Equals_Null_ReturnsFalse()
{
CreateTwoWebProjectProperties();
bool result = lhs.Equals(null);
Assert.IsFalse(result);
}
[Test]
public void Equals_AutoAssignPortPropertyIsDifferent_ReturnsFalse()
{
CreateTwoWebProjectProperties();
lhs.AutoAssignPort = true;
rhs.AutoAssignPort = false;
Assert.AreNotEqual(lhs, rhs);
}
[Test]
public void Equals_DevelopmentServerVPathPropertyIsDifferent_ReturnsFalse()
{
CreateTwoWebProjectProperties();
lhs.DevelopmentServerVPath = "/";
rhs.DevelopmentServerVPath = "/Test";
Assert.AreNotEqual(lhs, rhs);
}
[Test]
public void Equals_DevelopmentServerPortPropertyIsDifferent_ReturnsFalse()
{
CreateTwoWebProjectProperties();
lhs.DevelopmentServerPort = 8080;
rhs.DevelopmentServerPort = 7777;
Assert.AreNotEqual(lhs, rhs);
}
[Test]
public void Equals_NTLMAuthenticationPropertyIsDifferent_ReturnsFalse()
{
CreateTwoWebProjectProperties();
lhs.NTLMAuthentication = false;
rhs.NTLMAuthentication = true;
Assert.AreNotEqual(lhs, rhs);
}
[Test]
public void Equals_IISUrlPropertyIsDifferent_ReturnsFalse()
{
CreateTwoWebProjectProperties();
lhs.IISUrl = "http://localhost/";
rhs.IISUrl = "http://localhost:1888/";
Assert.AreNotEqual(lhs, rhs);
}
[Test]
public void Equals_UseIISExpressPropertyIsDifferent_ReturnsFalse()
{
CreateTwoWebProjectProperties();
lhs.UseIISExpress = false;
rhs.UseIISExpress = true;
Assert.AreNotEqual(lhs, rhs);
}
[Test]
public void Equals_SaveServerSettingsInUserFilePropertyIsDifferent_ReturnsFalse()
{
CreateTwoWebProjectProperties();
lhs.SaveServerSettingsInUserFile = false;
rhs.SaveServerSettingsInUserFile = true;
Assert.AreNotEqual(lhs, rhs);
}
[Test]
public void Equals_CustomServerUrlPropertyIsDifferent_ReturnsFalse()
{
CreateTwoWebProjectProperties();
lhs.CustomServerUrl = "/a";
rhs.CustomServerUrl = "/test";
Assert.AreNotEqual(lhs, rhs);
}
[Test]
public void Equals_UseCustomServerPropertyIsDifferent_ReturnsFalse()
{
CreateTwoWebProjectProperties();
lhs.UseCustomServer = false;
rhs.UseCustomServer = true;
Assert.AreNotEqual(lhs, rhs);
}
[Test]
public void ToString_NewInstance_ReturnsMainPropertyValues()
{
CreateTwoWebProjectProperties();
lhs.UseIISExpress = false;
lhs.UseIIS = true;
lhs.IISUrl = "http://localhost";
lhs.SaveServerSettingsInUserFile = true;
string text = lhs.ToString();
string expectedText =
"[WebProjectProperties IISUrl=\"http://localhost\", UseIISExpress=False, UseIIS=True, SaveServerSettingsInUserFile=True]";
Assert.AreEqual(expectedText, text);
}
[Test]
public void Constructor_WebPropertyPropertiesXElementHasNoChildElements_ExceptionNotThrown()
{
var element = new XElement("WebPropertyProperties");
var properties = new WebProjectProperties(element);
Assert.AreEqual(String.Empty, properties.IISUrl);
Assert.AreEqual(String.Empty, properties.CustomServerUrl);
}
[Test]
public void Constructor_XElementHasCustomServerUrl_CustomServerUrlPropertyPopulated()
{
var properties = new WebProjectProperties() { CustomServerUrl = "/Test" };
properties = new WebProjectProperties(properties.ToXElement());
Assert.AreEqual("/Test", properties.CustomServerUrl);
}
[Test]
public void Constructor_XElementHasAutoAssignPort_AutoAssignPortPropertyPopulated()
{
var properties = new WebProjectProperties() { AutoAssignPort = true };
properties = new WebProjectProperties(properties.ToXElement());
Assert.IsTrue(properties.AutoAssignPort);
}
[Test]
public void Constructor_XElementHasDevelopmentServerVPath_DevelopmentServerVPathPropertyPopulated()
{
var properties = new WebProjectProperties() { DevelopmentServerVPath = "Test" };
properties = new WebProjectProperties(properties.ToXElement());
Assert.AreEqual("Test", properties.DevelopmentServerVPath);
}
[Test]
public void Constructor_XElementHasNTLMAuthentication_NTLMAuthenticationPropertyPopulated()
{
var properties = new WebProjectProperties() { NTLMAuthentication = true };
properties = new WebProjectProperties(properties.ToXElement());
Assert.IsTrue(properties.NTLMAuthentication);
}
[Test]
public void Constructor_XElementHasSaveServerSettingsInUserFile_SaveServerSettingsInUserFilePropertyPopulated()
{
var properties = new WebProjectProperties() { SaveServerSettingsInUserFile = true };
properties = new WebProjectProperties(properties.ToXElement());
Assert.IsTrue(properties.SaveServerSettingsInUserFile);
}
[Test]
public void Constructor_XElementHasUseIIS_UseIISPropertyPopulated()
{
var properties = new WebProjectProperties() { UseIIS = true };
properties = new WebProjectProperties(properties.ToXElement());
Assert.IsTrue(properties.UseIIS);
}
[Test]
public void Constructor_XElementHasUseCustomServer_UseCustomServerPropertyPopulated()
{
var properties = new WebProjectProperties() { UseCustomServer = true };
properties = new WebProjectProperties(properties.ToXElement());
Assert.IsTrue(properties.UseCustomServer);
}
[Test]
public void IsConfigured_UseIISAndUseIISExpressAreBothFalse_ReturnsFalse()
{
var properties = new WebProjectProperties() { UseIISExpress = false, UseIIS = false };
bool configured = properties.IsConfigured();
Assert.IsFalse(configured);
}
[Test]
public void IsConfigured_UseIISExpressIsTrueAndIISUrlIsValidUrl_ReturnsTrue()
{
var properties = new WebProjectProperties
{
UseIISExpress = true,
IISUrl = "http://localhost:8080/"
};
bool configured = properties.IsConfigured();
Assert.IsTrue(configured);
}
[Test]
public void IsConfigured_UseIISExpressIsTrueAndIISUrlIsEmptyString_ReturnsFalse()
{
var properties = new WebProjectProperties
{
UseIISExpress = true,
IISUrl = String.Empty
};
bool configured = properties.IsConfigured();
Assert.IsFalse(configured);
}
[Test]
public void IsConfigured_UseIISIsTrueAndIISUrlIsNull_ReturnsFalse()
{
var properties = new WebProjectProperties
{
UseIISExpress = true,
IISUrl = null
};
bool configured = properties.IsConfigured();
Assert.IsFalse(configured);
}
}
}

276
src/AddIns/BackendBindings/AspNet.Mvc/Test/Src/WebProjectTests.cs

@ -0,0 +1,276 @@ @@ -0,0 +1,276 @@
// 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 System.Text.RegularExpressions;
using System.Xml;
using System.Xml.Linq;
using AspNet.Mvc.Tests.Helpers;
using ICSharpCode.AspNet.Mvc;
using ICSharpCode.SharpDevelop.Internal.Templates;
using ICSharpCode.SharpDevelop.Project;
using NUnit.Framework;
using Rhino.Mocks;
namespace AspNet.Mvc.Tests
{
[TestFixture]
public class WebProjectTests
{
MSBuildBasedProject msbuildProject;
WebProject webProject;
void CreateMSBuildProject()
{
msbuildProject = MSBuildProjectHelper.CreateCSharpProject();
}
void CreateWebProject()
{
CreateMSBuildProject();
CreateWebProject(msbuildProject);
}
void CreateWebProject(MSBuildBasedProject msbuildProject)
{
webProject = new WebProject(msbuildProject);
}
void CreateWebProjectFromMSBuildProjectWithWebProjectProperties(WebProjectProperties properties)
{
CreateWebProject();
webProject.UpdateWebProjectProperties(properties);
CreateWebProject(msbuildProject);
}
void CreateWebProjectFromMSBuildProjectWithWebProjectProperties()
{
CreateWebProjectFromMSBuildProjectWithWebProjectProperties(new WebProjectProperties());
}
string GetMSBuildProjectExtensions()
{
var fileContentsBuilder = new StringBuilder();
var stringWriter = new StringWriter(fileContentsBuilder);
msbuildProject.MSBuildProjectFile.Save(stringWriter);
return GetProjectExtensions(fileContentsBuilder.ToString());
}
string GetProjectExtensions(string text)
{
return Regex.Match(
text,
"<ProjectExtensions>.*?</ProjectExtensions>",
RegexOptions.Singleline).Value;
}
void SetUseIISExpressInMSBuildProjectToTrue()
{
msbuildProject.SetProperty("UseIISExpress", "True");
}
void AddVisualStudioExtensionWithChildElement(string childElementName)
{
msbuildProject.SaveProjectExtensions(VisualStudioProjectExtension.ProjectExtensionName, new XElement(childElementName));
}
[Test]
public void Regex_GetMSBuildProjectExtensions_ReturnsProjectExtensionsXml()
{
string text =
"<Project>\r\n" +
" <ProjectExtensions>\r\n" +
" <foo>\r\n" +
" </foo>\r\n" +
" <ProjectExtensions>\r\n" +
"</Project>";
string result = GetProjectExtensions(text);
string expectedResult =
" <ProjectExtensions>\r\n" +
" <foo>\r\n" +
" </foo>\r\n" +
" <ProjectExtensions>";
Assert.AreNotEqual(expectedResult, result);
}
[Test]
public void Regex_GetMSBuildProjectExtensionsFromFullProjectXml_ReturnsProjectExtensionsXml()
{
string text =
@"<?xml version=""1.0"" encoding=""utf-16""?>
<Project ToolsVersion=""4.0"" xmlns=""http://schemas.microsoft.com/developer/msbuild/2003"" DefaultTargets=""Build"">
<PropertyGroup>
<ProjectGuid>{20D05950-C385-4093-8EAF-ADF36EAA54BE}</ProjectGuid>
<Configuration Condition="" '$(Configuration)' == '' "">Debug</Configuration>
<Platform Condition="" '$(Platform)' == '' "">x86</Platform>
</PropertyGroup>
<PropertyGroup Condition="" '$(Platform)' == 'x86' "">
<PlatformTarget>x86</PlatformTarget>
</PropertyGroup>
<ProjectExtensions>
<VisualStudio>
<FlavorProperties GUID=""{349C5851-65DF-11DA-9384-00065B846F21}""> <WebProjectProperties> <UseIIS>True</UseIIS> <AutoAssignPort>False</AutoAssignPort> <DevelopmentServerPort>7777</DevelopmentServerPort> <DevelopmentServerVPath>/</DevelopmentServerVPath> <IISUrl>http://localhost:7777/test</IISUrl> <NTLMAuthentication>False</NTLMAuthentication> <UseCustomServer>False</UseCustomServer> <CustomServerUrl> </CustomServerUrl> <SaveServerSettingsInUserFile>False</SaveServerSettingsInUserFile> </WebProjectProperties></FlavorProperties>
</VisualStudio>
</ProjectExtensions>
</Project>";
string result = GetProjectExtensions(text);
string expectedResult =
@"<ProjectExtensions>
<VisualStudio>
<FlavorProperties GUID=""{349C5851-65DF-11DA-9384-00065B846F21}""> <WebProjectProperties> <UseIIS>True</UseIIS> <AutoAssignPort>False</AutoAssignPort> <DevelopmentServerPort>7777</DevelopmentServerPort> <DevelopmentServerVPath>/</DevelopmentServerVPath> <IISUrl>http://localhost:7777/test</IISUrl> <NTLMAuthentication>False</NTLMAuthentication> <UseCustomServer>False</UseCustomServer> <CustomServerUrl> </CustomServerUrl> <SaveServerSettingsInUserFile>False</SaveServerSettingsInUserFile> </WebProjectProperties></FlavorProperties>
</VisualStudio>
</ProjectExtensions>";
Assert.AreEqual(expectedResult, result);
}
[Test]
public void GetWebProjectProperties_NoExistingWebProjectPropertiesInMSBuildProject_ReturnsWebProjectPropertiesWithDefaultValues()
{
CreateWebProject();
WebProjectProperties properties = webProject.GetWebProjectProperties();
Assert.AreEqual(WebProject.DefaultProperties, properties);
}
[Test]
public void UpdateWebProjectProperties_SaveServerSettingsInUserFileIsFalse_SavesPropertiesToMainProjectFile()
{
CreateWebProject();
WebProjectProperties properties = webProject.GetWebProjectProperties();
properties.SaveServerSettingsInUserFile = false;
properties.DevelopmentServerPort = 7777;
properties.DevelopmentServerVPath = "/";
properties.IISUrl = "http://localhost:7777/test";
properties.UseIIS = true;
webProject.UpdateWebProjectProperties(properties);
string msbuildProjectFileContents = GetMSBuildProjectExtensions();
string expectedMSBuildProjectFileContents =
@"<ProjectExtensions>
<VisualStudio>
<FlavorProperties GUID=""{349C5851-65DF-11DA-9384-00065B846F21}"">
<WebProjectProperties>
<UseIIS>True</UseIIS>
<AutoAssignPort>False</AutoAssignPort>
<DevelopmentServerPort>7777</DevelopmentServerPort>
<DevelopmentServerVPath>/</DevelopmentServerVPath>
<IISUrl>http://localhost:7777/test</IISUrl>
<NTLMAuthentication>False</NTLMAuthentication>
<UseCustomServer>False</UseCustomServer>
<CustomServerUrl></CustomServerUrl>
<SaveServerSettingsInUserFile>False</SaveServerSettingsInUserFile>
</WebProjectProperties>
</FlavorProperties>
</VisualStudio>
</ProjectExtensions>";
Assert.AreEqual(expectedMSBuildProjectFileContents, msbuildProjectFileContents);
}
[Test]
public void GetWebProjectProperties_MSBuildHasWebProjectProperties_ReadsWebProjectPropertiesFromMSBuildProject()
{
var expectedProperties = new WebProjectProperties
{
DevelopmentServerPort = 8989,
IISUrl = "http://localhost:8989/test"
};
CreateWebProjectFromMSBuildProjectWithWebProjectProperties(expectedProperties);
WebProjectProperties properties = webProject.GetWebProjectProperties();
Assert.AreEqual(expectedProperties, properties);
}
[Test]
public void GetWebProjectProperties_MSBuildHasUseIISExpressPropertySetToTrue_UseIISExpressPropertyIsTrue()
{
CreateWebProjectFromMSBuildProjectWithWebProjectProperties();
SetUseIISExpressInMSBuildProjectToTrue();
var properties = webProject.GetWebProjectProperties();
var expectedProperties = new WebProjectProperties { UseIISExpress = true };
Assert.AreEqual(expectedProperties, properties);
}
[Test]
public void UpdateWebProjectProperties_UseIISExpressIsTrue_MSBuildProjectIISExpressPropertySetToTrue()
{
CreateWebProject();
var properties = new WebProjectProperties { UseIISExpress = true };
webProject.UpdateWebProjectProperties(properties);
string value = msbuildProject.GetEvaluatedProperty("UseIISExpress");
Assert.AreEqual("True", value);
}
[Test]
public void UseIISExpress_MSBuildUseIISExpressIsTrue_ReturnsTrue()
{
CreateWebProject();
msbuildProject.SetProperty("UseIISExpress", "True");
bool result = webProject.UseIISExpress;
Assert.IsTrue(result);
}
[Test]
public void UseIISExpress_MSBuildHasNoUseIISExpressProperty_ReturnsFalse()
{
CreateWebProject();
bool result = webProject.UseIISExpress;
Assert.IsFalse(result);
}
[Test]
public void HasWebProjectProperties_MSBuildHasNoWebProjectProperties_ReturnsFalse()
{
CreateWebProject();
bool result = webProject.HasWebProjectProperties();
Assert.IsFalse(result);
}
[Test]
public void HasWebProjectProperties_MSBuildHasWebProjectProperties_ReturnsTrue()
{
CreateWebProjectFromMSBuildProjectWithWebProjectProperties();
bool result = webProject.HasWebProjectProperties();
Assert.IsTrue(result);
}
[Test]
public void HasWebProjectProperties_MSBuildProjectDoesNotHaveWebProjectPropertiesButHasVisualStudioExtension_ReturnsFalse()
{
CreateMSBuildProject();
AddVisualStudioExtensionWithChildElement("Test");
CreateWebProject(msbuildProject);
bool contains = webProject.HasWebProjectProperties();
Assert.IsFalse(contains);
}
}
}

BIN
src/AddIns/BackendBindings/AspNet.Mvc/Test/lib/Rhino.Mocks.dll

Binary file not shown.

25
src/AddIns/BackendBindings/AspNet.Mvc/Test/lib/Rhino.Mocks.license.txt

@ -1,25 +0,0 @@ @@ -1,25 +0,0 @@
Copyright (c) 2005 - 2009 Ayende Rahien (ayende@ayende.com)
All rights reserved.
Redistribution and use in source and binary forms, with or without modification,
are permitted provided that the following conditions are met:
* Redistributions of source code must retain the above copyright notice,
this list of conditions and the following disclaimer.
* Redistributions in binary form must reproduce the above copyright notice,
this list of conditions and the following disclaimer in the documentation
and/or other materials provided with the distribution.
* Neither the name of Ayende Rahien nor the names of its
contributors may be used to endorse or promote products derived from this
software without specific prior written permission.
THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE
FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.

20
src/Main/Base/Project/Src/Gui/Dialogs/OptionPanels/ProjectOptions/DebugOptions.xaml.cs

@ -29,14 +29,6 @@ namespace ICSharpCode.SharpDevelop.Gui.OptionPanels @@ -29,14 +29,6 @@ namespace ICSharpCode.SharpDevelop.Gui.OptionPanels
public DebugOptions()
{
InitializeComponent();
if (ProjectService.CurrentProject is CompilableProject) {
if (((CompilableProject)ProjectService.CurrentProject).IsWebProject) {
IsWebProject = Visibility.Visible;
} else {
IsWebProject = Visibility.Hidden;
}
}
}
@ -74,18 +66,6 @@ namespace ICSharpCode.SharpDevelop.Gui.OptionPanels @@ -74,18 +66,6 @@ namespace ICSharpCode.SharpDevelop.Gui.OptionPanels
}
}
Visibility isWebControlVisible;
public Visibility IsWebProject {
get { return isWebControlVisible; }
set {
isWebControlVisible = value;
OnPropertyChanged("IsWebProject");
}
}
void ExternalProgramButton_Click(object sender, System.Windows.RoutedEventArgs e)
{
string fileFilter = "${res:SharpDevelop.FileFilter.ExecutableFiles}|*.exe;*.com;*.pif;*.bat;*.cmd";

12
src/Main/Base/Project/Src/Project/AbstractProject.cs

@ -356,13 +356,6 @@ namespace ICSharpCode.SharpDevelop.Project @@ -356,13 +356,6 @@ namespace ICSharpCode.SharpDevelop.Project
}
}
[Browsable(false)]
public virtual bool IsWebProject {
get {
return false;
}
}
public void Start(bool withDebugging)
{
GetOrCreateBehavior().Start(withDebugging);
@ -578,6 +571,11 @@ namespace ICSharpCode.SharpDevelop.Project @@ -578,6 +571,11 @@ namespace ICSharpCode.SharpDevelop.Project
{
}
public virtual bool ContainsProjectExtension(string name)
{
return false;
}
[Browsable(false)]
public Properties ProjectSpecificProperties {
get; internal set;

43
src/Main/Base/Project/Src/Project/MSBuildBasedProject.cs

@ -8,9 +8,11 @@ using System.ComponentModel; @@ -8,9 +8,11 @@ using System.ComponentModel;
using System.Diagnostics;
using System.IO;
using System.Linq;
using System.Text;
using System.Threading;
using System.Xml;
using System.Xml.Linq;
using ICSharpCode.Core;
using ICSharpCode.SharpDevelop.Gui;
using ICSharpCode.SharpDevelop.Internal.Templates;
@ -1530,28 +1532,59 @@ namespace ICSharpCode.SharpDevelop.Project @@ -1530,28 +1532,59 @@ namespace ICSharpCode.SharpDevelop.Project
#endregion
#region ProjectExtensions
public override bool ContainsProjectExtension(string name)
{
ProjectExtensionsElement projectExtensions = GetExistingProjectExtensionsElement();
if (projectExtensions != null) {
return projectExtensions[name] != null;
}
return false;
}
public override void SaveProjectExtensions(string name, XElement element)
{
lock (SyncRoot) {
var existing = projectFile.Children.OfType<ProjectExtensionsElement>().FirstOrDefault();
ProjectExtensionsElement existing = GetExistingProjectExtensionsElement();
if (existing == null) {
existing = projectFile.CreateProjectExtensionsElement();
projectFile.AppendChild(existing);
}
existing[name] = element.ToString();
existing[name] = FormatProjectExtension(element);
}
}
public override XElement LoadProjectExtensions(string name)
{
lock (SyncRoot) {
var existing = projectFile.Children.OfType<ProjectExtensionsElement>().FirstOrDefault();
ProjectExtensionsElement existing = GetExistingProjectExtensionsElement();
if (existing == null) {
existing = projectFile.CreateProjectExtensionsElement();
return new XElement(name);
}
return XElement.Parse(existing[name]) ?? new XElement(name);
return XElement.Parse(existing[name]);
}
}
#endregion
ProjectExtensionsElement GetExistingProjectExtensionsElement()
{
return projectFile.Children.OfType<ProjectExtensionsElement>().FirstOrDefault();
}
string FormatProjectExtension(XElement element)
{
var settings = new XmlWriterSettings {
Indent = true,
IndentChars = " ",
NewLineChars = "\r\n ",
NewLineHandling = NewLineHandling.Replace,
OmitXmlDeclaration = true
};
var formattedText = new StringBuilder();
using (XmlWriter writer = XmlWriter.Create(new StringWriter(formattedText), settings)) {
element.WriteTo(writer);
}
return formattedText.ToString();
}
#endregion
}
}

22
src/Main/Base/Test/ServiceReferences/MSBuildBasedProjectTests.cs

@ -2,6 +2,7 @@ @@ -2,6 +2,7 @@
// This code is distributed under the GNU LGPL (for details please see \doc\license.txt)
using System;
using System.Xml.Linq;
using ICSharpCode.SharpDevelop.Project;
using ICSharpCode.SharpDevelop.Tests.WebReferences;
using NUnit.Framework;
@ -48,5 +49,26 @@ namespace ICSharpCode.SharpDevelop.Tests.ServiceReferences @@ -48,5 +49,26 @@ namespace ICSharpCode.SharpDevelop.Tests.ServiceReferences
Assert.IsNotNull(projectItem);
}
[Test]
public void ContainsProjectExtension_ProjectDoesNotContainsExtension_ReturnsFalse()
{
CreateProject();
bool contains = project.ContainsProjectExtension("UNKNOWN_EXTENSION");
Assert.IsFalse(contains);
}
[Test]
public void ContainsProjectExtension_ProjectContainsExtension_ReturnsTrue()
{
CreateProject();
project.SaveProjectExtensions("Test", new XElement("MyProjectExtension"));
bool contains = project.ContainsProjectExtension("Test");
Assert.IsTrue(contains);
}
}
}

Loading…
Cancel
Save