Browse Source
git-svn-id: svn://svn.sharpdevelop.net/sharpdevelop/branches/3.0@3608 1ccf3a8d-04fe-1044-b7c0-cef0b8235c61shortcuts
15 changed files with 610 additions and 98 deletions
@ -0,0 +1,56 @@
@@ -0,0 +1,56 @@
|
||||
// <file>
|
||||
// <copyright see="prj:///doc/copyright.txt"/>
|
||||
// <license see="prj:///doc/license.txt"/>
|
||||
// <owner name="Matthew Ward" email="mrward@users.sourceforge.net"/>
|
||||
// <version>$Revision$</version>
|
||||
// </file>
|
||||
|
||||
using System; |
||||
using System.Collections.Generic; |
||||
using ICSharpCode.SharpDevelop.Dom; |
||||
|
||||
namespace ICSharpCode.UnitTesting |
||||
{ |
||||
/// <summary>
|
||||
/// Used to determine which classes have been removed by the user in the project.
|
||||
/// </summary>
|
||||
public class RemovedClasses |
||||
{ |
||||
Dictionary<string, IClass> classDictionary = new Dictionary<string, IClass>(); |
||||
|
||||
public RemovedClasses() |
||||
{ |
||||
} |
||||
|
||||
public void Add(IList<IClass> classes) |
||||
{ |
||||
foreach (IClass c in classes) { |
||||
classDictionary[c.DotNetName] = c; |
||||
foreach (IClass innerClass in c.InnerClasses) { |
||||
classDictionary[innerClass.DotNetName] = innerClass; |
||||
} |
||||
} |
||||
} |
||||
|
||||
/// <summary>
|
||||
///
|
||||
/// </summary>
|
||||
/// <param name="c"></param>
|
||||
public void Remove(IClass c) |
||||
{ |
||||
classDictionary.Remove(c.DotNetName); |
||||
foreach (IClass innerClass in c.InnerClasses) { |
||||
classDictionary.Remove(innerClass.DotNetName); |
||||
} |
||||
} |
||||
|
||||
public IList<IClass> GetMissingClasses() |
||||
{ |
||||
List<IClass> missingClasses = new List<IClass>(); |
||||
foreach (IClass c in classDictionary.Values) { |
||||
missingClasses.Add(c); |
||||
} |
||||
return missingClasses; |
||||
} |
||||
} |
||||
} |
||||
@ -0,0 +1,73 @@
@@ -0,0 +1,73 @@
|
||||
// <file>
|
||||
// <copyright see="prj:///doc/copyright.txt"/>
|
||||
// <license see="prj:///doc/license.txt"/>
|
||||
// <owner name="Matthew Ward" email="mrward@users.sourceforge.net"/>
|
||||
// <version>$Revision$</version>
|
||||
// </file>
|
||||
|
||||
using System; |
||||
using ICSharpCode.SharpDevelop.Dom; |
||||
using ICSharpCode.UnitTesting; |
||||
using NUnit.Framework; |
||||
using UnitTesting.Tests.Utils; |
||||
|
||||
namespace UnitTesting.Tests.Project |
||||
{ |
||||
/// <summary>
|
||||
/// Tests what happens when a test method is renamed inside an inner class.
|
||||
/// </summary>
|
||||
[TestFixture] |
||||
public class InnerClassMethodRemovedTestFixture : InnerClassTestFixtureBase |
||||
{ |
||||
TestClass innerTestClass; |
||||
|
||||
[SetUp] |
||||
public void Init() |
||||
{ |
||||
base.InitBase(); |
||||
|
||||
DefaultCompilationUnit oldUnit = new DefaultCompilationUnit(projectContent); |
||||
oldUnit.Classes.Add(outerClass); |
||||
|
||||
// Create new compilation unit with inner class that has its method renamed.
|
||||
DefaultCompilationUnit newUnit = new DefaultCompilationUnit(projectContent); |
||||
MockClass newOuterClass = new MockClass("MyTests.A"); |
||||
newOuterClass.ProjectContent = projectContent; |
||||
projectContent.Classes.Add(newOuterClass); |
||||
newOuterClass.SetCompoundClass(newOuterClass); |
||||
newUnit.Classes.Add(newOuterClass); |
||||
|
||||
// Create the inner test class.
|
||||
MockClass newInnerClass = new MockClass("MyTests.A.InnerATest", "MyTests.A+InnerATest"); |
||||
newInnerClass.Attributes.Add(new MockAttribute("TestFixture")); |
||||
newInnerClass.ProjectContent = projectContent; |
||||
newInnerClass.DeclaringType = outerClass; // Declaring type is outer class.
|
||||
newInnerClass.SetCompoundClass(newInnerClass); |
||||
newOuterClass.InnerClasses.Add(newInnerClass); |
||||
|
||||
MockMethod method = new MockMethod("FooBarRenamed"); |
||||
method.Attributes.Add(new MockAttribute("Test")); |
||||
method.DeclaringType = newInnerClass; |
||||
newInnerClass.Methods.Add(method); |
||||
outerClass.InnerClasses.Add(newInnerClass); |
||||
|
||||
// Update TestProject's parse info.
|
||||
testProject.UpdateParseInfo(oldUnit, newUnit); |
||||
|
||||
innerTestClass = testProject.TestClasses["MyTests.A+InnerATest"]; |
||||
} |
||||
|
||||
[Test] |
||||
public void NewTestMethodExists() |
||||
{ |
||||
TestMethod method = innerTestClass.TestMethods[0]; |
||||
Assert.AreEqual("FooBarRenamed", method.Name); |
||||
} |
||||
|
||||
[Test] |
||||
public void OldTestMethodRemoved() |
||||
{ |
||||
Assert.AreEqual(1, innerTestClass.TestMethods.Count); |
||||
} |
||||
} |
||||
} |
||||
@ -0,0 +1,69 @@
@@ -0,0 +1,69 @@
|
||||
// <file>
|
||||
// <copyright see="prj:///doc/copyright.txt"/>
|
||||
// <license see="prj:///doc/license.txt"/>
|
||||
// <owner name="Matthew Ward" email="mrward@users.sourceforge.net"/>
|
||||
// <version>$Revision$</version>
|
||||
// </file>
|
||||
|
||||
using System; |
||||
using ICSharpCode.SharpDevelop.Dom; |
||||
using ICSharpCode.SharpDevelop.Project; |
||||
using ICSharpCode.UnitTesting; |
||||
using NUnit.Framework; |
||||
using UnitTesting.Tests.Utils; |
||||
|
||||
namespace UnitTesting.Tests.Project |
||||
{ |
||||
/// <summary>
|
||||
/// Tests that the TestProject is correctly updated after the inner class name changes.
|
||||
/// </summary>
|
||||
[TestFixture] |
||||
public class InnerClassNameChangesTestFixture : InnerClassTestFixtureBase |
||||
{ |
||||
[SetUp] |
||||
public void Init() |
||||
{ |
||||
base.InitBase(); |
||||
|
||||
DefaultCompilationUnit oldUnit = new DefaultCompilationUnit(projectContent); |
||||
oldUnit.Classes.Add(outerClass); |
||||
|
||||
// Create new compilation unit with extra class.
|
||||
DefaultCompilationUnit newUnit = new DefaultCompilationUnit(projectContent); |
||||
MockClass newOuterClass = new MockClass("MyTests.A"); |
||||
newOuterClass.ProjectContent = projectContent; |
||||
projectContent.Classes.Add(newOuterClass); |
||||
newOuterClass.SetCompoundClass(newOuterClass); |
||||
newUnit.Classes.Add(newOuterClass); |
||||
|
||||
// Create the inner test class.
|
||||
// Note the use of the DotNetName "MyTests.A+InnerTest".
|
||||
MockClass newInnerClass = new MockClass("MyTests.A.InnerATestMod", "MyTests.A+InnerATestMod"); |
||||
newInnerClass.Attributes.Add(new MockAttribute("TestFixture")); |
||||
newInnerClass.ProjectContent = projectContent; |
||||
newInnerClass.DeclaringType = outerClass; // Declaring type is outer class.
|
||||
newOuterClass.InnerClasses.Add(newInnerClass); |
||||
|
||||
// Update TestProject's parse info.
|
||||
testProject.UpdateParseInfo(oldUnit, newUnit); |
||||
} |
||||
|
||||
[Test] |
||||
public void NewInnerClassAdded() |
||||
{ |
||||
Assert.IsTrue(testProject.TestClasses.Contains("MyTests.A+InnerATestMod")); |
||||
} |
||||
|
||||
[Test] |
||||
public void OldInnerClassRemoved() |
||||
{ |
||||
Assert.IsFalse(testProject.TestClasses.Contains("MyTests.A+InnerATest")); |
||||
} |
||||
|
||||
[Test] |
||||
public void OneTestClassRemain() |
||||
{ |
||||
Assert.AreEqual(1, testProject.TestClasses.Count); |
||||
} |
||||
} |
||||
} |
||||
@ -0,0 +1,79 @@
@@ -0,0 +1,79 @@
|
||||
// <file>
|
||||
// <copyright see="prj:///doc/copyright.txt"/>
|
||||
// <license see="prj:///doc/license.txt"/>
|
||||
// <owner name="Matthew Ward" email="mrward@users.sourceforge.net"/>
|
||||
// <version>$Revision$</version>
|
||||
// </file>
|
||||
|
||||
using System; |
||||
using ICSharpCode.SharpDevelop.Dom; |
||||
using ICSharpCode.SharpDevelop.Project; |
||||
using ICSharpCode.UnitTesting; |
||||
using NUnit.Framework; |
||||
using UnitTesting.Tests.Utils; |
||||
|
||||
namespace UnitTesting.Tests.Project |
||||
{ |
||||
/// <summary>
|
||||
/// Tests that a class with an inner test fixture is recognised, for example:
|
||||
///
|
||||
/// public class A
|
||||
/// {
|
||||
/// [TestFixture]
|
||||
/// public class InnerATest
|
||||
/// {
|
||||
/// [Test]
|
||||
/// public void FooBar()
|
||||
/// {
|
||||
/// }
|
||||
/// }
|
||||
/// }
|
||||
///
|
||||
/// In this case the FooBar test is identified via: "A+InnerATest.FooBar".
|
||||
/// </summary>
|
||||
[TestFixture] |
||||
public class InnerClassTestFixture : InnerClassTestFixtureBase |
||||
{ |
||||
[SetUp] |
||||
public void Init() |
||||
{ |
||||
base.InitBase(); |
||||
} |
||||
|
||||
[Test] |
||||
public void OneTestClassFound() |
||||
{ |
||||
Assert.AreEqual(1, testProject.TestClasses.Count); |
||||
} |
||||
|
||||
[Test] |
||||
public void TestClassQualifiedName() |
||||
{ |
||||
Assert.AreEqual("MyTests.A+InnerATest", testClass.QualifiedName); |
||||
} |
||||
|
||||
[Test] |
||||
public void TestClassName() |
||||
{ |
||||
Assert.AreEqual("A+InnerATest", testClass.Name); |
||||
} |
||||
|
||||
[Test] |
||||
public void NoTestClassesForNamespaceMyTestsA() |
||||
{ |
||||
Assert.AreEqual(0, testProject.GetTestClasses("MyTests.A").Length); |
||||
} |
||||
|
||||
[Test] |
||||
public void OneTestClassForNamespaceMyTests() |
||||
{ |
||||
Assert.AreEqual(1, testProject.GetTestClasses("MyTests").Length); |
||||
} |
||||
|
||||
[Test] |
||||
public void NamespaceForInnerClassIsDeclaringTypesNamespace() |
||||
{ |
||||
Assert.AreEqual("MyTests", testClass.Namespace); |
||||
} |
||||
} |
||||
} |
||||
@ -0,0 +1,61 @@
@@ -0,0 +1,61 @@
|
||||
// <file>
|
||||
// <copyright see="prj:///doc/copyright.txt"/>
|
||||
// <license see="prj:///doc/license.txt"/>
|
||||
// <owner name="Matthew Ward" email="mrward@users.sourceforge.net"/>
|
||||
// <version>$Revision$</version>
|
||||
// </file>
|
||||
|
||||
using System; |
||||
using ICSharpCode.SharpDevelop.Dom; |
||||
using ICSharpCode.UnitTesting; |
||||
using NUnit.Framework; |
||||
using UnitTesting.Tests.Utils; |
||||
|
||||
namespace UnitTesting.Tests.Project |
||||
{ |
||||
/// <summary>
|
||||
/// Tests that the inner test class is removed when its TestFixture attribute is removed.
|
||||
/// </summary>
|
||||
[TestFixture] |
||||
public class InnerClassTestFixtureAttributeRemovedTestFixture : InnerClassTestFixtureBase |
||||
{ |
||||
[SetUp] |
||||
public void Init() |
||||
{ |
||||
base.InitBase(); |
||||
|
||||
DefaultCompilationUnit oldUnit = new DefaultCompilationUnit(projectContent); |
||||
oldUnit.Classes.Add(outerClass); |
||||
|
||||
// Create new compilation unit with inner class that no longer has the TestFixture attribute.
|
||||
DefaultCompilationUnit newUnit = new DefaultCompilationUnit(projectContent); |
||||
MockClass newOuterClass = new MockClass("MyTests.A"); |
||||
newOuterClass.ProjectContent = projectContent; |
||||
projectContent.Classes.Add(newOuterClass); |
||||
newOuterClass.SetCompoundClass(newOuterClass); |
||||
newUnit.Classes.Add(newOuterClass); |
||||
|
||||
// Create the inner test class.
|
||||
MockClass newInnerClass = new MockClass("MyTests.A.InnerATest", "MyTests.A+InnerATest"); |
||||
newInnerClass.ProjectContent = projectContent; |
||||
newInnerClass.DeclaringType = outerClass; // Declaring type is outer class.
|
||||
newInnerClass.SetCompoundClass(newInnerClass); |
||||
newOuterClass.InnerClasses.Add(newInnerClass); |
||||
|
||||
// Update TestProject's parse info.
|
||||
testProject.UpdateParseInfo(oldUnit, newUnit); |
||||
} |
||||
|
||||
[Test] |
||||
public void NoTestClasses() |
||||
{ |
||||
Assert.AreEqual(0, testProject.TestClasses.Count); |
||||
} |
||||
|
||||
[Test] |
||||
public void InnerTestClassRemoved() |
||||
{ |
||||
Assert.IsFalse(testProject.TestClasses.Contains("MyTests.A+InnerATest")); |
||||
} |
||||
} |
||||
} |
||||
@ -0,0 +1,70 @@
@@ -0,0 +1,70 @@
|
||||
// <file>
|
||||
// <copyright see="prj:///doc/copyright.txt"/>
|
||||
// <license see="prj:///doc/license.txt"/>
|
||||
// <owner name="Matthew Ward" email="mrward@users.sourceforge.net"/>
|
||||
// <version>$Revision$</version>
|
||||
// </file>
|
||||
|
||||
using System; |
||||
using ICSharpCode.SharpDevelop.Dom; |
||||
using ICSharpCode.SharpDevelop.Project; |
||||
using ICSharpCode.UnitTesting; |
||||
using UnitTesting.Tests.Utils; |
||||
|
||||
namespace UnitTesting.Tests.Project |
||||
{ |
||||
/// <summary>
|
||||
/// Base class for testing inner classes with TestFixture information.
|
||||
/// </summary>
|
||||
public class InnerClassTestFixtureBase |
||||
{ |
||||
protected TestClass testClass; |
||||
protected MockClass innerClass; |
||||
protected TestProject testProject; |
||||
protected MockProjectContent projectContent; |
||||
protected MockClass outerClass; |
||||
|
||||
protected void InitBase() |
||||
{ |
||||
projectContent = new MockProjectContent(); |
||||
projectContent.Language = LanguageProperties.None; |
||||
|
||||
// Create the base test class.
|
||||
outerClass = new MockClass("MyTests.A"); |
||||
outerClass.ProjectContent = projectContent; |
||||
projectContent.Classes.Add(outerClass); |
||||
|
||||
// Create the inner test class.
|
||||
// Note the use of the DotNetName "MyTests.A+InnerTest".
|
||||
innerClass = new MockClass("MyTests.A.InnerATest", "MyTests.A+InnerATest"); |
||||
innerClass.Attributes.Add(new MockAttribute("TestFixture")); |
||||
innerClass.ProjectContent = projectContent; |
||||
innerClass.DeclaringType = outerClass; // Declaring type is outer class.
|
||||
|
||||
MockMethod method = new MockMethod("FooBar"); |
||||
method.Attributes.Add(new MockAttribute("Test")); |
||||
method.DeclaringType = innerClass; |
||||
innerClass.Methods.Add(method); |
||||
outerClass.InnerClasses.Add(innerClass); |
||||
|
||||
// Add another inner class that is not a test class.
|
||||
MockClass nonTestInnerClass = new MockClass("MyTests.A.InnerBClass"); |
||||
nonTestInnerClass.ProjectContent = projectContent; |
||||
nonTestInnerClass.DeclaringType = outerClass; // Declaring type is outer class.
|
||||
outerClass.InnerClasses.Add(nonTestInnerClass); |
||||
|
||||
// Add another inner class with the same name as the InnerATest.
|
||||
// This makes sure duplicate classes are not added.
|
||||
MockClass duplicateInnerClass = new MockClass("MyTests.A.InnerATest", "MyTests.A+InnerATest"); |
||||
duplicateInnerClass.Attributes.Add(new MockAttribute("TestFixture")); |
||||
duplicateInnerClass.ProjectContent = projectContent; |
||||
duplicateInnerClass.DeclaringType = outerClass; // Declaring type is outer class.
|
||||
outerClass.InnerClasses.Add(duplicateInnerClass); |
||||
|
||||
testProject = new TestProject(null, projectContent); |
||||
if (testProject.TestClasses.Count > 0) { |
||||
testClass = testProject.TestClasses[0]; |
||||
} |
||||
} |
||||
} |
||||
} |
||||
@ -0,0 +1,111 @@
@@ -0,0 +1,111 @@
|
||||
// <file>
|
||||
// <copyright see="prj:///doc/copyright.txt"/>
|
||||
// <license see="prj:///doc/license.txt"/>
|
||||
// <owner name="Matthew Ward" email="mrward@users.sourceforge.net"/>
|
||||
// <version>$Revision$</version>
|
||||
// </file>
|
||||
|
||||
using System; |
||||
using System.Collections.Generic; |
||||
using System.Text; |
||||
using ICSharpCode.SharpDevelop.Dom; |
||||
using ICSharpCode.UnitTesting; |
||||
using NUnit.Framework; |
||||
using UnitTesting.Tests.Utils; |
||||
|
||||
namespace UnitTesting.Tests.Project |
||||
{ |
||||
[TestFixture] |
||||
public class RemovedClassesTestFixture |
||||
{ |
||||
RemovedClasses removedClasses; |
||||
MockClass myClass; |
||||
MockClass anotherClass; |
||||
MockClass innerClass; |
||||
|
||||
[SetUp] |
||||
public void Init() |
||||
{ |
||||
myClass = new MockClass("MyTests.MyClass"); |
||||
innerClass = new MockClass("MyTests.MyClass.InnerClass", "MyTests.MyClass+InnerClass"); |
||||
myClass.InnerClasses.Add(innerClass); |
||||
|
||||
anotherClass = new MockClass("MyTests.AnotherClass"); |
||||
|
||||
List<IClass> classes = new List<IClass>(); |
||||
classes.Add(myClass); |
||||
classes.Add(anotherClass); |
||||
|
||||
removedClasses = new RemovedClasses(); |
||||
removedClasses.Add(classes); |
||||
} |
||||
|
||||
[Test] |
||||
public void InnerClassesIncludedInMissingClasses() |
||||
{ |
||||
List<IClass> expectedClasses = new List<IClass>(); |
||||
expectedClasses.Add(myClass); |
||||
expectedClasses.Add(innerClass); |
||||
expectedClasses.Add(anotherClass); |
||||
|
||||
AssertContains(expectedClasses, removedClasses.GetMissingClasses()); |
||||
} |
||||
|
||||
/// <summary>
|
||||
/// Should remove inner class too.
|
||||
/// </summary>
|
||||
[Test] |
||||
public void RemoveMyClass() |
||||
{ |
||||
removedClasses.Remove(myClass); |
||||
|
||||
List<IClass> expectedClasses = new List<IClass>(); |
||||
expectedClasses.Add(anotherClass); |
||||
|
||||
AssertContains(expectedClasses, removedClasses.GetMissingClasses()); |
||||
} |
||||
|
||||
[Test] |
||||
public void RemoveInnerClass() |
||||
{ |
||||
removedClasses.Remove(innerClass); |
||||
|
||||
List<IClass> expectedClasses = new List<IClass>(); |
||||
expectedClasses.Add(myClass); |
||||
expectedClasses.Add(anotherClass); |
||||
|
||||
AssertContains(expectedClasses, removedClasses.GetMissingClasses()); |
||||
} |
||||
|
||||
[Test] |
||||
public void DotNetNameUsedWhenAddingClasses() |
||||
{ |
||||
MockClass c = new MockClass("MyTests.MyClass.InnerClass", "MyTests.MyClass+InnerClass"); |
||||
List<IClass> classes = new List<IClass>(); |
||||
classes.Add(c); |
||||
|
||||
RemovedClasses removedClasses = new RemovedClasses(); |
||||
removedClasses.Add(classes); |
||||
removedClasses.Remove(c); |
||||
|
||||
Assert.AreEqual(0, removedClasses.GetMissingClasses().Count); |
||||
} |
||||
|
||||
void AssertContains(IList<IClass> expectedClasses, IList<IClass> actualClasses) |
||||
{ |
||||
foreach (IClass c in expectedClasses) { |
||||
Assert.IsTrue(actualClasses.Contains(c), "Class missing: " + c.FullyQualifiedName + " Actual:\r\n" + GetClassNames(actualClasses)); |
||||
} |
||||
Assert.AreEqual(expectedClasses.Count, actualClasses.Count, "Actual:\r\n" + GetClassNames(actualClasses)); |
||||
} |
||||
|
||||
string GetClassNames(IList<IClass> classes) |
||||
{ |
||||
StringBuilder names = new StringBuilder(); |
||||
foreach (IClass c in classes) { |
||||
names.AppendLine(c.FullyQualifiedName); |
||||
} |
||||
return names.ToString(); |
||||
} |
||||
} |
||||
} |
||||
Loading…
Reference in new issue