diff --git a/src/AddIns/Analysis/UnitTesting/Extensions.cs b/src/AddIns/Analysis/UnitTesting/Extensions.cs index 99970454fe..956bea6f18 100644 --- a/src/AddIns/Analysis/UnitTesting/Extensions.cs +++ b/src/AddIns/Analysis/UnitTesting/Extensions.cs @@ -80,5 +80,23 @@ namespace ICSharpCode.UnitTesting index++; list.Insert(index, item); } + + public static void UpdateTestClasses(this IList testClasses, IRegisteredTestFrameworks testFrameworks, IReadOnlyList oldTypes, IReadOnlyList newTypes) + { + var mappings = oldTypes.FullOuterJoin(newTypes, t => t.ReflectionName, t => t.ReflectionName, Tuple.Create); + foreach (Tuple 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); + } + } + } } } diff --git a/src/AddIns/Analysis/UnitTesting/Model/TestClass.cs b/src/AddIns/Analysis/UnitTesting/Model/TestClass.cs index 716051a201..346fa09446 100644 --- a/src/AddIns/Analysis/UnitTesting/Model/TestClass.cs +++ b/src/AddIns/Analysis/UnitTesting/Model/TestClass.cs @@ -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 string fullName; ObservableCollection parts; readonly ObservableCollection testMembers; + readonly ObservableCollection nestedClasses; TestResultType testResultType; IRegisteredTestFrameworks testFrameworks; @@ -32,6 +33,7 @@ namespace ICSharpCode.UnitTesting { this.parts = new ObservableCollection(); this.testMembers = new ObservableCollection(); + this.nestedClasses = new ObservableCollection(); this.testFrameworks = testFrameworks; this.fullName = fullName; UpdateClass(definition); @@ -48,6 +50,10 @@ namespace ICSharpCode.UnitTesting get { return testMembers; } } + public ObservableCollection NestedClasses { + get { return nestedClasses; } + } + public string FullName { get { return fullName; } } @@ -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()); } /// diff --git a/src/AddIns/Analysis/UnitTesting/Model/TestProject.cs b/src/AddIns/Analysis/UnitTesting/Model/TestProject.cs index 8c39576110..9dc1d44c8f 100644 --- a/src/AddIns/Analysis/UnitTesting/Model/TestProject.cs +++ b/src/AddIns/Analysis/UnitTesting/Model/TestProject.cs @@ -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(); - 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 oldTypes, IReadOnlyList newTypes) - { - var mappings = oldTypes.FullOuterJoin(newTypes, t => t.ReflectionName, t => t.ReflectionName, Tuple.Create); - foreach (Tuple 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 { diff --git a/src/AddIns/Analysis/UnitTesting/Nodes/ClassUnitTestNode.cs b/src/AddIns/Analysis/UnitTesting/Nodes/ClassUnitTestNode.cs index 954f625636..126137a3a3 100644 --- a/src/AddIns/Analysis/UnitTesting/Nodes/ClassUnitTestNode.cs +++ b/src/AddIns/Analysis/UnitTesting/Nodes/ClassUnitTestNode.cs @@ -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 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)); }