Browse Source

Add support for creating new ASP.NET MVC controllers and adding them to the project using an Add MVC Controller dialog.

pull/18/head
Matt Ward 15 years ago
parent
commit
2ffc00c2eb
  1. 15
      src/AddIns/BackendBindings/AspNet.Mvc/Project/AspNet.Mvc.addin
  2. 25
      src/AddIns/BackendBindings/AspNet.Mvc/Project/AspNet.Mvc.csproj
  3. 21
      src/AddIns/BackendBindings/AspNet.Mvc/Project/ItemTemplates/CSharp/CodeTemplates/AddController/Controller.tt
  4. 39
      src/AddIns/BackendBindings/AspNet.Mvc/Project/Src/AddMvcControllerToProjectCommand.cs
  5. 58
      src/AddIns/BackendBindings/AspNet.Mvc/Project/Src/AddMvcControllerToProjectView.xaml
  6. 16
      src/AddIns/BackendBindings/AspNet.Mvc/Project/Src/AddMvcControllerToProjectView.xaml.cs
  7. 101
      src/AddIns/BackendBindings/AspNet.Mvc/Project/Src/AddMvcControllerToProjectViewModel.cs
  8. 13
      src/AddIns/BackendBindings/AspNet.Mvc/Project/Src/AddMvcViewToProjectViewModel.cs
  9. 16
      src/AddIns/BackendBindings/AspNet.Mvc/Project/Src/IMvcControllerFileGenerator.cs
  10. 5
      src/AddIns/BackendBindings/AspNet.Mvc/Project/Src/IMvcTextTemplateHost.cs
  11. 2
      src/AddIns/BackendBindings/AspNet.Mvc/Project/Src/IMvcViewFileGenerator.cs
  12. 6
      src/AddIns/BackendBindings/AspNet.Mvc/Project/Src/ISelectedMvcFolder.cs
  13. 18
      src/AddIns/BackendBindings/AspNet.Mvc/Project/Src/IsMvcControllerFolderSelectedConditionEvaluator.cs
  14. 50
      src/AddIns/BackendBindings/AspNet.Mvc/Project/Src/MvcControllerFileGenerator.cs
  15. 52
      src/AddIns/BackendBindings/AspNet.Mvc/Project/Src/MvcControllerFileName.cs
  16. 23
      src/AddIns/BackendBindings/AspNet.Mvc/Project/Src/MvcControllerTextTemplateFileName.cs
  17. 51
      src/AddIns/BackendBindings/AspNet.Mvc/Project/Src/MvcFileGenerator.cs
  18. 50
      src/AddIns/BackendBindings/AspNet.Mvc/Project/Src/MvcFileName.cs
  19. 50
      src/AddIns/BackendBindings/AspNet.Mvc/Project/Src/MvcTextTemplateFileName.cs
  20. 27
      src/AddIns/BackendBindings/AspNet.Mvc/Project/Src/MvcTextTemplateHost.cs
  21. 18
      src/AddIns/BackendBindings/AspNet.Mvc/Project/Src/MvcTextTemplateLanguageFileNameExtension.cs
  22. 8
      src/AddIns/BackendBindings/AspNet.Mvc/Project/Src/MvcTextTemplateRepository.cs
  23. 34
      src/AddIns/BackendBindings/AspNet.Mvc/Project/Src/MvcViewFileGenerator.cs
  24. 37
      src/AddIns/BackendBindings/AspNet.Mvc/Project/Src/MvcViewFileName.cs
  25. 33
      src/AddIns/BackendBindings/AspNet.Mvc/Project/Src/MvcViewTextTemplateFileName.cs
  26. 21
      src/AddIns/BackendBindings/AspNet.Mvc/Project/Src/SelectedMvcControllerFolder.cs
  27. 54
      src/AddIns/BackendBindings/AspNet.Mvc/Project/Src/SelectedMvcFolder.cs
  28. 33
      src/AddIns/BackendBindings/AspNet.Mvc/Project/Src/SelectedMvcViewFolder.cs
  29. 15
      src/AddIns/BackendBindings/AspNet.Mvc/Test/AspNet.Mvc.Tests.csproj
  30. 24
      src/AddIns/BackendBindings/AspNet.Mvc/Test/Helpers/FakeMvcControllerFileGenerator.cs
  31. 10
      src/AddIns/BackendBindings/AspNet.Mvc/Test/Helpers/FakeMvcTextTemplateHost.cs
  32. 10
      src/AddIns/BackendBindings/AspNet.Mvc/Test/Helpers/FakeMvcViewFileGenerator.cs
  33. 9
      src/AddIns/BackendBindings/AspNet.Mvc/Test/Helpers/FakeSelectedMvcFolder.cs
  34. 25
      src/AddIns/BackendBindings/AspNet.Mvc/Test/Helpers/TestableAddMvcControllerToProjectCommand.cs
  35. 44
      src/AddIns/BackendBindings/AspNet.Mvc/Test/Src/AddMvcControllerToProjectCommandTests.cs
  36. 197
      src/AddIns/BackendBindings/AspNet.Mvc/Test/Src/AddMvcControllerToProjectViewModelTests.cs
  37. 14
      src/AddIns/BackendBindings/AspNet.Mvc/Test/Src/AddMvcViewToProjectViewModelTests.cs
  38. 50
      src/AddIns/BackendBindings/AspNet.Mvc/Test/Src/IsMvcControllerFolderSelectedConditionEvaluatorTests.cs
  39. 0
      src/AddIns/BackendBindings/AspNet.Mvc/Test/Src/IsMvcViewFolderSelectedConditionEvaluatorTests.cs
  40. 151
      src/AddIns/BackendBindings/AspNet.Mvc/Test/Src/MvcControllerFileGeneratorTests.cs
  41. 110
      src/AddIns/BackendBindings/AspNet.Mvc/Test/Src/MvcControllerFileNameTests.cs
  42. 50
      src/AddIns/BackendBindings/AspNet.Mvc/Test/Src/MvcTextTemplateHostTests.cs
  43. 26
      src/AddIns/BackendBindings/AspNet.Mvc/Test/Src/MvcTextTemplateRepositoryTests.cs
  44. 34
      src/AddIns/BackendBindings/AspNet.Mvc/Test/Src/MvcViewFileGeneratorTests.cs
  45. 12
      src/AddIns/BackendBindings/AspNet.Mvc/Test/Src/MvcViewFileNameTests.cs
  46. 22
      src/AddIns/BackendBindings/AspNet.Mvc/Test/Src/SelectedMvcViewFolderTests.cs

15
src/AddIns/BackendBindings/AspNet.Mvc/Project/AspNet.Mvc.addin

@ -16,6 +16,9 @@ @@ -16,6 +16,9 @@
<ConditionEvaluator
name="IsMvcViewsFolder"
class="ICSharpCode.AspNet.Mvc.IsMvcViewFolderSelectedConditionEvaluator"/>
<ConditionEvaluator
name="IsMvcControllersFolder"
class="ICSharpCode.AspNet.Mvc.IsMvcControllerFolderSelectedConditionEvaluator"/>
</Import>
</Runtime>
@ -32,5 +35,17 @@ @@ -32,5 +35,17 @@
insertbefore="New Item"
type="Separator"/>
</Condition>
<Condition name="IsMvcControllersFolder" action="Exclude">
<MenuItem
id="MvcController"
insertbefore="New Item"
label="Controller..."
icon="Icons.16x16.NewDocumentIcon"
class="ICSharpCode.AspNet.Mvc.AddMvcControllerToProjectCommand"/>
<MenuItem
id="MvcSeparator"
insertbefore="New Item"
type="Separator"/>
</Condition>
</Path>
</AddIn>

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

@ -47,6 +47,12 @@ @@ -47,6 +47,12 @@
<Compile Include="..\..\..\..\Main\GlobalAssemblyInfo.cs">
<Link>Configuration\GlobalAssemblyInfo.cs</Link>
</Compile>
<Compile Include="Src\AddMvcControllerToProjectCommand.cs" />
<Compile Include="Src\AddMvcControllerToProjectView.xaml.cs">
<DependentUpon>AddMvcControllerToProjectView.xaml</DependentUpon>
<SubType>Code</SubType>
</Compile>
<Compile Include="Src\AddMvcControllerToProjectViewModel.cs" />
<Compile Include="Src\AddMvcViewToProjectCommand.cs" />
<Compile Include="Src\AddMvcViewToProjectView.xaml.cs">
<DependentUpon>AddMvcViewToProjectView.xaml</DependentUpon>
@ -56,22 +62,33 @@ @@ -56,22 +62,33 @@
<Compile Include="Src\CloseDialogBehaviour.cs" />
<Compile Include="Src\DelegateCommand.cs" />
<Compile Include="Src\IAddMvcItemToProjectView.cs" />
<Compile Include="Src\IMvcControllerFileGenerator.cs" />
<Compile Include="Src\IMvcFileService.cs" />
<Compile Include="Src\IMvcTextTemplateHost.cs" />
<Compile Include="Src\IMvcTextTemplateHostFactory.cs" />
<Compile Include="Src\IMvcViewFileGenerator.cs" />
<Compile Include="Src\ISelectedMvcViewFolder.cs" />
<Compile Include="Src\ISelectedMvcFolder.cs" />
<Compile Include="Src\IsMvcControllerFolderSelectedConditionEvaluator.cs" />
<Compile Include="Src\IsMvcViewFolderSelectedConditionEvaluator.cs" />
<Compile Include="Configuration\AssemblyInfo.cs" />
<Compile Include="Src\MvcControllerFileGenerator.cs" />
<Compile Include="Src\MvcControllerFileName.cs" />
<Compile Include="Src\MvcControllerTextTemplateFileName.cs" />
<Compile Include="Src\MvcFileGenerator.cs" />
<Compile Include="Src\MvcFileName.cs" />
<Compile Include="Src\MvcFileService.cs" />
<Compile Include="Src\MvcTextTemplateFileName.cs" />
<Compile Include="Src\MvcTextTemplateHost.cs" />
<Compile Include="Src\MvcTextTemplateHostFactory.cs" />
<Compile Include="Src\MvcTextTemplateLanguage.cs" />
<Compile Include="Src\MvcTextTemplateLanguageConverter.cs" />
<Compile Include="Src\MvcTextTemplateLanguageFileNameExtension.cs" />
<Compile Include="Src\MvcTextTemplateRepository.cs" />
<Compile Include="Src\MvcViewFileName.cs" />
<Compile Include="Src\MvcViewFileGenerator.cs" />
<Compile Include="Src\MvcViewTextTemplateFileName.cs" />
<Compile Include="Src\SelectedMvcControllerFolder.cs" />
<Compile Include="Src\SelectedMvcFolder.cs" />
<Compile Include="Src\SelectedMvcViewFolder.cs" />
<Compile Include="Src\ViewModelBase.cs" />
</ItemGroup>
@ -81,6 +98,7 @@ @@ -81,6 +98,7 @@
<Folder Include="ItemTemplates\CSharp" />
<Folder Include="ItemTemplates\CSharp\CodeTemplates\AddView" />
<Folder Include="ItemTemplates\CSharp\CodeTemplates\AddView\AspxCSharp" />
<Folder Include="ItemTemplates\CSharp\CodeTemplates\AddController" />
</ItemGroup>
<ItemGroup>
<ProjectReference Include="..\..\..\..\Main\Base\Project\ICSharpCode.SharpDevelop.csproj">
@ -108,11 +126,16 @@ @@ -108,11 +126,16 @@
<None Include="AspNet.Mvc.addin">
<CopyToOutputDirectory>Always</CopyToOutputDirectory>
</None>
<None Include="ItemTemplates\CSharp\CodeTemplates\AddController\Controller.tt">
<LastGenOutput>Controller.cs</LastGenOutput>
<CopyToOutputDirectory>Always</CopyToOutputDirectory>
</None>
<None Include="ItemTemplates\CSharp\CodeTemplates\AddView\AspxCSharp\Empty.tt">
<CopyToOutputDirectory>Always</CopyToOutputDirectory>
</None>
</ItemGroup>
<ItemGroup>
<Page Include="Src\AddMvcControllerToProjectView.xaml" />
<Page Include="Src\AddMvcViewToProjectView.xaml" />
</ItemGroup>
<Import Project="$(MSBuildBinPath)\Microsoft.CSharp.Targets" />

21
src/AddIns/BackendBindings/AspNet.Mvc/Project/ItemTemplates/CSharp/CodeTemplates/AddController/Controller.tt

@ -0,0 +1,21 @@ @@ -0,0 +1,21 @@
<#@ template language="C#" HostSpecific="true" #>
<#@ output extension=".cs" #>
<#
MvcTextTemplateHost mvcHost = (MvcTextTemplateHost)Host;
#>
using System;
using System.Web.Mvc;
namespace <#= mvcHost.Namespace #>
{
/// <summary>
/// Description of <#= mvcHost.ControllerName #>.
/// </summary>
public class <#= mvcHost.ControllerName #> : Controller
{
public ActionResult Index()
{
return View();
}
}
}

39
src/AddIns/BackendBindings/AspNet.Mvc/Project/Src/AddMvcControllerToProjectCommand.cs

@ -0,0 +1,39 @@ @@ -0,0 +1,39 @@
// 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.Core;
using ICSharpCode.SharpDevelop.Gui;
using ICSharpCode.SharpDevelop.Project;
namespace ICSharpCode.AspNet.Mvc
{
public class AddMvcControllerToProjectCommand : AbstractCommand
{
public override void Run()
{
IAddMvcItemToProjectView view = CreateView();
view.DataContext = CreateDataContext();
view.ShowDialog();
}
protected virtual IAddMvcItemToProjectView CreateView()
{
return new AddMvcControllerToProjectView() {
Owner = WorkbenchSingleton.MainWindow
};
}
protected virtual object CreateDataContext()
{
SelectedMvcControllerFolder selectedFolder = GetSelectedFolder();
return new AddMvcControllerToProjectViewModel(selectedFolder);
}
SelectedMvcControllerFolder GetSelectedFolder()
{
var directoryNode = Owner as DirectoryNode;
return new SelectedMvcControllerFolder(directoryNode);
}
}
}

58
src/AddIns/BackendBindings/AspNet.Mvc/Project/Src/AddMvcControllerToProjectView.xaml

@ -0,0 +1,58 @@ @@ -0,0 +1,58 @@
<Window
x:Class="ICSharpCode.AspNet.Mvc.AddMvcControllerToProjectView"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:core="http://icsharpcode.net/sharpdevelop/core"
xmlns:mvc="clr-namespace:ICSharpCode.AspNet.Mvc"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
Title="Add Controller"
Style="{x:Static core:GlobalStyles.DialogWindowStyle}"
mvc:CloseWindowBehaviour.IsClosed="{Binding IsClosed}"
WindowStartupLocation="CenterOwner"
FocusManager.FocusedElement="{Binding ElementName=ControllerNameTextBox}"
Height="400"
Width="400">
<Window.Resources>
<Style TargetType="Button" BasedOn="{x:Static core:GlobalStyles.ButtonStyle}"/>
</Window.Resources>
<Grid>
<Grid.RowDefinitions>
<RowDefinition Height="Auto"/>
<RowDefinition Height="*"/>
<RowDefinition Height="Auto"/>
</Grid.RowDefinitions>
<Grid>
<Grid.ColumnDefinitions>
<ColumnDefinition Width="Auto"/>
<ColumnDefinition Width="*"/>
</Grid.ColumnDefinitions>
<TextBlock
Margin="4"
FontWeight="Bold"
Text="Controller Name:"/>
<TextBox
x:Name="ControllerNameTextBox"
Grid.Column="1"
Text="{Binding Path=ControllerName, UpdateSourceTrigger=PropertyChanged}"/>
</Grid>
<StackPanel
Orientation="Horizontal"
HorizontalAlignment="Right"
Margin="4"
Grid.Row="2">
<Button
Margin="2, 0"
Content="_Add"
IsDefault="True"
Command="{Binding Path=AddMvcControllerCommand}"/>
<Button
Margin="2, 0"
Content="_Cancel"
IsCancel="True"/>
</StackPanel>
</Grid>
</Window>

16
src/AddIns/BackendBindings/AspNet.Mvc/Project/Src/AddMvcControllerToProjectView.xaml.cs

@ -0,0 +1,16 @@ @@ -0,0 +1,16 @@
// 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.Windows;
namespace ICSharpCode.AspNet.Mvc
{
public partial class AddMvcControllerToProjectView : Window, IAddMvcItemToProjectView
{
public AddMvcControllerToProjectView()
{
InitializeComponent();
}
}
}

101
src/AddIns/BackendBindings/AspNet.Mvc/Project/Src/AddMvcControllerToProjectViewModel.cs

@ -0,0 +1,101 @@ @@ -0,0 +1,101 @@
// 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.Windows.Input;
using ICSharpCode.AspNet.Mvc;
namespace ICSharpCode.AspNet.Mvc
{
public class AddMvcControllerToProjectViewModel : ViewModelBase<AddMvcControllerToProjectViewModel>
{
IMvcControllerFileGenerator controllerGenerator;
ISelectedMvcFolder selectedControllerFolder;
IMvcFileService fileService;
MvcControllerFileName controllerFileName = new MvcControllerFileName();
bool closed;
public AddMvcControllerToProjectViewModel(ISelectedMvcFolder selectedControllerFolder)
: this(
selectedControllerFolder,
new MvcControllerFileGenerator(),
new MvcFileService())
{
}
public AddMvcControllerToProjectViewModel(
ISelectedMvcFolder selectedControllerFolder,
IMvcControllerFileGenerator controllerGenerator,
IMvcFileService fileService)
{
this.selectedControllerFolder = selectedControllerFolder;
this.controllerGenerator = controllerGenerator;
this.fileService = fileService;
this.controllerFileName.Folder = selectedControllerFolder.Path;
CreateCommands();
}
void CreateCommands()
{
AddMvcControllerCommand = new DelegateCommand(param => AddMvcController(), param => CanAddMvcController());
}
public ICommand AddMvcControllerCommand { get; private set; }
public string ControllerName {
get { return controllerFileName.ControllerName; }
set { controllerFileName.ControllerName = value; }
}
public bool IsClosed {
get { return closed; }
set {
closed = value;
OnPropertyChanged(viewModel => viewModel.IsClosed);
}
}
public bool CanAddMvcController()
{
return controllerFileName.HasValidControllerName();
}
public void AddMvcController()
{
GenerateMvcControllerFile();
AddMvcControllerFileToProject();
OpenMvcControllerFileCreated();
IsClosed = true;
}
void GenerateMvcControllerFile()
{
ConfigureMvcControllerGenerator();
controllerGenerator.GenerateFile(controllerFileName);
}
void ConfigureMvcControllerGenerator()
{
controllerGenerator.Language = GetTemplateLanguage();
controllerGenerator.Project = selectedControllerFolder.Project;
}
MvcTextTemplateLanguage GetTemplateLanguage()
{
return selectedControllerFolder.GetTemplateLanguage();
}
void AddMvcControllerFileToProject()
{
string fileName = controllerFileName.GetFileName();
selectedControllerFolder.AddFileToProject(fileName);
}
void OpenMvcControllerFileCreated()
{
string path = controllerFileName.GetPath();
fileService.OpenFile(path);
}
}
}

13
src/AddIns/BackendBindings/AspNet.Mvc/Project/Src/AddMvcViewToProjectViewModel.cs

@ -10,12 +10,12 @@ namespace ICSharpCode.AspNet.Mvc @@ -10,12 +10,12 @@ namespace ICSharpCode.AspNet.Mvc
public class AddMvcViewToProjectViewModel : ViewModelBase<AddMvcViewToProjectViewModel>
{
IMvcViewFileGenerator viewGenerator;
ISelectedMvcViewFolder selectedViewFolder;
ISelectedMvcFolder selectedViewFolder;
IMvcFileService fileService;
MvcViewFileName viewFileName = new MvcViewFileName();
bool closed;
public AddMvcViewToProjectViewModel(ISelectedMvcViewFolder selectedViewFolder)
public AddMvcViewToProjectViewModel(ISelectedMvcFolder selectedViewFolder)
: this(
selectedViewFolder,
new MvcViewFileGenerator(),
@ -24,14 +24,14 @@ namespace ICSharpCode.AspNet.Mvc @@ -24,14 +24,14 @@ namespace ICSharpCode.AspNet.Mvc
}
public AddMvcViewToProjectViewModel(
ISelectedMvcViewFolder selectedViewFolder,
ISelectedMvcFolder selectedViewFolder,
IMvcViewFileGenerator viewGenerator,
IMvcFileService fileService)
{
this.selectedViewFolder = selectedViewFolder;
this.viewGenerator = viewGenerator;
this.fileService = fileService;
this.viewFileName.ViewFolder = selectedViewFolder.Path;
this.viewFileName.Folder = selectedViewFolder.Path;
CreateCommands();
}
@ -72,7 +72,7 @@ namespace ICSharpCode.AspNet.Mvc @@ -72,7 +72,7 @@ namespace ICSharpCode.AspNet.Mvc
void GenerateMvcViewFile()
{
ConfigureMvcViewGenerator();
viewGenerator.GenerateView(viewFileName);
viewGenerator.GenerateFile(viewFileName);
}
void ConfigureMvcViewGenerator()
@ -83,8 +83,7 @@ namespace ICSharpCode.AspNet.Mvc @@ -83,8 +83,7 @@ namespace ICSharpCode.AspNet.Mvc
MvcTextTemplateLanguage GetTemplateLanguage()
{
string language = selectedViewFolder.Project.Language;
return MvcTextTemplateLanguageConverter.Convert(language);
return selectedViewFolder.GetTemplateLanguage();
}
void AddMvcViewFileToProject()

16
src/AddIns/BackendBindings/AspNet.Mvc/Project/Src/IMvcControllerFileGenerator.cs

@ -0,0 +1,16 @@ @@ -0,0 +1,16 @@
// 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 interface IMvcControllerFileGenerator
{
MvcTextTemplateLanguage Language { get; set; }
IProject Project { get; set; }
void GenerateFile(MvcControllerFileName fileName);
}
}

5
src/AddIns/BackendBindings/AspNet.Mvc/Project/Src/IMvcTextTemplateHost.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.CodeDom.Compiler;
using ICSharpCode.TextTemplating;
namespace ICSharpCode.AspNet.Mvc
@ -9,7 +10,11 @@ namespace ICSharpCode.AspNet.Mvc @@ -9,7 +10,11 @@ namespace ICSharpCode.AspNet.Mvc
public interface IMvcTextTemplateHost : IDisposable
{
string ViewName { get; set; }
string ControllerName { get; set; }
string Namespace { get; set; }
bool ProcessTemplate(string inputFile, string outputFile);
CompilerErrorCollection Errors { get; }
}
}

2
src/AddIns/BackendBindings/AspNet.Mvc/Project/Src/IMvcViewFileGenerator.cs

@ -11,6 +11,6 @@ namespace ICSharpCode.AspNet.Mvc @@ -11,6 +11,6 @@ namespace ICSharpCode.AspNet.Mvc
MvcTextTemplateLanguage Language { get; set; }
IProject Project { get; set; }
void GenerateView(MvcViewFileName fileName);
void GenerateFile(MvcViewFileName fileName);
}
}

6
src/AddIns/BackendBindings/AspNet.Mvc/Project/Src/ISelectedMvcViewFolder.cs → src/AddIns/BackendBindings/AspNet.Mvc/Project/Src/ISelectedMvcFolder.cs

@ -6,15 +6,17 @@ using ICSharpCode.SharpDevelop.Project; @@ -6,15 +6,17 @@ using ICSharpCode.SharpDevelop.Project;
namespace ICSharpCode.AspNet.Mvc
{
public interface ISelectedMvcViewFolder
public interface ISelectedMvcFolder
{
string Path { get; }
IProject Project { get; }
/// <summary>
/// Adds the file to the view folder.
/// Adds the file to the folder.
/// </summary>
/// <param name="fileName">The filename should not have any path information</param>
void AddFileToProject(string fileName);
MvcTextTemplateLanguage GetTemplateLanguage();
}
}

18
src/AddIns/BackendBindings/AspNet.Mvc/Project/Src/IsMvcControllerFolderSelectedConditionEvaluator.cs

@ -0,0 +1,18 @@ @@ -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.Core;
using ICSharpCode.SharpDevelop.Project;
namespace ICSharpCode.AspNet.Mvc
{
public class IsMvcControllerFolderSelectedConditionEvaluator : IConditionEvaluator
{
public bool IsValid(object owner, Condition condition)
{
var directoryNode = owner as DirectoryNode;
return directoryNode != null;
}
}
}

50
src/AddIns/BackendBindings/AspNet.Mvc/Project/Src/MvcControllerFileGenerator.cs

@ -0,0 +1,50 @@ @@ -0,0 +1,50 @@
// Copyright (c) AlphaSierraPapa for the SharpDevelop Team (for details please see \doc\copyright.txt)
// This code is distributed under the GNU LGPL (for details please see \doc\license.txt)
using System;
using ICSharpCode.SharpDevelop.Project;
namespace ICSharpCode.AspNet.Mvc
{
public class MvcControllerFileGenerator : MvcFileGenerator, IMvcControllerFileGenerator
{
MvcTextTemplateRepository textTemplateRepository;
public MvcControllerFileGenerator()
: this(
new MvcTextTemplateHostFactory(),
new MvcTextTemplateRepository())
{
}
public MvcControllerFileGenerator(
IMvcTextTemplateHostFactory hostFactory,
MvcTextTemplateRepository textTemplateRepository)
: base(hostFactory)
{
this.textTemplateRepository = textTemplateRepository;
}
public void GenerateFile(MvcControllerFileName fileName)
{
base.GenerateFile(fileName);
}
protected override void ConfigureHost(IMvcTextTemplateHost host, MvcFileName fileName)
{
var controllerFileName = fileName as MvcControllerFileName;
host.ControllerName = controllerFileName.ControllerName;
host.Namespace = GetNamespace();
}
string GetNamespace()
{
return Project.RootNamespace + ".Controllers";
}
protected override string GetTextTemplateFileName()
{
return textTemplateRepository.GetMvcControllerTextTemplateFileName(Language, "Controller");
}
}
}

52
src/AddIns/BackendBindings/AspNet.Mvc/Project/Src/MvcControllerFileName.cs

@ -0,0 +1,52 @@ @@ -0,0 +1,52 @@
// Copyright (c) AlphaSierraPapa for the SharpDevelop Team (for details please see \doc\copyright.txt)
// This code is distributed under the GNU LGPL (for details please see \doc\license.txt)
using System;
using System.IO;
namespace ICSharpCode.AspNet.Mvc
{
public class MvcControllerFileName : MvcFileName
{
string controllerName = String.Empty;
public string ControllerName {
get {
EnsureControllerNameIsNotNull();
return controllerName;
}
set { controllerName = value; }
}
void EnsureControllerNameIsNotNull()
{
controllerName = ConvertToEmptyStringIfNull(controllerName);
}
public MvcTextTemplateLanguage Language { get; set; }
public override string GetFileName()
{
string name = GetControllerName();
return name + GetFileExtension();
}
string GetControllerName()
{
if (controllerName != null) {
return controllerName;
}
return "Default1Controller";
}
string GetFileExtension()
{
return MvcTextTemplateLanguageFileNameExtension.GetFileExtension(Language);
}
public bool HasValidControllerName()
{
return !String.IsNullOrEmpty(controllerName);
}
}
}

23
src/AddIns/BackendBindings/AspNet.Mvc/Project/Src/MvcControllerTextTemplateFileName.cs

@ -0,0 +1,23 @@ @@ -0,0 +1,23 @@
// Copyright (c) AlphaSierraPapa for the SharpDevelop Team (for details please see \doc\copyright.txt)
// This code is distributed under the GNU LGPL (for details please see \doc\license.txt)
using System;
using System.IO;
namespace ICSharpCode.AspNet.Mvc
{
public class MvcControllerTextTemplateFileName : MvcTextTemplateFileName
{
public MvcControllerTextTemplateFileName(
string textTemplatesRootDirectory,
MvcTextTemplateLanguage language,
string templateName)
: base(textTemplatesRootDirectory, language, templateName)
{
}
protected override string LanguageSubdirectoryFormatString {
get { return "{0}\\CodeTemplates\\AddController"; }
}
}
}

51
src/AddIns/BackendBindings/AspNet.Mvc/Project/Src/MvcFileGenerator.cs

@ -0,0 +1,51 @@ @@ -0,0 +1,51 @@
// Copyright (c) AlphaSierraPapa for the SharpDevelop Team (for details please see \doc\copyright.txt)
// This code is distributed under the GNU LGPL (for details please see \doc\license.txt)
using System;
using System.CodeDom.Compiler;
using ICSharpCode.SharpDevelop.Project;
namespace ICSharpCode.AspNet.Mvc
{
public abstract class MvcFileGenerator
{
IMvcTextTemplateHostFactory hostFactory;
public MvcFileGenerator(IMvcTextTemplateHostFactory hostFactory)
{
this.hostFactory = hostFactory;
}
public MvcTextTemplateLanguage Language { get; set; }
public IProject Project { get; set; }
public void GenerateFile(MvcFileName fileName)
{
using (IMvcTextTemplateHost host = CreateHost()) {
GenerateFile(host, fileName);
}
}
IMvcTextTemplateHost CreateHost()
{
return hostFactory.CreateMvcTextTemplateHost(Project);
}
void GenerateFile(IMvcTextTemplateHost host, MvcFileName fileName)
{
ConfigureHost(host, fileName);
string templateFileName = GetTextTemplateFileName();
string outputViewFileName = fileName.GetPath();
host.ProcessTemplate(templateFileName, outputViewFileName);
if (host.Errors.Count > 0) {
CompilerError error = host.Errors[0];
Console.WriteLine("ProcessTemplate error: " + error.ErrorText);
Console.WriteLine("ProcessTemplate error: Line: " + error.Line);
}
}
protected abstract void ConfigureHost(IMvcTextTemplateHost host, MvcFileName fileName);
protected abstract string GetTextTemplateFileName();
}
}

50
src/AddIns/BackendBindings/AspNet.Mvc/Project/Src/MvcFileName.cs

@ -0,0 +1,50 @@ @@ -0,0 +1,50 @@
// Copyright (c) AlphaSierraPapa for the SharpDevelop Team (for details please see \doc\copyright.txt)
// This code is distributed under the GNU LGPL (for details please see \doc\license.txt)
using System;
using System.IO;
namespace ICSharpCode.AspNet.Mvc
{
public class MvcFileName
{
string folder = String.Empty;
public string Folder {
get {
EnsureFolderIsNotNull();
return folder;
}
set { folder = value; }
}
void EnsureFolderIsNotNull()
{
folder = ConvertToEmptyStringIfNull(folder);
}
public override string ToString()
{
return GetPath();
}
public string GetPath()
{
string fileName = GetFileName();
return Path.Combine(Folder, fileName);
}
public virtual string GetFileName()
{
return String.Empty;
}
protected static string ConvertToEmptyStringIfNull(string text)
{
if (text != null) {
return text;
}
return String.Empty;
}
}
}

50
src/AddIns/BackendBindings/AspNet.Mvc/Project/Src/MvcTextTemplateFileName.cs

@ -0,0 +1,50 @@ @@ -0,0 +1,50 @@
// Copyright (c) AlphaSierraPapa for the SharpDevelop Team (for details please see \doc\copyright.txt)
// This code is distributed under the GNU LGPL (for details please see \doc\license.txt)
using System;
using System.IO;
namespace ICSharpCode.AspNet.Mvc
{
public abstract class MvcTextTemplateFileName
{
string textTemplatesRootDirectory;
MvcTextTemplateLanguage language;
string templateName;
public MvcTextTemplateFileName(
string textTemplatesRootDirectory,
MvcTextTemplateLanguage language,
string templateName)
{
this.textTemplatesRootDirectory = textTemplatesRootDirectory;
this.language = language;
this.templateName = templateName;
}
public string GetPath()
{
string fileName = GetTemplateFileName();
string directory = GetTemplateDirectory(language);
return Path.Combine(directory, fileName);
}
string GetTemplateFileName()
{
return templateName + ".tt";
}
string GetTemplateDirectory(MvcTextTemplateLanguage language)
{
string languageSubdirectory = GetLanguageSubdirectory(language);
return Path.Combine(textTemplatesRootDirectory, languageSubdirectory);
}
string GetLanguageSubdirectory(MvcTextTemplateLanguage language)
{
return String.Format(LanguageSubdirectoryFormatString, language.ToString());
}
protected abstract string LanguageSubdirectoryFormatString { get; }
}
}

27
src/AddIns/BackendBindings/AspNet.Mvc/Project/Src/MvcTextTemplateHost.cs

@ -8,6 +8,10 @@ namespace ICSharpCode.AspNet.Mvc @@ -8,6 +8,10 @@ namespace ICSharpCode.AspNet.Mvc
{
public class MvcTextTemplateHost : TextTemplatingHost, IMvcTextTemplateHost
{
string viewName = String.Empty;
string controllerName = String.Empty;
string @namespace = String.Empty;
public MvcTextTemplateHost(
ITextTemplatingAppDomainFactory appDomainFactory,
ITextTemplatingAssemblyResolver assemblyResolver,
@ -29,6 +33,27 @@ namespace ICSharpCode.AspNet.Mvc @@ -29,6 +33,27 @@ namespace ICSharpCode.AspNet.Mvc
Imports.Add("ICSharpCode.AspNet.Mvc");
}
public string ViewName { get; set; }
public string ViewName {
get { return GetValueOrUseEmptyStringIfNull(viewName); }
set { viewName = value; }
}
string GetValueOrUseEmptyStringIfNull(string value)
{
if (value != null) {
return value;
}
return String.Empty;
}
public string ControllerName {
get { return GetValueOrUseEmptyStringIfNull(controllerName); }
set { controllerName = value; }
}
public string Namespace {
get { return GetValueOrUseEmptyStringIfNull(@namespace); }
set { @namespace = value; }
}
}
}

18
src/AddIns/BackendBindings/AspNet.Mvc/Project/Src/MvcTextTemplateLanguageFileNameExtension.cs

@ -0,0 +1,18 @@ @@ -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;
namespace ICSharpCode.AspNet.Mvc
{
public static class MvcTextTemplateLanguageFileNameExtension
{
public static string GetFileExtension(MvcTextTemplateLanguage language)
{
if (language == MvcTextTemplateLanguage.VisualBasic) {
return ".vb";
}
return ".cs";
}
}
}

8
src/AddIns/BackendBindings/AspNet.Mvc/Project/Src/MvcTextTemplateRepository.cs

@ -33,5 +33,13 @@ namespace ICSharpCode.AspNet.Mvc @@ -33,5 +33,13 @@ namespace ICSharpCode.AspNet.Mvc
var fileName = new MvcViewTextTemplateFileName(textTemplatesRootDirectory, language, templateName);
return fileName.GetPath();
}
public string GetMvcControllerTextTemplateFileName(
MvcTextTemplateLanguage language,
string templateName)
{
var fileName = new MvcControllerTextTemplateFileName(textTemplatesRootDirectory, language, templateName);
return fileName.GetPath();
}
}
}

34
src/AddIns/BackendBindings/AspNet.Mvc/Project/Src/MvcViewFileGenerator.cs

@ -6,9 +6,8 @@ using ICSharpCode.SharpDevelop.Project; @@ -6,9 +6,8 @@ using ICSharpCode.SharpDevelop.Project;
namespace ICSharpCode.AspNet.Mvc
{
public class MvcViewFileGenerator : IMvcViewFileGenerator
public class MvcViewFileGenerator : MvcFileGenerator, IMvcViewFileGenerator
{
IMvcTextTemplateHostFactory hostFactory;
MvcTextTemplateRepository textTemplateRepository;
public MvcViewFileGenerator()
@ -21,40 +20,23 @@ namespace ICSharpCode.AspNet.Mvc @@ -21,40 +20,23 @@ namespace ICSharpCode.AspNet.Mvc
public MvcViewFileGenerator(
IMvcTextTemplateHostFactory hostFactory,
MvcTextTemplateRepository textTemplateRepository)
: base(hostFactory)
{
this.hostFactory = hostFactory;
this.textTemplateRepository = textTemplateRepository;
}
public MvcTextTemplateLanguage Language { get; set; }
public IProject Project { get; set; }
public void GenerateView(MvcViewFileName fileName)
{
using (IMvcTextTemplateHost host = CreateHost()) {
GenerateView(host, fileName);
}
}
IMvcTextTemplateHost CreateHost()
{
return hostFactory.CreateMvcTextTemplateHost(Project);
}
void GenerateView(IMvcTextTemplateHost host, MvcViewFileName fileName)
public void GenerateFile(MvcViewFileName fileName)
{
ConfigureHost(host, fileName);
string templateFileName = GetTextTemplateFileName();
string outputViewFileName = fileName.GetPath();
host.ProcessTemplate(templateFileName, outputViewFileName);
base.GenerateFile(fileName);
}
void ConfigureHost(IMvcTextTemplateHost host, MvcViewFileName fileName)
protected override void ConfigureHost(IMvcTextTemplateHost host, MvcFileName fileName)
{
host.ViewName = fileName.ViewName;
var viewFileName = fileName as MvcViewFileName;
host.ViewName = viewFileName.ViewName;
}
string GetTextTemplateFileName()
protected override string GetTextTemplateFileName()
{
return textTemplateRepository.GetMvcViewTextTemplateFileName(Language, "Empty");
}

37
src/AddIns/BackendBindings/AspNet.Mvc/Project/Src/MvcViewFileName.cs

@ -6,10 +6,9 @@ using System.IO; @@ -6,10 +6,9 @@ using System.IO;
namespace ICSharpCode.AspNet.Mvc
{
public class MvcViewFileName
public class MvcViewFileName : MvcFileName
{
string viewName = String.Empty;
string viewFolder = String.Empty;
public string ViewName {
get {
@ -24,39 +23,7 @@ namespace ICSharpCode.AspNet.Mvc @@ -24,39 +23,7 @@ namespace ICSharpCode.AspNet.Mvc
viewName = ConvertToEmptyStringIfNull(viewName);
}
static string ConvertToEmptyStringIfNull(string text)
{
if (text != null) {
return text;
}
return String.Empty;
}
public string ViewFolder {
get {
EnsureViewFolderIsNotNull();
return viewFolder;
}
set { viewFolder = value; }
}
void EnsureViewFolderIsNotNull()
{
viewFolder = ConvertToEmptyStringIfNull(viewFolder);
}
public override string ToString()
{
return GetPath();
}
public string GetPath()
{
string fileName = GetFileName();
return Path.Combine(ViewFolder, fileName);
}
public string GetFileName()
public override string GetFileName()
{
string viewName = GetViewName();
return viewName + ".aspx";

33
src/AddIns/BackendBindings/AspNet.Mvc/Project/Src/MvcViewTextTemplateFileName.cs

@ -6,43 +6,18 @@ using System.IO; @@ -6,43 +6,18 @@ using System.IO;
namespace ICSharpCode.AspNet.Mvc
{
public class MvcViewTextTemplateFileName
public class MvcViewTextTemplateFileName : MvcTextTemplateFileName
{
string textTemplatesRootDirectory;
MvcTextTemplateLanguage language;
string templateName;
public MvcViewTextTemplateFileName(
string textTemplatesRootDirectory,
MvcTextTemplateLanguage language,
string templateName)
: base(textTemplatesRootDirectory, language, templateName)
{
this.textTemplatesRootDirectory = textTemplatesRootDirectory;
this.language = language;
this.templateName = templateName;
}
public string GetPath()
{
string fileName = GetTemplateFileName();
string directory = GetTemplateDirectory(language);
return Path.Combine(directory, fileName);
}
string GetTemplateFileName()
{
return templateName + ".tt";
}
string GetTemplateDirectory(MvcTextTemplateLanguage language)
{
string languageSubdirectory = GetLanguageSubdirectory(language);
return Path.Combine(textTemplatesRootDirectory, languageSubdirectory);
}
string GetLanguageSubdirectory(MvcTextTemplateLanguage language)
{
return String.Format("{0}\\CodeTemplates\\AddView\\Aspx{0}", language.ToString());
protected override string LanguageSubdirectoryFormatString {
get { return "{0}\\CodeTemplates\\AddView\\Aspx{0}"; }
}
}
}

21
src/AddIns/BackendBindings/AspNet.Mvc/Project/Src/SelectedMvcControllerFolder.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.Project;
namespace ICSharpCode.AspNet.Mvc
{
public class SelectedMvcControllerFolder : SelectedMvcFolder
{
public SelectedMvcControllerFolder(DirectoryNode directoryNode)
: base(directoryNode)
{
}
public SelectedMvcControllerFolder()
: base()
{
}
}
}

54
src/AddIns/BackendBindings/AspNet.Mvc/Project/Src/SelectedMvcFolder.cs

@ -0,0 +1,54 @@ @@ -0,0 +1,54 @@
// 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 SelectedMvcFolder : ISelectedMvcFolder
{
DirectoryNode directoryNode;
public SelectedMvcFolder(DirectoryNode directoryNode)
{
this.directoryNode = directoryNode;
}
public SelectedMvcFolder()
: this(ProjectBrowserPad.Instance.SelectedNode as DirectoryNode)
{
}
public string Path {
get { return directoryNode.Directory; }
}
public IProject Project {
get { return directoryNode.Project; }
}
public void AddFileToProject(string fileName)
{
string fullPath = System.IO.Path.Combine(Path, fileName);
AddNewFileToDirectoryNode(fullPath);
SaveProject();
}
protected virtual void AddNewFileToDirectoryNode(string path)
{
directoryNode.AddNewFile(path);
}
void SaveProject()
{
directoryNode.Project.Save();
}
public MvcTextTemplateLanguage GetTemplateLanguage()
{
string language = Project.Language;
return MvcTextTemplateLanguageConverter.Convert(language);
}
}
}

33
src/AddIns/BackendBindings/AspNet.Mvc/Project/Src/SelectedMvcViewFolder.cs

@ -6,43 +6,16 @@ using ICSharpCode.SharpDevelop.Project; @@ -6,43 +6,16 @@ using ICSharpCode.SharpDevelop.Project;
namespace ICSharpCode.AspNet.Mvc
{
public class SelectedMvcViewFolder : ISelectedMvcViewFolder
public class SelectedMvcViewFolder : SelectedMvcFolder, ISelectedMvcFolder
{
DirectoryNode directoryNode;
public SelectedMvcViewFolder(DirectoryNode directoryNode)
: base(directoryNode)
{
this.directoryNode = directoryNode;
}
public SelectedMvcViewFolder()
: this(ProjectBrowserPad.Instance.SelectedNode as DirectoryNode)
{
}
public string Path {
get { return directoryNode.Directory; }
}
public IProject Project {
get { return directoryNode.Project; }
}
public void AddFileToProject(string fileName)
{
string fullPath = System.IO.Path.Combine(Path, fileName);
AddNewFileToDirectoryNode(fullPath);
SaveProject();
}
protected virtual void AddNewFileToDirectoryNode(string path)
{
directoryNode.AddNewFile(path);
}
void SaveProject()
: base()
{
directoryNode.Project.Save();
}
}
}

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

@ -29,6 +29,9 @@ @@ -29,6 +29,9 @@
<DefineConstants>TRACE</DefineConstants>
</PropertyGroup>
<ItemGroup>
<Reference Include="Mono.TextTemplating">
<HintPath>..\..\..\Misc\TextTemplating\Project\lib\Mono.TextTemplating.dll</HintPath>
</Reference>
<Reference Include="nunit.framework">
<HintPath>..\..\..\..\Tools\NUnit\nunit.framework.dll</HintPath>
</Reference>
@ -44,18 +47,26 @@ @@ -44,18 +47,26 @@
<Link>Configuration\GlobalAssemblyInfo.cs</Link>
</Compile>
<Compile Include="Helpers\FakeAddMvcItemToProjectView.cs" />
<Compile Include="Helpers\FakeMvcControllerFileGenerator.cs" />
<Compile Include="Helpers\FakeMvcFileService.cs" />
<Compile Include="Helpers\FakeMvcTextTemplateHost.cs" />
<Compile Include="Helpers\FakeMvcTextTemplateHostFactory.cs" />
<Compile Include="Helpers\FakeMvcViewFileGenerator.cs" />
<Compile Include="Helpers\FakeSelectedMvcViewFolder.cs" />
<Compile Include="Helpers\FakeSelectedMvcFolder.cs" />
<Compile Include="Helpers\TestableAddMvcControllerToProjectCommand.cs" />
<Compile Include="Helpers\TestableAddMvcViewToProjectCommand.cs" />
<Compile Include="Helpers\TestableProject.cs" />
<Compile Include="Helpers\TestableSelectedMvcViewFolder.cs" />
<Compile Include="Src\AddMvcControllerToProjectCommandTests.cs" />
<Compile Include="Src\AddMvcControllerToProjectViewModelTests.cs" />
<Compile Include="Src\AddMvcViewToProjectCommandTests.cs" />
<Compile Include="Src\AddMvcViewToProjectViewModelTests.cs" />
<Compile Include="Src\IsMvcViewFolderSelectedConditionTests.cs" />
<Compile Include="Src\IsMvcControllerFolderSelectedConditionEvaluatorTests.cs" />
<Compile Include="Src\IsMvcViewFolderSelectedConditionEvaluatorTests.cs" />
<Compile Include="Configuration\AssemblyInfo.cs" />
<Compile Include="Src\MvcControllerFileGeneratorTests.cs" />
<Compile Include="Src\MvcControllerFileNameTests.cs" />
<Compile Include="Src\MvcTextTemplateHostTests.cs" />
<Compile Include="Src\MvcTextTemplateRepositoryTests.cs" />
<Compile Include="Src\MvcViewFileNameTests.cs" />
<Compile Include="Src\MvcViewFileGeneratorTests.cs" />

24
src/AddIns/BackendBindings/AspNet.Mvc/Test/Helpers/FakeMvcControllerFileGenerator.cs

@ -0,0 +1,24 @@ @@ -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 ICSharpCode.AspNet.Mvc;
using ICSharpCode.SharpDevelop.Project;
namespace AspNet.Mvc.Tests.Helpers
{
public class FakeMvcControllerFileGenerator : IMvcControllerFileGenerator
{
public MvcTextTemplateLanguage Language { get; set; }
public IProject Project { get; set; }
public bool IsGenerateFileCalled;
public MvcControllerFileName FileNamePassedToGenerateController;
public void GenerateFile(MvcControllerFileName fileName)
{
FileNamePassedToGenerateController = fileName;
IsGenerateFileCalled = true;
}
}
}

10
src/AddIns/BackendBindings/AspNet.Mvc/Test/Helpers/FakeMvcTextTemplateHost.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.CodeDom.Compiler;
using ICSharpCode.AspNet.Mvc;
namespace AspNet.Mvc.Tests.Helpers
@ -12,6 +13,11 @@ namespace AspNet.Mvc.Tests.Helpers @@ -12,6 +13,11 @@ namespace AspNet.Mvc.Tests.Helpers
public string InputFilePassedToProcessTemplate;
public string OutputFilePassedToProcessTemplate;
public FakeMvcTextTemplateHost()
{
this.Errors = new CompilerErrorCollection();
}
public bool ProcessTemplate(string inputFile, string outputFile)
{
InputFilePassedToProcessTemplate = inputFile;
@ -27,5 +33,9 @@ namespace AspNet.Mvc.Tests.Helpers @@ -27,5 +33,9 @@ namespace AspNet.Mvc.Tests.Helpers
}
public string ViewName { get; set; }
public string ControllerName { get; set; }
public string Namespace { get; set; }
public CompilerErrorCollection Errors { get; set; }
}
}

10
src/AddIns/BackendBindings/AspNet.Mvc/Test/Helpers/FakeMvcViewFileGenerator.cs

@ -12,13 +12,13 @@ namespace AspNet.Mvc.Tests.Helpers @@ -12,13 +12,13 @@ namespace AspNet.Mvc.Tests.Helpers
public MvcTextTemplateLanguage Language { get; set; }
public IProject Project { get; set; }
public bool IsGenerateViewCalled;
public MvcViewFileName FileNamePassedToGenerateView;
public bool IsGenerateFileCalled;
public MvcViewFileName FileNamePassedToGenerateFile;
public void GenerateView(MvcViewFileName fileName)
public void GenerateFile(MvcViewFileName fileName)
{
FileNamePassedToGenerateView = fileName;
IsGenerateViewCalled = true;
FileNamePassedToGenerateFile = fileName;
IsGenerateFileCalled = true;
}
}
}

9
src/AddIns/BackendBindings/AspNet.Mvc/Test/Helpers/FakeSelectedMvcViewFolder.cs → src/AddIns/BackendBindings/AspNet.Mvc/Test/Helpers/FakeSelectedMvcFolder.cs

@ -7,7 +7,7 @@ using ICSharpCode.SharpDevelop.Project; @@ -7,7 +7,7 @@ using ICSharpCode.SharpDevelop.Project;
namespace AspNet.Mvc.Tests.Helpers
{
public class FakeSelectedMvcViewFolder : ISelectedMvcViewFolder
public class FakeSelectedMvcFolder : ISelectedMvcFolder
{
public string Path { get; set; }
@ -28,5 +28,12 @@ namespace AspNet.Mvc.Tests.Helpers @@ -28,5 +28,12 @@ namespace AspNet.Mvc.Tests.Helpers
{
FileNamePassedToAddFile = fileName;
}
public MvcTextTemplateLanguage TemplateLanguage = MvcTextTemplateLanguage.CSharp;
public MvcTextTemplateLanguage GetTemplateLanguage()
{
return TemplateLanguage;
}
}
}

25
src/AddIns/BackendBindings/AspNet.Mvc/Test/Helpers/TestableAddMvcControllerToProjectCommand.cs

@ -0,0 +1,25 @@ @@ -0,0 +1,25 @@
// Copyright (c) AlphaSierraPapa for the SharpDevelop Team (for details please see \doc\copyright.txt)
// This code is distributed under the GNU LGPL (for details please see \doc\license.txt)
using System;
using ICSharpCode.AspNet.Mvc;
namespace AspNet.Mvc.Tests.Helpers
{
public class TestableAddMvcControllerToProjectCommand : AddMvcControllerToProjectCommand
{
public FakeAddMvcItemToProjectView FakeAddMvcControllerToProjectView = new FakeAddMvcItemToProjectView();
protected override IAddMvcItemToProjectView CreateView()
{
return FakeAddMvcControllerToProjectView;
}
public object FakeDataContext { get; set; }
protected override object CreateDataContext()
{
return FakeDataContext;
}
}
}

44
src/AddIns/BackendBindings/AspNet.Mvc/Test/Src/AddMvcControllerToProjectCommandTests.cs

@ -0,0 +1,44 @@ @@ -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 AspNet.Mvc.Tests.Helpers;
using NUnit.Framework;
namespace AspNet.Mvc.Tests
{
[TestFixture]
public class AddMvcControllerToProjectCommandTests
{
TestableAddMvcControllerToProjectCommand command;
FakeAddMvcItemToProjectView fakeView;
void CreateCommand()
{
command = new TestableAddMvcControllerToProjectCommand();
fakeView = command.FakeAddMvcControllerToProjectView;
}
[Test]
public void Run_CommandExecuted_ViewIsDisplayed()
{
CreateCommand();
command.Run();
Assert.IsTrue(fakeView.IsShowDialogCalled);
}
[Test]
public void Run_CommandExecuted_ViewDataContextIsSet()
{
CreateCommand();
object expectedDataContext = new object();
command.FakeDataContext = expectedDataContext;
command.Run();
object dataContext = fakeView.DataContext;
Assert.AreEqual(expectedDataContext, dataContext);
}
}
}

197
src/AddIns/BackendBindings/AspNet.Mvc/Test/Src/AddMvcControllerToProjectViewModelTests.cs

@ -0,0 +1,197 @@ @@ -0,0 +1,197 @@
// 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 AspNet.Mvc.Tests.Helpers;
using ICSharpCode.AspNet.Mvc;
using ICSharpCode.SharpDevelop.Project;
using NUnit.Framework;
namespace AspNet.Mvc.Tests
{
[TestFixture]
public class AddMvcControllerToProjectControllerModelTests
{
AddMvcControllerToProjectViewModel viewModel;
FakeMvcControllerFileGenerator fakeControllerGenerator;
FakeSelectedMvcFolder fakeSelectedMvcControllerFolder;
List<string> propertyChangedEvents;
FakeMvcFileService fakeFileService;
void CreateViewModel()
{
string path = @"d:\projects\MyAspMvcProject\Controllers";
CreateViewModelWithControllerFolderPath(path);
}
void CreateViewModelWithControllerFolderPath(string path)
{
fakeSelectedMvcControllerFolder = new FakeSelectedMvcFolder();
fakeSelectedMvcControllerFolder.TemplateLanguage = MvcTextTemplateLanguage.CSharp;
fakeSelectedMvcControllerFolder.Path = path;
fakeControllerGenerator = new FakeMvcControllerFileGenerator();
fakeFileService = new FakeMvcFileService();
viewModel = new AddMvcControllerToProjectViewModel(
fakeSelectedMvcControllerFolder,
fakeControllerGenerator,
fakeFileService);
}
void MonitorPropertyChangedEvents()
{
propertyChangedEvents = new List<string>();
viewModel.PropertyChanged += (source, e) => propertyChangedEvents.Add(e.PropertyName);
}
[Test]
public void AddMvcControllerCommand_ExecutedWhenControllerNameSpecified_MvcControllerIsGenerated()
{
CreateViewModel();
viewModel.ControllerName = "MyControllerPage";
viewModel.AddMvcControllerCommand.Execute(null);
bool generated = fakeControllerGenerator.IsGenerateFileCalled;
Assert.IsTrue(generated);
}
[Test]
public void AddMvcController_ControllerNameAndControllerFolderSpecified_ControllerFullPathUsedToGenerateFile()
{
CreateViewModelWithControllerFolderPath(@"d:\projects\MyProject\Controllers");
fakeSelectedMvcControllerFolder.TemplateLanguage = MvcTextTemplateLanguage.CSharp;
viewModel.ControllerName = "Home";
viewModel.AddMvcController();
MvcControllerFileName controllerFileName = fakeControllerGenerator.FileNamePassedToGenerateController;
string fileName = controllerFileName.GetPath();
string expectedFileName = @"d:\projects\MyProject\Controllers\Home.cs";
Assert.AreEqual(expectedFileName, fileName);
}
[Test]
public void AddMvcController_SelectedControllerFolderIsInVisualBasicProject_VisualBasicMvcControllerFileGenerated()
{
CreateViewModel();
fakeSelectedMvcControllerFolder.TemplateLanguage = MvcTextTemplateLanguage.VisualBasic;
viewModel.AddMvcController();
MvcTextTemplateLanguage templateLanguage = fakeControllerGenerator.Language;
Assert.AreEqual(MvcTextTemplateLanguage.VisualBasic, templateLanguage);
}
[Test]
public void AddMvcController_SelectedControllerFolderIsInCSharpProject_CSharpMvcControllerFileGenerated()
{
CreateViewModel();
fakeSelectedMvcControllerFolder.TemplateLanguage = MvcTextTemplateLanguage.CSharp;
viewModel.AddMvcController();
MvcTextTemplateLanguage templateLanguage = fakeControllerGenerator.Language;
Assert.AreEqual(MvcTextTemplateLanguage.CSharp, templateLanguage);
}
[Test]
public void AddMvcController_SelectedControllerFolderIsInVisualBasicProject_VisualBasicProjectIsPassedToMvcControllerGenerator()
{
CreateViewModel();
fakeSelectedMvcControllerFolder.ProjectLanguage = "VBNet";
viewModel.AddMvcController();
IProject project = fakeControllerGenerator.Project;
TestableProject expectedProject = fakeSelectedMvcControllerFolder.FakeProject;
Assert.AreEqual(expectedProject, project);
}
[Test]
public void AddMvcController_FileIsGenerated_FileIsAddedToProject()
{
CreateViewModel();
viewModel.ControllerName = "Home";
fakeSelectedMvcControllerFolder.ProjectLanguage = "C#";
fakeSelectedMvcControllerFolder.TemplateLanguage = MvcTextTemplateLanguage.CSharp;
fakeSelectedMvcControllerFolder.Path = @"d:\projects\MyAspMvcProject\Controllers\Home";
viewModel.AddMvcController();
string fileAddedToProject = fakeSelectedMvcControllerFolder.FileNamePassedToAddFile;
string expectedFileAddedToProject = "Home.cs";
Assert.AreEqual(expectedFileAddedToProject, fileAddedToProject);
}
[Test]
public void AddMvcController_FileIsGenerated_WindowIsClosed()
{
CreateViewModel();
viewModel.AddMvcController();
bool closed = viewModel.IsClosed;
Assert.IsTrue(closed);
}
[Test]
public void IsClosed_MvcControllerFileIsNotGenerated_ReturnsFalse()
{
CreateViewModel();
bool closed = viewModel.IsClosed;
Assert.IsFalse(closed);
}
[Test]
public void AddMvcController_FileIsGenerated_PropertyChangedEventIsFiredForIsClosedProperty()
{
CreateViewModel();
MonitorPropertyChangedEvents();
viewModel.AddMvcController();
bool fired = propertyChangedEvents.Contains("IsClosed");
Assert.IsTrue(fired);
}
[Test]
public void AddMvcController_FileIsGenerated_FileIsOpened()
{
CreateViewModel();
viewModel.ControllerName = "HomeController";
fakeSelectedMvcControllerFolder.ProjectLanguage = "C#";
fakeSelectedMvcControllerFolder.TemplateLanguage = MvcTextTemplateLanguage.CSharp;
fakeSelectedMvcControllerFolder.Path = @"d:\projects\MyAspMvcProject\Controllers";
viewModel.AddMvcController();
string fileNameOpened = fakeFileService.FileNamePassedToOpenFile;
string expectedFileNameOpened = @"d:\projects\MyAspMvcProject\Controllers\HomeController.cs";
Assert.AreEqual(expectedFileNameOpened, fileNameOpened);
}
[Test]
public void AddMvcControllerCommand_ControllerNameIsEmptyString_CommandIsDisabled()
{
CreateViewModel();
viewModel.ControllerName = String.Empty;
bool canExecute = viewModel.AddMvcControllerCommand.CanExecute(null);
Assert.IsFalse(canExecute);
}
[Test]
public void AddMvcControllerCommand_ControllerNameIsNotEmptyString_CommandIsEnable()
{
CreateViewModel();
viewModel.ControllerName = "MyController";
bool canExecute = viewModel.AddMvcControllerCommand.CanExecute(null);
Assert.IsTrue(canExecute);
}
}
}

14
src/AddIns/BackendBindings/AspNet.Mvc/Test/Src/AddMvcViewToProjectViewModelTests.cs

@ -15,7 +15,7 @@ namespace AspNet.Mvc.Tests @@ -15,7 +15,7 @@ namespace AspNet.Mvc.Tests
{
AddMvcViewToProjectViewModel viewModel;
FakeMvcViewFileGenerator fakeViewGenerator;
FakeSelectedMvcViewFolder fakeSelectedMvcViewFolder;
FakeSelectedMvcFolder fakeSelectedMvcViewFolder;
List<string> propertyChangedEvents;
FakeMvcFileService fakeFileService;
@ -27,8 +27,10 @@ namespace AspNet.Mvc.Tests @@ -27,8 +27,10 @@ namespace AspNet.Mvc.Tests
void CreateViewModelWithViewFolderPath(string path)
{
fakeSelectedMvcViewFolder = new FakeSelectedMvcViewFolder();
fakeSelectedMvcViewFolder = new FakeSelectedMvcFolder();
fakeSelectedMvcViewFolder.Path = path;
fakeSelectedMvcViewFolder.ProjectLanguage = "C#";
fakeSelectedMvcViewFolder.TemplateLanguage = MvcTextTemplateLanguage.CSharp;
fakeViewGenerator = new FakeMvcViewFileGenerator();
fakeFileService = new FakeMvcFileService();
viewModel = new AddMvcViewToProjectViewModel(
@ -50,7 +52,7 @@ namespace AspNet.Mvc.Tests @@ -50,7 +52,7 @@ namespace AspNet.Mvc.Tests
viewModel.ViewName = "MyViewPage";
viewModel.AddMvcViewCommand.Execute(null);
bool generated = fakeViewGenerator.IsGenerateViewCalled;
bool generated = fakeViewGenerator.IsGenerateFileCalled;
Assert.IsTrue(generated);
}
@ -62,7 +64,7 @@ namespace AspNet.Mvc.Tests @@ -62,7 +64,7 @@ namespace AspNet.Mvc.Tests
viewModel.ViewName = "Index";
viewModel.AddMvcView();
MvcViewFileName viewFileName = fakeViewGenerator.FileNamePassedToGenerateView;
MvcViewFileName viewFileName = fakeViewGenerator.FileNamePassedToGenerateFile;
string fileName = viewFileName.GetPath();
string expectedFileName = @"d:\projects\MyProject\Views\Home\Index.aspx";
@ -73,7 +75,7 @@ namespace AspNet.Mvc.Tests @@ -73,7 +75,7 @@ namespace AspNet.Mvc.Tests
public void AddMvcView_SelectedViewFolderIsInVisualBasicProject_VisualBasicMvcViewFileGenerated()
{
CreateViewModel();
fakeSelectedMvcViewFolder.ProjectLanguage = "VBNet";
fakeSelectedMvcViewFolder.TemplateLanguage = MvcTextTemplateLanguage.VisualBasic;
viewModel.AddMvcView();
MvcTextTemplateLanguage templateLanguage = fakeViewGenerator.Language;
@ -85,7 +87,7 @@ namespace AspNet.Mvc.Tests @@ -85,7 +87,7 @@ namespace AspNet.Mvc.Tests
public void AddMvcView_SelectedViewFolderIsInCSharpProject_CSharpMvcViewFileGenerated()
{
CreateViewModel();
fakeSelectedMvcViewFolder.ProjectLanguage = "C#";
fakeSelectedMvcViewFolder.TemplateLanguage = MvcTextTemplateLanguage.CSharp;
viewModel.AddMvcView();
MvcTextTemplateLanguage templateLanguage = fakeViewGenerator.Language;

50
src/AddIns/BackendBindings/AspNet.Mvc/Test/Src/IsMvcControllerFolderSelectedConditionEvaluatorTests.cs

@ -0,0 +1,50 @@ @@ -0,0 +1,50 @@
// Copyright (c) AlphaSierraPapa for the SharpDevelop Team (for details please see \doc\copyright.txt)
// This code is distributed under the GNU LGPL (for details please see \doc\license.txt)
using System;
using ICSharpCode.AspNet.Mvc;
using ICSharpCode.SharpDevelop.Project;
using NUnit.Framework;
namespace AspNet.Mvc.Tests
{
[TestFixture]
public class IsMvcControllerFolderSelectedConditionEvaluatorTests
{
IsMvcControllerFolderSelectedConditionEvaluator conditionEvaluator;
void CreateConditionEvaluator()
{
conditionEvaluator = new IsMvcControllerFolderSelectedConditionEvaluator();
}
bool IsValid(object owner)
{
CreateConditionEvaluator();
return conditionEvaluator.IsValid(owner, null);
}
DirectoryNode CreateControllersFolderNode()
{
var node = new DirectoryNode("Controllers");
return node;
}
[Test]
public void IsValid_NullOwnerIsPassed_ReturnsFalse()
{
bool valid = IsValid(owner: null);
Assert.IsFalse(valid);
}
[Test]
public void IsValid_ControllersFolderNodePassed_ReturnsTrue()
{
DirectoryNode owner = CreateControllersFolderNode();
bool valid = IsValid(owner);
Assert.IsTrue(valid);
}
}
}

0
src/AddIns/BackendBindings/AspNet.Mvc/Test/Src/IsMvcViewFolderSelectedConditionTests.cs → src/AddIns/BackendBindings/AspNet.Mvc/Test/Src/IsMvcViewFolderSelectedConditionEvaluatorTests.cs

151
src/AddIns/BackendBindings/AspNet.Mvc/Test/Src/MvcControllerFileGeneratorTests.cs

@ -0,0 +1,151 @@ @@ -0,0 +1,151 @@
// 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 AspNet.Mvc.Tests.Helpers;
using ICSharpCode.AspNet.Mvc;
using ICSharpCode.SharpDevelop.Project;
using NUnit.Framework;
namespace AspNet.Mvc.Tests
{
[TestFixture]
public class MvcControllerFileGeneratorTests
{
MvcControllerFileGenerator generator;
TestableProject projectUsedByGenerator;
MvcTextTemplateRepository templateRepository;
FakeMvcTextTemplateHostFactory fakeHostFactory;
FakeMvcTextTemplateHost fakeHost;
void CreateTemplateRepository(string templateRootDirectory)
{
templateRepository = new MvcTextTemplateRepository(templateRootDirectory);
}
void CreateGenerator()
{
CreateTemplateRepository(@"d:\sd\addins\AspNet.Mvc");
CreateGenerator(templateRepository);
}
void CreateGenerator(MvcTextTemplateRepository templateRepository)
{
fakeHostFactory = new FakeMvcTextTemplateHostFactory();
fakeHost = fakeHostFactory.FakeMvcTextTemplateHost;
generator = new MvcControllerFileGenerator(fakeHostFactory, templateRepository);
projectUsedByGenerator = TestableProject.CreateProject();
generator.Project = projectUsedByGenerator;
ProjectPassedToGeneratorIsCSharpProject();
}
void ProjectPassedToGeneratorIsCSharpProject()
{
projectUsedByGenerator.SetLanguage("C#");
generator.Language = MvcTextTemplateLanguage.CSharp;
}
void GenerateFile()
{
GenerateFile(@"d:\projects\myproject\Controllers", "Home");
}
void GenerateFile(string folder, string name)
{
var fileName = new MvcControllerFileName();
fileName.Folder = folder;
fileName.ControllerName = name;
GenerateFile(fileName);
}
void GenerateFile(MvcControllerFileName fileName)
{
generator.GenerateFile(fileName);
}
[Test]
public void GenerateFile_CSharpEmptyViewTemplate_MvcTextTemplateHostIsCreated()
{
CreateGenerator();
ProjectPassedToGeneratorIsCSharpProject();
GenerateFile();
IProject project = fakeHostFactory.ProjectPassedToCreateMvcTextTemplateHost;
Assert.AreEqual(projectUsedByGenerator, project);
}
[Test]
public void GenerateFile_CSharpEmptyViewTemplate_MvcTextTemplateHostIsDisposed()
{
CreateGenerator();
ProjectPassedToGeneratorIsCSharpProject();
GenerateFile();
bool disposed = fakeHost.IsDisposed;
Assert.IsTrue(disposed);
}
[Test]
public void GenerateFile_CSharpEmptyControllerTemplate_OutputFileGeneratedUsingFileNamePassedToGenerator()
{
CreateGenerator();
ProjectPassedToGeneratorIsCSharpProject();
string controllerFolder = @"d:\projects\MyProject\Controllers";
string controllerName = "HomeController";
GenerateFile(controllerFolder, controllerName);
string outputFileGenerated = fakeHost.OutputFilePassedToProcessTemplate;
string expectedOutputFileGenerated =
@"d:\projects\MyProject\Controllers\HomeController.cs";
Assert.AreEqual(expectedOutputFileGenerated, outputFileGenerated);
}
[Test]
public void GenerateFile_CSharpControllerTemplate_TemplateFileUsedIsIsCSharpEmptyControllerTemplate()
{
string templateRootDirectory = @"d:\SharpDev\AddIns\AspNet.Mvc";
CreateTemplateRepository(templateRootDirectory);
CreateGenerator(templateRepository);
ProjectPassedToGeneratorIsCSharpProject();
GenerateFile();
string inputFileName = fakeHost.InputFilePassedToProcessTemplate;
string expectedInputFileName =
@"d:\SharpDev\AddIns\AspNet.Mvc\ItemTemplates\CSharp\CodeTemplates\AddController\Controller.tt";
Assert.AreEqual(expectedInputFileName, inputFileName);
}
[Test]
public void GenerateFile_CSharpControllerTemplate_MvcTextTemplateHostControllerNameIsSet()
{
CreateGenerator();
ProjectPassedToGeneratorIsCSharpProject();
string controllerFolder = @"d:\projects\MyProject\Controllers";
string controllerName = "AboutController";
GenerateFile(controllerFolder, controllerName);
Assert.AreEqual("AboutController", fakeHost.ControllerName);
}
[Test]
public void GenerateFile_CSharpControllerTemplate_MvcTextTemplateHostNamespaceIsTakenFromProject()
{
CreateGenerator();
ProjectPassedToGeneratorIsCSharpProject();
projectUsedByGenerator.RootNamespace = "MyProjectNamespace";
string controllerFolder = @"d:\projects\MyProject\Controllers";
string controllerName = "AboutController";
GenerateFile(controllerFolder, controllerName);
string expectedNamespace = "MyProjectNamespace.Controllers";
Assert.AreEqual(expectedNamespace, fakeHost.Namespace);
}
}
}

110
src/AddIns/BackendBindings/AspNet.Mvc/Test/Src/MvcControllerFileNameTests.cs

@ -0,0 +1,110 @@ @@ -0,0 +1,110 @@
// 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.AspNet.Mvc;
using NUnit.Framework;
namespace AspNet.Mvc.Tests
{
[TestFixture]
public class MvcControllerFileNameTests
{
MvcControllerFileName mvcControllerFileName;
void CreateFileName()
{
mvcControllerFileName = new MvcControllerFileName();
}
[Test]
public void ToString_ControllerNameAndFolderSpecified_ReturnsControllerFileNameGeneratedFromControllerNameAndFolder()
{
CreateFileName();
mvcControllerFileName.Language = MvcTextTemplateLanguage.CSharp;
mvcControllerFileName.ControllerName = "AboutController";
mvcControllerFileName.Folder = @"d:\projects\MyAspProject\Controller\About";
string fileName = mvcControllerFileName.ToString();
string expectedFileName = @"d:\projects\MyAspProject\Controller\About\AboutController.cs";
Assert.AreEqual(expectedFileName, fileName);
}
[Test]
public void GetPath_ControllerFolderIsNull_ReturnsControllerFileNameUsingOnlyControllerName()
{
CreateFileName();
mvcControllerFileName.Language = MvcTextTemplateLanguage.CSharp;
mvcControllerFileName.ControllerName = "HomeController";
mvcControllerFileName.Folder = null;
string fileName = mvcControllerFileName.GetPath();
Assert.AreEqual("HomeController.cs", fileName);
}
[Test]
public void GetPath_ControllerNameIsNull_ReturnsDefault1ControllerAsFileNameAndUsesControllerFolder()
{
CreateFileName();
mvcControllerFileName.Language = MvcTextTemplateLanguage.CSharp;
mvcControllerFileName.Folder = @"d:\projects\MyProject\Controllers\Home";
mvcControllerFileName.ControllerName = null;
string fileName = mvcControllerFileName.GetPath();
string expectedFileName = @"d:\projects\MyProject\Controllers\Home\Default1Controller.cs";
Assert.AreEqual(expectedFileName, fileName);
}
[Test]
public void ControllerName_ControllerNameIsNull_ReturnsEmptyString()
{
CreateFileName();
mvcControllerFileName.ControllerName = null;
string controllerName = mvcControllerFileName.ControllerName;
Assert.AreEqual(String.Empty, controllerName);
}
[Test]
public void ControllerFolder_ControllerFolderIsNull_ReturnsEmptyString()
{
CreateFileName();
mvcControllerFileName.Folder = null;
string controllerFolder = mvcControllerFileName.Folder;
Assert.AreEqual(String.Empty, controllerFolder);
}
[Test]
public void GetFileName_ControllerNameAndFolderSpecified_ReturnsControllerNameWithExtensionButNoFolderPath()
{
CreateFileName();
mvcControllerFileName.Language = MvcTextTemplateLanguage.CSharp;
mvcControllerFileName.Folder = @"d:\projects\myproject\Controllers";
mvcControllerFileName.ControllerName = "Index";
string fileName = mvcControllerFileName.GetFileName();
Assert.AreEqual("Index.cs", fileName);
}
[Test]
public void GetPath_LanguageIsSetToVisualBasic_ReturnsVisualBasicControllerFileName()
{
CreateFileName();
mvcControllerFileName.Language = MvcTextTemplateLanguage.VisualBasic;
mvcControllerFileName.ControllerName = "AboutController";
mvcControllerFileName.Folder = @"d:\projects\MyAspProject\Controller\About";
string fileName = mvcControllerFileName.GetPath();
string expectedFileName = @"d:\projects\MyAspProject\Controller\About\AboutController.vb";
Assert.AreEqual(expectedFileName, fileName);
}
}
}

50
src/AddIns/BackendBindings/AspNet.Mvc/Test/Src/MvcTextTemplateHostTests.cs

@ -0,0 +1,50 @@ @@ -0,0 +1,50 @@
// Copyright (c) AlphaSierraPapa for the SharpDevelop Team (for details please see \doc\copyright.txt)
// This code is distributed under the GNU LGPL (for details please see \doc\license.txt)
using System;
using ICSharpCode.AspNet.Mvc;
using NUnit.Framework;
namespace AspNet.Mvc.Tests
{
[TestFixture]
public class MvcTextTemplateHostTests
{
MvcTextTemplateHost host;
void CreateHost()
{
host = new MvcTextTemplateHost(null, null, null);
}
[Test]
public void ViewName_SetToNull_ReturnsEmptyString()
{
CreateHost();
host.ViewName = null;
string viewName = host.ViewName;
Assert.AreEqual(String.Empty, viewName);
}
[Test]
public void ControllerName_SetToNull_ReturnsEmptyString()
{
CreateHost();
host.ControllerName = null;
string controllerName = host.ControllerName;
Assert.AreEqual(String.Empty, controllerName);
}
[Test]
public void Namespace_SetToNull_ReturnsEmptyString()
{
CreateHost();
host.Namespace = null;
string ns = host.Namespace;
Assert.AreEqual(String.Empty, ns);
}
}
}

26
src/AddIns/BackendBindings/AspNet.Mvc/Test/Src/MvcTextTemplateRepositoryTests.cs

@ -42,5 +42,31 @@ namespace AspNet.Mvc.Tests @@ -42,5 +42,31 @@ namespace AspNet.Mvc.Tests
Assert.AreEqual(expectedFileName, fileName);
}
[Test]
public void GetMvcControllerTextTemplateFileName_CSharpControllerTemplateRequested_ReturnsFileNameToCSharpControllerTextTemplate()
{
CreateRepositoryWithAspNetMvcAddInDirectory(@"C:\SD\AddIns\AspNet.Mvc");
string fileName = repository.GetMvcControllerTextTemplateFileName(MvcTextTemplateLanguage.CSharp, "Controller");
string expectedFileName =
@"C:\SD\AddIns\AspNet.Mvc\ItemTemplates\CSharp\CodeTemplates\AddController\Controller.tt";
Assert.AreEqual(expectedFileName, fileName);
}
[Test]
public void GetMvcControllerTextTemplateFileName_VisualBasicControllerTemplateRequested_ReturnsFileNameToVisualBasicControllerTextTemplate()
{
CreateRepositoryWithAspNetMvcAddInDirectory(@"C:\SD\AddIns\AspNet.Mvc");
string fileName = repository.GetMvcControllerTextTemplateFileName(MvcTextTemplateLanguage.VisualBasic, "Controller");
string expectedFileName =
@"C:\SD\AddIns\AspNet.Mvc\ItemTemplates\VisualBasic\CodeTemplates\AddController\Controller.tt";
Assert.AreEqual(expectedFileName, fileName);
}
}
}

34
src/AddIns/BackendBindings/AspNet.Mvc/Test/Src/MvcViewFileGeneratorTests.cs

@ -45,55 +45,55 @@ namespace AspNet.Mvc.Tests @@ -45,55 +45,55 @@ namespace AspNet.Mvc.Tests
generator.Language = MvcTextTemplateLanguage.CSharp;
}
void GenerateView()
void GenerateFile()
{
GenerateView(@"d:\projects\myproject\Views\Home", "Index");
GenerateFile(@"d:\projects\myproject\Views\Home", "Index");
}
void GenerateView(string folder, string name)
void GenerateFile(string folder, string name)
{
var fileName = new MvcViewFileName();
fileName.ViewFolder = folder;
fileName.Folder = folder;
fileName.ViewName = name;
GenerateView(fileName);
GenerateFile(fileName);
}
void GenerateView(MvcViewFileName fileName)
void GenerateFile(MvcViewFileName fileName)
{
generator.GenerateView(fileName);
generator.GenerateFile(fileName);
}
[Test]
public void GenerateView_CSharpEmptyViewTemplate_MvcTextTemplateHostIsCreated()
public void GenerateFile_CSharpEmptyViewTemplate_MvcTextTemplateHostIsCreated()
{
CreateGenerator();
ProjectPassedToGeneratorIsCSharpProject();
GenerateView();
GenerateFile();
IProject project = fakeHostFactory.ProjectPassedToCreateMvcTextTemplateHost;
Assert.AreEqual(projectUsedByGenerator, project);
}
[Test]
public void GenerateView_CSharpEmptyViewTemplate_MvcTextTemplateHostIsDisposed()
public void GenerateFile_CSharpEmptyViewTemplate_MvcTextTemplateHostIsDisposed()
{
CreateGenerator();
ProjectPassedToGeneratorIsCSharpProject();
GenerateView();
GenerateFile();
bool disposed = fakeHost.IsDisposed;
Assert.IsTrue(disposed);
}
[Test]
public void GenerateView_CSharpEmptyViewTemplate_OutputFileGeneratedUsingFileNamePassedToGenerator()
public void GenerateFile_CSharpEmptyViewTemplate_OutputFileGeneratedUsingFileNamePassedToGenerator()
{
CreateGenerator();
ProjectPassedToGeneratorIsCSharpProject();
string viewFolder = @"d:\projects\MyProject\Views\Home";
string viewName = "Index";
GenerateView(viewFolder, viewName);
GenerateFile(viewFolder, viewName);
string outputFileGenerated = fakeHost.OutputFilePassedToProcessTemplate;
string expectedOutputFileGenerated =
@ -103,14 +103,14 @@ namespace AspNet.Mvc.Tests @@ -103,14 +103,14 @@ namespace AspNet.Mvc.Tests
}
[Test]
public void GenerateView_CSharpEmptyViewTemplate_TemplateFileUsedIsIsCSharpEmptyViewTemplate()
public void GenerateFile_CSharpEmptyViewTemplate_TemplateFileUsedIsIsCSharpEmptyViewTemplate()
{
string templateRootDirectory = @"d:\SharpDev\AddIns\AspNet.Mvc";
CreateTemplateRepository(templateRootDirectory);
CreateGenerator(templateRepository);
ProjectPassedToGeneratorIsCSharpProject();
GenerateView();
GenerateFile();
string inputFileName = fakeHost.InputFilePassedToProcessTemplate;
string expectedInputFileName =
@ -120,14 +120,14 @@ namespace AspNet.Mvc.Tests @@ -120,14 +120,14 @@ namespace AspNet.Mvc.Tests
}
[Test]
public void GenerateView_CSharpEmptyViewTemplate_MvcTextTemplateHostViewNameIsSet()
public void GenerateFile_CSharpEmptyViewTemplate_MvcTextTemplateHostViewNameIsSet()
{
CreateGenerator();
ProjectPassedToGeneratorIsCSharpProject();
string viewFolder = @"d:\projects\MyProject\Views\Home";
string viewName = "About";
GenerateView(viewFolder, viewName);
GenerateFile(viewFolder, viewName);
Assert.AreEqual("About", fakeHost.ViewName);
}

12
src/AddIns/BackendBindings/AspNet.Mvc/Test/Src/MvcViewFileNameTests.cs

@ -22,7 +22,7 @@ namespace AspNet.Mvc.Tests @@ -22,7 +22,7 @@ namespace AspNet.Mvc.Tests
{
CreateFileName();
mvcViewFileName.ViewName = "Index";
mvcViewFileName.ViewFolder = @"d:\projects\MyAspProject\Views\About";
mvcViewFileName.Folder = @"d:\projects\MyAspProject\Views\About";
string fileName = mvcViewFileName.ToString();
string expectedFileName = @"d:\projects\MyAspProject\Views\About\Index.aspx";
@ -34,7 +34,7 @@ namespace AspNet.Mvc.Tests @@ -34,7 +34,7 @@ namespace AspNet.Mvc.Tests
public void GetPath_ViewFolderIsNull_ReturnsViewFileNameUsingOnlyViewName()
{
CreateFileName();
mvcViewFileName.ViewFolder = null;
mvcViewFileName.Folder = null;
mvcViewFileName.ViewName = "Home";
string fileName = mvcViewFileName.GetPath();
@ -46,7 +46,7 @@ namespace AspNet.Mvc.Tests @@ -46,7 +46,7 @@ namespace AspNet.Mvc.Tests
public void GetPath_ViewNameIsNull_ReturnsView1AsFileNameAndUsesViewFolder()
{
CreateFileName();
mvcViewFileName.ViewFolder = @"d:\projects\MyProject\Views\Home";
mvcViewFileName.Folder = @"d:\projects\MyProject\Views\Home";
mvcViewFileName.ViewName = null;
string fileName = mvcViewFileName.GetPath();
@ -70,9 +70,9 @@ namespace AspNet.Mvc.Tests @@ -70,9 +70,9 @@ namespace AspNet.Mvc.Tests
public void ViewFolder_ViewFolderIsNull_ReturnsEmptyString()
{
CreateFileName();
mvcViewFileName.ViewFolder = null;
mvcViewFileName.Folder = null;
string viewFolder = mvcViewFileName.ViewFolder;
string viewFolder = mvcViewFileName.Folder;
Assert.AreEqual(String.Empty, viewFolder);
}
@ -81,7 +81,7 @@ namespace AspNet.Mvc.Tests @@ -81,7 +81,7 @@ namespace AspNet.Mvc.Tests
public void GetFileName_ViewNameAndViewFolderSpecified_ReturnsViewNameWithExtensionButNoFolderPath()
{
CreateFileName();
mvcViewFileName.ViewFolder = @"d:\projects\myproject\Views";
mvcViewFileName.Folder = @"d:\projects\myproject\Views";
mvcViewFileName.ViewName = "Index";
string fileName = mvcViewFileName.GetFileName();

22
src/AddIns/BackendBindings/AspNet.Mvc/Test/Src/SelectedMvcViewFolderTests.cs

@ -77,5 +77,27 @@ namespace AspNet.Mvc.Tests @@ -77,5 +77,27 @@ namespace AspNet.Mvc.Tests
Assert.AreEqual(projectForSelectedFolder, project);
}
[Test]
public void GetTemplateLanguage_ProjectIsVisualBasicProject_ReturnsVisualBasicTemplateLanguage()
{
CreateSelectedFolder();
projectForSelectedFolder.SetLanguage("VBNet");
MvcTextTemplateLanguage language = selectedFolder.GetTemplateLanguage();
Assert.AreEqual(MvcTextTemplateLanguage.VisualBasic, language);
}
[Test]
public void GetTemplateLanguage_ProjectIsCSharpProject_ReturnsCSharpTemplateLanguage()
{
CreateSelectedFolder();
projectForSelectedFolder.SetLanguage("C#");
MvcTextTemplateLanguage language = selectedFolder.GetTemplateLanguage();
Assert.AreEqual(MvcTextTemplateLanguage.CSharp, language);
}
}
}

Loading…
Cancel
Save