Browse Source

implement support for nested test classes

newNRvisualizers
Siegfried Pammer 13 years ago
parent
commit
cea0f48325
  1. 18
      src/AddIns/Analysis/UnitTesting/Extensions.cs
  2. 11
      src/AddIns/Analysis/UnitTesting/Model/TestClass.cs
  3. 20
      src/AddIns/Analysis/UnitTesting/Model/TestProject.cs
  4. 22
      src/AddIns/Analysis/UnitTesting/Nodes/ClassUnitTestNode.cs

18
src/AddIns/Analysis/UnitTesting/Extensions.cs

@ -80,5 +80,23 @@ namespace ICSharpCode.UnitTesting @@ -80,5 +80,23 @@ namespace ICSharpCode.UnitTesting
index++;
list.Insert(index, item);
}
public static void UpdateTestClasses(this IList<TestClass> testClasses, IRegisteredTestFrameworks testFrameworks, IReadOnlyList<ITypeDefinition> oldTypes, IReadOnlyList<ITypeDefinition> newTypes)
{
var mappings = oldTypes.FullOuterJoin(newTypes, t => t.ReflectionName, t => t.ReflectionName, Tuple.Create);
foreach (Tuple<ITypeDefinition, ITypeDefinition> mapping in mappings) {
if (mapping.Item2 == null)
testClasses.RemoveWhere(c => c.FullName == mapping.Item1.ReflectionName);
else if (mapping.Item1 == null)
testClasses.Add(new TestClass(testFrameworks, mapping.Item2.ReflectionName, mapping.Item2));
else {
var testClass = testClasses.SingleOrDefault(c => c.FullName == mapping.Item1.ReflectionName);
if (testClass == null)
testClasses.Add(new TestClass(testFrameworks, mapping.Item2.ReflectionName, mapping.Item2));
else
testClass.UpdateClass(mapping.Item2);
}
}
}
}
}

11
src/AddIns/Analysis/UnitTesting/Model/TestClass.cs

@ -5,9 +5,9 @@ using System; @@ -5,9 +5,9 @@ using System;
using System.Collections.Generic;
using System.Collections.ObjectModel;
using System.Linq;
using ICSharpCode.Core;
using ICSharpCode.NRefactory.TypeSystem;
using ICSharpCode.NRefactory.TypeSystem.Implementation;
using ICSharpCode.SharpDevelop;
namespace ICSharpCode.UnitTesting
@ -20,6 +20,7 @@ namespace ICSharpCode.UnitTesting @@ -20,6 +20,7 @@ namespace ICSharpCode.UnitTesting
string fullName;
ObservableCollection<IUnresolvedTypeDefinition> parts;
readonly ObservableCollection<TestMember> testMembers;
readonly ObservableCollection<TestClass> nestedClasses;
TestResultType testResultType;
IRegisteredTestFrameworks testFrameworks;
@ -32,6 +33,7 @@ namespace ICSharpCode.UnitTesting @@ -32,6 +33,7 @@ namespace ICSharpCode.UnitTesting
{
this.parts = new ObservableCollection<IUnresolvedTypeDefinition>();
this.testMembers = new ObservableCollection<TestMember>();
this.nestedClasses = new ObservableCollection<TestClass>();
this.testFrameworks = testFrameworks;
this.fullName = fullName;
UpdateClass(definition);
@ -48,6 +50,10 @@ namespace ICSharpCode.UnitTesting @@ -48,6 +50,10 @@ namespace ICSharpCode.UnitTesting
get { return testMembers; }
}
public ObservableCollection<TestClass> NestedClasses {
get { return nestedClasses; }
}
public string FullName {
get { return fullName; }
}
@ -135,6 +141,9 @@ namespace ICSharpCode.UnitTesting @@ -135,6 +141,9 @@ namespace ICSharpCode.UnitTesting
}
testMembers.RemoveWhere(m => !definition.Methods.Any(dm => dm.ReflectionName == m.Method.ReflectionName && dm.IsTestMethod(definition.Compilation)));
testMembers.AddRange(definition.Methods.Where(m => m.IsTestMethod(definition.Compilation) && !testMembers.Any(dm => dm.Method.ReflectionName == m.ReflectionName)).Select(m => new TestMember((IUnresolvedMethod)m.UnresolvedMember)));
var context = new SimpleTypeResolveContext(definition);
nestedClasses.UpdateTestClasses(testFrameworks, nestedClasses.Select(tc => new DefaultResolvedTypeDefinition(context, tc.Parts.ToArray())).ToList(), definition.NestedTypes.Where(nt => nt.HasTests(definition.Compilation)).ToList());
}
/// <summary>

20
src/AddIns/Analysis/UnitTesting/Model/TestProject.cs

@ -48,25 +48,7 @@ namespace ICSharpCode.UnitTesting @@ -48,25 +48,7 @@ namespace ICSharpCode.UnitTesting
@new = e.NewParsedFile.TopLevelTypeDefinitions.Select(utd => utd.Resolve(context).GetDefinition()).Where(x => x != null && x.HasTests(SD.ParserService.GetCompilation(project)));
else
@new = Enumerable.Empty<ITypeDefinition>();
UpdateTestClasses(testClasses.Where(tc => tc.Parts.Any(td => td.ParsedFile.FileName == e.OldParsedFile.FileName)).Select(tc => new DefaultResolvedTypeDefinition(context, tc.Parts.ToArray())).ToList(), @new.ToList());
}
void UpdateTestClasses(IReadOnlyList<ITypeDefinition> oldTypes, IReadOnlyList<ITypeDefinition> newTypes)
{
var mappings = oldTypes.FullOuterJoin(newTypes, t => t.ReflectionName, t => t.ReflectionName, Tuple.Create);
foreach (Tuple<ITypeDefinition, ITypeDefinition> mapping in mappings) {
if (mapping.Item2 == null)
testClasses.RemoveWhere(c => c.FullName == mapping.Item1.ReflectionName);
else if (mapping.Item1 == null)
testClasses.Add(new TestClass(testFrameworks, mapping.Item2.ReflectionName, mapping.Item2));
else {
var testClass = testClasses.SingleOrDefault(c => c.FullName == mapping.Item1.ReflectionName);
if (testClass == null)
testClasses.Add(new TestClass(testFrameworks, mapping.Item2.ReflectionName, mapping.Item2));
else
testClass.UpdateClass(mapping.Item2);
}
}
testClasses.UpdateTestClasses(testFrameworks, testClasses.Where(tc => tc.Parts.Any(td => td.ParsedFile.FileName == e.OldParsedFile.FileName)).Select(tc => new DefaultResolvedTypeDefinition(context, tc.Parts.ToArray())).ToList(), @new.ToList());
}
public IProject Project {

22
src/AddIns/Analysis/UnitTesting/Nodes/ClassUnitTestNode.cs

@ -21,9 +21,29 @@ namespace ICSharpCode.UnitTesting @@ -21,9 +21,29 @@ namespace ICSharpCode.UnitTesting
{
this.testClass = testClass;
testClass.Members.CollectionChanged += TestMembersCollectionChanged;
testClass.NestedClasses.CollectionChanged += NestedClassesCollectionChanged;
LazyLoading = true;
}
void NestedClassesCollectionChanged(object sender, NotifyCollectionChangedEventArgs e)
{
switch (e.Action) {
case NotifyCollectionChangedAction.Add:
foreach (TestClass c in e.NewItems) {
Children.OrderedInsert(new ClassUnitTestNode(c), (a, b) => string.CompareOrdinal(a.Text.ToString(), b.Text.ToString()));
}
break;
case NotifyCollectionChangedAction.Remove:
foreach (TestClass c in e.OldItems) {
Children.RemoveAll(n => n is ClassUnitTestNode && ((ClassUnitTestNode)n).TestClass.FullName == c.FullName);
}
break;
case NotifyCollectionChangedAction.Reset:
LoadChildren();
break;
}
}
void TestMembersCollectionChanged(object sender, NotifyCollectionChangedEventArgs e)
{
switch (e.Action) {
@ -46,6 +66,8 @@ namespace ICSharpCode.UnitTesting @@ -46,6 +66,8 @@ namespace ICSharpCode.UnitTesting
protected override void LoadChildren()
{
Children.Clear();
foreach (TestClass c in testClass.NestedClasses)
Children.Add(new ClassUnitTestNode(c));
foreach (TestMember m in testClass.Members)
Children.Add(new MemberUnitTestNode(m));
}

Loading…
Cancel
Save