|
1 | 1 | using NUnit.Framework;
|
2 | 2 | using Rubberduck.Navigation.CodeExplorer;
|
| 3 | +using Rubberduck.Parsing.Annotations; |
| 4 | +using Rubberduck.Parsing.Symbols; |
| 5 | +using Rubberduck.VBEditor; |
3 | 6 | using Rubberduck.VBEditor.SafeComWrappers;
|
| 7 | +using Rubberduck.VBEditor.Utility; |
| 8 | +using System; |
4 | 9 | using System.Linq;
|
| 10 | +using System.Runtime.InteropServices; |
| 11 | +using System.Runtime.InteropServices.ComTypes; |
5 | 12 |
|
6 | 13 | namespace RubberduckTests.CodeExplorer
|
7 | 14 | {
|
@@ -54,6 +61,123 @@ Dim d As Boolean
|
54 | 61 | }
|
55 | 62 | }
|
56 | 63 |
|
| 64 | + [Category("Code Explorer")] |
| 65 | + [Test] |
| 66 | + public void AddedModuleIsAtCorrectDepth_DefaultNode() |
| 67 | + { |
| 68 | + const string inputCode = |
| 69 | +@"'@Folder(""First.Second.Third"") |
| 70 | +
|
| 71 | +Sub Foo() |
| 72 | +Dim d As Boolean |
| 73 | +d = True |
| 74 | +End Sub"; |
| 75 | + |
| 76 | + using (var explorer = new MockedCodeExplorer(ProjectType.HostProject, new[] { ComponentType.StandardModule }, new[] { inputCode }) |
| 77 | + .SelectFirstProject()) |
| 78 | + { |
| 79 | + var project = (CodeExplorerProjectViewModel)explorer.ViewModel.SelectedItem; |
| 80 | + var folder = project.Children.OfType<CodeExplorerCustomFolderViewModel>().First(node => node.Name.Equals(project.Declaration.IdentifierName)); |
| 81 | + var declarations = project.State.AllUserDeclarations.ToList(); |
| 82 | + declarations.Add(GetNewClassDeclaration(project.Declaration, "Foo")); |
| 83 | + |
| 84 | + project.Synchronize(declarations); |
| 85 | + var added = folder.Children.OfType<CodeExplorerComponentViewModel>().Single(); |
| 86 | + |
| 87 | + Assert.AreEqual(DeclarationType.ClassModule, added.Declaration.DeclarationType); |
| 88 | + Assert.AreEqual(project.Declaration.IdentifierName, added.Declaration.CustomFolder); |
| 89 | + } |
| 90 | + } |
| 91 | + |
| 92 | + [Category("Code Explorer")] |
| 93 | + [Test] |
| 94 | + public void AddedModuleIsAtCorrectDepth_RootNode() |
| 95 | + { |
| 96 | + const string inputCode = |
| 97 | +@"'@Folder(""First.Second.Third"") |
| 98 | +
|
| 99 | +Sub Foo() |
| 100 | +Dim d As Boolean |
| 101 | +d = True |
| 102 | +End Sub"; |
| 103 | + |
| 104 | + using (var explorer = new MockedCodeExplorer(ProjectType.HostProject, new[] { ComponentType.StandardModule }, new[] { inputCode }) |
| 105 | + .SelectFirstCustomFolder()) |
| 106 | + { |
| 107 | + var project = explorer.ViewModel.Projects.OfType<CodeExplorerProjectViewModel>().First(); |
| 108 | + var folder = (CodeExplorerCustomFolderViewModel)explorer.ViewModel.SelectedItem; |
| 109 | + var declarations = project.State.AllUserDeclarations.ToList(); |
| 110 | + declarations.Add(GetNewClassDeclaration(project.Declaration, "Foo", "\"First\"")); |
| 111 | + |
| 112 | + project.Synchronize(declarations); |
| 113 | + var added = folder.Children.OfType<CodeExplorerComponentViewModel>().Single(); |
| 114 | + |
| 115 | + Assert.AreEqual(DeclarationType.ClassModule, added.Declaration.DeclarationType); |
| 116 | + Assert.AreEqual("\"First\"", added.Declaration.CustomFolder); |
| 117 | + } |
| 118 | + } |
| 119 | + |
| 120 | + [Category("Code Explorer")] |
| 121 | + [Test] |
| 122 | + public void AddedModuleIsAtCorrectDepth_SubNode() |
| 123 | + { |
| 124 | + const string inputCode = |
| 125 | +@"'@Folder(""First.Second.Third"") |
| 126 | +
|
| 127 | +Sub Foo() |
| 128 | +Dim d As Boolean |
| 129 | +d = True |
| 130 | +End Sub"; |
| 131 | + |
| 132 | + using (var explorer = new MockedCodeExplorer(ProjectType.HostProject, new[] { ComponentType.StandardModule }, new[] { inputCode }) |
| 133 | + .SelectFirstCustomFolder()) |
| 134 | + { |
| 135 | + var project = explorer.ViewModel.Projects.OfType<CodeExplorerProjectViewModel>().First(); |
| 136 | + var folder = (CodeExplorerCustomFolderViewModel)explorer.ViewModel.SelectedItem; |
| 137 | + var subfolder = folder.Children.OfType<CodeExplorerCustomFolderViewModel>().Single(); |
| 138 | + var declarations = project.State.AllUserDeclarations.ToList(); |
| 139 | + declarations.Add(GetNewClassDeclaration(project.Declaration, "Foo", "\"First.Second\"")); |
| 140 | + |
| 141 | + project.Synchronize(declarations); |
| 142 | + var added = subfolder.Children.OfType<CodeExplorerComponentViewModel>().Single(); |
| 143 | + |
| 144 | + Assert.AreEqual(DeclarationType.ClassModule, added.Declaration.DeclarationType); |
| 145 | + Assert.AreEqual("\"First.Second\"", added.Declaration.CustomFolder); |
| 146 | + } |
| 147 | + } |
| 148 | + |
| 149 | + [Category("Code Explorer")] |
| 150 | + [Test] |
| 151 | + public void AddedModuleIsAtCorrectDepth_TerminalNode() |
| 152 | + { |
| 153 | + const string inputCode = |
| 154 | +@"'@Folder(""First.Second.Third"") |
| 155 | +
|
| 156 | +Sub Foo() |
| 157 | +Dim d As Boolean |
| 158 | +d = True |
| 159 | +End Sub"; |
| 160 | + |
| 161 | + using (var explorer = new MockedCodeExplorer(ProjectType.HostProject, new[] { ComponentType.StandardModule }, new[] { inputCode }) |
| 162 | + .SelectFirstCustomFolder()) |
| 163 | + { |
| 164 | + var project = explorer.ViewModel.Projects.OfType<CodeExplorerProjectViewModel>().First(); |
| 165 | + var folder = (CodeExplorerCustomFolderViewModel)explorer.ViewModel.SelectedItem; |
| 166 | + var subfolder = folder.Children.OfType<CodeExplorerCustomFolderViewModel>().Single() |
| 167 | + .Children.OfType<CodeExplorerCustomFolderViewModel>().Single(); |
| 168 | + var declarations = project.State.AllUserDeclarations.ToList(); |
| 169 | + declarations.Add(GetNewClassDeclaration(project.Declaration, "Foo", "\"First.Second.Third\"")); |
| 170 | + |
| 171 | + project.Synchronize(declarations); |
| 172 | + |
| 173 | + var added = subfolder.Children.OfType<CodeExplorerComponentViewModel>() |
| 174 | + .SingleOrDefault(node => node.Declaration.DeclarationType == DeclarationType.ClassModule); |
| 175 | + |
| 176 | + Assert.IsNotNull(added); |
| 177 | + Assert.AreEqual("\"First.Second.Third\"", added.Declaration.CustomFolder); |
| 178 | + } |
| 179 | + } |
| 180 | + |
57 | 181 | [Category("Code Explorer")]
|
58 | 182 | [Test]
|
59 | 183 | public void SubFolderModuleIsChildOfDeepestSubFolder()
|
@@ -167,5 +291,17 @@ public void FoldersNamesAreCaseSensitive()
|
167 | 291 | Assert.AreEqual(3, project.Children.Count);
|
168 | 292 | }
|
169 | 293 | }
|
| 294 | + |
| 295 | + private static Declaration GetNewClassDeclaration(Declaration project, string name, string folder = "") |
| 296 | + { |
| 297 | + var annotations = string.IsNullOrEmpty(folder) |
| 298 | + ? Enumerable.Empty<IAnnotation>() |
| 299 | + : new[] { new FolderAnnotation(new QualifiedSelection(project.QualifiedModuleName, new Selection(1, 1)), null, new[] { folder }) }; |
| 300 | + |
| 301 | + var declaration = |
| 302 | + new ClassModuleDeclaration(new QualifiedMemberName(project.QualifiedModuleName, name), project, name, true, annotations, new Attributes()); |
| 303 | + |
| 304 | + return declaration; |
| 305 | + } |
170 | 306 | }
|
171 | 307 | }
|
0 commit comments