diff --git a/src/AddIns/BackendBindings/AspNet.Mvc/Project/Src/AddMvcViewToProjectViewModel.cs b/src/AddIns/BackendBindings/AspNet.Mvc/Project/Src/AddMvcViewToProjectViewModel.cs index 7f4115ce81..9d51b34db8 100644 --- a/src/AddIns/BackendBindings/AspNet.Mvc/Project/Src/AddMvcViewToProjectViewModel.cs +++ b/src/AddIns/BackendBindings/AspNet.Mvc/Project/Src/AddMvcViewToProjectViewModel.cs @@ -280,7 +280,10 @@ namespace ICSharpCode.AspNet.Mvc IEnumerable GetAspxMasterPageFileNames() { - return selectedViewFolder.Project.GetAspxMasterPageFileNames(); + var unsortedMasterPages = selectedViewFolder.Project.GetAspxMasterPageFileNames() as IEnumerable; + var masterPages = new List(unsortedMasterPages); + masterPages.Sort(); + return masterPages; } public void CloseSelectMasterPageView() diff --git a/src/AddIns/BackendBindings/AspNet.Mvc/Project/Src/MvcMasterPageFileName.cs b/src/AddIns/BackendBindings/AspNet.Mvc/Project/Src/MvcMasterPageFileName.cs index 2562d997b5..70854cef7e 100644 --- a/src/AddIns/BackendBindings/AspNet.Mvc/Project/Src/MvcMasterPageFileName.cs +++ b/src/AddIns/BackendBindings/AspNet.Mvc/Project/Src/MvcMasterPageFileName.cs @@ -7,7 +7,7 @@ using ICSharpCode.SharpDevelop.Project; namespace ICSharpCode.AspNet.Mvc { - public class MvcMasterPageFileName + public class MvcMasterPageFileName : IComparable { public MvcMasterPageFileName(FileProjectItem fileProjectItem) { @@ -81,5 +81,24 @@ namespace ICSharpCode.AspNet.Mvc } return String.Empty; } + + public int CompareTo(MvcMasterPageFileName other) + { + int result = CompareFileNames(other); + if (result == 0) { + return CompareFolderRelativeToProject(other); + } + return result; + } + + int CompareFileNames(MvcMasterPageFileName other) + { + return FileName.CompareTo(other.FileName); + } + + int CompareFolderRelativeToProject(MvcMasterPageFileName other) + { + return FolderRelativeToProject.CompareTo(other.FolderRelativeToProject); + } } } diff --git a/src/AddIns/BackendBindings/AspNet.Mvc/Test/Src/AddMvcViewToProjectViewModelTests.cs b/src/AddIns/BackendBindings/AspNet.Mvc/Test/Src/AddMvcViewToProjectViewModelTests.cs index 8846cbdda1..98c7a04cf5 100644 --- a/src/AddIns/BackendBindings/AspNet.Mvc/Test/Src/AddMvcViewToProjectViewModelTests.cs +++ b/src/AddIns/BackendBindings/AspNet.Mvc/Test/Src/AddMvcViewToProjectViewModelTests.cs @@ -912,5 +912,34 @@ namespace AspNet.Mvc.Tests Assert.IsTrue(fired); } + + [Test] + public void MasterPages_ProjectContainsTwoAspxMasterPagesInIncorrectSortOrder_ReturnsTwoAspxMasterPagesSorted() + { + CreateViewModel(); + SelectAspxViewEngine(); + var masterPageFile1 = new MvcMasterPageFileName() { + FullPath = @"d:\projects\MyProject\Views\Shared\ViewSite.Master", + FileName = "ViewSite.Master", + FolderRelativeToProject = @"Views\Shared" + }; + fakeProject.AddMasterPageFile(masterPageFile1); + var masterPageFile2 = new MvcMasterPageFileName() { + FullPath = @"d:\projects\MyProject\Views\Shared\Site.Master", + FileName = "Site.Master", + FolderRelativeToProject = @"Views\Shared" + }; + fakeProject.AddMasterPageFile(masterPageFile2); + viewModel.OpenSelectMasterPageView(); + + var expectedFileNames = new MvcMasterPageFileName[] { + masterPageFile2, + masterPageFile1 + }; + + ObservableCollection fileNames = viewModel.MasterPages; + + Assert.AreEqual(expectedFileNames, fileNames); + } } } diff --git a/src/AddIns/BackendBindings/AspNet.Mvc/Test/Src/MvcMasterPageFileNameTests.cs b/src/AddIns/BackendBindings/AspNet.Mvc/Test/Src/MvcMasterPageFileNameTests.cs index c91f028015..219f14d972 100644 --- a/src/AddIns/BackendBindings/AspNet.Mvc/Test/Src/MvcMasterPageFileNameTests.cs +++ b/src/AddIns/BackendBindings/AspNet.Mvc/Test/Src/MvcMasterPageFileNameTests.cs @@ -20,11 +20,12 @@ namespace AspNet.Mvc.Tests project = TestableProject.CreateProject(fileName, "MyProject"); } - void CreateMasterPageFileName(string fullPath) + MvcMasterPageFileName CreateMasterPageFileName(string fullPath) { var projectItem = new FileProjectItem(project, ItemType.Compile); projectItem.FileName = fullPath; masterPageFileName = new MvcMasterPageFileName(projectItem); + return masterPageFileName; } [Test] @@ -82,5 +83,65 @@ namespace AspNet.Mvc.Tests Assert.AreEqual("~/Site.Master", virtualPath); } + + [Test] + 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"); + + int result = lhs.CompareTo(rhs); + + Assert.AreEqual(0, result); + } + + [Test] + 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"); + + int result = lhs.CompareTo(rhs); + + Assert.AreEqual(-1, result); + } + + [Test] + 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"); + + int result = lhs.CompareTo(rhs); + + Assert.AreEqual(1, result); + } + + [Test] + 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"); + + int result = lhs.CompareTo(rhs); + + Assert.AreEqual(1, result); + } + + [Test] + 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"); + + int result = lhs.CompareTo(rhs); + + Assert.AreEqual(-1, result); + } } }