From 7aa62b7436e2caae3cf87b4e0e0f30428e54ab0a Mon Sep 17 00:00:00 2001 From: Matt Ward Date: Thu, 15 Sep 2011 20:56:58 +0100 Subject: [PATCH] Support selecting Razor layout page for a new MVC view from a list of available Razor pages in the project. --- .../AspNet.Mvc/Project/AspNet.Mvc.csproj | 4 +- .../Src/AddMvcViewToProjectViewModel.cs | 25 +++-- .../AspNet.Mvc/Project/Src/IMvcProject.cs | 3 +- .../AspNet.Mvc/Project/Src/MvcFileName.cs | 8 ++ .../AspNet.Mvc/Project/Src/MvcProject.cs | 18 ++- ...asterPageFileName.cs => MvcProjectFile.cs} | 35 +----- .../Project/Src/MvcProjectMasterPageFile.cs | 40 +++++++ .../Project/Src/MvcProjectRazorFile.cs | 39 +++++++ .../AspNet.Mvc/Test/AspNet.Mvc.Tests.csproj | 8 +- .../AspNet.Mvc/Test/Helpers/FakeMvcProject.cs | 22 +++- .../MvcMasterPageFileNameCollectionAssert.cs | 32 ------ ...eNameAssert.cs => MvcProjectFileAssert.cs} | 10 +- .../Helpers/MvcProjectFileCollectionAssert.cs | 32 ++++++ .../Src/AddMvcViewToProjectViewModelTests.cs | 91 +++++++++++---- ...ileNameTests.cs => MvcProjectFileTests.cs} | 51 +++++---- .../Test/Src/MvcProjectMasterPageFileTests.cs | 45 ++++++++ .../Test/Src/MvcProjectRazorFileTests.cs | 45 ++++++++ .../AspNet.Mvc/Test/Src/MvcProjectTests.cs | 106 ++++++++++++++---- 18 files changed, 458 insertions(+), 156 deletions(-) rename src/AddIns/BackendBindings/AspNet.Mvc/Project/Src/{MvcMasterPageFileName.cs => MvcProjectFile.cs} (63%) create mode 100644 src/AddIns/BackendBindings/AspNet.Mvc/Project/Src/MvcProjectMasterPageFile.cs create mode 100644 src/AddIns/BackendBindings/AspNet.Mvc/Project/Src/MvcProjectRazorFile.cs delete mode 100644 src/AddIns/BackendBindings/AspNet.Mvc/Test/Helpers/MvcMasterPageFileNameCollectionAssert.cs rename src/AddIns/BackendBindings/AspNet.Mvc/Test/Helpers/{MvcMasterPageFileNameAssert.cs => MvcProjectFileAssert.cs} (59%) create mode 100644 src/AddIns/BackendBindings/AspNet.Mvc/Test/Helpers/MvcProjectFileCollectionAssert.cs rename src/AddIns/BackendBindings/AspNet.Mvc/Test/Src/{MvcMasterPageFileNameTests.cs => MvcProjectFileTests.cs} (62%) create mode 100644 src/AddIns/BackendBindings/AspNet.Mvc/Test/Src/MvcProjectMasterPageFileTests.cs create mode 100644 src/AddIns/BackendBindings/AspNet.Mvc/Test/Src/MvcProjectRazorFileTests.cs diff --git a/src/AddIns/BackendBindings/AspNet.Mvc/Project/AspNet.Mvc.csproj b/src/AddIns/BackendBindings/AspNet.Mvc/Project/AspNet.Mvc.csproj index 3b15162bd5..901d1b29d0 100644 --- a/src/AddIns/BackendBindings/AspNet.Mvc/Project/AspNet.Mvc.csproj +++ b/src/AddIns/BackendBindings/AspNet.Mvc/Project/AspNet.Mvc.csproj @@ -79,7 +79,7 @@ - + @@ -96,6 +96,8 @@ + + diff --git a/src/AddIns/BackendBindings/AspNet.Mvc/Project/Src/AddMvcViewToProjectViewModel.cs b/src/AddIns/BackendBindings/AspNet.Mvc/Project/Src/AddMvcViewToProjectViewModel.cs index 9d51b34db8..2775a45365 100644 --- a/src/AddIns/BackendBindings/AspNet.Mvc/Project/Src/AddMvcViewToProjectViewModel.cs +++ b/src/AddIns/BackendBindings/AspNet.Mvc/Project/Src/AddMvcViewToProjectViewModel.cs @@ -20,7 +20,7 @@ namespace ICSharpCode.AspNet.Mvc bool isStronglyTypedView; bool isContentPage; bool isSelectMasterPageViewOpen; - MvcMasterPageFileName selectedMasterPage; + MvcProjectFile selectedMasterPage; string masterPageFile = String.Empty; MvcModelClassViewModelsForSelectedFolder modelClassesForSelectedFolder; @@ -41,7 +41,7 @@ namespace ICSharpCode.AspNet.Mvc this.viewFileName.Folder = selectedViewFolder.Path; this.ModelClassName = String.Empty; this.PrimaryContentPlaceHolderId = "Main"; - this.MasterPages = new ObservableCollection(); + this.MasterPages = new ObservableCollection(); CreateModelClassesForSelectedFolder(); CreateCommands(); @@ -273,27 +273,36 @@ namespace ICSharpCode.AspNet.Mvc void UpdateMasterPages() { MasterPages.Clear(); - foreach (MvcMasterPageFileName fileName in GetAspxMasterPageFileNames()) { + foreach (MvcProjectFile fileName in GetMasterPageFileNames()) { MasterPages.Add(fileName); } } - IEnumerable GetAspxMasterPageFileNames() + IEnumerable GetMasterPageFileNames() { - var unsortedMasterPages = selectedViewFolder.Project.GetAspxMasterPageFileNames() as IEnumerable; - var masterPages = new List(unsortedMasterPages); + IEnumerable unsortedMasterPages = GetMasterPageFileNamesForSelectedViewEngine(); + var masterPages = new List(unsortedMasterPages); masterPages.Sort(); return masterPages; } + IEnumerable GetMasterPageFileNamesForSelectedViewEngine() + { + IMvcProject project = selectedViewFolder.Project; + if (IsAspxViewEngineSelected) { + return project.GetAspxMasterPageFiles(); + } + return project.GetRazorFiles(); + } + public void CloseSelectMasterPageView() { IsSelectMasterPageViewOpen = false; } - public ObservableCollection MasterPages { get; private set; } + public ObservableCollection MasterPages { get; private set; } - public MvcMasterPageFileName SelectedMasterPage { + public MvcProjectFile SelectedMasterPage { get { return selectedMasterPage; } set { selectedMasterPage = value; } } diff --git a/src/AddIns/BackendBindings/AspNet.Mvc/Project/Src/IMvcProject.cs b/src/AddIns/BackendBindings/AspNet.Mvc/Project/Src/IMvcProject.cs index 0e7252b5ba..d9de2dddde 100644 --- a/src/AddIns/BackendBindings/AspNet.Mvc/Project/Src/IMvcProject.cs +++ b/src/AddIns/BackendBindings/AspNet.Mvc/Project/Src/IMvcProject.cs @@ -17,6 +17,7 @@ namespace ICSharpCode.AspNet.Mvc MvcTextTemplateLanguage GetTemplateLanguage(); IEnumerable GetModelClasses(); - IEnumerable GetAspxMasterPageFileNames(); + IEnumerable GetAspxMasterPageFiles(); + IEnumerable GetRazorFiles(); } } diff --git a/src/AddIns/BackendBindings/AspNet.Mvc/Project/Src/MvcFileName.cs b/src/AddIns/BackendBindings/AspNet.Mvc/Project/Src/MvcFileName.cs index b7c4dea770..5f4ec84db4 100644 --- a/src/AddIns/BackendBindings/AspNet.Mvc/Project/Src/MvcFileName.cs +++ b/src/AddIns/BackendBindings/AspNet.Mvc/Project/Src/MvcFileName.cs @@ -46,5 +46,13 @@ namespace ICSharpCode.AspNet.Mvc } return String.Empty; } + + public static string GetLowerCaseFileExtension(string fileName) + { + if (fileName != null) { + return Path.GetExtension(fileName).ToLowerInvariant(); + } + return String.Empty; + } } } diff --git a/src/AddIns/BackendBindings/AspNet.Mvc/Project/Src/MvcProject.cs b/src/AddIns/BackendBindings/AspNet.Mvc/Project/Src/MvcProject.cs index ff18c84bc4..8d974bb0b9 100644 --- a/src/AddIns/BackendBindings/AspNet.Mvc/Project/Src/MvcProject.cs +++ b/src/AddIns/BackendBindings/AspNet.Mvc/Project/Src/MvcProject.cs @@ -44,12 +44,22 @@ namespace ICSharpCode.AspNet.Mvc return modelClassLocator.GetModelClasses(this); } - public IEnumerable GetAspxMasterPageFileNames() + public IEnumerable GetAspxMasterPageFiles() { foreach (ProjectItem projectItem in Project.Items) { - MvcMasterPageFileName fileName = MvcMasterPageFileName.CreateMvcMasterPageFileName(projectItem); - if (fileName != null) { - yield return fileName; + MvcProjectFile file = MvcProjectMasterPageFile.CreateMvcProjectMasterPageFile(projectItem); + if (file != null) { + yield return file; + } + } + } + + public IEnumerable GetRazorFiles() + { + foreach (ProjectItem projectItem in Project.Items) { + MvcProjectFile file = MvcProjectRazorFile.CreateMvcProjectRazorFile(projectItem); + if (file != null) { + yield return file; } } } diff --git a/src/AddIns/BackendBindings/AspNet.Mvc/Project/Src/MvcMasterPageFileName.cs b/src/AddIns/BackendBindings/AspNet.Mvc/Project/Src/MvcProjectFile.cs similarity index 63% rename from src/AddIns/BackendBindings/AspNet.Mvc/Project/Src/MvcMasterPageFileName.cs rename to src/AddIns/BackendBindings/AspNet.Mvc/Project/Src/MvcProjectFile.cs index 70854cef7e..558f552e8d 100644 --- a/src/AddIns/BackendBindings/AspNet.Mvc/Project/Src/MvcMasterPageFileName.cs +++ b/src/AddIns/BackendBindings/AspNet.Mvc/Project/Src/MvcProjectFile.cs @@ -7,9 +7,9 @@ using ICSharpCode.SharpDevelop.Project; namespace ICSharpCode.AspNet.Mvc { - public class MvcMasterPageFileName : IComparable + public class MvcProjectFile : IComparable { - public MvcMasterPageFileName(FileProjectItem fileProjectItem) + public MvcProjectFile(FileProjectItem fileProjectItem) { UpdateFileName(fileProjectItem); } @@ -33,7 +33,7 @@ namespace ICSharpCode.AspNet.Mvc return virtualPath.VirtualPath; } - public MvcMasterPageFileName() + public MvcProjectFile() { FullPath = String.Empty; FileName = String.Empty; @@ -51,29 +51,6 @@ namespace ICSharpCode.AspNet.Mvc return FullPath; } - public static MvcMasterPageFileName CreateMvcMasterPageFileName(ProjectItem projectItem) - { - var fileProjectItem = projectItem as FileProjectItem; - if (fileProjectItem != null) { - return CreateMvcMasterPageFileName(fileProjectItem); - } - return null; - } - - public static MvcMasterPageFileName CreateMvcMasterPageFileName(FileProjectItem fileProjectItem) - { - if (IsMasterPageFileName(fileProjectItem.FileName)) { - return new MvcMasterPageFileName(fileProjectItem); - } - return null; - } - - public static bool IsMasterPageFileName(string fileName) - { - string extension = GetLowerCaseFileExtension(fileName); - return extension == ".master"; - } - static string GetLowerCaseFileExtension(string fileName) { if (fileName != null) { @@ -82,7 +59,7 @@ namespace ICSharpCode.AspNet.Mvc return String.Empty; } - public int CompareTo(MvcMasterPageFileName other) + public int CompareTo(MvcProjectFile other) { int result = CompareFileNames(other); if (result == 0) { @@ -91,12 +68,12 @@ namespace ICSharpCode.AspNet.Mvc return result; } - int CompareFileNames(MvcMasterPageFileName other) + int CompareFileNames(MvcProjectFile other) { return FileName.CompareTo(other.FileName); } - int CompareFolderRelativeToProject(MvcMasterPageFileName other) + int CompareFolderRelativeToProject(MvcProjectFile other) { return FolderRelativeToProject.CompareTo(other.FolderRelativeToProject); } diff --git a/src/AddIns/BackendBindings/AspNet.Mvc/Project/Src/MvcProjectMasterPageFile.cs b/src/AddIns/BackendBindings/AspNet.Mvc/Project/Src/MvcProjectMasterPageFile.cs new file mode 100644 index 0000000000..57a8235c6d --- /dev/null +++ b/src/AddIns/BackendBindings/AspNet.Mvc/Project/Src/MvcProjectMasterPageFile.cs @@ -0,0 +1,40 @@ +// Copyright (c) AlphaSierraPapa for the SharpDevelop Team (for details please see \doc\copyright.txt) +// This code is distributed under the GNU LGPL (for details please see \doc\license.txt) + +using System; +using System.IO; +using ICSharpCode.SharpDevelop.Project; + +namespace ICSharpCode.AspNet.Mvc +{ + public class MvcProjectMasterPageFile + { + public static MvcProjectFile CreateMvcProjectMasterPageFile(ProjectItem projectItem) + { + var fileProjectItem = projectItem as FileProjectItem; + return CreateMvcProjectMasterPageFile(fileProjectItem); + } + + public static MvcProjectFile CreateMvcProjectMasterPageFile(FileProjectItem fileProjectItem) + { + if (IsMasterPageFile(fileProjectItem)) { + return new MvcProjectFile(fileProjectItem); + } + return null; + } + + public static bool IsMasterPageFile(FileProjectItem fileProjectItem) + { + if (fileProjectItem != null) { + return IsMasterPageFileName(fileProjectItem.FileName); + } + return false; + } + + public static bool IsMasterPageFileName(string fileName) + { + string extension = MvcFileName.GetLowerCaseFileExtension(fileName); + return extension == ".master"; + } + } +} diff --git a/src/AddIns/BackendBindings/AspNet.Mvc/Project/Src/MvcProjectRazorFile.cs b/src/AddIns/BackendBindings/AspNet.Mvc/Project/Src/MvcProjectRazorFile.cs new file mode 100644 index 0000000000..2fb041a326 --- /dev/null +++ b/src/AddIns/BackendBindings/AspNet.Mvc/Project/Src/MvcProjectRazorFile.cs @@ -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.SharpDevelop.Project; + +namespace ICSharpCode.AspNet.Mvc +{ + public class MvcProjectRazorFile + { + public static MvcProjectFile CreateMvcProjectRazorFile(ProjectItem projectItem) + { + FileProjectItem fileProjectItem = projectItem as FileProjectItem; + return CreateMvcProjectRazorFile(fileProjectItem); + } + + public static MvcProjectFile CreateMvcProjectRazorFile(FileProjectItem fileProjectItem) + { + if (IsRazorFile(fileProjectItem)) { + return new MvcProjectFile(fileProjectItem); + } + return null; + } + + public static bool IsRazorFile(FileProjectItem fileProjectItem) + { + if (fileProjectItem != null) { + return IsRazorFileName(fileProjectItem.FileName); + } + return false; + } + + public static bool IsRazorFileName(string fileName) + { + string extension = MvcFileName.GetLowerCaseFileExtension(fileName); + return extension == ".cshtml"; + } + } +} diff --git a/src/AddIns/BackendBindings/AspNet.Mvc/Test/AspNet.Mvc.Tests.csproj b/src/AddIns/BackendBindings/AspNet.Mvc/Test/AspNet.Mvc.Tests.csproj index b477da6006..fedb78ea17 100644 --- a/src/AddIns/BackendBindings/AspNet.Mvc/Test/AspNet.Mvc.Tests.csproj +++ b/src/AddIns/BackendBindings/AspNet.Mvc/Test/AspNet.Mvc.Tests.csproj @@ -66,8 +66,8 @@ - - + + @@ -81,11 +81,13 @@ - + + + diff --git a/src/AddIns/BackendBindings/AspNet.Mvc/Test/Helpers/FakeMvcProject.cs b/src/AddIns/BackendBindings/AspNet.Mvc/Test/Helpers/FakeMvcProject.cs index 23c65e645d..edf8464a2c 100644 --- a/src/AddIns/BackendBindings/AspNet.Mvc/Test/Helpers/FakeMvcProject.cs +++ b/src/AddIns/BackendBindings/AspNet.Mvc/Test/Helpers/FakeMvcProject.cs @@ -64,16 +64,28 @@ namespace AspNet.Mvc.Tests.Helpers return ModelClasses; } - public List MasterPageFileNames = new List(); + public List AspxMasterPageFiles = new List(); - public void AddMasterPageFile(MvcMasterPageFileName fileName) + public void AddAspxMasterPageFile(MvcProjectFile file) { - MasterPageFileNames.Add(fileName); + AspxMasterPageFiles.Add(file); } - public IEnumerable GetAspxMasterPageFileNames() + public IEnumerable GetAspxMasterPageFiles() { - return MasterPageFileNames; + return AspxMasterPageFiles; + } + + public List RazorFiles = new List(); + + public void AddRazorFile(MvcProjectFile file) + { + RazorFiles.Add(file); + } + + public IEnumerable GetRazorFiles() + { + return RazorFiles; } } } diff --git a/src/AddIns/BackendBindings/AspNet.Mvc/Test/Helpers/MvcMasterPageFileNameCollectionAssert.cs b/src/AddIns/BackendBindings/AspNet.Mvc/Test/Helpers/MvcMasterPageFileNameCollectionAssert.cs deleted file mode 100644 index 5e298829af..0000000000 --- a/src/AddIns/BackendBindings/AspNet.Mvc/Test/Helpers/MvcMasterPageFileNameCollectionAssert.cs +++ /dev/null @@ -1,32 +0,0 @@ -// Copyright (c) AlphaSierraPapa for the SharpDevelop Team (for details please see \doc\copyright.txt) -// This code is distributed under the GNU LGPL (for details please see \doc\license.txt) - -using System; -using System.Collections.Generic; -using ICSharpCode.AspNet.Mvc; -using ICSharpCode.SharpDevelop; -using NUnit.Framework; - -namespace AspNet.Mvc.Tests.Helpers -{ - public static class MvcMasterPageFileNameCollectionAssert - { - public static void AreEqual(IEnumerable expected, IEnumerable actual) - { - List expectedAsStrings = GetMvcMasterPageFileNamesAsStrings(expected); - List actualAsStrings = GetMvcMasterPageFileNamesAsStrings(actual); - - CollectionAssert.AreEqual(expectedAsStrings, actualAsStrings); - } - - static List GetMvcMasterPageFileNamesAsStrings(IEnumerable fileNames) - { - var convertedFileNames = new List(); - foreach (MvcMasterPageFileName fileName in fileNames) { - string fileNameAsString = MvcMasterPageFileNameAssert.GetMvcMasterPageFileNameAsString(fileName); - convertedFileNames.Add(fileNameAsString); - } - return convertedFileNames; - } - } -} diff --git a/src/AddIns/BackendBindings/AspNet.Mvc/Test/Helpers/MvcMasterPageFileNameAssert.cs b/src/AddIns/BackendBindings/AspNet.Mvc/Test/Helpers/MvcProjectFileAssert.cs similarity index 59% rename from src/AddIns/BackendBindings/AspNet.Mvc/Test/Helpers/MvcMasterPageFileNameAssert.cs rename to src/AddIns/BackendBindings/AspNet.Mvc/Test/Helpers/MvcProjectFileAssert.cs index 0eb5c31cd1..31f4fb202b 100644 --- a/src/AddIns/BackendBindings/AspNet.Mvc/Test/Helpers/MvcMasterPageFileNameAssert.cs +++ b/src/AddIns/BackendBindings/AspNet.Mvc/Test/Helpers/MvcProjectFileAssert.cs @@ -7,16 +7,16 @@ using NUnit.Framework; namespace AspNet.Mvc.Tests.Helpers { - public static class MvcMasterPageFileNameAssert + public static class MvcProjectFileAssert { - public static void AreEqual(MvcMasterPageFileName expected, MvcMasterPageFileName actual) + public static void AreEqual(MvcProjectFile expected, MvcProjectFile actual) { - string expectedAsString = GetMvcMasterPageFileNameAsString(expected); - string actualAsString = GetMvcMasterPageFileNameAsString(actual); + string expectedAsString = GetMvcProjectFileAsString(expected); + string actualAsString = GetMvcProjectFileAsString(actual); Assert.AreEqual(expectedAsString, actualAsString); } - public static string GetMvcMasterPageFileNameAsString(MvcMasterPageFileName fileName) + public static string GetMvcProjectFileAsString(MvcProjectFile fileName) { return String.Format( "FileName: {0}\r\nFolder: {1}\r\n, FullPath: {2}", diff --git a/src/AddIns/BackendBindings/AspNet.Mvc/Test/Helpers/MvcProjectFileCollectionAssert.cs b/src/AddIns/BackendBindings/AspNet.Mvc/Test/Helpers/MvcProjectFileCollectionAssert.cs new file mode 100644 index 0000000000..33bc9d7afb --- /dev/null +++ b/src/AddIns/BackendBindings/AspNet.Mvc/Test/Helpers/MvcProjectFileCollectionAssert.cs @@ -0,0 +1,32 @@ +// 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; +using NUnit.Framework; + +namespace AspNet.Mvc.Tests.Helpers +{ + public static class MvcProjectFileCollectionAssert + { + public static void AreEqual(IEnumerable expected, IEnumerable actual) + { + List expectedAsStrings = GetMvcProjectFilesAsStrings(expected); + List actualAsStrings = GetMvcProjectFilesAsStrings(actual); + + CollectionAssert.AreEqual(expectedAsStrings, actualAsStrings); + } + + static List GetMvcProjectFilesAsStrings(IEnumerable fileNames) + { + var convertedFileNames = new List(); + foreach (MvcProjectFile fileName in fileNames) { + string fileNameAsString = MvcProjectFileAssert.GetMvcProjectFileAsString(fileName); + convertedFileNames.Add(fileNameAsString); + } + return convertedFileNames; + } + } +} diff --git a/src/AddIns/BackendBindings/AspNet.Mvc/Test/Src/AddMvcViewToProjectViewModelTests.cs b/src/AddIns/BackendBindings/AspNet.Mvc/Test/Src/AddMvcViewToProjectViewModelTests.cs index 98c7a04cf5..0fb4a6174c 100644 --- a/src/AddIns/BackendBindings/AspNet.Mvc/Test/Src/AddMvcViewToProjectViewModelTests.cs +++ b/src/AddIns/BackendBindings/AspNet.Mvc/Test/Src/AddMvcViewToProjectViewModelTests.cs @@ -793,21 +793,21 @@ namespace AspNet.Mvc.Tests { CreateViewModel(); SelectAspxViewEngine(); - var masterPageFile = new MvcMasterPageFileName() { + var masterPageFile = new MvcProjectFile() { FullPath = @"d:\projects\MyProject\Views\Shared\Site.Master", FileName = "Site.Master", FolderRelativeToProject = @"Views\Shared" }; - fakeProject.AddMasterPageFile(masterPageFile); + fakeProject.AddAspxMasterPageFile(masterPageFile); viewModel.OpenSelectMasterPageView(); - var expectedFileNames = new MvcMasterPageFileName[] { + var expectedFiles = new MvcProjectFile[] { masterPageFile }; - ObservableCollection fileNames = viewModel.MasterPages; + ObservableCollection files = viewModel.MasterPages; - Assert.AreEqual(expectedFileNames, fileNames); + Assert.AreEqual(expectedFiles, files); } [Test] @@ -815,19 +815,19 @@ namespace AspNet.Mvc.Tests { CreateViewModel(); SelectAspxViewEngine(); - var masterPageFile = new MvcMasterPageFileName(); - fakeProject.AddMasterPageFile(masterPageFile); + var masterPageFile = new MvcProjectFile(); + fakeProject.AddAspxMasterPageFile(masterPageFile); viewModel.OpenSelectMasterPageView(); viewModel.CloseSelectMasterPageView(); viewModel.OpenSelectMasterPageView(); - var expectedFileNames = new MvcMasterPageFileName[] { + var expectedFiles = new MvcProjectFile[] { masterPageFile }; - ObservableCollection fileNames = viewModel.MasterPages; + ObservableCollection files = viewModel.MasterPages; - Assert.AreEqual(expectedFileNames, fileNames); + Assert.AreEqual(expectedFiles, files); } [Test] @@ -845,7 +845,7 @@ namespace AspNet.Mvc.Tests public void SelectMasterPageCommand_MasterPageIsSelected_CommandIsEnabled() { CreateViewModel(); - viewModel.SelectedMasterPage = new MvcMasterPageFileName(); + viewModel.SelectedMasterPage = new MvcProjectFile(); bool canExecute = viewModel.SelectMasterPageCommand.CanExecute(null); @@ -883,7 +883,7 @@ namespace AspNet.Mvc.Tests CreateViewModel(); viewModel.MasterPageFile = "test.master"; viewModel.OpenSelectMasterPageView(); - var masterPageFileName = new MvcMasterPageFileName() { + var masterPageFileName = new MvcProjectFile() { FullPath = @"d:\projects\MyProject\Views\Shared\site.master", FileName = "site.master", FolderRelativeToProject = @"Views\Shared", @@ -902,7 +902,7 @@ namespace AspNet.Mvc.Tests { CreateViewModel(); viewModel.OpenSelectMasterPageView(); - var masterPageFileName = new MvcMasterPageFileName(); + var masterPageFileName = new MvcProjectFile(); viewModel.SelectedMasterPage = masterPageFileName; MonitorPropertyChangedEvents(); @@ -918,28 +918,79 @@ namespace AspNet.Mvc.Tests { CreateViewModel(); SelectAspxViewEngine(); - var masterPageFile1 = new MvcMasterPageFileName() { + var masterPageFile1 = new MvcProjectFile() { FullPath = @"d:\projects\MyProject\Views\Shared\ViewSite.Master", FileName = "ViewSite.Master", FolderRelativeToProject = @"Views\Shared" }; - fakeProject.AddMasterPageFile(masterPageFile1); - var masterPageFile2 = new MvcMasterPageFileName() { + fakeProject.AddAspxMasterPageFile(masterPageFile1); + var masterPageFile2 = new MvcProjectFile() { FullPath = @"d:\projects\MyProject\Views\Shared\Site.Master", FileName = "Site.Master", FolderRelativeToProject = @"Views\Shared" }; - fakeProject.AddMasterPageFile(masterPageFile2); + fakeProject.AddAspxMasterPageFile(masterPageFile2); viewModel.OpenSelectMasterPageView(); - var expectedFileNames = new MvcMasterPageFileName[] { + var expectedFiles = new MvcProjectFile[] { masterPageFile2, masterPageFile1 }; - ObservableCollection fileNames = viewModel.MasterPages; + ObservableCollection files = viewModel.MasterPages; - Assert.AreEqual(expectedFileNames, fileNames); + Assert.AreEqual(expectedFiles, files); + } + + [Test] + public void MasterPages_ProjectContainsOneRazorFileAndRazorEngineSelected_ReturnsOneRazorFile() + { + CreateViewModel(); + SelectRazorViewEngine(); + var razorFile = new MvcProjectFile() { + FullPath = @"d:\projects\MyProject\Views\Shared\_Layout.cshtml", + FileName = "_Layout.cshtml", + FolderRelativeToProject = @"Views\Shared" + }; + fakeProject.AddRazorFile(razorFile); + viewModel.OpenSelectMasterPageView(); + + var expectedFiles = new MvcProjectFile[] { + razorFile + }; + + ObservableCollection files = viewModel.MasterPages; + + Assert.AreEqual(expectedFiles, files); + } + + [Test] + public void MasterPages_ProjectContainsTwoRazorPagesInIncorrectSortOrder_ReturnsTwoRazorFilesSorted() + { + CreateViewModel(); + SelectRazorViewEngine(); + var razorFile1 = new MvcProjectFile() { + FullPath = @"d:\projects\MyProject\Views\Shared\ViewSite.cshtml", + FileName = "ViewSite.cshtml", + FolderRelativeToProject = @"Views\Shared" + }; + fakeProject.AddRazorFile(razorFile1); + var razorFile2 = new MvcProjectFile() { + FullPath = @"d:\projects\MyProject\Views\Shared\Site.cshtml", + FileName = "Site.cshtml", + FolderRelativeToProject = @"Views\Shared" + }; + fakeProject.AddRazorFile(razorFile2); + viewModel.OpenSelectMasterPageView(); + + var expectedFiles = new MvcProjectFile[] { + razorFile2, + razorFile1 + }; + + ObservableCollection files = viewModel.MasterPages; + + Assert.AreEqual(expectedFiles, files); } } } diff --git a/src/AddIns/BackendBindings/AspNet.Mvc/Test/Src/MvcMasterPageFileNameTests.cs b/src/AddIns/BackendBindings/AspNet.Mvc/Test/Src/MvcProjectFileTests.cs similarity index 62% rename from src/AddIns/BackendBindings/AspNet.Mvc/Test/Src/MvcMasterPageFileNameTests.cs rename to src/AddIns/BackendBindings/AspNet.Mvc/Test/Src/MvcProjectFileTests.cs index 219f14d972..6d65cac887 100644 --- a/src/AddIns/BackendBindings/AspNet.Mvc/Test/Src/MvcMasterPageFileNameTests.cs +++ b/src/AddIns/BackendBindings/AspNet.Mvc/Test/Src/MvcProjectFileTests.cs @@ -9,23 +9,22 @@ using NUnit.Framework; namespace AspNet.Mvc.Tests { - [TestFixture] - public class MvcMasterPageFileNameTests + public class MvcProjectFileTests { TestableProject project; - MvcMasterPageFileName masterPageFileName; + MvcProjectFile file; void CreateProject(string fileName) { project = TestableProject.CreateProject(fileName, "MyProject"); } - MvcMasterPageFileName CreateMasterPageFileName(string fullPath) + MvcProjectFile CreateProjectFile(string fullPath) { var projectItem = new FileProjectItem(project, ItemType.Compile); projectItem.FileName = fullPath; - masterPageFileName = new MvcMasterPageFileName(projectItem); - return masterPageFileName; + file = new MvcProjectFile(projectItem); + return file; } [Test] @@ -33,9 +32,9 @@ namespace AspNet.Mvc.Tests { CreateProject(@"d:\projects\MyProject\MyProject.csproj"); string expectedFullPath = @"d:\projects\MyProject\Views\Shared\Site.Master"; - CreateMasterPageFileName(expectedFullPath); + CreateProjectFile(expectedFullPath); - string fullPath = masterPageFileName.FullPath; + string fullPath = file.FullPath; Assert.AreEqual(expectedFullPath, fullPath); } @@ -44,9 +43,9 @@ namespace AspNet.Mvc.Tests public void FileName_CreatedFromFileProjectItem_ReturnsFileNameWithoutFolder() { CreateProject(@"d:\projects\MyProject\MyProject.csproj"); - CreateMasterPageFileName(@"d:\projects\MyProject\Views\Shared\Site.Master"); + CreateProjectFile(@"d:\projects\MyProject\Views\Shared\Site.Master"); - string fileName = masterPageFileName.FileName; + string fileName = file.FileName; Assert.AreEqual("Site.Master", fileName); } @@ -55,9 +54,9 @@ namespace AspNet.Mvc.Tests public void FolderRelativeToProject_CreatedFromFileProjectItem_ReturnsFileNameWithoutFolder() { CreateProject(@"d:\projects\MyProject\MyProject.csproj"); - CreateMasterPageFileName(@"d:\projects\MyProject\Views\Shared\Site.Master"); + CreateProjectFile(@"d:\projects\MyProject\Views\Shared\Site.Master"); - string folder = masterPageFileName.FolderRelativeToProject; + string folder = file.FolderRelativeToProject; Assert.AreEqual(@"Views\Shared", folder); } @@ -66,9 +65,9 @@ namespace AspNet.Mvc.Tests public void VirtualPath_CreatedFromFileProjectItem_ReturnsAspNetVirtualPathForFileName() { CreateProject(@"d:\projects\MyProject\MyProject.csproj"); - CreateMasterPageFileName(@"d:\projects\MyProject\Views\Shared\Site.Master"); + CreateProjectFile(@"d:\projects\MyProject\Views\Shared\Site.Master"); - string virtualPath = masterPageFileName.VirtualPath; + string virtualPath = file.VirtualPath; Assert.AreEqual("~/Views/Shared/Site.Master", virtualPath); } @@ -77,9 +76,9 @@ namespace AspNet.Mvc.Tests public void VirtualPath_FileInProjectRootDirectory_ReturnsAspNetVirtualPathForFileName() { CreateProject(@"d:\projects\MyProject\MyProject.csproj"); - CreateMasterPageFileName(@"d:\projects\MyProject\Site.Master"); + CreateProjectFile(@"d:\projects\MyProject\Site.Master"); - string virtualPath = masterPageFileName.VirtualPath; + string virtualPath = file.VirtualPath; Assert.AreEqual("~/Site.Master", virtualPath); } @@ -88,8 +87,8 @@ namespace AspNet.Mvc.Tests public void CompareTo_FileNamesAreTheSame_ReturnsZero() { CreateProject(@"d:\projects\MyProject\MyProject.csproj"); - MvcMasterPageFileName lhs = CreateMasterPageFileName(@"d:\projects\MyProject\Site.Master"); - MvcMasterPageFileName rhs = CreateMasterPageFileName(@"d:\projects\MyProject\Site.Master"); + MvcProjectFile lhs = CreateProjectFile(@"d:\projects\MyProject\Site.Master"); + MvcProjectFile rhs = CreateProjectFile(@"d:\projects\MyProject\Site.Master"); int result = lhs.CompareTo(rhs); @@ -100,8 +99,8 @@ namespace AspNet.Mvc.Tests public void CompareTo_FoldersAreSameAndSecondFileNameIsGreaterThanFirstFileName_ReturnsMinusOne() { CreateProject(@"d:\projects\MyProject\MyProject.csproj"); - MvcMasterPageFileName lhs = CreateMasterPageFileName(@"d:\projects\MyProject\Shared\A.Master"); - MvcMasterPageFileName rhs = CreateMasterPageFileName(@"d:\projects\MyProject\Shared\Z.Master"); + MvcProjectFile lhs = CreateProjectFile(@"d:\projects\MyProject\Shared\A.Master"); + MvcProjectFile rhs = CreateProjectFile(@"d:\projects\MyProject\Shared\Z.Master"); int result = lhs.CompareTo(rhs); @@ -112,8 +111,8 @@ namespace AspNet.Mvc.Tests public void CompareTo_FoldersAreSameAndSecondFileNameIsLessThanFirstFileName_ReturnsPlusOne() { CreateProject(@"d:\projects\MyProject\MyProject.csproj"); - MvcMasterPageFileName lhs = CreateMasterPageFileName(@"d:\projects\MyProject\Shared\Z.Master"); - MvcMasterPageFileName rhs = CreateMasterPageFileName(@"d:\projects\MyProject\Shared\A.Master"); + MvcProjectFile lhs = CreateProjectFile(@"d:\projects\MyProject\Shared\Z.Master"); + MvcProjectFile rhs = CreateProjectFile(@"d:\projects\MyProject\Shared\A.Master"); int result = lhs.CompareTo(rhs); @@ -124,8 +123,8 @@ namespace AspNet.Mvc.Tests public void CompareTo_FileNamesAreSameAndSecondFolderIsLessThanFirstFolder_ReturnsPlusOne() { CreateProject(@"d:\projects\MyProject\MyProject.csproj"); - MvcMasterPageFileName lhs = CreateMasterPageFileName(@"d:\projects\MyProject\Z\site.Master"); - MvcMasterPageFileName rhs = CreateMasterPageFileName(@"d:\projects\MyProject\A\site.Master"); + MvcProjectFile lhs = CreateProjectFile(@"d:\projects\MyProject\Z\site.Master"); + MvcProjectFile rhs = CreateProjectFile(@"d:\projects\MyProject\A\site.Master"); int result = lhs.CompareTo(rhs); @@ -136,8 +135,8 @@ namespace AspNet.Mvc.Tests public void CompareTo_FileNamesAreSameAndSecondFolderIsGreaterThanFirstFolder_ReturnsMinussOne() { CreateProject(@"d:\projects\MyProject\MyProject.csproj"); - MvcMasterPageFileName lhs = CreateMasterPageFileName(@"d:\projects\MyProject\A\site.Master"); - MvcMasterPageFileName rhs = CreateMasterPageFileName(@"d:\projects\MyProject\Z\site.Master"); + MvcProjectFile lhs = CreateProjectFile(@"d:\projects\MyProject\A\site.Master"); + MvcProjectFile rhs = CreateProjectFile(@"d:\projects\MyProject\Z\site.Master"); int result = lhs.CompareTo(rhs); diff --git a/src/AddIns/BackendBindings/AspNet.Mvc/Test/Src/MvcProjectMasterPageFileTests.cs b/src/AddIns/BackendBindings/AspNet.Mvc/Test/Src/MvcProjectMasterPageFileTests.cs new file mode 100644 index 0000000000..9a6ffe74f2 --- /dev/null +++ b/src/AddIns/BackendBindings/AspNet.Mvc/Test/Src/MvcProjectMasterPageFileTests.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 ICSharpCode.AspNet.Mvc; +using NUnit.Framework; + +namespace AspNet.Mvc.Tests +{ + [TestFixture] + public class MvcProjectMasterPageFileTests + { + [Test] + public void IsMasterPageFileName_NullFileNamePassed_ReturnsFalse() + { + bool result = MvcProjectMasterPageFile.IsMasterPageFileName(null); + + Assert.IsFalse(result); + } + + [Test] + public void IsMasterPageFileName_MasterPageFileNamePassed_ReturnsTrue() + { + bool result = MvcProjectMasterPageFile.IsMasterPageFileName("Site.master"); + + Assert.IsTrue(result); + } + + [Test] + public void IsMasterPageFileName_UpperCaseMasterPageFileNamePassed_ReturnsTrue() + { + bool result = MvcProjectMasterPageFile.IsMasterPageFileName("Site.MASTER"); + + Assert.IsTrue(result); + } + + [Test] + public void CreateMvcProjectMasterPageFile_NullProjectItemPassed_ReturnsNull() + { + MvcProjectFile file = MvcProjectMasterPageFile.CreateMvcProjectMasterPageFile(null); + + Assert.IsNull(file); + } + } +} diff --git a/src/AddIns/BackendBindings/AspNet.Mvc/Test/Src/MvcProjectRazorFileTests.cs b/src/AddIns/BackendBindings/AspNet.Mvc/Test/Src/MvcProjectRazorFileTests.cs new file mode 100644 index 0000000000..37ffa3bf40 --- /dev/null +++ b/src/AddIns/BackendBindings/AspNet.Mvc/Test/Src/MvcProjectRazorFileTests.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 ICSharpCode.AspNet.Mvc; +using NUnit.Framework; + +namespace AspNet.Mvc.Tests +{ + [TestFixture] + public class MvcProjectRazorFileTests + { + [Test] + public void IsRazorFileName_NullFileNamePassed_ReturnsFalse() + { + bool result = MvcProjectRazorFile.IsRazorFile(null); + + Assert.IsFalse(result); + } + + [Test] + public void IsRazorFileName_RazorFileNamePassed_ReturnsTrue() + { + bool result = MvcProjectRazorFile.IsRazorFileName("layout.cshtml"); + + Assert.IsTrue(result); + } + + [Test] + public void IsRazorFileName_UpperCaseRazorFileNamePassed_ReturnsTrue() + { + bool result = MvcProjectRazorFile.IsRazorFileName("test.CSHTML"); + + Assert.IsTrue(result); + } + + [Test] + public void CreateMvcProjectRazorFile_NullProjectItemPassed_ReturnsNull() + { + MvcProjectFile file = MvcProjectRazorFile.CreateMvcProjectRazorFile(null); + + Assert.IsNull(file); + } + } +} diff --git a/src/AddIns/BackendBindings/AspNet.Mvc/Test/Src/MvcProjectTests.cs b/src/AddIns/BackendBindings/AspNet.Mvc/Test/Src/MvcProjectTests.cs index 09851e9c3a..f55a778cf9 100644 --- a/src/AddIns/BackendBindings/AspNet.Mvc/Test/Src/MvcProjectTests.cs +++ b/src/AddIns/BackendBindings/AspNet.Mvc/Test/Src/MvcProjectTests.cs @@ -35,10 +35,17 @@ namespace AspNet.Mvc.Tests testableProject.AddFileToProject(fileName); } - List GetAspxMasterPageFileNames() + List GetAspxMasterPageFiles() { - return new List( - project.GetAspxMasterPageFileNames() + return new List( + project.GetAspxMasterPageFiles() + ); + } + + List GetRazorFiles() + { + return new List( + project.GetRazorFiles() ); } @@ -125,74 +132,129 @@ namespace AspNet.Mvc.Tests } [Test] - public void GetAspxMasterPageFileNames_OneMasterPageInProject_ReturnsOneFileName() + public void GetAspxMasterPageFiles_OneMasterPageInProject_ReturnsOneFile() { CreateProject(@"d:\projects\AspNetMvcProject\MyProject.csproj"); AddFileToProject(@"d:\projects\AspNetMvcProject\Views\Shared\Site.Master"); - List fileNames = GetAspxMasterPageFileNames(); + List files = GetAspxMasterPageFiles(); - Assert.AreEqual(1, fileNames.Count); + Assert.AreEqual(1, files.Count); } [Test] - public void GetAspxMasterPageFileNames_OneMasterPageInProject_ReturnsOneMasterPageWithExpectedFileName() + public void GetAspxMasterPageFiles_OneMasterPageInProject_ReturnsOneMasterPageWithExpectedFile() { CreateProject(@"d:\projects\AspNetMvcProject\MyProject.csproj"); AddFileToProject(@"d:\projects\AspNetMvcProject\Views\Shared\Site.Master"); - MvcMasterPageFileName fileName = GetAspxMasterPageFileNames().First(); + MvcProjectFile file = GetAspxMasterPageFiles().First(); - var expectedFileName = new MvcMasterPageFileName() { + var expectedFile = new MvcProjectFile() { FullPath = @"d:\projects\AspNetMvcProject\Views\Shared\Site.Master", FileName = "Site.Master", FolderRelativeToProject = @"Views\Shared" }; - MvcMasterPageFileNameAssert.AreEqual(expectedFileName, fileName); + MvcProjectFileAssert.AreEqual(expectedFile, file); } [Test] - public void GetAspxMasterPageFileNames_OneHtmlFileAndOneMasterPageInProject_ReturnsOneMasterPageWithExpectedFileName() + public void GetAspxMasterPageFiles_OneHtmlFileAndOneMasterPageInProject_ReturnsOneMasterPageWithExpectedFileName() { CreateProject(@"d:\projects\AspNetMvcProject\MyProject.csproj"); AddFileToProject(@"d:\projects\AspNetMvcProject\Views\Shared\test.html"); AddFileToProject(@"d:\projects\AspNetMvcProject\Views\Shared\Site.Master"); - List fileNames = GetAspxMasterPageFileNames(); + List files = GetAspxMasterPageFiles(); - var expectedFileName = new MvcMasterPageFileName() { + var expectedFileName = new MvcProjectFile() { FullPath = @"d:\projects\AspNetMvcProject\Views\Shared\Site.Master", FileName = "Site.Master", FolderRelativeToProject = @"Views\Shared" }; - var expectedFileNames = new MvcMasterPageFileName[] { + var expectedFiles = new MvcProjectFile[] { expectedFileName }; - MvcMasterPageFileNameCollectionAssert.AreEqual(expectedFileNames, fileNames); + MvcProjectFileCollectionAssert.AreEqual(expectedFiles, files); } [Test] - public void GetAspxMasterPageFileNames_OneMasterPageWithFileExtensionInUpperCaseInProject_ReturnsOneMasterPageWithExpectedFileName() + public void GetAspxMasterPageFiles_OneMasterPageWithFileExtensionInUpperCaseInProject_ReturnsOneMasterPageWithExpectedFileName() { CreateProject(@"d:\projects\AspNetMvcProject\MyProject.csproj"); AddFileToProject(@"d:\projects\AspNetMvcProject\Views\Shared\TEST.MASTER"); - MvcMasterPageFileName fileName = GetAspxMasterPageFileNames().First(); + MvcProjectFile fileName = GetAspxMasterPageFiles().First(); - var expectedFileName = new MvcMasterPageFileName() { + var expectedFileName = new MvcProjectFile() { FullPath = @"d:\projects\AspNetMvcProject\Views\Shared\TEST.MASTER", FileName = "TEST.MASTER", FolderRelativeToProject = @"Views\Shared" }; - MvcMasterPageFileNameAssert.AreEqual(expectedFileName, fileName); + MvcProjectFileAssert.AreEqual(expectedFileName, fileName); + } + + [Test] + public void GetRazorFiles_OneRazorFileInProject_ReturnsOneFile() + { + CreateProject(@"d:\projects\AspNetMvcProject\MyProject.csproj"); + AddFileToProject(@"d:\projects\AspNetMvcProject\Views\Shared\_Layout.cshtml"); + List files = GetRazorFiles(); + + Assert.AreEqual(1, files.Count); + } + + [Test] + public void GetRazorFiles_OneRazorFileInProject_ReturnsOneRazorFileWithExpectedFile() + { + CreateProject(@"d:\projects\AspNetMvcProject\MyProject.csproj"); + AddFileToProject(@"d:\projects\AspNetMvcProject\Views\Shared\_Layout.cshtml"); + MvcProjectFile file = GetRazorFiles().First(); + + var expectedFile = new MvcProjectFile() { + FullPath = @"d:\projects\AspNetMvcProject\Views\Shared\_Layout.cshtml", + FileName = "_Layout.cshtml", + FolderRelativeToProject = @"Views\Shared" + }; + + MvcProjectFileAssert.AreEqual(expectedFile, file); + } + + [Test] + public void GetRazorFiles_OneHtmlFileAndOneRazorFileInProject_ReturnsOneRazorFileWithExpectedFileName() + { + CreateProject(@"d:\projects\AspNetMvcProject\MyProject.csproj"); + AddFileToProject(@"d:\projects\AspNetMvcProject\Views\Shared\test.html"); + AddFileToProject(@"d:\projects\AspNetMvcProject\Views\Shared\test.cshtml"); + List files = GetRazorFiles(); + + var expectedFileName = new MvcProjectFile() { + FullPath = @"d:\projects\AspNetMvcProject\Views\Shared\test.cshtml", + FileName = "test.cshtml", + FolderRelativeToProject = @"Views\Shared" + }; + + var expectedFiles = new MvcProjectFile[] { + expectedFileName + }; + + MvcProjectFileCollectionAssert.AreEqual(expectedFiles, files); } [Test] - public void IsMvcMasterPage_NullFileNamePassed_ReturnsFalse() + public void GetRazorFiles_OneRazorWithFileExtensionInUpperCaseInProject_ReturnsOneRazorFileWithExpectedFileName() { - bool result = MvcMasterPageFileName.IsMasterPageFileName(null); + CreateProject(@"d:\projects\AspNetMvcProject\MyProject.csproj"); + AddFileToProject(@"d:\projects\AspNetMvcProject\Views\Shared\TEST.CSHTML"); + MvcProjectFile fileName = GetRazorFiles().First(); + + var expectedFileName = new MvcProjectFile() { + FullPath = @"d:\projects\AspNetMvcProject\Views\Shared\TEST.CSHTML", + FileName = "TEST.CSHTML", + FolderRelativeToProject = @"Views\Shared" + }; - Assert.IsFalse(result); + MvcProjectFileAssert.AreEqual(expectedFileName, fileName); } } }