diff --git a/src/AddIns/BackendBindings/AspNet.Mvc/Project/Src/AddMvcViewToProjectViewModel.cs b/src/AddIns/BackendBindings/AspNet.Mvc/Project/Src/AddMvcViewToProjectViewModel.cs index 40afcfc2d3..cf23bc8333 100644 --- a/src/AddIns/BackendBindings/AspNet.Mvc/Project/Src/AddMvcViewToProjectViewModel.cs +++ b/src/AddIns/BackendBindings/AspNet.Mvc/Project/Src/AddMvcViewToProjectViewModel.cs @@ -139,7 +139,7 @@ namespace ICSharpCode.AspNet.Mvc { if (IsStronglyTypedView) { if (SelectedModelClass != null) { - return SelectedModelClass.FullyQualifiedName; + return SelectedModelClass.FullName; } return ModelClassName.Trim(); } diff --git a/src/AddIns/BackendBindings/AspNet.Mvc/Project/Src/IMvcClass.cs b/src/AddIns/BackendBindings/AspNet.Mvc/Project/Src/IMvcClass.cs index f7757a8eb1..0f3d855a71 100644 --- a/src/AddIns/BackendBindings/AspNet.Mvc/Project/Src/IMvcClass.cs +++ b/src/AddIns/BackendBindings/AspNet.Mvc/Project/Src/IMvcClass.cs @@ -7,8 +7,9 @@ namespace ICSharpCode.AspNet.Mvc { public interface IMvcClass { - string FullyQualifiedName { get; } + string FullName { get; } string Name { get; } string Namespace { get; } + string BaseClassFullName { get; } } } diff --git a/src/AddIns/BackendBindings/AspNet.Mvc/Project/Src/MvcClass.cs b/src/AddIns/BackendBindings/AspNet.Mvc/Project/Src/MvcClass.cs index 2db4f3b5c7..fe366dff2c 100644 --- a/src/AddIns/BackendBindings/AspNet.Mvc/Project/Src/MvcClass.cs +++ b/src/AddIns/BackendBindings/AspNet.Mvc/Project/Src/MvcClass.cs @@ -15,7 +15,7 @@ namespace ICSharpCode.AspNet.Mvc this.c = c; } - public string FullyQualifiedName { + public string FullName { get { return c.FullyQualifiedName; } } @@ -26,5 +26,18 @@ namespace ICSharpCode.AspNet.Mvc public string Namespace { get { return c.Namespace; } } + + public string BaseClassFullName { + get { return GetBaseClassFullName(); } + } + + string GetBaseClassFullName() + { + IClass baseClass = c.BaseClass; + if (baseClass != null) { + return baseClass.FullyQualifiedName; + } + return String.Empty; + } } } diff --git a/src/AddIns/BackendBindings/AspNet.Mvc/Project/Src/MvcModelClassLocator.cs b/src/AddIns/BackendBindings/AspNet.Mvc/Project/Src/MvcModelClassLocator.cs index c85adb80ae..13726ec26c 100644 --- a/src/AddIns/BackendBindings/AspNet.Mvc/Project/Src/MvcModelClassLocator.cs +++ b/src/AddIns/BackendBindings/AspNet.Mvc/Project/Src/MvcModelClassLocator.cs @@ -22,12 +22,14 @@ namespace ICSharpCode.AspNet.Mvc public IEnumerable GetModelClasses(IMvcProject project) { - foreach (IMvcClass c in GetClasses(project)) { - yield return c; + foreach (IMvcClass c in GetAllClassesInProject(project)) { + if (IsModelClass(c)) { + yield return c; + } } } - IEnumerable GetClasses(IMvcProject project) + IEnumerable GetAllClassesInProject(IMvcProject project) { IMvcProjectContent projectContent = GetProjectContent(project); return projectContent.GetClasses(); @@ -37,5 +39,18 @@ namespace ICSharpCode.AspNet.Mvc { return parserService.GetProjectContent(project); } + + bool IsModelClass(IMvcClass c) + { + if (IsBaseClassMvcController(c)) { + return false; + } + return true; + } + + bool IsBaseClassMvcController(IMvcClass c) + { + return c.BaseClassFullName == "System.Web.Mvc.Controller"; + } } } diff --git a/src/AddIns/BackendBindings/AspNet.Mvc/Project/Src/MvcModelClassViewModel.cs b/src/AddIns/BackendBindings/AspNet.Mvc/Project/Src/MvcModelClassViewModel.cs index b567a52978..3383bfc097 100644 --- a/src/AddIns/BackendBindings/AspNet.Mvc/Project/Src/MvcModelClassViewModel.cs +++ b/src/AddIns/BackendBindings/AspNet.Mvc/Project/Src/MvcModelClassViewModel.cs @@ -31,8 +31,8 @@ namespace ICSharpCode.AspNet.Mvc return Name; } - public string FullyQualifiedName { - get { return mvcClass.FullyQualifiedName; } + public string FullName { + get { return mvcClass.FullName; } } } } 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 c9e66897b2..1d533a202a 100644 --- a/src/AddIns/BackendBindings/AspNet.Mvc/Test/AspNet.Mvc.Tests.csproj +++ b/src/AddIns/BackendBindings/AspNet.Mvc/Test/AspNet.Mvc.Tests.csproj @@ -50,6 +50,7 @@ Configuration\GlobalAssemblyInfo.cs + @@ -73,7 +74,8 @@ - + + diff --git a/src/AddIns/BackendBindings/AspNet.Mvc/Test/Helpers/FakeClass.cs b/src/AddIns/BackendBindings/AspNet.Mvc/Test/Helpers/FakeClass.cs new file mode 100644 index 0000000000..33f2a06ef0 --- /dev/null +++ b/src/AddIns/BackendBindings/AspNet.Mvc/Test/Helpers/FakeClass.cs @@ -0,0 +1,24 @@ +// Copyright (c) AlphaSierraPapa for the SharpDevelop Team (for details please see \doc\copyright.txt) +// This code is distributed under the GNU LGPL (for details please see \doc\license.txt) + +using System; +using ICSharpCode.SharpDevelop.Dom; + +namespace AspNet.Mvc.Tests.Helpers +{ + public class FakeClass : DefaultClass + { + public FakeClass(string name) + : base(new DefaultCompilationUnit(new DefaultProjectContent()), name) + { + } + + public FakeClass AddBaseClass(string name) + { + var baseClass = new FakeClass(name); + var returnType = new DefaultReturnType(baseClass); + BaseTypes.Add(returnType); + return baseClass; + } + } +} diff --git a/src/AddIns/BackendBindings/AspNet.Mvc/Test/Helpers/FakeMvcClass.cs b/src/AddIns/BackendBindings/AspNet.Mvc/Test/Helpers/FakeMvcClass.cs index 553117242a..b3b43d2335 100644 --- a/src/AddIns/BackendBindings/AspNet.Mvc/Test/Helpers/FakeMvcClass.cs +++ b/src/AddIns/BackendBindings/AspNet.Mvc/Test/Helpers/FakeMvcClass.cs @@ -8,9 +8,9 @@ namespace AspNet.Mvc.Tests.Helpers { public class FakeMvcClass : IMvcClass { - public FakeMvcClass(string fullyQualifiedName) + public FakeMvcClass(string fullName) { - this.FullyQualifiedName = fullyQualifiedName; + this.FullName = fullName; } public FakeMvcClass(string @namespace, string name) @@ -19,8 +19,9 @@ namespace AspNet.Mvc.Tests.Helpers this.Name = name; } - public string FullyQualifiedName { get; set; } + public string FullName { get; set; } public string Name { get; set; } public string Namespace { get; set; } + public string BaseClassFullName { get; set; } } } diff --git a/src/AddIns/BackendBindings/AspNet.Mvc/Test/Helpers/FakeMvcParserService.cs b/src/AddIns/BackendBindings/AspNet.Mvc/Test/Helpers/FakeMvcParserService.cs index d4e3341138..139ee2c8a4 100644 --- a/src/AddIns/BackendBindings/AspNet.Mvc/Test/Helpers/FakeMvcParserService.cs +++ b/src/AddIns/BackendBindings/AspNet.Mvc/Test/Helpers/FakeMvcParserService.cs @@ -17,9 +17,14 @@ namespace AspNet.Mvc.Tests.Helpers return FakeMvcProjectContent; } - public void AddModelClassToProjectContent(string fullyQualifiedClassName) + public FakeMvcClass AddModelClassToProjectContent(string fullyQualifiedClassName) { - FakeMvcProjectContent.AddFakeClass(fullyQualifiedClassName); + return FakeMvcProjectContent.AddFakeClass(fullyQualifiedClassName); + } + + public FakeMvcClass AddModelClassWithBaseClassToProjectContent(string baseClassName, string className) + { + return FakeMvcProjectContent.AddFakeClassWithBaseClass(baseClassName, className); } } } diff --git a/src/AddIns/BackendBindings/AspNet.Mvc/Test/Helpers/FakeMvcProjectContent.cs b/src/AddIns/BackendBindings/AspNet.Mvc/Test/Helpers/FakeMvcProjectContent.cs index 3f9d58ba13..463b28b53e 100644 --- a/src/AddIns/BackendBindings/AspNet.Mvc/Test/Helpers/FakeMvcProjectContent.cs +++ b/src/AddIns/BackendBindings/AspNet.Mvc/Test/Helpers/FakeMvcProjectContent.cs @@ -16,10 +16,19 @@ namespace AspNet.Mvc.Tests.Helpers return FakeClasses; } - public void AddFakeClass(string fullyQualifiedClassName) + public FakeMvcClass AddFakeClass(string fullyQualifiedClassName) { var fakeClass = new FakeMvcClass(fullyQualifiedClassName); FakeClasses.Add(fakeClass); + return fakeClass; + } + + public FakeMvcClass AddFakeClassWithBaseClass(string baseClassName, string className) + { + var fakeClass = new FakeMvcClass(className); + fakeClass.BaseClassFullName = baseClassName; + FakeClasses.Add(fakeClass); + return fakeClass; } } } diff --git a/src/AddIns/BackendBindings/AspNet.Mvc/Test/Src/MvcClassTests.cs b/src/AddIns/BackendBindings/AspNet.Mvc/Test/Src/MvcClassTests.cs new file mode 100644 index 0000000000..63f4ea8f53 --- /dev/null +++ b/src/AddIns/BackendBindings/AspNet.Mvc/Test/Src/MvcClassTests.cs @@ -0,0 +1,75 @@ +// 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.Dom; +using NUnit.Framework; + +namespace AspNet.Mvc.Tests +{ + [TestFixture] + public class MvcClassTests + { + MvcClass mvcClass; + FakeClass fakeClass; + + void CreateClass(string name) + { + fakeClass = new FakeClass(name); + mvcClass = new MvcClass(fakeClass); + } + + void AddBaseClass(string name) + { + fakeClass.AddBaseClass(name); + } + + [Test] + public void FullName_ClassIsICSharpCodeTestClass_ReturnsICSharpCodeTestClass() + { + CreateClass("ICSharpCode.TestClass"); + string name = mvcClass.FullName; + + Assert.AreEqual("ICSharpCode.TestClass", name); + } + + [Test] + public void Namespace_ClassIsICSharpCodeTestClass_ReturnsICSharpCode() + { + CreateClass("ICSharpCode.TestClass"); + string @namespace = mvcClass.Namespace; + + Assert.AreEqual("ICSharpCode", @namespace); + } + + [Test] + public void Name_ClassIsICSharpCodeTestClass_ReturnsTestClass() + { + CreateClass("ICSharpCode.TestClass"); + string name = mvcClass.Name; + + Assert.AreEqual("TestClass", name); + } + + [Test] + public void BaseClassFullName_ClassHasNoBaseClass_ReturnsEmptyString() + { + CreateClass("ICSharpCode.TestClass"); + string name = mvcClass.BaseClassFullName; + + Assert.AreEqual(String.Empty, name); + } + + [Test] + public void BaseClassFullName_ClassHasBaseClass_ReturnsBaseClassName() + { + CreateClass("ICSharpCode.TestClass"); + AddBaseClass("ICSharpCode.BaseClass"); + string name = mvcClass.BaseClassFullName; + + Assert.AreEqual("ICSharpCode.BaseClass", name); + } + } +} diff --git a/src/AddIns/BackendBindings/AspNet.Mvc/Test/Src/ModelClassLocatorTests.cs b/src/AddIns/BackendBindings/AspNet.Mvc/Test/Src/MvcModelClassLocatorTests.cs similarity index 65% rename from src/AddIns/BackendBindings/AspNet.Mvc/Test/Src/ModelClassLocatorTests.cs rename to src/AddIns/BackendBindings/AspNet.Mvc/Test/Src/MvcModelClassLocatorTests.cs index d900d35930..5cedf54e5b 100644 --- a/src/AddIns/BackendBindings/AspNet.Mvc/Test/Src/ModelClassLocatorTests.cs +++ b/src/AddIns/BackendBindings/AspNet.Mvc/Test/Src/MvcModelClassLocatorTests.cs @@ -11,7 +11,7 @@ using NUnit.Framework; namespace AspNet.Mvc.Tests { [TestFixture] - public class ModelClassLocatorTests + public class MvcModelClassLocatorTests { MvcModelClassLocator locator; FakeMvcProject fakeProject; @@ -29,14 +29,24 @@ namespace AspNet.Mvc.Tests return locator.GetModelClasses(fakeProject).ToList(); } - void AddModelClass(string fullyQualifiedClassName) + FakeMvcClass AddModelClass(string className) { - fakeParserService.AddModelClassToProjectContent(fullyQualifiedClassName); + return fakeParserService.AddModelClassToProjectContent(className); + } + + FakeMvcClass AddModelClassWithBaseClass(string baseClassName, string className) + { + return fakeParserService.AddModelClassWithBaseClassToProjectContent(baseClassName, className); } string GetFirstModelClassName() { - return GetModelClasses().First().FullyQualifiedName; + return GetModelClasses().First().FullName; + } + + int GetModelClassCount() + { + return GetModelClasses().Count; } [Test] @@ -54,7 +64,7 @@ namespace AspNet.Mvc.Tests { CreateLocator(); AddModelClass("MyNamespace.MyClass"); - int count = GetModelClasses().Count; + int count = GetModelClassCount(); Assert.AreEqual(1, count); } @@ -67,5 +77,16 @@ namespace AspNet.Mvc.Tests Assert.AreEqual(fakeProject, fakeParserService.ProjectPassedToGetProjectContent); } + + [Test] + public void GetModelClasses_ControllerClassInProject_ControllerClassNotReturnedInModelClasses() + { + CreateLocator(); + AddModelClassWithBaseClass("System.Web.Mvc.Controller", "ICSharpCode.FooController"); + GetModelClasses(); + int count = GetModelClassCount(); + + Assert.AreEqual(0, count); + } } } diff --git a/src/AddIns/BackendBindings/AspNet.Mvc/Test/Src/MvcModelClassViewModelTests.cs b/src/AddIns/BackendBindings/AspNet.Mvc/Test/Src/MvcModelClassViewModelTests.cs index b76dc8228f..882902f640 100644 --- a/src/AddIns/BackendBindings/AspNet.Mvc/Test/Src/MvcModelClassViewModelTests.cs +++ b/src/AddIns/BackendBindings/AspNet.Mvc/Test/Src/MvcModelClassViewModelTests.cs @@ -45,10 +45,10 @@ namespace AspNet.Mvc.Tests } [Test] - public void FullyQualifiedName_ClassHasNamespaceAndName_ReturnsFullyQualifiedClassName() + public void FullName_ClassHasNamespaceAndName_ReturnsFullyQualifiedClassName() { CreateViewModel("ICSharpCode.Tests.MyClass"); - string name = viewModel.FullyQualifiedName; + string name = viewModel.FullName; Assert.AreEqual("ICSharpCode.Tests.MyClass", name); } diff --git a/src/AddIns/BackendBindings/AspNet.Mvc/Test/Src/MvcProjectTests.cs b/src/AddIns/BackendBindings/AspNet.Mvc/Test/Src/MvcProjectTests.cs index 2e0a555b00..b65d78137c 100644 --- a/src/AddIns/BackendBindings/AspNet.Mvc/Test/Src/MvcProjectTests.cs +++ b/src/AddIns/BackendBindings/AspNet.Mvc/Test/Src/MvcProjectTests.cs @@ -86,7 +86,7 @@ namespace AspNet.Mvc.Tests string[] modelClasses = project .GetModelClasses() - .Select(m => m.FullyQualifiedName) + .Select(m => m.FullName) .ToArray(); string[] expectedModelClasses = new string[] {