Browse Source

Show model classes in ASP.NET MVC Add View dialog.

pull/18/head
Matt Ward 15 years ago
parent
commit
665752625a
  1. 19
      src/AddIns/BackendBindings/AspNet.Mvc/Project/AspNet.Mvc.csproj
  2. 15
      src/AddIns/BackendBindings/AspNet.Mvc/Project/Src/AddMvcControllerToProjectViewModel.cs
  3. 54
      src/AddIns/BackendBindings/AspNet.Mvc/Project/Src/AddMvcViewToProjectView.xaml
  4. 42
      src/AddIns/BackendBindings/AspNet.Mvc/Project/Src/AddMvcViewToProjectViewModel.cs
  5. 14
      src/AddIns/BackendBindings/AspNet.Mvc/Project/Src/IMvcClass.cs
  6. 2
      src/AddIns/BackendBindings/AspNet.Mvc/Project/Src/IMvcControllerFileGenerator.cs
  7. 13
      src/AddIns/BackendBindings/AspNet.Mvc/Project/Src/IMvcModelClassLocator.cs
  8. 12
      src/AddIns/BackendBindings/AspNet.Mvc/Project/Src/IMvcParserService.cs
  9. 20
      src/AddIns/BackendBindings/AspNet.Mvc/Project/Src/IMvcProject.cs
  10. 13
      src/AddIns/BackendBindings/AspNet.Mvc/Project/Src/IMvcProjectContent.cs
  11. 2
      src/AddIns/BackendBindings/AspNet.Mvc/Project/Src/IMvcTextTemplateHostFactory.cs
  12. 2
      src/AddIns/BackendBindings/AspNet.Mvc/Project/Src/IMvcViewFileGenerator.cs
  13. 15
      src/AddIns/BackendBindings/AspNet.Mvc/Project/Src/ISelectedFolderNodeInProjectsView.cs
  14. 3
      src/AddIns/BackendBindings/AspNet.Mvc/Project/Src/ISelectedMvcFolder.cs
  15. 30
      src/AddIns/BackendBindings/AspNet.Mvc/Project/Src/MvcClass.cs
  16. 2
      src/AddIns/BackendBindings/AspNet.Mvc/Project/Src/MvcFileGenerator.cs
  17. 41
      src/AddIns/BackendBindings/AspNet.Mvc/Project/Src/MvcModelClassLocator.cs
  18. 35
      src/AddIns/BackendBindings/AspNet.Mvc/Project/Src/MvcModelClassViewModel.cs
  19. 45
      src/AddIns/BackendBindings/AspNet.Mvc/Project/Src/MvcModelClassViewModelsForSelectedFolder.cs
  20. 23
      src/AddIns/BackendBindings/AspNet.Mvc/Project/Src/MvcParserService.cs
  21. 47
      src/AddIns/BackendBindings/AspNet.Mvc/Project/Src/MvcProject.cs
  22. 26
      src/AddIns/BackendBindings/AspNet.Mvc/Project/Src/MvcProjectContent.cs
  23. 4
      src/AddIns/BackendBindings/AspNet.Mvc/Project/Src/MvcTextTemplateHostFactory.cs
  24. 33
      src/AddIns/BackendBindings/AspNet.Mvc/Project/Src/SelectedFolderNodeInProjectsView.cs
  25. 46
      src/AddIns/BackendBindings/AspNet.Mvc/Project/Src/SelectedMvcFolder.cs
  26. 7
      src/AddIns/BackendBindings/AspNet.Mvc/Project/Src/SelectedMvcViewFolder.cs
  27. 10
      src/AddIns/BackendBindings/AspNet.Mvc/Test/AspNet.Mvc.Tests.csproj
  28. 26
      src/AddIns/BackendBindings/AspNet.Mvc/Test/Helpers/FakeMvcClass.cs
  29. 2
      src/AddIns/BackendBindings/AspNet.Mvc/Test/Helpers/FakeMvcControllerFileGenerator.cs
  30. 28
      src/AddIns/BackendBindings/AspNet.Mvc/Test/Helpers/FakeMvcModelClassLocator.cs
  31. 25
      src/AddIns/BackendBindings/AspNet.Mvc/Test/Helpers/FakeMvcParserService.cs
  32. 61
      src/AddIns/BackendBindings/AspNet.Mvc/Test/Helpers/FakeMvcProject.cs
  33. 25
      src/AddIns/BackendBindings/AspNet.Mvc/Test/Helpers/FakeMvcProjectContent.cs
  34. 4
      src/AddIns/BackendBindings/AspNet.Mvc/Test/Helpers/FakeMvcTextTemplateHostFactory.cs
  35. 2
      src/AddIns/BackendBindings/AspNet.Mvc/Test/Helpers/FakeMvcViewFileGenerator.cs
  36. 31
      src/AddIns/BackendBindings/AspNet.Mvc/Test/Helpers/FakeSelectedFolderNodeInProjectsView.cs
  37. 22
      src/AddIns/BackendBindings/AspNet.Mvc/Test/Helpers/FakeSelectedMvcFolder.cs
  38. 17
      src/AddIns/BackendBindings/AspNet.Mvc/Test/Helpers/TestableSelectedMvcViewFolder.cs
  39. 46
      src/AddIns/BackendBindings/AspNet.Mvc/Test/Src/AddMvcControllerToProjectViewModelTests.cs
  40. 115
      src/AddIns/BackendBindings/AspNet.Mvc/Test/Src/AddMvcViewToProjectViewModelTests.cs
  41. 71
      src/AddIns/BackendBindings/AspNet.Mvc/Test/Src/ModelClassLocatorTests.cs
  42. 10
      src/AddIns/BackendBindings/AspNet.Mvc/Test/Src/MvcControllerFileGeneratorTests.cs
  43. 41
      src/AddIns/BackendBindings/AspNet.Mvc/Test/Src/MvcModelClassViewModelTests.cs
  44. 109
      src/AddIns/BackendBindings/AspNet.Mvc/Test/Src/MvcProjectTests.cs
  45. 8
      src/AddIns/BackendBindings/AspNet.Mvc/Test/Src/MvcViewFileGeneratorTests.cs
  46. 52
      src/AddIns/BackendBindings/AspNet.Mvc/Test/Src/SelectedFolderNodeInProjectsViewTests.cs
  47. 44
      src/AddIns/BackendBindings/AspNet.Mvc/Test/Src/SelectedMvcViewFolderTests.cs

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

@ -62,17 +62,25 @@
<Compile Include="Src\CloseDialogBehaviour.cs" /> <Compile Include="Src\CloseDialogBehaviour.cs" />
<Compile Include="Src\DelegateCommand.cs" /> <Compile Include="Src\DelegateCommand.cs" />
<Compile Include="Src\IAddMvcItemToProjectView.cs" /> <Compile Include="Src\IAddMvcItemToProjectView.cs" />
<Compile Include="Src\IMvcModelClassLocator.cs" />
<Compile Include="Src\IMvcClass.cs" />
<Compile Include="Src\IMvcControllerFileGenerator.cs" /> <Compile Include="Src\IMvcControllerFileGenerator.cs" />
<Compile Include="Src\IMvcFileService.cs" /> <Compile Include="Src\IMvcFileService.cs" />
<Compile Include="Src\IMvcParserService.cs" />
<Compile Include="Src\IMvcProject.cs" />
<Compile Include="Src\IMvcProjectContent.cs" />
<Compile Include="Src\IMvcTextTemplateHost.cs" /> <Compile Include="Src\IMvcTextTemplateHost.cs" />
<Compile Include="Src\IMvcTextTemplateHostFactory.cs" /> <Compile Include="Src\IMvcTextTemplateHostFactory.cs" />
<Compile Include="Src\IMvcViewFileGenerator.cs" /> <Compile Include="Src\IMvcViewFileGenerator.cs" />
<Compile Include="Src\ISelectedFolderNodeInProjectsView.cs" />
<Compile Include="Src\ISelectedMvcFolder.cs" /> <Compile Include="Src\ISelectedMvcFolder.cs" />
<Compile Include="Src\IsMvcControllerFolderSelectedConditionEvaluator.cs" /> <Compile Include="Src\IsMvcControllerFolderSelectedConditionEvaluator.cs" />
<Compile Include="Src\IsMvcFolderSelectedConditionEvaluator.cs" /> <Compile Include="Src\IsMvcFolderSelectedConditionEvaluator.cs" />
<Compile Include="Src\IsMvcViewFolderSelectedConditionEvaluator.cs" /> <Compile Include="Src\IsMvcViewFolderSelectedConditionEvaluator.cs" />
<Compile Include="Configuration\AssemblyInfo.cs" /> <Compile Include="Configuration\AssemblyInfo.cs" />
<Compile Include="Src\MvcModelClassLocator.cs" />
<Compile Include="Src\MvcAddViewTextTemplateFolder.cs" /> <Compile Include="Src\MvcAddViewTextTemplateFolder.cs" />
<Compile Include="Src\MvcClass.cs" />
<Compile Include="Src\MvcControllerFileGenerator.cs" /> <Compile Include="Src\MvcControllerFileGenerator.cs" />
<Compile Include="Src\MvcControllerFileName.cs" /> <Compile Include="Src\MvcControllerFileName.cs" />
<Compile Include="Src\MvcControllerName.cs" /> <Compile Include="Src\MvcControllerName.cs" />
@ -81,6 +89,11 @@
<Compile Include="Src\MvcFileGenerator.cs" /> <Compile Include="Src\MvcFileGenerator.cs" />
<Compile Include="Src\MvcFileName.cs" /> <Compile Include="Src\MvcFileName.cs" />
<Compile Include="Src\MvcFileService.cs" /> <Compile Include="Src\MvcFileService.cs" />
<Compile Include="Src\MvcModelClassViewModel.cs" />
<Compile Include="Src\MvcModelClassViewModelsForSelectedFolder.cs" />
<Compile Include="Src\MvcParserService.cs" />
<Compile Include="Src\MvcProject.cs" />
<Compile Include="Src\MvcProjectContent.cs" />
<Compile Include="Src\MvcTextTemplateCriteria.cs" /> <Compile Include="Src\MvcTextTemplateCriteria.cs" />
<Compile Include="Src\MvcTextTemplateFileName.cs" /> <Compile Include="Src\MvcTextTemplateFileName.cs" />
<Compile Include="Src\MvcTextTemplateHost.cs" /> <Compile Include="Src\MvcTextTemplateHost.cs" />
@ -97,6 +110,7 @@
<Compile Include="Src\MvcViewFileGenerator.cs" /> <Compile Include="Src\MvcViewFileGenerator.cs" />
<Compile Include="Src\MvcViewTextTemplateFileName.cs" /> <Compile Include="Src\MvcViewTextTemplateFileName.cs" />
<Compile Include="Src\MvcViewTypeViewModel.cs" /> <Compile Include="Src\MvcViewTypeViewModel.cs" />
<Compile Include="Src\SelectedFolderNodeInProjectsView.cs" />
<Compile Include="Src\SelectedMvcControllerFolder.cs" /> <Compile Include="Src\SelectedMvcControllerFolder.cs" />
<Compile Include="Src\SelectedMvcFolder.cs" /> <Compile Include="Src\SelectedMvcFolder.cs" />
<Compile Include="Src\SelectedMvcViewFolder.cs" /> <Compile Include="Src\SelectedMvcViewFolder.cs" />
@ -134,6 +148,11 @@
<Name>ICSharpCode.Core.Presentation</Name> <Name>ICSharpCode.Core.Presentation</Name>
<Private>False</Private> <Private>False</Private>
</ProjectReference> </ProjectReference>
<ProjectReference Include="..\..\..\..\Main\ICSharpCode.SharpDevelop.Dom\Project\ICSharpCode.SharpDevelop.Dom.csproj">
<Project>{924EE450-603D-49C1-A8E5-4AFAA31CE6F3}</Project>
<Name>ICSharpCode.SharpDevelop.Dom</Name>
<Private>False</Private>
</ProjectReference>
<ProjectReference Include="..\..\..\Misc\TextTemplating\Project\TextTemplating.csproj"> <ProjectReference Include="..\..\..\Misc\TextTemplating\Project\TextTemplating.csproj">
<Project>{B5D8C3E6-42EC-4D4B-AD05-3644B32563EF}</Project> <Project>{B5D8C3E6-42EC-4D4B-AD05-3644B32563EF}</Project>
<Name>TextTemplating</Name> <Name>TextTemplating</Name>

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

@ -13,7 +13,6 @@ namespace ICSharpCode.AspNet.Mvc
{ {
IMvcControllerFileGenerator controllerGenerator; IMvcControllerFileGenerator controllerGenerator;
ISelectedMvcFolder selectedControllerFolder; ISelectedMvcFolder selectedControllerFolder;
IMvcFileService fileService;
MvcControllerFileName controllerFileName = new MvcControllerFileName(); MvcControllerFileName controllerFileName = new MvcControllerFileName();
bool closed; bool closed;
List<MvcControllerTemplateViewModel> controllerTemplates; List<MvcControllerTemplateViewModel> controllerTemplates;
@ -21,19 +20,16 @@ namespace ICSharpCode.AspNet.Mvc
public AddMvcControllerToProjectViewModel(ISelectedMvcFolder selectedControllerFolder) public AddMvcControllerToProjectViewModel(ISelectedMvcFolder selectedControllerFolder)
: this( : this(
selectedControllerFolder, selectedControllerFolder,
new MvcControllerFileGenerator(), new MvcControllerFileGenerator())
new MvcFileService())
{ {
} }
public AddMvcControllerToProjectViewModel( public AddMvcControllerToProjectViewModel(
ISelectedMvcFolder selectedControllerFolder, ISelectedMvcFolder selectedControllerFolder,
IMvcControllerFileGenerator controllerGenerator, IMvcControllerFileGenerator controllerGenerator)
IMvcFileService fileService)
{ {
this.selectedControllerFolder = selectedControllerFolder; this.selectedControllerFolder = selectedControllerFolder;
this.controllerGenerator = controllerGenerator; this.controllerGenerator = controllerGenerator;
this.fileService = fileService;
this.controllerFileName.Folder = selectedControllerFolder.Path; this.controllerFileName.Folder = selectedControllerFolder.Path;
@ -127,7 +123,6 @@ namespace ICSharpCode.AspNet.Mvc
{ {
GenerateMvcControllerFile(); GenerateMvcControllerFile();
AddMvcControllerFileToProject(); AddMvcControllerFileToProject();
OpenMvcControllerFileCreated();
IsClosed = true; IsClosed = true;
} }
@ -148,11 +143,5 @@ namespace ICSharpCode.AspNet.Mvc
string fileName = controllerFileName.GetFileName(); string fileName = controllerFileName.GetFileName();
selectedControllerFolder.AddFileToProject(fileName); selectedControllerFolder.AddFileToProject(fileName);
} }
void OpenMvcControllerFileCreated()
{
string path = controllerFileName.GetPath();
fileService.OpenFile(path);
}
} }
} }

54
src/AddIns/BackendBindings/AspNet.Mvc/Project/Src/AddMvcViewToProjectView.xaml

@ -18,10 +18,16 @@
<DataTemplate x:Key="ViewEngineTemplate"> <DataTemplate x:Key="ViewEngineTemplate">
<TextBlock Text="{Binding Name}"/> <TextBlock Text="{Binding Name}"/>
</DataTemplate> </DataTemplate>
<DataTemplate x:Key="ModelClassTemplate">
<TextBlock Text="{Binding Name}"/>
</DataTemplate>
</Window.Resources> </Window.Resources>
<Grid> <Grid>
<Grid.RowDefinitions> <Grid.RowDefinitions>
<RowDefinition Height="Auto"/>
<RowDefinition Height="Auto"/>
<RowDefinition Height="Auto"/> <RowDefinition Height="Auto"/>
<RowDefinition Height="Auto"/> <RowDefinition Height="Auto"/>
<RowDefinition Height="Auto"/> <RowDefinition Height="Auto"/>
@ -34,43 +40,65 @@
<ColumnDefinition Width="*"/> <ColumnDefinition Width="*"/>
</Grid.ColumnDefinitions> </Grid.ColumnDefinitions>
<TextBlock <Label
Margin="4" Margin="0, 2, 0, 0"
Text="View Name:"/> Content="View Name:"/>
<TextBox <TextBox
x:Name="ViewNameTextBox" x:Name="ViewNameTextBox"
Margin="0, 2, 0, 0"
Grid.Column="1" Grid.Column="1"
Margin="2"
Text="{Binding Path=ViewName, UpdateSourceTrigger=PropertyChanged}"/> Text="{Binding Path=ViewName, UpdateSourceTrigger=PropertyChanged}"/>
<TextBlock <Label
Grid.Row="1" Grid.Row="1"
Margin="4" Content="View Engine:"/>
Text="View Engine:"/>
<ComboBox <ComboBox
Margin="2"
Grid.Row="1" Grid.Row="1"
Grid.Column="1" Grid.Column="1"
Margin="0, 2, 0, 0"
ItemsSource="{Binding Path=ViewEngines}" ItemsSource="{Binding Path=ViewEngines}"
ItemTemplate="{StaticResource ViewEngineTemplate}" ItemTemplate="{StaticResource ViewEngineTemplate}"
SelectedItem="{Binding Path=SelectedViewEngine}"/> SelectedItem="{Binding Path=SelectedViewEngine}"/>
<TextBlock <Label
Grid.Row="2" Grid.Row="2"
Margin="4" Content="Partial View:"/>
Text="Partial View:"/>
<CheckBox <CheckBox
Grid.Column="1" Grid.Column="1"
Grid.Row="2" Grid.Row="2"
Margin="2, 4, 0, 0" Margin="0, 6, 0, 0"
IsChecked="{Binding Path=IsPartialView}"/> IsChecked="{Binding Path=IsPartialView}"/>
<Label
Grid.Row="3"
Margin="0, 20, 0, 0"
Content="Strongly Typed:"/>
<CheckBox
Grid.Column="1"
Grid.Row="3"
Margin="0, 28, 0, 0"
IsChecked="{Binding Path=IsStronglyTypedView}"/>
<Label
Grid.Row="4"
IsEnabled="{Binding Path=IsStronglyTypedView}"
Content="Model:"/>
<ComboBox
Grid.Row="4"
Grid.Column="1"
Margin="0, 2, 0, 0"
IsEditable="True"
IsEnabled="{Binding Path=IsStronglyTypedView}"
ItemsSource="{Binding Path=ModelClasses}"
ItemTemplate="{StaticResource ModelClassTemplate}"
SelectedItem="{Binding Path=SelectedModelClass}"/>
<StackPanel <StackPanel
Orientation="Horizontal" Orientation="Horizontal"
HorizontalAlignment="Right" HorizontalAlignment="Right"
Margin="4" Margin="4"
Grid.ColumnSpan="2" Grid.ColumnSpan="2"
Grid.Row="4"> Grid.Row="6">
<Button <Button
Margin="2, 0" Margin="2, 0"
Content="_Add" Content="_Add"

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

@ -3,6 +3,7 @@
using System; using System;
using System.Collections.Generic; using System.Collections.Generic;
using System.Collections.ObjectModel;
using System.IO; using System.IO;
using System.Windows.Input; using System.Windows.Input;
@ -12,34 +13,38 @@ namespace ICSharpCode.AspNet.Mvc
{ {
IMvcViewFileGenerator viewGenerator; IMvcViewFileGenerator viewGenerator;
ISelectedMvcFolder selectedViewFolder; ISelectedMvcFolder selectedViewFolder;
IMvcFileService fileService;
MvcViewFileName viewFileName = new MvcViewFileName(); MvcViewFileName viewFileName = new MvcViewFileName();
bool closed; bool closed;
List<MvcViewEngineViewModel> viewEngines; List<MvcViewEngineViewModel> viewEngines;
MvcViewEngineViewModel selectedViewEngine; MvcViewEngineViewModel selectedViewEngine;
bool stronglyTypedView;
MvcModelClassViewModelsForSelectedFolder modelClassesForSelectedFolder;
public AddMvcViewToProjectViewModel(ISelectedMvcFolder selectedViewFolder) public AddMvcViewToProjectViewModel(ISelectedMvcFolder selectedViewFolder)
: this( : this(
selectedViewFolder, selectedViewFolder,
new MvcViewFileGenerator(), new MvcViewFileGenerator())
new MvcFileService())
{ {
} }
public AddMvcViewToProjectViewModel( public AddMvcViewToProjectViewModel(
ISelectedMvcFolder selectedViewFolder, ISelectedMvcFolder selectedViewFolder,
IMvcViewFileGenerator viewGenerator, IMvcViewFileGenerator viewGenerator)
IMvcFileService fileService)
{ {
this.selectedViewFolder = selectedViewFolder; this.selectedViewFolder = selectedViewFolder;
this.viewGenerator = viewGenerator; this.viewGenerator = viewGenerator;
this.fileService = fileService;
this.viewFileName.Folder = selectedViewFolder.Path; this.viewFileName.Folder = selectedViewFolder.Path;
CreateModelClassesForSelectedFolder();
CreateCommands(); CreateCommands();
AddViewEngines(); AddViewEngines();
} }
void CreateModelClassesForSelectedFolder()
{
modelClassesForSelectedFolder = new MvcModelClassViewModelsForSelectedFolder(selectedViewFolder);
}
void CreateCommands() void CreateCommands()
{ {
AddMvcViewCommand = new DelegateCommand(param => AddMvcView(), param => CanAddMvcView()); AddMvcViewCommand = new DelegateCommand(param => AddMvcView(), param => CanAddMvcView());
@ -111,7 +116,6 @@ namespace ICSharpCode.AspNet.Mvc
{ {
GenerateMvcViewFile(); GenerateMvcViewFile();
AddMvcViewFileToProject(); AddMvcViewFileToProject();
OpenMvcViewFileCreated();
IsClosed = true; IsClosed = true;
} }
@ -140,16 +144,28 @@ namespace ICSharpCode.AspNet.Mvc
selectedViewFolder.AddFileToProject(fileName); selectedViewFolder.AddFileToProject(fileName);
} }
void OpenMvcViewFileCreated()
{
string path = viewFileName.GetPath();
fileService.OpenFile(path);
}
public bool IsPartialView { public bool IsPartialView {
get { return viewFileName.IsPartialView; } get { return viewFileName.IsPartialView; }
set { viewFileName.IsPartialView = value; } set { viewFileName.IsPartialView = value; }
} }
public bool IsStronglyTypedView {
get { return stronglyTypedView; }
set {
stronglyTypedView = value;
if (stronglyTypedView) {
modelClassesForSelectedFolder.GetModelClasses();
OnPropertyChanged(viewModel => viewModel.ModelClasses);
}
OnPropertyChanged(viewModel => viewModel.IsStronglyTypedView);
}
}
public IEnumerable<MvcModelClassViewModel> ModelClasses {
get { return modelClassesForSelectedFolder.ModelClasses; }
}
public string SelectedModelClass { get; set; }
} }
} }

14
src/AddIns/BackendBindings/AspNet.Mvc/Project/Src/IMvcClass.cs

@ -0,0 +1,14 @@
// Copyright (c) AlphaSierraPapa for the SharpDevelop Team (for details please see \doc\copyright.txt)
// This code is distributed under the GNU LGPL (for details please see \doc\license.txt)
using System;
namespace ICSharpCode.AspNet.Mvc
{
public interface IMvcClass
{
string FullyQualifiedName { get; }
string Name { get; }
string Namespace { get; }
}
}

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

@ -9,7 +9,7 @@ namespace ICSharpCode.AspNet.Mvc
public interface IMvcControllerFileGenerator public interface IMvcControllerFileGenerator
{ {
MvcTextTemplateLanguage TemplateLanguage { get; set; } MvcTextTemplateLanguage TemplateLanguage { get; set; }
IProject Project { get; set; } IMvcProject Project { get; set; }
bool AddActionMethods { get; set; } bool AddActionMethods { get; set; }
void GenerateFile(MvcControllerFileName fileName); void GenerateFile(MvcControllerFileName fileName);

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

@ -0,0 +1,13 @@
// 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;
namespace ICSharpCode.AspNet.Mvc
{
public interface IMvcModelClassLocator
{
IEnumerable<IMvcClass> GetModelClasses(IMvcProject project);
}
}

12
src/AddIns/BackendBindings/AspNet.Mvc/Project/Src/IMvcParserService.cs

@ -0,0 +1,12 @@
// Copyright (c) AlphaSierraPapa for the SharpDevelop Team (for details please see \doc\copyright.txt)
// This code is distributed under the GNU LGPL (for details please see \doc\license.txt)
using System;
namespace ICSharpCode.AspNet.Mvc
{
public interface IMvcParserService
{
IMvcProjectContent GetProjectContent(IMvcProject project);
}
}

20
src/AddIns/BackendBindings/AspNet.Mvc/Project/Src/IMvcProject.cs

@ -0,0 +1,20 @@
// 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 ICSharpCode.SharpDevelop;
using ICSharpCode.SharpDevelop.Project;
namespace ICSharpCode.AspNet.Mvc
{
public interface IMvcProject
{
IProject Project { get; }
string RootNamespace { get; }
void Save();
MvcTextTemplateLanguage GetTemplateLanguage();
IEnumerable<IMvcClass> GetModelClasses();
}
}

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

@ -0,0 +1,13 @@
// 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;
namespace ICSharpCode.AspNet.Mvc
{
public interface IMvcProjectContent
{
IEnumerable<IMvcClass> GetClasses();
}
}

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

@ -8,6 +8,6 @@ namespace ICSharpCode.AspNet.Mvc
{ {
public interface IMvcTextTemplateHostFactory public interface IMvcTextTemplateHostFactory
{ {
IMvcTextTemplateHost CreateMvcTextTemplateHost(IProject project); IMvcTextTemplateHost CreateMvcTextTemplateHost(IMvcProject project);
} }
} }

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

@ -10,7 +10,7 @@ namespace ICSharpCode.AspNet.Mvc
{ {
MvcTextTemplateLanguage TemplateLanguage { get; set; } MvcTextTemplateLanguage TemplateLanguage { get; set; }
MvcTextTemplateType TemplateType { get; set; } MvcTextTemplateType TemplateType { get; set; }
IProject Project { get; set; } IMvcProject Project { get; set; }
void GenerateFile(MvcViewFileName fileName); void GenerateFile(MvcViewFileName fileName);
} }

15
src/AddIns/BackendBindings/AspNet.Mvc/Project/Src/ISelectedFolderNodeInProjectsView.cs

@ -0,0 +1,15 @@
// Copyright (c) AlphaSierraPapa for the SharpDevelop Team (for details please see \doc\copyright.txt)
// This code is distributed under the GNU LGPL (for details please see \doc\license.txt)
using System;
namespace ICSharpCode.AspNet.Mvc
{
public interface ISelectedFolderNodeInProjectsView
{
string Folder { get; }
IMvcProject Project { get; }
void AddNewFile(string path);
}
}

3
src/AddIns/BackendBindings/AspNet.Mvc/Project/Src/ISelectedMvcFolder.cs

@ -2,6 +2,7 @@
// This code is distributed under the GNU LGPL (for details please see \doc\license.txt) // This code is distributed under the GNU LGPL (for details please see \doc\license.txt)
using System; using System;
using System.Collections.Generic;
using ICSharpCode.SharpDevelop.Project; using ICSharpCode.SharpDevelop.Project;
namespace ICSharpCode.AspNet.Mvc namespace ICSharpCode.AspNet.Mvc
@ -9,7 +10,7 @@ namespace ICSharpCode.AspNet.Mvc
public interface ISelectedMvcFolder public interface ISelectedMvcFolder
{ {
string Path { get; } string Path { get; }
IProject Project { get; } IMvcProject Project { get; }
/// <summary> /// <summary>
/// Adds the file to the folder. /// Adds the file to the folder.

30
src/AddIns/BackendBindings/AspNet.Mvc/Project/Src/MvcClass.cs

@ -0,0 +1,30 @@
// Copyright (c) AlphaSierraPapa for the SharpDevelop Team (for details please see \doc\copyright.txt)
// This code is distributed under the GNU LGPL (for details please see \doc\license.txt)
using System;
using ICSharpCode.SharpDevelop.Dom;
namespace ICSharpCode.AspNet.Mvc
{
public class MvcClass : IMvcClass
{
IClass c;
public MvcClass(IClass c)
{
this.c = c;
}
public string FullyQualifiedName {
get { return c.FullyQualifiedName; }
}
public string Name {
get { return c.Name; }
}
public string Namespace {
get { return c.Namespace; }
}
}
}

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

@ -17,7 +17,7 @@ namespace ICSharpCode.AspNet.Mvc
} }
public MvcTextTemplateLanguage TemplateLanguage { get; set; } public MvcTextTemplateLanguage TemplateLanguage { get; set; }
public IProject Project { get; set; } public IMvcProject Project { get; set; }
public void GenerateFile(MvcFileName fileName) public void GenerateFile(MvcFileName fileName)
{ {

41
src/AddIns/BackendBindings/AspNet.Mvc/Project/Src/MvcModelClassLocator.cs

@ -0,0 +1,41 @@
// 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;
namespace ICSharpCode.AspNet.Mvc
{
public class MvcModelClassLocator : IMvcModelClassLocator
{
IMvcParserService parserService;
public MvcModelClassLocator()
: this(new MvcParserService())
{
}
public MvcModelClassLocator(IMvcParserService parserService)
{
this.parserService = parserService;
}
public IEnumerable<IMvcClass> GetModelClasses(IMvcProject project)
{
foreach (IMvcClass c in GetClasses(project)) {
yield return c;
}
}
IEnumerable<IMvcClass> GetClasses(IMvcProject project)
{
IMvcProjectContent projectContent = GetProjectContent(project);
return projectContent.GetClasses();
}
IMvcProjectContent GetProjectContent(IMvcProject project)
{
return parserService.GetProjectContent(project);
}
}
}

35
src/AddIns/BackendBindings/AspNet.Mvc/Project/Src/MvcModelClassViewModel.cs

@ -0,0 +1,35 @@
// Copyright (c) AlphaSierraPapa for the SharpDevelop Team (for details please see \doc\copyright.txt)
// This code is distributed under the GNU LGPL (for details please see \doc\license.txt)
using System;
namespace ICSharpCode.AspNet.Mvc
{
public class MvcModelClassViewModel
{
IMvcClass mvcClass;
string name;
public MvcModelClassViewModel(
IMvcClass mvcClass)
{
this.mvcClass = mvcClass;
GetName();
}
void GetName()
{
name = String.Format("{0} ({1})", mvcClass.Name, mvcClass.Namespace);
}
public string Name {
get { return name; }
}
public override string ToString()
{
return Name;
}
}
}

45
src/AddIns/BackendBindings/AspNet.Mvc/Project/Src/MvcModelClassViewModelsForSelectedFolder.cs

@ -0,0 +1,45 @@
// 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;
namespace ICSharpCode.AspNet.Mvc
{
public class MvcModelClassViewModelsForSelectedFolder
{
ISelectedMvcFolder selectedFolder;
List<MvcModelClassViewModel> modelClasses;
public MvcModelClassViewModelsForSelectedFolder(ISelectedMvcFolder selectedFolder)
{
this.selectedFolder = selectedFolder;
}
public IEnumerable<MvcModelClassViewModel> ModelClasses {
get {
if (modelClasses != null) {
return modelClasses;
}
return new MvcModelClassViewModel[0];
}
}
public void GetModelClasses()
{
if (modelClasses == null) {
modelClasses = new List<MvcModelClassViewModel>();
foreach (IMvcClass mvcClass in GetModelClassesFromProject()) {
var modelClassViewModel = new MvcModelClassViewModel(mvcClass);
modelClasses.Add(modelClassViewModel);
}
}
}
IEnumerable<IMvcClass> GetModelClassesFromProject()
{
return selectedFolder.Project.GetModelClasses();
}
}
}

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

@ -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 ICSharpCode.SharpDevelop;
using ICSharpCode.SharpDevelop.Dom;
namespace ICSharpCode.AspNet.Mvc
{
public class MvcParserService : IMvcParserService
{
public IMvcProjectContent GetProjectContent(IMvcProject project)
{
IProjectContent projectContent = GetProjectContentFromParser(project);
return new MvcProjectContent(projectContent);
}
IProjectContent GetProjectContentFromParser(IMvcProject mvcProject)
{
return ParserService.GetProjectContent(mvcProject.Project);
}
}
}

47
src/AddIns/BackendBindings/AspNet.Mvc/Project/Src/MvcProject.cs

@ -0,0 +1,47 @@
// 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 ICSharpCode.SharpDevelop.Project;
namespace ICSharpCode.AspNet.Mvc
{
public class MvcProject : IMvcProject
{
IMvcModelClassLocator modelClassLocator;
public MvcProject(IProject project)
: this(project, new MvcModelClassLocator())
{
}
public MvcProject(IProject project, IMvcModelClassLocator modelClassLocator)
{
this.Project = project;
this.modelClassLocator = modelClassLocator;
}
public IProject Project { get; private set; }
public string RootNamespace {
get { return Project.RootNamespace; }
}
public void Save()
{
Project.Save();
}
public MvcTextTemplateLanguage GetTemplateLanguage()
{
string language = Project.Language;
return MvcTextTemplateLanguageConverter.Convert(language);
}
public IEnumerable<IMvcClass> GetModelClasses()
{
return modelClassLocator.GetModelClasses(this);
}
}
}

26
src/AddIns/BackendBindings/AspNet.Mvc/Project/Src/MvcProjectContent.cs

@ -0,0 +1,26 @@
// Copyright (c) AlphaSierraPapa for the SharpDevelop Team (for details please see \doc\copyright.txt)
// This code is distributed under the GNU LGPL (for details please see \doc\license.txt)
using System;
using System.Collections.Generic;
using ICSharpCode.SharpDevelop.Dom;
namespace ICSharpCode.AspNet.Mvc
{
public class MvcProjectContent : IMvcProjectContent
{
IProjectContent projectContent;
public MvcProjectContent(IProjectContent projectContent)
{
this.projectContent = projectContent;
}
public IEnumerable<IMvcClass> GetClasses()
{
foreach (IClass c in projectContent.Classes) {
yield return new MvcClass(c);
}
}
}
}

4
src/AddIns/BackendBindings/AspNet.Mvc/Project/Src/MvcTextTemplateHostFactory.cs

@ -10,11 +10,11 @@ namespace ICSharpCode.AspNet.Mvc
{ {
public class MvcTextTemplateHostFactory : IMvcTextTemplateHostFactory public class MvcTextTemplateHostFactory : IMvcTextTemplateHostFactory
{ {
public IMvcTextTemplateHost CreateMvcTextTemplateHost(IProject project) public IMvcTextTemplateHost CreateMvcTextTemplateHost(IMvcProject mvcProject)
{ {
var appDomainFactory = new TextTemplatingAppDomainFactory(); var appDomainFactory = new TextTemplatingAppDomainFactory();
string applicationBase = GetAssemblyBaseLocation(); string applicationBase = GetAssemblyBaseLocation();
var assemblyResolver = new TextTemplatingAssemblyResolver(project); var assemblyResolver = new TextTemplatingAssemblyResolver(mvcProject.Project);
return new MvcTextTemplateHost(appDomainFactory, assemblyResolver, applicationBase); return new MvcTextTemplateHost(appDomainFactory, assemblyResolver, applicationBase);
} }

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

@ -0,0 +1,33 @@
// 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 SelectedFolderNodeInProjectsView : ISelectedFolderNodeInProjectsView
{
DirectoryNode directoryNode;
MvcProject project;
public SelectedFolderNodeInProjectsView(DirectoryNode directoryNode)
{
this.directoryNode = directoryNode;
this.project = new MvcProject(directoryNode.Project);
}
public string Folder {
get { return directoryNode.Directory; }
}
public IMvcProject Project {
get { return project; }
}
public void AddNewFile(string path)
{
directoryNode.AddNewFile(path);
}
}
}

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

@ -2,17 +2,29 @@
// This code is distributed under the GNU LGPL (for details please see \doc\license.txt) // This code is distributed under the GNU LGPL (for details please see \doc\license.txt)
using System; using System;
using System.Collections.Generic;
using ICSharpCode.SharpDevelop.Project; using ICSharpCode.SharpDevelop.Project;
namespace ICSharpCode.AspNet.Mvc namespace ICSharpCode.AspNet.Mvc
{ {
public class SelectedMvcFolder : ISelectedMvcFolder public class SelectedMvcFolder : ISelectedMvcFolder
{ {
DirectoryNode directoryNode; IMvcFileService fileService;
ISelectedFolderNodeInProjectsView selectedFolderNode;
public SelectedMvcFolder(
ISelectedFolderNodeInProjectsView selectedFolderNode,
IMvcFileService fileService)
{
this.selectedFolderNode = selectedFolderNode;
this.fileService = fileService;
}
public SelectedMvcFolder(DirectoryNode directoryNode) public SelectedMvcFolder(DirectoryNode directoryNode)
: this(
new SelectedFolderNodeInProjectsView(directoryNode),
new MvcFileService())
{ {
this.directoryNode = directoryNode;
} }
public SelectedMvcFolder() public SelectedMvcFolder()
@ -21,34 +33,44 @@ namespace ICSharpCode.AspNet.Mvc
} }
public string Path { public string Path {
get { return directoryNode.Directory; } get { return selectedFolderNode.Folder; }
} }
public IProject Project { public IMvcProject Project {
get { return directoryNode.Project; } get { return selectedFolderNode.Project; }
} }
public void AddFileToProject(string fileName) public void AddFileToProject(string fileName)
{ {
string fullPath = System.IO.Path.Combine(Path, fileName); string fullPath = GetFullPathToFile(fileName);
AddNewFileToDirectoryNode(fullPath); AddNewFileToFolderNode(fullPath);
SaveProject(); SaveProject();
OpenFile(fullPath);
} }
protected virtual void AddNewFileToDirectoryNode(string path) string GetFullPathToFile(string fileName)
{ {
directoryNode.AddNewFile(path); return System.IO.Path.Combine(Path, fileName);
}
void AddNewFileToFolderNode(string path)
{
selectedFolderNode.AddNewFile(path);
} }
void SaveProject() void SaveProject()
{ {
directoryNode.Project.Save(); selectedFolderNode.Project.Save();
}
void OpenFile(string fullPath)
{
fileService.OpenFile(fullPath);
} }
public MvcTextTemplateLanguage GetTemplateLanguage() public MvcTextTemplateLanguage GetTemplateLanguage()
{ {
string language = Project.Language; return Project.GetTemplateLanguage();
return MvcTextTemplateLanguageConverter.Convert(language);
} }
} }
} }

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

@ -13,6 +13,13 @@ namespace ICSharpCode.AspNet.Mvc
{ {
} }
public SelectedMvcViewFolder(
ISelectedFolderNodeInProjectsView selectedFolderNodeInProjectsView,
IMvcFileService fileService)
: base(selectedFolderNodeInProjectsView, fileService)
{
}
public SelectedMvcViewFolder() public SelectedMvcViewFolder()
: base() : base()
{ {

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

@ -50,11 +50,17 @@
<Link>Configuration\GlobalAssemblyInfo.cs</Link> <Link>Configuration\GlobalAssemblyInfo.cs</Link>
</Compile> </Compile>
<Compile Include="Helpers\FakeAddMvcItemToProjectView.cs" /> <Compile Include="Helpers\FakeAddMvcItemToProjectView.cs" />
<Compile Include="Helpers\FakeMvcModelClassLocator.cs" />
<Compile Include="Helpers\FakeMvcClass.cs" />
<Compile Include="Helpers\FakeMvcControllerFileGenerator.cs" /> <Compile Include="Helpers\FakeMvcControllerFileGenerator.cs" />
<Compile Include="Helpers\FakeMvcFileService.cs" /> <Compile Include="Helpers\FakeMvcFileService.cs" />
<Compile Include="Helpers\FakeMvcParserService.cs" />
<Compile Include="Helpers\FakeMvcProject.cs" />
<Compile Include="Helpers\FakeMvcProjectContent.cs" />
<Compile Include="Helpers\FakeMvcTextTemplateHost.cs" /> <Compile Include="Helpers\FakeMvcTextTemplateHost.cs" />
<Compile Include="Helpers\FakeMvcTextTemplateHostFactory.cs" /> <Compile Include="Helpers\FakeMvcTextTemplateHostFactory.cs" />
<Compile Include="Helpers\FakeMvcViewFileGenerator.cs" /> <Compile Include="Helpers\FakeMvcViewFileGenerator.cs" />
<Compile Include="Helpers\FakeSelectedFolderNodeInProjectsView.cs" />
<Compile Include="Helpers\FakeSelectedMvcFolder.cs" /> <Compile Include="Helpers\FakeSelectedMvcFolder.cs" />
<Compile Include="Helpers\TestableAddMvcControllerToProjectCommand.cs" /> <Compile Include="Helpers\TestableAddMvcControllerToProjectCommand.cs" />
<Compile Include="Helpers\TestableAddMvcViewToProjectCommand.cs" /> <Compile Include="Helpers\TestableAddMvcViewToProjectCommand.cs" />
@ -67,12 +73,16 @@
<Compile Include="Src\IsMvcControllerFolderSelectedConditionEvaluatorTests.cs" /> <Compile Include="Src\IsMvcControllerFolderSelectedConditionEvaluatorTests.cs" />
<Compile Include="Src\IsMvcViewFolderSelectedConditionEvaluatorTests.cs" /> <Compile Include="Src\IsMvcViewFolderSelectedConditionEvaluatorTests.cs" />
<Compile Include="Configuration\AssemblyInfo.cs" /> <Compile Include="Configuration\AssemblyInfo.cs" />
<Compile Include="Src\ModelClassLocatorTests.cs" />
<Compile Include="Src\MvcControllerFileGeneratorTests.cs" /> <Compile Include="Src\MvcControllerFileGeneratorTests.cs" />
<Compile Include="Src\MvcControllerFileNameTests.cs" /> <Compile Include="Src\MvcControllerFileNameTests.cs" />
<Compile Include="Src\MvcModelClassViewModelTests.cs" />
<Compile Include="Src\MvcProjectTests.cs" />
<Compile Include="Src\MvcTextTemplateHostTests.cs" /> <Compile Include="Src\MvcTextTemplateHostTests.cs" />
<Compile Include="Src\MvcTextTemplateRepositoryTests.cs" /> <Compile Include="Src\MvcTextTemplateRepositoryTests.cs" />
<Compile Include="Src\MvcViewFileNameTests.cs" /> <Compile Include="Src\MvcViewFileNameTests.cs" />
<Compile Include="Src\MvcViewFileGeneratorTests.cs" /> <Compile Include="Src\MvcViewFileGeneratorTests.cs" />
<Compile Include="Src\SelectedFolderNodeInProjectsViewTests.cs" />
<Compile Include="Src\SelectedMvcViewFolderTests.cs" /> <Compile Include="Src\SelectedMvcViewFolderTests.cs" />
</ItemGroup> </ItemGroup>
<ItemGroup> <ItemGroup>

26
src/AddIns/BackendBindings/AspNet.Mvc/Test/Helpers/FakeMvcClass.cs

@ -0,0 +1,26 @@
// Copyright (c) AlphaSierraPapa for the SharpDevelop Team (for details please see \doc\copyright.txt)
// This code is distributed under the GNU LGPL (for details please see \doc\license.txt)
using System;
using ICSharpCode.AspNet.Mvc;
namespace AspNet.Mvc.Tests.Helpers
{
public class FakeMvcClass : IMvcClass
{
public FakeMvcClass(string fullyQualifiedName)
{
this.FullyQualifiedName = fullyQualifiedName;
}
public FakeMvcClass(string @namespace, string name)
{
this.Namespace = @namespace;
this.Name = name;
}
public string FullyQualifiedName { get; set; }
public string Name { get; set; }
public string Namespace { get; set; }
}
}

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

@ -10,7 +10,7 @@ namespace AspNet.Mvc.Tests.Helpers
public class FakeMvcControllerFileGenerator : IMvcControllerFileGenerator public class FakeMvcControllerFileGenerator : IMvcControllerFileGenerator
{ {
public MvcTextTemplateLanguage TemplateLanguage { get; set; } public MvcTextTemplateLanguage TemplateLanguage { get; set; }
public IProject Project { get; set; } public IMvcProject Project { get; set; }
public bool AddActionMethods { get; set; } public bool AddActionMethods { get; set; }
public bool IsGenerateFileCalled; public bool IsGenerateFileCalled;

28
src/AddIns/BackendBindings/AspNet.Mvc/Test/Helpers/FakeMvcModelClassLocator.cs

@ -0,0 +1,28 @@
// 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 ICSharpCode.AspNet.Mvc;
namespace AspNet.Mvc.Tests.Helpers
{
public class FakeMvcModelClassLocator : IMvcModelClassLocator
{
public List<FakeMvcClass> FakeModelClasses = new List<FakeMvcClass>();
public void AddModelClass(string fullyQualifiedClassName)
{
var fakeClass = new FakeMvcClass(fullyQualifiedClassName);
FakeModelClasses.Add(fakeClass);
}
public IMvcProject ProjectPassedToGetModelClasses;
public IEnumerable<IMvcClass> GetModelClasses(IMvcProject project)
{
ProjectPassedToGetModelClasses = project;
return FakeModelClasses;
}
}
}

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

@ -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 FakeMvcParserService : IMvcParserService
{
public IMvcProject ProjectPassedToGetProjectContent;
public FakeMvcProjectContent FakeMvcProjectContent = new FakeMvcProjectContent();
public IMvcProjectContent GetProjectContent(IMvcProject project)
{
ProjectPassedToGetProjectContent = project;
return FakeMvcProjectContent;
}
public void AddModelClassToProjectContent(string fullyQualifiedClassName)
{
FakeMvcProjectContent.AddFakeClass(fullyQualifiedClassName);
}
}
}

61
src/AddIns/BackendBindings/AspNet.Mvc/Test/Helpers/FakeMvcProject.cs

@ -0,0 +1,61 @@
// 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 ICSharpCode.AspNet.Mvc;
using ICSharpCode.SharpDevelop.Project;
namespace AspNet.Mvc.Tests.Helpers
{
public class FakeMvcProject : IMvcProject
{
public TestableProject FakeProject = TestableProject.CreateProject();
public IProject Project {
get { return FakeProject; }
}
public string RootNamespace { get; set; }
public bool SaveCalled;
public void Save()
{
SaveCalled = true;
}
MvcTextTemplateLanguage TemplateLanguageToReturnFromGetTemplateLanguage;
public void SetCSharpAsTemplateLanguage()
{
TemplateLanguageToReturnFromGetTemplateLanguage = MvcTextTemplateLanguage.CSharp;
}
public void SetVisualBasicAsTemplateLanguage()
{
TemplateLanguageToReturnFromGetTemplateLanguage = MvcTextTemplateLanguage.VisualBasic;
}
public MvcTextTemplateLanguage GetTemplateLanguage()
{
return TemplateLanguageToReturnFromGetTemplateLanguage;
}
public List<FakeMvcClass> ModelClasses = new List<FakeMvcClass>();
public void AddModelClassToProject(string @namespace, string name)
{
var fakeClass = new FakeMvcClass(@namespace, name);
ModelClasses.Add(fakeClass);
}
public int GetModelClassesCallCount;
public IEnumerable<IMvcClass> GetModelClasses()
{
GetModelClassesCallCount++;
return ModelClasses;
}
}
}

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

@ -0,0 +1,25 @@
// Copyright (c) AlphaSierraPapa for the SharpDevelop Team (for details please see \doc\copyright.txt)
// This code is distributed under the GNU LGPL (for details please see \doc\license.txt)
using System;
using System.Collections.Generic;
using ICSharpCode.AspNet.Mvc;
namespace AspNet.Mvc.Tests.Helpers
{
public class FakeMvcProjectContent : IMvcProjectContent
{
public List<FakeMvcClass> FakeClasses = new List<FakeMvcClass>();
public IEnumerable<IMvcClass> GetClasses()
{
return FakeClasses;
}
public void AddFakeClass(string fullyQualifiedClassName)
{
var fakeClass = new FakeMvcClass(fullyQualifiedClassName);
FakeClasses.Add(fakeClass);
}
}
}

4
src/AddIns/BackendBindings/AspNet.Mvc/Test/Helpers/FakeMvcTextTemplateHostFactory.cs

@ -9,10 +9,10 @@ namespace AspNet.Mvc.Tests.Helpers
{ {
public class FakeMvcTextTemplateHostFactory : IMvcTextTemplateHostFactory public class FakeMvcTextTemplateHostFactory : IMvcTextTemplateHostFactory
{ {
public IProject ProjectPassedToCreateMvcTextTemplateHost; public IMvcProject ProjectPassedToCreateMvcTextTemplateHost;
public FakeMvcTextTemplateHost FakeMvcTextTemplateHost = new FakeMvcTextTemplateHost(); public FakeMvcTextTemplateHost FakeMvcTextTemplateHost = new FakeMvcTextTemplateHost();
public IMvcTextTemplateHost CreateMvcTextTemplateHost(IProject project) public IMvcTextTemplateHost CreateMvcTextTemplateHost(IMvcProject project)
{ {
ProjectPassedToCreateMvcTextTemplateHost = project; ProjectPassedToCreateMvcTextTemplateHost = project;
return FakeMvcTextTemplateHost; return FakeMvcTextTemplateHost;

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

@ -11,7 +11,7 @@ namespace AspNet.Mvc.Tests.Helpers
{ {
public MvcTextTemplateLanguage TemplateLanguage { get; set; } public MvcTextTemplateLanguage TemplateLanguage { get; set; }
public MvcTextTemplateType TemplateType { get; set; } public MvcTextTemplateType TemplateType { get; set; }
public IProject Project { get; set; } public IMvcProject Project { get; set; }
public bool IsGenerateFileCalled; public bool IsGenerateFileCalled;
public MvcViewFileName FileNamePassedToGenerateFile; public MvcViewFileName FileNamePassedToGenerateFile;

31
src/AddIns/BackendBindings/AspNet.Mvc/Test/Helpers/FakeSelectedFolderNodeInProjectsView.cs

@ -0,0 +1,31 @@
// 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 FakeSelectedFolderNodeInProjectsView : ISelectedFolderNodeInProjectsView
{
public FakeSelectedFolderNodeInProjectsView()
{
Folder = @"d:\projects\MyMvcApp\Views\Home";
}
public string Folder { get; set; }
public FakeMvcProject FakeMvcProject = new FakeMvcProject();
public IMvcProject Project {
get { return FakeMvcProject; }
}
public string PathPassedToAddNewFile;
public void AddNewFile(string path)
{
PathPassedToAddNewFile = path;
}
}
}

22
src/AddIns/BackendBindings/AspNet.Mvc/Test/Helpers/FakeSelectedMvcFolder.cs

@ -2,6 +2,7 @@
// This code is distributed under the GNU LGPL (for details please see \doc\license.txt) // This code is distributed under the GNU LGPL (for details please see \doc\license.txt)
using System; using System;
using System.Collections.Generic;
using ICSharpCode.AspNet.Mvc; using ICSharpCode.AspNet.Mvc;
using ICSharpCode.SharpDevelop.Project; using ICSharpCode.SharpDevelop.Project;
@ -11,15 +12,10 @@ namespace AspNet.Mvc.Tests.Helpers
{ {
public string Path { get; set; } public string Path { get; set; }
public string ProjectLanguage { public FakeMvcProject FakeMvcProject = new FakeMvcProject();
get { return FakeProject.Language; }
set { FakeProject.SetLanguage(value); }
}
public TestableProject FakeProject = TestableProject.CreateProject();
public IProject Project { public IMvcProject Project {
get { return FakeProject; } get { return FakeMvcProject; }
} }
public string FileNamePassedToAddFile; public string FileNamePassedToAddFile;
@ -35,5 +31,15 @@ namespace AspNet.Mvc.Tests.Helpers
{ {
return TemplateLanguage; return TemplateLanguage;
} }
public void SetCSharpAsTemplateLanguage()
{
TemplateLanguage = MvcTextTemplateLanguage.CSharp;
}
public void SetVisualBasicAsTemplateLanguage()
{
TemplateLanguage = MvcTextTemplateLanguage.VisualBasic;
}
} }
} }

17
src/AddIns/BackendBindings/AspNet.Mvc/Test/Helpers/TestableSelectedMvcViewFolder.cs

@ -9,16 +9,21 @@ namespace AspNet.Mvc.Tests.Helpers
{ {
public class TestableSelectedMvcViewFolder : SelectedMvcViewFolder public class TestableSelectedMvcViewFolder : SelectedMvcViewFolder
{ {
public TestableSelectedMvcViewFolder(DirectoryNode directoryNode) public FakeMvcFileService FakeFileService;
: base(directoryNode) public FakeSelectedFolderNodeInProjectsView FakeSelectedFolderNodeInProjectsView;
public TestableSelectedMvcViewFolder()
: this(new FakeSelectedFolderNodeInProjectsView(), new FakeMvcFileService())
{ {
} }
public string PathPassedToAddNewFileToDirectoryNode; public TestableSelectedMvcViewFolder(
FakeSelectedFolderNodeInProjectsView selectedFolderNode,
protected override void AddNewFileToDirectoryNode(string path) FakeMvcFileService fileService)
: base(selectedFolderNode, fileService)
{ {
PathPassedToAddNewFileToDirectoryNode = path; this.FakeSelectedFolderNodeInProjectsView = selectedFolderNode;
this.FakeFileService = fileService;
} }
} }
} }

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

@ -19,35 +19,30 @@ namespace AspNet.Mvc.Tests
FakeMvcControllerFileGenerator fakeControllerGenerator; FakeMvcControllerFileGenerator fakeControllerGenerator;
FakeSelectedMvcFolder fakeSelectedMvcControllerFolder; FakeSelectedMvcFolder fakeSelectedMvcControllerFolder;
List<string> propertyChangedEvents; List<string> propertyChangedEvents;
FakeMvcFileService fakeFileService;
void CreateViewModelWithCSharpProject() void CreateViewModelWithCSharpProject()
{ {
string path = @"d:\projects\MyAspMvcProject\Controllers"; string path = @"d:\projects\MyAspMvcProject\Controllers";
CreateViewModelWithControllerFolderPath(path, MvcTextTemplateLanguage.CSharp, "C#"); CreateViewModelWithControllerFolderPath(path, MvcTextTemplateLanguage.CSharp);
} }
void CreateViewModelWithVisualBasicProject() void CreateViewModelWithVisualBasicProject()
{ {
string path = @"d:\projects\MyAspMvcProject\Controllers"; string path = @"d:\projects\MyAspMvcProject\Controllers";
CreateViewModelWithControllerFolderPath(path, MvcTextTemplateLanguage.VisualBasic, "VBNet"); CreateViewModelWithControllerFolderPath(path, MvcTextTemplateLanguage.VisualBasic);
} }
void CreateViewModelWithControllerFolderPath( void CreateViewModelWithControllerFolderPath(
string path, string path,
MvcTextTemplateLanguage language, MvcTextTemplateLanguage language)
string projectLanguage)
{ {
fakeSelectedMvcControllerFolder = new FakeSelectedMvcFolder(); fakeSelectedMvcControllerFolder = new FakeSelectedMvcFolder();
fakeSelectedMvcControllerFolder.TemplateLanguage = language; fakeSelectedMvcControllerFolder.TemplateLanguage = language;
fakeSelectedMvcControllerFolder.ProjectLanguage = projectLanguage;
fakeSelectedMvcControllerFolder.Path = path; fakeSelectedMvcControllerFolder.Path = path;
fakeControllerGenerator = new FakeMvcControllerFileGenerator(); fakeControllerGenerator = new FakeMvcControllerFileGenerator();
fakeFileService = new FakeMvcFileService();
viewModel = new AddMvcControllerToProjectViewModel( viewModel = new AddMvcControllerToProjectViewModel(
fakeSelectedMvcControllerFolder, fakeSelectedMvcControllerFolder,
fakeControllerGenerator, fakeControllerGenerator);
fakeFileService);
} }
void MonitorPropertyChangedEvents() void MonitorPropertyChangedEvents()
@ -93,7 +88,7 @@ namespace AspNet.Mvc.Tests
{ {
CreateViewModelWithControllerFolderPath( CreateViewModelWithControllerFolderPath(
@"d:\projects\MyProject\Controllers", @"d:\projects\MyProject\Controllers",
MvcTextTemplateLanguage.CSharp, "C#"); MvcTextTemplateLanguage.CSharp);
viewModel.ControllerName = "Home"; viewModel.ControllerName = "Home";
viewModel.AddMvcController(); viewModel.AddMvcController();
@ -131,11 +126,11 @@ namespace AspNet.Mvc.Tests
public void AddMvcController_SelectedControllerFolderIsInVisualBasicProject_VisualBasicProjectIsPassedToMvcControllerGenerator() public void AddMvcController_SelectedControllerFolderIsInVisualBasicProject_VisualBasicProjectIsPassedToMvcControllerGenerator()
{ {
CreateViewModelWithCSharpProject(); CreateViewModelWithCSharpProject();
fakeSelectedMvcControllerFolder.ProjectLanguage = "VBNet"; fakeSelectedMvcControllerFolder.SetVisualBasicAsTemplateLanguage();
viewModel.AddMvcController(); viewModel.AddMvcController();
IProject project = fakeControllerGenerator.Project; IMvcProject project = fakeControllerGenerator.Project;
TestableProject expectedProject = fakeSelectedMvcControllerFolder.FakeProject; FakeMvcProject expectedProject = fakeSelectedMvcControllerFolder.FakeMvcProject;
Assert.AreEqual(expectedProject, project); Assert.AreEqual(expectedProject, project);
} }
@ -145,8 +140,7 @@ namespace AspNet.Mvc.Tests
{ {
CreateViewModelWithCSharpProject(); CreateViewModelWithCSharpProject();
viewModel.ControllerName = "Home"; viewModel.ControllerName = "Home";
fakeSelectedMvcControllerFolder.ProjectLanguage = "C#"; fakeSelectedMvcControllerFolder.SetCSharpAsTemplateLanguage();
fakeSelectedMvcControllerFolder.TemplateLanguage = MvcTextTemplateLanguage.CSharp;
fakeSelectedMvcControllerFolder.Path = @"d:\projects\MyAspMvcProject\Controllers\Home"; fakeSelectedMvcControllerFolder.Path = @"d:\projects\MyAspMvcProject\Controllers\Home";
viewModel.AddMvcController(); viewModel.AddMvcController();
@ -188,22 +182,6 @@ namespace AspNet.Mvc.Tests
Assert.IsTrue(fired); Assert.IsTrue(fired);
} }
[Test]
public void AddMvcController_FileIsGenerated_FileIsOpened()
{
CreateViewModelWithCSharpProject();
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] [Test]
public void AddMvcControllerCommand_ControllerNameIsEmptyString_CommandIsDisabled() public void AddMvcControllerCommand_ControllerNameIsEmptyString_CommandIsDisabled()
{ {
@ -234,10 +212,10 @@ namespace AspNet.Mvc.Tests
fakeSelectedMvcControllerFolder.Path = @"d:\projects\MyAspMvcProject\Controllers"; fakeSelectedMvcControllerFolder.Path = @"d:\projects\MyAspMvcProject\Controllers";
viewModel.AddMvcController(); viewModel.AddMvcController();
string fileNameOpened = fakeFileService.FileNamePassedToOpenFile; string fileNameGenerated = fakeControllerGenerator.FileNamePassedToGenerateController.GetPath();
string expectedFileNameOpened = @"d:\projects\MyAspMvcProject\Controllers\HomeController.vb"; string expectedFileNameGenerated = @"d:\projects\MyAspMvcProject\Controllers\HomeController.vb";
Assert.AreEqual(expectedFileNameOpened, fileNameOpened); Assert.AreEqual(expectedFileNameGenerated, fileNameGenerated);
} }
[Test] [Test]

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

@ -3,6 +3,7 @@
using System; using System;
using System.Collections.Generic; using System.Collections.Generic;
using System.Collections.ObjectModel;
using System.Linq; using System.Linq;
using AspNet.Mvc.Tests.Helpers; using AspNet.Mvc.Tests.Helpers;
using ICSharpCode.AspNet.Mvc; using ICSharpCode.AspNet.Mvc;
@ -18,7 +19,7 @@ namespace AspNet.Mvc.Tests
FakeMvcViewFileGenerator fakeViewGenerator; FakeMvcViewFileGenerator fakeViewGenerator;
FakeSelectedMvcFolder fakeSelectedMvcViewFolder; FakeSelectedMvcFolder fakeSelectedMvcViewFolder;
List<string> propertyChangedEvents; List<string> propertyChangedEvents;
FakeMvcFileService fakeFileService; FakeMvcProject fakeProject;
void CreateViewModel() void CreateViewModel()
{ {
@ -30,14 +31,12 @@ namespace AspNet.Mvc.Tests
{ {
fakeSelectedMvcViewFolder = new FakeSelectedMvcFolder(); fakeSelectedMvcViewFolder = new FakeSelectedMvcFolder();
fakeSelectedMvcViewFolder.Path = path; fakeSelectedMvcViewFolder.Path = path;
fakeSelectedMvcViewFolder.ProjectLanguage = "C#"; fakeSelectedMvcViewFolder.SetCSharpAsTemplateLanguage();
fakeSelectedMvcViewFolder.TemplateLanguage = MvcTextTemplateLanguage.CSharp; fakeProject = fakeSelectedMvcViewFolder.FakeMvcProject;
fakeViewGenerator = new FakeMvcViewFileGenerator(); fakeViewGenerator = new FakeMvcViewFileGenerator();
fakeFileService = new FakeMvcFileService();
viewModel = new AddMvcViewToProjectViewModel( viewModel = new AddMvcViewToProjectViewModel(
fakeSelectedMvcViewFolder, fakeSelectedMvcViewFolder,
fakeViewGenerator, fakeViewGenerator);
fakeFileService);
} }
void MonitorPropertyChangedEvents() void MonitorPropertyChangedEvents()
@ -76,6 +75,11 @@ namespace AspNet.Mvc.Tests
viewModel.SelectedViewEngine = GetViewEngineFromViewModel("Razor"); viewModel.SelectedViewEngine = GetViewEngineFromViewModel("Razor");
} }
void AddModelClassToProject(string ns, string name)
{
fakeProject.AddModelClassToProject(ns, name);
}
[Test] [Test]
public void AddMvcViewCommand_ExecutedWhenViewNameSpecified_MvcViewIsGenerated() public void AddMvcViewCommand_ExecutedWhenViewNameSpecified_MvcViewIsGenerated()
{ {
@ -130,11 +134,11 @@ namespace AspNet.Mvc.Tests
public void AddMvcView_SelectedViewFolderIsInVisualBasicProject_VisualBasicProjectIsPassedToMvcViewGenerator() public void AddMvcView_SelectedViewFolderIsInVisualBasicProject_VisualBasicProjectIsPassedToMvcViewGenerator()
{ {
CreateViewModel(); CreateViewModel();
fakeSelectedMvcViewFolder.ProjectLanguage = "VBNet"; fakeSelectedMvcViewFolder.SetVisualBasicAsTemplateLanguage();
viewModel.AddMvcView(); viewModel.AddMvcView();
IProject project = fakeViewGenerator.Project; IMvcProject project = fakeViewGenerator.Project;
TestableProject expectedProject = fakeSelectedMvcViewFolder.FakeProject; FakeMvcProject expectedProject = fakeSelectedMvcViewFolder.FakeMvcProject;
Assert.AreEqual(expectedProject, project); Assert.AreEqual(expectedProject, project);
} }
@ -144,7 +148,7 @@ namespace AspNet.Mvc.Tests
{ {
CreateViewModel(); CreateViewModel();
viewModel.ViewName = "Index"; viewModel.ViewName = "Index";
fakeSelectedMvcViewFolder.ProjectLanguage = "C#"; fakeSelectedMvcViewFolder.SetCSharpAsTemplateLanguage();
fakeSelectedMvcViewFolder.Path = @"d:\projects\MyAspMvcProject\Views\Home"; fakeSelectedMvcViewFolder.Path = @"d:\projects\MyAspMvcProject\Views\Home";
viewModel.AddMvcView(); viewModel.AddMvcView();
@ -186,21 +190,6 @@ namespace AspNet.Mvc.Tests
Assert.IsTrue(fired); Assert.IsTrue(fired);
} }
[Test]
public void AddMvcView_FileIsGenerated_FileIsOpened()
{
CreateViewModel();
viewModel.ViewName = "Index";
fakeSelectedMvcViewFolder.ProjectLanguage = "C#";
fakeSelectedMvcViewFolder.Path = @"d:\projects\MyAspMvcProject\Views\Home";
viewModel.AddMvcView();
string fileNameOpened = fakeFileService.FileNamePassedToOpenFile;
string expectedFileNameOpened = @"d:\projects\MyAspMvcProject\Views\Home\Index.aspx";
Assert.AreEqual(expectedFileNameOpened, fileNameOpened);
}
[Test] [Test]
public void AddMvcViewCommand_ViewNameIsEmptyString_CommandIsDisabled() public void AddMvcViewCommand_ViewNameIsEmptyString_CommandIsDisabled()
{ {
@ -370,5 +359,81 @@ namespace AspNet.Mvc.Tests
Assert.IsFalse(partialView); Assert.IsFalse(partialView);
} }
[Test]
public void ModelClasses_OneAvailableModelClassIsStronglyTypedViewSetToTrue_ReturnsOneModelClass()
{
CreateViewModel();
CSharpProjectSelected();
AddModelClassToProject("ICSharpCode.MyProject", "MyModel");
viewModel.IsStronglyTypedView = true;
IEnumerable<MvcModelClassViewModel> models = viewModel.ModelClasses;
MvcModelClassViewModel model = models.First();
Assert.AreEqual(1, models.Count());
Assert.AreEqual("MyModel (ICSharpCode.MyProject)", model.Name);
}
[Test]
public void ModelClasses_OneAvailableModelClassAndIsStronglyTypedViewIsFalse_ReturnsNoModelClasses()
{
CreateViewModel();
CSharpProjectSelected();
AddModelClassToProject("ICSharpCode.MyProject", "MyModel");
IEnumerable<MvcModelClassViewModel> models = viewModel.ModelClasses;
int count = models.Count();
Assert.AreEqual(0, count);
}
[Test]
public void ModelClasses_IsStronglyTypedViewChangedToTrueTwice_ModelClassesReadOnlyOnce()
{
CreateViewModel();
CSharpProjectSelected();
AddModelClassToProject("ICSharpCode.MyProject", "MyModel");
viewModel.IsStronglyTypedView = true;
IEnumerable<MvcModelClassViewModel> models = viewModel.ModelClasses;
viewModel.IsStronglyTypedView = false;
models = viewModel.ModelClasses;
viewModel.IsStronglyTypedView = true;
models = viewModel.ModelClasses;
int callCount = fakeProject.GetModelClassesCallCount;
Assert.AreEqual(1, callCount);
}
[Test]
public void ModelClasses_OneAvailableModelClassIsStronglyTypedViewSetToTrue_PropertyChangedEventIsFiredForModelClasses()
{
CreateViewModel();
CSharpProjectSelected();
AddModelClassToProject("ICSharpCode.MyProject", "MyModel");
MonitorPropertyChangedEvents();
viewModel.IsStronglyTypedView = true;
bool contains = propertyChangedEvents.Contains("ModelClasses");
Assert.IsTrue(contains);
}
[Test]
public void ModelClasses_OneAvailableModelClassIsStronglyTypedViewSetToTrue_PropertyChangedEventIsFiredForIsStronglyTypedView()
{
CreateViewModel();
CSharpProjectSelected();
AddModelClassToProject("ICSharpCode.MyProject", "MyModel");
MonitorPropertyChangedEvents();
viewModel.IsStronglyTypedView = true;
bool contains = propertyChangedEvents.Contains("IsStronglyTypedView");
Assert.IsTrue(contains);
}
} }
} }

71
src/AddIns/BackendBindings/AspNet.Mvc/Test/Src/ModelClassLocatorTests.cs

@ -0,0 +1,71 @@
// Copyright (c) AlphaSierraPapa for the SharpDevelop Team (for details please see \doc\copyright.txt)
// This code is distributed under the GNU LGPL (for details please see \doc\license.txt)
using System;
using System.Collections.Generic;
using System.Linq;
using AspNet.Mvc.Tests.Helpers;
using ICSharpCode.AspNet.Mvc;
using NUnit.Framework;
namespace AspNet.Mvc.Tests
{
[TestFixture]
public class ModelClassLocatorTests
{
MvcModelClassLocator locator;
FakeMvcProject fakeProject;
FakeMvcParserService fakeParserService;
void CreateLocator()
{
fakeProject = new FakeMvcProject();
fakeParserService = new FakeMvcParserService();
locator = new MvcModelClassLocator(fakeParserService);
}
List<IMvcClass> GetModelClasses()
{
return locator.GetModelClasses(fakeProject).ToList();
}
void AddModelClass(string fullyQualifiedClassName)
{
fakeParserService.AddModelClassToProjectContent(fullyQualifiedClassName);
}
string GetFirstModelClassName()
{
return GetModelClasses().First().FullyQualifiedName;
}
[Test]
public void GetModelClasses_OneModelClassInProject_ReturnModelClassWithExpectedName()
{
CreateLocator();
AddModelClass("MyNamespace.MyClass");
string modelClassName = GetFirstModelClassName();
Assert.AreEqual("MyNamespace.MyClass", modelClassName);
}
[Test]
public void GetModelClasses_OneModelClassInProject_ReturnOneModelClass()
{
CreateLocator();
AddModelClass("MyNamespace.MyClass");
int count = GetModelClasses().Count;
Assert.AreEqual(1, count);
}
[Test]
public void GetModelClasses_NoModelClassesInProject_GetsProjectContentFromParserService()
{
CreateLocator();
GetModelClasses();
Assert.AreEqual(fakeProject, fakeParserService.ProjectPassedToGetProjectContent);
}
}
}

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

@ -13,7 +13,7 @@ namespace AspNet.Mvc.Tests
public class MvcControllerFileGeneratorTests public class MvcControllerFileGeneratorTests
{ {
MvcControllerFileGenerator generator; MvcControllerFileGenerator generator;
TestableProject projectUsedByGenerator; FakeMvcProject projectUsedByGenerator;
MvcTextTemplateRepository templateRepository; MvcTextTemplateRepository templateRepository;
FakeMvcTextTemplateHostFactory fakeHostFactory; FakeMvcTextTemplateHostFactory fakeHostFactory;
FakeMvcTextTemplateHost fakeHost; FakeMvcTextTemplateHost fakeHost;
@ -34,20 +34,20 @@ namespace AspNet.Mvc.Tests
fakeHostFactory = new FakeMvcTextTemplateHostFactory(); fakeHostFactory = new FakeMvcTextTemplateHostFactory();
fakeHost = fakeHostFactory.FakeMvcTextTemplateHost; fakeHost = fakeHostFactory.FakeMvcTextTemplateHost;
generator = new MvcControllerFileGenerator(fakeHostFactory, templateRepository); generator = new MvcControllerFileGenerator(fakeHostFactory, templateRepository);
projectUsedByGenerator = TestableProject.CreateProject(); projectUsedByGenerator = new FakeMvcProject();
generator.Project = projectUsedByGenerator; generator.Project = projectUsedByGenerator;
ProjectPassedToGeneratorIsCSharpProject(); ProjectPassedToGeneratorIsCSharpProject();
} }
void ProjectPassedToGeneratorIsCSharpProject() void ProjectPassedToGeneratorIsCSharpProject()
{ {
projectUsedByGenerator.SetLanguage("C#"); projectUsedByGenerator.SetCSharpAsTemplateLanguage();
generator.TemplateLanguage = MvcTextTemplateLanguage.CSharp; generator.TemplateLanguage = MvcTextTemplateLanguage.CSharp;
} }
void ProjectPassedToGeneratorIsVisualBasicProject() void ProjectPassedToGeneratorIsVisualBasicProject()
{ {
projectUsedByGenerator.SetLanguage("VBNet"); projectUsedByGenerator.SetVisualBasicAsTemplateLanguage();
generator.TemplateLanguage = MvcTextTemplateLanguage.VisualBasic; generator.TemplateLanguage = MvcTextTemplateLanguage.VisualBasic;
} }
@ -75,7 +75,7 @@ namespace AspNet.Mvc.Tests
CreateGenerator(); CreateGenerator();
ProjectPassedToGeneratorIsCSharpProject(); ProjectPassedToGeneratorIsCSharpProject();
GenerateFile(); GenerateFile();
IProject project = fakeHostFactory.ProjectPassedToCreateMvcTextTemplateHost; IMvcProject project = fakeHostFactory.ProjectPassedToCreateMvcTextTemplateHost;
Assert.AreEqual(projectUsedByGenerator, project); Assert.AreEqual(projectUsedByGenerator, project);
} }

41
src/AddIns/BackendBindings/AspNet.Mvc/Test/Src/MvcModelClassViewModelTests.cs

@ -0,0 +1,41 @@
// 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 NUnit.Framework;
namespace AspNet.Mvc.Tests
{
[TestFixture]
public class MvcModelClassViewModelTests
{
FakeMvcClass fakeClass;
MvcModelClassViewModel viewModel;
void CreateViewModel(string classNamespace, string className)
{
fakeClass = new FakeMvcClass(classNamespace, className);
viewModel = new MvcModelClassViewModel(fakeClass);
}
[Test]
public void Name_ClassHasNamespaceAndName_ReturnsClassNameFollowedByNamespace()
{
CreateViewModel("ICSharpCode.Tests", "MyClass");
string text = viewModel.Name;
Assert.AreEqual("MyClass (ICSharpCode.Tests)", text);
}
[Test]
public void ToString_ClassHasNamespaceAndName_ReturnsClassNameFollowedByNamespace()
{
CreateViewModel("ICSharpCode.Tests", "MyClass");
string text = viewModel.ToString();
Assert.AreEqual("MyClass (ICSharpCode.Tests)", text);
}
}
}

109
src/AddIns/BackendBindings/AspNet.Mvc/Test/Src/MvcProjectTests.cs

@ -0,0 +1,109 @@
// 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 AspNet.Mvc.Tests.Helpers;
using ICSharpCode.AspNet.Mvc;
using ICSharpCode.SharpDevelop.Project;
using NUnit.Framework;
namespace AspNet.Mvc.Tests
{
[TestFixture]
public class MvcProjectTests
{
MvcProject project;
TestableProject testableProject;
FakeMvcModelClassLocator fakeModelClassLocator;
void CreateProject()
{
testableProject = TestableProject.CreateProject();
fakeModelClassLocator = new FakeMvcModelClassLocator();
project = new MvcProject(testableProject, fakeModelClassLocator);
}
[Test]
public void Project_ProjectPassedToConstructor_ReturnsProjectPassedToConstructor()
{
CreateProject();
IProject msbuildProject = project.Project;
Assert.AreEqual(testableProject, msbuildProject);
}
[Test]
public void RootNamespace_ProjectPassedToConstructorHasRootNamespace_ReturnsRootNamespace()
{
CreateProject();
testableProject.RootNamespace = "MyProjectNamespace";
string rootNamespace = project.RootNamespace;
Assert.AreEqual("MyProjectNamespace", rootNamespace);
}
[Test]
public void Save_ProjectPassedToConstructor_ProjectIsSaved()
{
CreateProject();
project.Save();
bool saved = testableProject.IsSaved;
Assert.IsTrue(saved);
}
[Test]
public void GetTemplateLanguage_ProjectIsVisualBasicProject_ReturnsVisualBasicTemplateLanguage()
{
CreateProject();
testableProject.SetLanguage("VBNet");
MvcTextTemplateLanguage language = project.GetTemplateLanguage();
Assert.AreEqual(MvcTextTemplateLanguage.VisualBasic, language);
}
[Test]
public void GetTemplateLanguage_ProjectIsCSharpProject_ReturnsCSharpTemplateLanguage()
{
CreateProject();
testableProject.SetLanguage("C#");
MvcTextTemplateLanguage language = project.GetTemplateLanguage();
Assert.AreEqual(MvcTextTemplateLanguage.CSharp, language);
}
[Test]
public void GetModelClasses_OneModelClassInProject_ReturnsOneModelClass()
{
CreateProject();
fakeModelClassLocator.AddModelClass("MyNamespace.MyClass");
string[] modelClasses = project
.GetModelClasses()
.Select(m => m.FullyQualifiedName)
.ToArray();
string[] expectedModelClasses = new string[] {
"MyNamespace.MyClass"
};
Assert.AreEqual(expectedModelClasses, modelClasses);
}
[Test]
public void GetModelClasses_OneModelClassInProject_ProjectUsedToFindModelClasses()
{
CreateProject();
fakeModelClassLocator.AddModelClass("MyNamespace.MyClass");
project.GetModelClasses();
Assert.AreEqual(project, fakeModelClassLocator.ProjectPassedToGetModelClasses);
}
}
}

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

@ -13,7 +13,7 @@ namespace AspNet.Mvc.Tests
public class MvcViewFileGeneratorTests public class MvcViewFileGeneratorTests
{ {
MvcViewFileGenerator generator; MvcViewFileGenerator generator;
TestableProject projectUsedByGenerator; FakeMvcProject projectUsedByGenerator;
MvcTextTemplateRepository templateRepository; MvcTextTemplateRepository templateRepository;
FakeMvcTextTemplateHostFactory fakeHostFactory; FakeMvcTextTemplateHostFactory fakeHostFactory;
FakeMvcTextTemplateHost fakeHost; FakeMvcTextTemplateHost fakeHost;
@ -34,14 +34,14 @@ namespace AspNet.Mvc.Tests
fakeHostFactory = new FakeMvcTextTemplateHostFactory(); fakeHostFactory = new FakeMvcTextTemplateHostFactory();
fakeHost = fakeHostFactory.FakeMvcTextTemplateHost; fakeHost = fakeHostFactory.FakeMvcTextTemplateHost;
generator = new MvcViewFileGenerator(fakeHostFactory, templateRepository); generator = new MvcViewFileGenerator(fakeHostFactory, templateRepository);
projectUsedByGenerator = TestableProject.CreateProject(); projectUsedByGenerator = new FakeMvcProject();
generator.Project = projectUsedByGenerator; generator.Project = projectUsedByGenerator;
ProjectPassedToGeneratorIsCSharpProject(); ProjectPassedToGeneratorIsCSharpProject();
} }
void ProjectPassedToGeneratorIsCSharpProject() void ProjectPassedToGeneratorIsCSharpProject()
{ {
projectUsedByGenerator.SetLanguage("C#"); projectUsedByGenerator.SetCSharpAsTemplateLanguage();
generator.TemplateLanguage = MvcTextTemplateLanguage.CSharp; generator.TemplateLanguage = MvcTextTemplateLanguage.CSharp;
} }
@ -85,7 +85,7 @@ namespace AspNet.Mvc.Tests
CreateGenerator(); CreateGenerator();
ProjectPassedToGeneratorIsCSharpProject(); ProjectPassedToGeneratorIsCSharpProject();
GenerateFile(); GenerateFile();
IProject project = fakeHostFactory.ProjectPassedToCreateMvcTextTemplateHost; IMvcProject project = fakeHostFactory.ProjectPassedToCreateMvcTextTemplateHost;
Assert.AreEqual(projectUsedByGenerator, project); Assert.AreEqual(projectUsedByGenerator, project);
} }

52
src/AddIns/BackendBindings/AspNet.Mvc/Test/Src/SelectedFolderNodeInProjectsViewTests.cs

@ -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 AspNet.Mvc.Tests.Helpers;
using ICSharpCode.AspNet.Mvc;
using ICSharpCode.SharpDevelop.Project;
using NUnit.Framework;
namespace AspNet.Mvc.Tests
{
[TestFixture]
public class SelectedFolderNodeInProjectsViewTests
{
SelectedFolderNodeInProjectsView selectedFolderNode;
TestableProject projectForSelectedFolder;
DirectoryNode directoryNode;
ProjectNode projectNode;
void CreateSelectedFolderNode(string folder)
{
projectForSelectedFolder = TestableProject.CreateProject();
projectNode = new ProjectNode(projectForSelectedFolder);
directoryNode = new DirectoryNode(folder);
directoryNode.AddTo(projectNode);
selectedFolderNode = new SelectedFolderNodeInProjectsView(directoryNode);
}
[Test]
public void Folder_DirectorySpecifiedForNode_ReturnsDirectoryTakenFromDirectoryNode()
{
string expectedFolder = @"d:\projects\MyAspMvcApp\Views\Home";
CreateSelectedFolderNode(expectedFolder);
string folder = selectedFolderNode.Folder;
Assert.AreEqual(expectedFolder, folder);
}
[Test]
public void MvcProject_DirectoryNodeHasProjectNodeAsParent_ReturnsProjectFromDirectoryNode()
{
CreateSelectedFolderNode(@"d:\projects\MyAspMvcApp\Views\Home");
IProject project = selectedFolderNode.Project.Project;
Assert.AreEqual(projectForSelectedFolder, project);
}
}
}

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

@ -2,6 +2,7 @@
// This code is distributed under the GNU LGPL (for details please see \doc\license.txt) // This code is distributed under the GNU LGPL (for details please see \doc\license.txt)
using System; using System;
using System.Linq;
using AspNet.Mvc.Tests.Helpers; using AspNet.Mvc.Tests.Helpers;
using ICSharpCode.AspNet.Mvc; using ICSharpCode.AspNet.Mvc;
using ICSharpCode.SharpDevelop.Project; using ICSharpCode.SharpDevelop.Project;
@ -13,9 +14,9 @@ namespace AspNet.Mvc.Tests
public class SelectedMvcViewFolderTests public class SelectedMvcViewFolderTests
{ {
TestableSelectedMvcViewFolder selectedFolder; TestableSelectedMvcViewFolder selectedFolder;
DirectoryNode directoryNode; FakeMvcProject projectForSelectedFolder;
TestableProject projectForSelectedFolder; FakeMvcFileService fakeFileService;
ProjectNode projectNode; FakeSelectedFolderNodeInProjectsView fakeSelectedFolderNode;
void CreateSelectedFolder() void CreateSelectedFolder()
{ {
@ -24,13 +25,11 @@ namespace AspNet.Mvc.Tests
void CreateSelectedFolder(string folder) void CreateSelectedFolder(string folder)
{ {
projectForSelectedFolder = TestableProject.CreateProject(); selectedFolder = new TestableSelectedMvcViewFolder();
projectNode = new ProjectNode(projectForSelectedFolder); fakeSelectedFolderNode = selectedFolder.FakeSelectedFolderNodeInProjectsView;
fakeSelectedFolderNode.Folder = folder;
directoryNode = new DirectoryNode(folder); projectForSelectedFolder = fakeSelectedFolderNode.FakeMvcProject;
directoryNode.AddTo(projectNode); fakeFileService = selectedFolder.FakeFileService;
selectedFolder = new TestableSelectedMvcViewFolder(directoryNode);
} }
[Test] [Test]
@ -50,7 +49,7 @@ namespace AspNet.Mvc.Tests
CreateSelectedFolder(@"d:\projects\MyAspMvcApp\Views\About"); CreateSelectedFolder(@"d:\projects\MyAspMvcApp\Views\About");
selectedFolder.AddFileToProject("Index.aspx"); selectedFolder.AddFileToProject("Index.aspx");
string fileNameAddedToProject = selectedFolder.PathPassedToAddNewFileToDirectoryNode; string fileNameAddedToProject = fakeSelectedFolderNode.PathPassedToAddNewFile;
string expectedFileNameAddedToProject = string expectedFileNameAddedToProject =
@"d:\projects\MyAspMvcApp\Views\About\Index.aspx"; @"d:\projects\MyAspMvcApp\Views\About\Index.aspx";
@ -63,17 +62,17 @@ namespace AspNet.Mvc.Tests
CreateSelectedFolder(@"d:\projects\MyAspMvcApp\Views\About"); CreateSelectedFolder(@"d:\projects\MyAspMvcApp\Views\About");
selectedFolder.AddFileToProject("Index.aspx"); selectedFolder.AddFileToProject("Index.aspx");
bool saved = projectForSelectedFolder.IsSaved; bool saved = fakeSelectedFolderNode.FakeMvcProject.SaveCalled;
Assert.IsTrue(saved); Assert.IsTrue(saved);
} }
[Test] [Test]
public void Project_DirectoryNodeHasParentProject_ReturnsProject() public void Project_FolderNodeHasProject_ReturnsProjectFromFolderNode()
{ {
CreateSelectedFolder(); CreateSelectedFolder();
IProject project = selectedFolder.Project; IMvcProject project = selectedFolder.Project;
Assert.AreEqual(projectForSelectedFolder, project); Assert.AreEqual(projectForSelectedFolder, project);
} }
@ -82,7 +81,7 @@ namespace AspNet.Mvc.Tests
public void GetTemplateLanguage_ProjectIsVisualBasicProject_ReturnsVisualBasicTemplateLanguage() public void GetTemplateLanguage_ProjectIsVisualBasicProject_ReturnsVisualBasicTemplateLanguage()
{ {
CreateSelectedFolder(); CreateSelectedFolder();
projectForSelectedFolder.SetLanguage("VBNet"); projectForSelectedFolder.SetVisualBasicAsTemplateLanguage();
MvcTextTemplateLanguage language = selectedFolder.GetTemplateLanguage(); MvcTextTemplateLanguage language = selectedFolder.GetTemplateLanguage();
@ -93,11 +92,24 @@ namespace AspNet.Mvc.Tests
public void GetTemplateLanguage_ProjectIsCSharpProject_ReturnsCSharpTemplateLanguage() public void GetTemplateLanguage_ProjectIsCSharpProject_ReturnsCSharpTemplateLanguage()
{ {
CreateSelectedFolder(); CreateSelectedFolder();
projectForSelectedFolder.SetLanguage("C#"); projectForSelectedFolder.SetCSharpAsTemplateLanguage();
MvcTextTemplateLanguage language = selectedFolder.GetTemplateLanguage(); MvcTextTemplateLanguage language = selectedFolder.GetTemplateLanguage();
Assert.AreEqual(MvcTextTemplateLanguage.CSharp, language); Assert.AreEqual(MvcTextTemplateLanguage.CSharp, language);
} }
[Test]
public void AddFileToProject_FileRelativePathPassed_FullPathIncludingViewFolderIsUsedToOpenFile()
{
CreateSelectedFolder(@"d:\projects\MyAspMvcApp\Views\About");
selectedFolder.AddFileToProject("Index.aspx");
string fileNameOpened = fakeFileService.FileNamePassedToOpenFile;
string expectedFileNameOpened =
@"d:\projects\MyAspMvcApp\Views\About\Index.aspx";
Assert.AreEqual(expectedFileNameOpened, fileNameOpened);
}
} }
} }

Loading…
Cancel
Save