|
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; |
| 9 | +using System.Collections.Generic; |
4 | 10 | using System.Linq;
|
| 11 | +using System.Runtime.InteropServices; |
| 12 | +using System.Runtime.InteropServices.ComTypes; |
5 | 13 |
|
6 | 14 | namespace RubberduckTests.CodeExplorer
|
7 | 15 | {
|
@@ -54,6 +62,187 @@ Dim d As Boolean
|
54 | 62 | }
|
55 | 63 | }
|
56 | 64 |
|
| 65 | + [Category("Code Explorer")] |
| 66 | + [Test] |
| 67 | + public void AddedModuleIsAtCorrectDepth_DefaultNode() |
| 68 | + { |
| 69 | + const string inputCode = |
| 70 | +@"'@Folder(""First.Second.Third"") |
| 71 | +
|
| 72 | +Sub Foo() |
| 73 | +Dim d As Boolean |
| 74 | +d = True |
| 75 | +End Sub"; |
| 76 | + |
| 77 | + using (var explorer = new MockedCodeExplorer(ProjectType.HostProject, new[] { ComponentType.StandardModule }, new[] { inputCode }) |
| 78 | + .SelectFirstProject()) |
| 79 | + { |
| 80 | + var project = (CodeExplorerProjectViewModel)explorer.ViewModel.SelectedItem; |
| 81 | + var folder = project.Children.OfType<CodeExplorerCustomFolderViewModel>().First(node => node.Name.Equals(project.Declaration.IdentifierName)); |
| 82 | + var declarations = project.State.AllUserDeclarations.ToList(); |
| 83 | + declarations.Add(GetNewClassDeclaration(project.Declaration, "Foo")); |
| 84 | + |
| 85 | + project.Synchronize(declarations); |
| 86 | + var added = folder.Children.OfType<CodeExplorerComponentViewModel>().Single(); |
| 87 | + |
| 88 | + Assert.AreEqual(DeclarationType.ClassModule, added.Declaration.DeclarationType); |
| 89 | + Assert.AreEqual(project.Declaration.IdentifierName, added.Declaration.CustomFolder); |
| 90 | + } |
| 91 | + } |
| 92 | + |
| 93 | + [Category("Code Explorer")] |
| 94 | + [Test] |
| 95 | + public void AddedModuleIsAtCorrectDepth_FirstAnnotation() |
| 96 | + { |
| 97 | + const string inputCode = |
| 98 | +@"'@Folder(""First.Second.Third"") |
| 99 | +
|
| 100 | +Sub Foo() |
| 101 | +Dim d As Boolean |
| 102 | +d = True |
| 103 | +End Sub"; |
| 104 | + |
| 105 | + using (var explorer = new MockedCodeExplorer(ProjectType.HostProject, new[] { ComponentType.StandardModule }, new[] { inputCode }) |
| 106 | + .SelectFirstCustomFolder()) |
| 107 | + { |
| 108 | + var project = explorer.ViewModel.Projects.OfType<CodeExplorerProjectViewModel>().First(); |
| 109 | + var folder = (CodeExplorerCustomFolderViewModel)explorer.ViewModel.SelectedItem; |
| 110 | + var declarations = project.State.AllUserDeclarations.ToList(); |
| 111 | + |
| 112 | + var annotation = new FolderAnnotation(new QualifiedSelection(project.Declaration.QualifiedModuleName, new Selection(1, 1)), null, new[] { "\"First\"" }); |
| 113 | + var predeclared = new PredeclaredIdAnnotation(new QualifiedSelection(project.Declaration.QualifiedModuleName, new Selection(2, 1)), null, Enumerable.Empty<string>()); |
| 114 | + |
| 115 | + declarations.Add(GetNewClassDeclaration(project.Declaration, "Foo", new IAnnotation [] { annotation, predeclared })); |
| 116 | + |
| 117 | + project.Synchronize(declarations); |
| 118 | + var added = folder.Children.OfType<CodeExplorerComponentViewModel>().Single(); |
| 119 | + |
| 120 | + Assert.AreEqual(DeclarationType.ClassModule, added.Declaration.DeclarationType); |
| 121 | + Assert.AreEqual("\"First\"", added.Declaration.CustomFolder); |
| 122 | + } |
| 123 | + } |
| 124 | + |
| 125 | + [Category("Code Explorer")] |
| 126 | + [Test] |
| 127 | + public void AddedModuleIsAtCorrectDepth_NotFirstAnnotation() |
| 128 | + { |
| 129 | + const string inputCode = |
| 130 | +@"'@Folder(""First.Second.Third"") |
| 131 | +
|
| 132 | +Sub Foo() |
| 133 | +Dim d As Boolean |
| 134 | +d = True |
| 135 | +End Sub"; |
| 136 | + |
| 137 | + using (var explorer = new MockedCodeExplorer(ProjectType.HostProject, new[] { ComponentType.StandardModule }, new[] { inputCode }) |
| 138 | + .SelectFirstCustomFolder()) |
| 139 | + { |
| 140 | + var project = explorer.ViewModel.Projects.OfType<CodeExplorerProjectViewModel>().First(); |
| 141 | + var folder = (CodeExplorerCustomFolderViewModel)explorer.ViewModel.SelectedItem; |
| 142 | + var declarations = project.State.AllUserDeclarations.ToList(); |
| 143 | + |
| 144 | + var annotation = new FolderAnnotation(new QualifiedSelection(project.Declaration.QualifiedModuleName, new Selection(2, 1)), null, new[] { "\"First\"" }); |
| 145 | + var predeclared = new PredeclaredIdAnnotation(new QualifiedSelection(project.Declaration.QualifiedModuleName, new Selection(1, 1)), null, Enumerable.Empty<string>()); |
| 146 | + |
| 147 | + declarations.Add(GetNewClassDeclaration(project.Declaration, "Foo", new IAnnotation[] { predeclared, annotation })); |
| 148 | + |
| 149 | + project.Synchronize(declarations); |
| 150 | + var added = folder.Children.OfType<CodeExplorerComponentViewModel>().Single(); |
| 151 | + |
| 152 | + Assert.AreEqual(DeclarationType.ClassModule, added.Declaration.DeclarationType); |
| 153 | + Assert.AreEqual("\"First\"", added.Declaration.CustomFolder); |
| 154 | + } |
| 155 | + } |
| 156 | + |
| 157 | + [Category("Code Explorer")] |
| 158 | + [Test] |
| 159 | + public void AddedModuleIsAtCorrectDepth_RootNode() |
| 160 | + { |
| 161 | + const string inputCode = |
| 162 | +@"'@Folder(""First.Second.Third"") |
| 163 | +
|
| 164 | +Sub Foo() |
| 165 | +Dim d As Boolean |
| 166 | +d = True |
| 167 | +End Sub"; |
| 168 | + |
| 169 | + using (var explorer = new MockedCodeExplorer(ProjectType.HostProject, new[] { ComponentType.StandardModule }, new[] { inputCode }) |
| 170 | + .SelectFirstCustomFolder()) |
| 171 | + { |
| 172 | + var project = explorer.ViewModel.Projects.OfType<CodeExplorerProjectViewModel>().First(); |
| 173 | + var folder = (CodeExplorerCustomFolderViewModel)explorer.ViewModel.SelectedItem; |
| 174 | + var declarations = project.State.AllUserDeclarations.ToList(); |
| 175 | + declarations.Add(GetNewClassDeclaration(project.Declaration, "Foo", "\"First\"")); |
| 176 | + |
| 177 | + project.Synchronize(declarations); |
| 178 | + var added = folder.Children.OfType<CodeExplorerComponentViewModel>().Single(); |
| 179 | + |
| 180 | + Assert.AreEqual(DeclarationType.ClassModule, added.Declaration.DeclarationType); |
| 181 | + Assert.AreEqual("\"First\"", added.Declaration.CustomFolder); |
| 182 | + } |
| 183 | + } |
| 184 | + |
| 185 | + [Category("Code Explorer")] |
| 186 | + [Test] |
| 187 | + public void AddedModuleIsAtCorrectDepth_SubNode() |
| 188 | + { |
| 189 | + const string inputCode = |
| 190 | +@"'@Folder(""First.Second.Third"") |
| 191 | +
|
| 192 | +Sub Foo() |
| 193 | +Dim d As Boolean |
| 194 | +d = True |
| 195 | +End Sub"; |
| 196 | + |
| 197 | + using (var explorer = new MockedCodeExplorer(ProjectType.HostProject, new[] { ComponentType.StandardModule }, new[] { inputCode }) |
| 198 | + .SelectFirstCustomFolder()) |
| 199 | + { |
| 200 | + var project = explorer.ViewModel.Projects.OfType<CodeExplorerProjectViewModel>().First(); |
| 201 | + var folder = (CodeExplorerCustomFolderViewModel)explorer.ViewModel.SelectedItem; |
| 202 | + var subfolder = folder.Children.OfType<CodeExplorerCustomFolderViewModel>().Single(); |
| 203 | + var declarations = project.State.AllUserDeclarations.ToList(); |
| 204 | + declarations.Add(GetNewClassDeclaration(project.Declaration, "Foo", "\"First.Second\"")); |
| 205 | + |
| 206 | + project.Synchronize(declarations); |
| 207 | + var added = subfolder.Children.OfType<CodeExplorerComponentViewModel>().Single(); |
| 208 | + |
| 209 | + Assert.AreEqual(DeclarationType.ClassModule, added.Declaration.DeclarationType); |
| 210 | + Assert.AreEqual("\"First.Second\"", added.Declaration.CustomFolder); |
| 211 | + } |
| 212 | + } |
| 213 | + |
| 214 | + [Category("Code Explorer")] |
| 215 | + [Test] |
| 216 | + public void AddedModuleIsAtCorrectDepth_TerminalNode() |
| 217 | + { |
| 218 | + const string inputCode = |
| 219 | +@"'@Folder(""First.Second.Third"") |
| 220 | +
|
| 221 | +Sub Foo() |
| 222 | +Dim d As Boolean |
| 223 | +d = True |
| 224 | +End Sub"; |
| 225 | + |
| 226 | + using (var explorer = new MockedCodeExplorer(ProjectType.HostProject, new[] { ComponentType.StandardModule }, new[] { inputCode }) |
| 227 | + .SelectFirstCustomFolder()) |
| 228 | + { |
| 229 | + var project = explorer.ViewModel.Projects.OfType<CodeExplorerProjectViewModel>().First(); |
| 230 | + var folder = (CodeExplorerCustomFolderViewModel)explorer.ViewModel.SelectedItem; |
| 231 | + var subfolder = folder.Children.OfType<CodeExplorerCustomFolderViewModel>().Single() |
| 232 | + .Children.OfType<CodeExplorerCustomFolderViewModel>().Single(); |
| 233 | + var declarations = project.State.AllUserDeclarations.ToList(); |
| 234 | + declarations.Add(GetNewClassDeclaration(project.Declaration, "Foo", "\"First.Second.Third\"")); |
| 235 | + |
| 236 | + project.Synchronize(declarations); |
| 237 | + |
| 238 | + var added = subfolder.Children.OfType<CodeExplorerComponentViewModel>() |
| 239 | + .SingleOrDefault(node => node.Declaration.DeclarationType == DeclarationType.ClassModule); |
| 240 | + |
| 241 | + Assert.IsNotNull(added); |
| 242 | + Assert.AreEqual("\"First.Second.Third\"", added.Declaration.CustomFolder); |
| 243 | + } |
| 244 | + } |
| 245 | + |
57 | 246 | [Category("Code Explorer")]
|
58 | 247 | [Test]
|
59 | 248 | public void SubFolderModuleIsChildOfDeepestSubFolder()
|
@@ -167,5 +356,22 @@ public void FoldersNamesAreCaseSensitive()
|
167 | 356 | Assert.AreEqual(3, project.Children.Count);
|
168 | 357 | }
|
169 | 358 | }
|
| 359 | + |
| 360 | + private static Declaration GetNewClassDeclaration(Declaration project, string name, string folder = "") |
| 361 | + { |
| 362 | + var annotations = string.IsNullOrEmpty(folder) |
| 363 | + ? Enumerable.Empty<IAnnotation>() |
| 364 | + : new[] { new FolderAnnotation(new QualifiedSelection(project.QualifiedModuleName, new Selection(1, 1)), null, new[] { folder }) }; |
| 365 | + |
| 366 | + return GetNewClassDeclaration(project, name, annotations); |
| 367 | + } |
| 368 | + |
| 369 | + private static Declaration GetNewClassDeclaration(Declaration project, string name, IEnumerable<IAnnotation> annotations) |
| 370 | + { |
| 371 | + var declaration = |
| 372 | + new ClassModuleDeclaration(new QualifiedMemberName(project.QualifiedModuleName, name), project, name, true, annotations, new Attributes()); |
| 373 | + |
| 374 | + return declaration; |
| 375 | + } |
170 | 376 | }
|
171 | 377 | }
|
0 commit comments