From 57878071305289c418d16536db36c4be7a859d06 Mon Sep 17 00:00:00 2001 From: Matt Ward Date: Sun, 16 Oct 2011 21:05:39 +0100 Subject: [PATCH] Fix InvalidCastException in Unit Tests addin when a field has an attribute. --- .../UnitTesting/Src/NUnitTestFramework.cs | 20 ++- .../NUnitTestFrameworkIsTestMemberTests.cs | 152 ++++++++++++++++++ .../NUnitTestFrameworkIsTestMethodTests.cs | 109 ------------- .../UnitTesting/Test/UnitTesting.Tests.csproj | 2 +- 4 files changed, 165 insertions(+), 118 deletions(-) create mode 100644 src/AddIns/Analysis/UnitTesting/Test/Frameworks/NUnitTestFrameworkIsTestMemberTests.cs delete mode 100644 src/AddIns/Analysis/UnitTesting/Test/Frameworks/NUnitTestFrameworkIsTestMethodTests.cs diff --git a/src/AddIns/Analysis/UnitTesting/Src/NUnitTestFramework.cs b/src/AddIns/Analysis/UnitTesting/Src/NUnitTestFramework.cs index db8ec348b2..99dce8a153 100644 --- a/src/AddIns/Analysis/UnitTesting/Src/NUnitTestFramework.cs +++ b/src/AddIns/Analysis/UnitTesting/Src/NUnitTestFramework.cs @@ -18,7 +18,7 @@ namespace ICSharpCode.UnitTesting { if (project != null) { foreach (ProjectItem projectItem in project.Items) { - ReferenceProjectItem referenceProjectItem = projectItem as ReferenceProjectItem; + var referenceProjectItem = projectItem as ReferenceProjectItem; if (IsNUnitFrameworkAssemblyReference(referenceProjectItem)) { return true; } @@ -75,16 +75,20 @@ namespace ICSharpCode.UnitTesting /// public bool IsTestMember(IMember member) { - if (member == null) { - return false; + var method = member as IMethod; + if (method != null) { + return IsTestMethod(method); } - - StringComparer nameComparer = GetNameComparer(member.DeclaringType); + return false; + } + + bool IsTestMethod(IMethod method) + { + var nameComparer = GetNameComparer(method.DeclaringType); if (nameComparer != null) { - NUnitTestAttributeName testAttribute = new NUnitTestAttributeName("Test", nameComparer); - foreach (IAttribute attribute in member.Attributes) { + var testAttribute = new NUnitTestAttributeName("Test", nameComparer); + foreach (IAttribute attribute in method.Attributes) { if (testAttribute.IsEqual(attribute)) { - IMethod method = (IMethod)member; if (method.Parameters.Count == 0) { return true; } diff --git a/src/AddIns/Analysis/UnitTesting/Test/Frameworks/NUnitTestFrameworkIsTestMemberTests.cs b/src/AddIns/Analysis/UnitTesting/Test/Frameworks/NUnitTestFrameworkIsTestMemberTests.cs new file mode 100644 index 0000000000..1d439c6682 --- /dev/null +++ b/src/AddIns/Analysis/UnitTesting/Test/Frameworks/NUnitTestFrameworkIsTestMemberTests.cs @@ -0,0 +1,152 @@ +// 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 ICSharpCode.SharpDevelop.Dom; +using ICSharpCode.SharpDevelop.Project; +using ICSharpCode.UnitTesting; +using NUnit.Framework; +using System; +using System.Collections.Generic; +using UnitTesting.Tests.Utils; + +namespace UnitTesting.Tests.Frameworks +{ + [TestFixture] + public class NUnitTestFrameworkIsTestMemberTests + { + NUnitTestFramework testFramework; + + void CreateTestFramework() + { + testFramework = new NUnitTestFramework(); + } + + [Test] + public void IsTestMember_MethodHasNoAttributes_ReturnsFalse() + { + CreateTestFramework(); + MockMethod mockMethod = MockMethod.CreateMockMethodWithoutAnyAttributes(); + + bool result = testFramework.IsTestMember(mockMethod); + + Assert.IsFalse(result); + } + + [Test] + public void IsTestMember_MethodHasTestAttributeWithoutAttributePart_ReturnsTrue() + { + CreateTestFramework(); + MockAttribute testAttribute = new MockAttribute("Test"); + MockMethod mockMethod = MockMethod.CreateMockMethodWithAttribute(testAttribute); + + bool result = testFramework.IsTestMember(mockMethod); + + Assert.IsTrue(result); + } + + [Test] + public void IsTestMember_MethodHasTestAttributeAttribute_ReturnsTrue() + { + CreateTestFramework(); + MockAttribute testAttribute = new MockAttribute("TestAttribute"); + MockMethod mockMethod = MockMethod.CreateMockMethodWithAttribute(testAttribute); + + bool result = testFramework.IsTestMember(mockMethod); + + Assert.IsTrue(result); + } + + [Test] + public void IsTestMember_MethodHasFullyQualifiedNUnitTestAttribute_ReturnsTrue() + { + CreateTestFramework(); + MockAttribute testAttribute = new MockAttribute("NUnit.Framework.TestAttribute"); + MockMethod mockMethod = MockMethod.CreateMockMethodWithAttribute(testAttribute); + + bool result = testFramework.IsTestMember(mockMethod); + + Assert.IsTrue(result); + } + + [Test] + public void IsTestMember_MethodIsNull_ReturnsFalse() + { + CreateTestFramework(); + bool result = testFramework.IsTestMember(null); + + Assert.IsFalse(result); + } + + [Test] + public void IsTestMember_ProjectContentLanguageHasNullNameComparer_ReturnsFalse() + { + CreateTestFramework(); + MockClass mockClass = MockClass.CreateMockClassWithoutAnyAttributes(); + mockClass.MockProjectContent.Language = new LanguageProperties(null); + var mockMethod = new MockMethod(mockClass); + mockMethod.Attributes.Add(new MockAttribute("Test")); + + bool result = testFramework.IsTestMember(mockMethod); + + Assert.IsFalse(result); + } + + /// + /// Even if the project is null the method should be + /// flagged as a TestMethod. + /// + [Test] + public void IsTestMember_ProjectIsNull_ReturnsTrue() + { + CreateTestFramework(); + var testAttribute = new MockAttribute("Test"); + MockMethod mockMethod = MockMethod.CreateMockMethodWithAttribute(testAttribute); + MockProjectContent mockProjectContent = (MockProjectContent)mockMethod.DeclaringType.ProjectContent; + mockProjectContent.Project = null; + + bool result = testFramework.IsTestMember(mockMethod); + + Assert.IsTrue(result); + } + + [Test] + public void IsTestMember_MethodHasNullLanguage_ReturnsFalse() + { + CreateTestFramework(); + MockClass mockClass = MockClass.CreateMockClassWithoutAnyAttributes(); + mockClass.MockProjectContent.Language = null; + var mockMethod = new MockMethod(mockClass); + bool result = testFramework.IsTestMember(mockMethod); + + Assert.IsFalse(result); + } + + [Test] + public void IsTestMember_MethodHasParameters_ReturnsFalse() + { + CreateTestFramework(); + var testAttribute = new MockAttribute("Test"); + MockMethod mockMethod = MockMethod.CreateMockMethodWithAttribute(testAttribute); + var mockParameter = new MockParameter(); + mockMethod.Parameters.Add(mockParameter); + + bool result = testFramework.IsTestMember(mockMethod); + + Assert.IsFalse(result); + } + + [Test] + public void IsTestMember_FieldHasOneAttribute_ReturnsFalseAndDoesNotThrowInvalidCastException() + { + CreateTestFramework(); + MockClass mockClass = MockClass.CreateMockClassWithoutAnyAttributes(); + var field = new DefaultField(mockClass, "MyField"); + var testAttribute = new MockAttribute("Test"); + field.Attributes.Add(testAttribute); + + bool result = testFramework.IsTestMember(field); + + Assert.IsFalse(result); + } + } +} diff --git a/src/AddIns/Analysis/UnitTesting/Test/Frameworks/NUnitTestFrameworkIsTestMethodTests.cs b/src/AddIns/Analysis/UnitTesting/Test/Frameworks/NUnitTestFrameworkIsTestMethodTests.cs deleted file mode 100644 index f746ca2a20..0000000000 --- a/src/AddIns/Analysis/UnitTesting/Test/Frameworks/NUnitTestFrameworkIsTestMethodTests.cs +++ /dev/null @@ -1,109 +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 ICSharpCode.SharpDevelop.Dom; -using ICSharpCode.SharpDevelop.Project; -using ICSharpCode.UnitTesting; -using NUnit.Framework; -using System; -using System.Collections.Generic; -using UnitTesting.Tests.Utils; - -namespace UnitTesting.Tests.Frameworks -{ - [TestFixture] - public class NUnitTestFrameworkIsTestMethodTests - { - NUnitTestFramework testFramework; - - [SetUp] - public void Init() - { - testFramework = new NUnitTestFramework(); - } - - [Test] - public void IsTestMethodReturnsFalseWhenMethodHasNoAttributes() - { - MockMethod mockMethod = MockMethod.CreateMockMethodWithoutAnyAttributes(); - Assert.IsFalse(testFramework.IsTestMember(mockMethod)); - } - - [Test] - public void IsTestMethodReturnsTrueWhenMethodHasTestAttributeWithoutAttributePart() - { - MockAttribute testAttribute = new MockAttribute("Test"); - MockMethod mockMethod = MockMethod.CreateMockMethodWithAttribute(testAttribute); - Assert.IsTrue(testFramework.IsTestMember(mockMethod)); - } - - [Test] - public void IsTestMethodReturnsTrueWhenMethodHasTestAttributeAttribute() - { - MockAttribute testAttribute = new MockAttribute("TestAttribute"); - MockMethod mockMethod = MockMethod.CreateMockMethodWithAttribute(testAttribute); - Assert.IsTrue(testFramework.IsTestMember(mockMethod)); - } - - [Test] - public void IsTestMethodReturnsTrueWhenMethodHasFullyQualifiedNUnitTestAttribute() - { - MockAttribute testAttribute = new MockAttribute("NUnit.Framework.TestAttribute"); - MockMethod mockMethod = MockMethod.CreateMockMethodWithAttribute(testAttribute); - Assert.IsTrue(testFramework.IsTestMember(mockMethod)); - } - - [Test] - public void IsTestMethodReturnsFalseWhenMethodIsNull() - { - Assert.IsFalse(testFramework.IsTestMember(null)); - } - - [Test] - public void IsTestMethodReturnsFalseWhenProjectContentLanguageHasNullNameComparer() - { - MockClass mockClass = MockClass.CreateMockClassWithoutAnyAttributes(); - mockClass.MockProjectContent.Language = new LanguageProperties(null); - MockMethod mockMethod = new MockMethod(mockClass); - mockMethod.Attributes.Add(new MockAttribute("Test")); - - Assert.IsFalse(testFramework.IsTestMember(mockMethod)); - } - - /// - /// Even if the project is null the method should be - /// flagged as a TestMethod. - /// - [Test] - public void IsTestMethodReturnsTrueWhenProjectIsNull() - { - MockAttribute testAttribute = new MockAttribute("Test"); - MockMethod mockMethod = MockMethod.CreateMockMethodWithAttribute(testAttribute); - MockProjectContent mockProjectContent = (MockProjectContent)mockMethod.DeclaringType.ProjectContent; - mockProjectContent.Project = null; - - Assert.IsTrue(testFramework.IsTestMember(mockMethod)); - } - - [Test] - public void IsTestMethodReturnsFalseWhenMethodHasNullLanguage() - { - MockClass mockClass = MockClass.CreateMockClassWithoutAnyAttributes(); - mockClass.MockProjectContent.Language = null; - MockMethod mockMethod = new MockMethod(mockClass); - - Assert.IsFalse(testFramework.IsTestMember(mockMethod)); - } - - [Test] - public void IsTestMethodReturnsFalseWhenMethodHasHasParameters() - { - MockAttribute testAttribute = new MockAttribute("Test"); - MockMethod mockMethod = MockMethod.CreateMockMethodWithAttribute(testAttribute); - MockParameter mockParameter = new MockParameter(); - mockMethod.Parameters.Add(mockParameter); - - Assert.IsFalse(testFramework.IsTestMember(mockMethod)); - } - } -} diff --git a/src/AddIns/Analysis/UnitTesting/Test/UnitTesting.Tests.csproj b/src/AddIns/Analysis/UnitTesting/Test/UnitTesting.Tests.csproj index d4c0f61335..62555b7124 100644 --- a/src/AddIns/Analysis/UnitTesting/Test/UnitTesting.Tests.csproj +++ b/src/AddIns/Analysis/UnitTesting/Test/UnitTesting.Tests.csproj @@ -67,7 +67,7 @@ - +