public void Constructor_SetsIsExpandedFalse(string name)
        {
            var declarations         = CodeExplorerTestSetup.TestProjectOneDeclarations.TestComponentDeclarations(name);
            var componentDeclaration = declarations
                                       .First(declaration => declaration.DeclarationType.HasFlag(DeclarationType.Module) && declaration.IdentifierName.Equals(name));

            var component = new CodeExplorerComponentViewModel(null, componentDeclaration, ref declarations, null);

            Assert.IsFalse(component.IsExpanded);
        }
        public void PredeclaredClassIsPredeclared()
        {
            var projectDeclaration = CodeExplorerTestSetup.TestProjectOneDeclarations
                                     .First(declaration => declaration.DeclarationType == DeclarationType.Project);
            var componentDeclaration = PredeclaredClassDeclaration(projectDeclaration);

            var declarations = new List <Declaration>();
            var component    = new CodeExplorerComponentViewModel(null, componentDeclaration, ref declarations, null);

            Assert.IsTrue(component.IsPredeclared);
        }
        public void SortComparerIsComponentType(CodeExplorerSortOrder order)
        {
            var declarations         = CodeExplorerTestSetup.TestProjectOneDeclarations.TestComponentDeclarations(CodeExplorerTestSetup.TestModuleName);
            var componentDeclaration = declarations
                                       .First(declaration => declaration.DeclarationType.HasFlag(DeclarationType.Module) &&
                                              declaration.IdentifierName.Equals(CodeExplorerTestSetup.TestModuleName));

            var component = new CodeExplorerComponentViewModel(null, componentDeclaration, ref declarations, null);

            Assert.AreEqual(CodeExplorerItemComparer.ComponentType.GetType(), component.SortComparer.GetType());
        }
예제 #4
0
        public void AddsTestModuleWithStubsAddsStubsPublicProcedures()
        {
            const string code =
                @"Public Sub PublicSub()
End Sub

Public Function PublicFunction()
End Function

Public Property Get PublicProperty()
End Property

Public Property Let PublicProperty(v As Variant)
End Property

Public Property Set PublicProperty(s As Object)
End Property
";

            var(vbe, state) = ArrangeAndParseTestCode(ComponentType.StandardModule, "Module1", code);
            using (state)
            {
                var addTestModuleCommand = ArrangeAddTestModuleCommand(vbe, state);
                var addWithStubsCommand  = ArrangeAddTestModuleWithStubsCommand(vbe, addTestModuleCommand);

                var project = state.DeclarationFinder.FindProject(TestProjectName);
                var target  = state.DeclarationFinder.FindStdModule("Module1", project);

                var _     = Enumerable.Empty <Declaration>().ToList();
                var model = new CodeExplorerComponentViewModel(null, target, ref _, vbe.Object);

                addWithStubsCommand.Execute(model);

                var testModule = state.DeclarationFinder.FindStdModule($"{TestModuleBaseName}1", project);

                Assert.IsTrue(testModule.Annotations.Any(a => a.Annotation is TestModuleAnnotation));

                var stubIdentifierNames = new List <string>
                {
                    $"PublicSub{TestMethodBaseName}",
                    $"PublicFunction{TestMethodBaseName}",
                    $"GetPublicProperty{TestMethodBaseName}",
                    $"LetPublicProperty{TestMethodBaseName}",
                    $"SetPublicProperty{TestMethodBaseName}"
                };

                var stubs = state.DeclarationFinder.AllUserDeclarations.Where(d => d.IdentifierName.EndsWith(TestMethodBaseName)).ToList();

                Assert.AreEqual(stubIdentifierNames.Count, stubs.Count);
                Assert.IsTrue(stubs.All(d => stubIdentifierNames.Contains(d.IdentifierName)));
            }
        }
        public void Synchronize_ClearsPassedDeclarationList_NoChanges(string name)
        {
            var declarations         = CodeExplorerTestSetup.TestProjectOneDeclarations.TestComponentDeclarations(name);
            var componentDeclaration = declarations
                                       .First(declaration => declaration.DeclarationType.HasFlag(DeclarationType.Module) && declaration.IdentifierName.Equals(name));

            var component = new CodeExplorerComponentViewModel(null, componentDeclaration, ref declarations, null);

            var updates = CodeExplorerTestSetup.TestProjectOneDeclarations.TestComponentDeclarations(name);

            component.Synchronize(ref updates);

            Assert.AreEqual(0, updates.Count);
        }
        private MoveMultipleToFolderModel ComponentModel(CodeExplorerComponentViewModel componentViewModel)
        {
            if (!(componentViewModel.Declaration is ModuleDeclaration moduleDeclaration))
            {
                return(null);
            }

            var targets = new List <ModuleDeclaration> {
                moduleDeclaration
            };
            var targetFolder = moduleDeclaration.CustomFolder;

            return(new MoveMultipleToFolderModel(targets, targetFolder));
        }
        public void UnfilteredStateIsRestored(string name)
        {
            var declarations         = CodeExplorerTestSetup.TestProjectOneDeclarations.TestComponentDeclarations(name);
            var componentDeclaration = declarations
                                       .First(declaration => declaration.DeclarationType.HasFlag(DeclarationType.Module) && declaration.IdentifierName.Equals(name));

            var component = new CodeExplorerComponentViewModel(null, componentDeclaration, ref declarations, null);
            var childName = component.Children.First().Name;

            component.IsExpanded = false;
            component.Filter     = childName;
            Assert.IsTrue(component.IsExpanded);

            component.Filter = string.Empty;
            Assert.IsFalse(component.IsExpanded);
        }
예제 #8
0
        private bool ExportFile(CodeExplorerComponentViewModel node)
        {
            var component = _projectsProvider.Component(node.Declaration.QualifiedName.QualifiedModuleName);

            _exportableFileExtensions.TryGetValue(component.Type, out string ext);

            _saveFileDialog.FileName = component.Name + ext;
            var result = _saveFileDialog.ShowDialog();

            if (result == DialogResult.OK)
            {
                component.Export(_saveFileDialog.FileName);
            }

            return(result == DialogResult.OK);
        }
        private string GetFileName(CodeExplorerComponentViewModel node)
        {
            var component = node.Declaration.QualifiedName.QualifiedModuleName.Component;

            var fileExtensions = new Dictionary <vbext_ComponentType, string>
            {
                { vbext_ComponentType.vbext_ct_StdModule, ".bas" },
                { vbext_ComponentType.vbext_ct_ClassModule, ".cls" },
                { vbext_ComponentType.vbext_ct_Document, ".cls" },
                { vbext_ComponentType.vbext_ct_MSForm, ".frm" }
            };

            string ext;

            fileExtensions.TryGetValue(component.Type, out ext);
            return(component.Name + ext);
        }
        public void Synchronize_DoesNotAlterDeclarationList_DifferentComponent(string name, string other)
        {
            var declarations         = CodeExplorerTestSetup.TestProjectOneDeclarations.TestComponentDeclarations(name);
            var componentDeclaration = declarations
                                       .First(declaration => declaration.DeclarationType.HasFlag(DeclarationType.Module) && declaration.IdentifierName.Equals(name));

            var component = new CodeExplorerComponentViewModel(null, componentDeclaration, ref declarations, null);

            var updates = CodeExplorerTestSetup.TestProjectOneDeclarations.TestComponentDeclarations(other);

            component.Synchronize(ref updates);

            var expected = CodeExplorerTestSetup.TestProjectOneDeclarations.TestComponentDeclarations(other)
                           .Select(declaration => declaration.QualifiedName.ToString()).OrderBy(_ => _);
            var actual = updates.Select(declaration => declaration.QualifiedName.ToString()).OrderBy(_ => _);

            Assert.IsTrue(expected.SequenceEqual(actual));
        }
        public void Constructor_PlacesAllTrackedDeclarations(string name)
        {
            var declarations         = CodeExplorerTestSetup.TestProjectOneDeclarations.TestComponentDeclarations(name);
            var componentDeclaration = declarations
                                       .First(declaration => declaration.DeclarationType.HasFlag(DeclarationType.Module) && declaration.IdentifierName.Equals(name));

            var component = new CodeExplorerComponentViewModel(null, componentDeclaration, ref declarations, null);

            var expected = CodeExplorerTestSetup.TestProjectOneDeclarations.TestComponentDeclarations(name)
                           .Select(declaration => declaration.QualifiedName.ToString())
                           .OrderBy(_ => _);

            var actual = component.GetAllChildDeclarations()
                         .Select(declaration => declaration.QualifiedName.ToString())
                         .OrderBy(_ => _);

            Assert.IsTrue(expected.SequenceEqual(actual));
        }
예제 #12
0
        public void AddsTestModuleWithStubsNoStubsAddedNonProcedures()
        {
            const string code =
                @"Public Type UserDefinedType
    UserDefinedTypeMember As String
End Type

Public Declare PtrSafe Sub LibraryProcedure Lib ""lib.dll""()

Public Declare PtrSafe Function LibraryFunction Lib ""lib.dll""()

Public Variable As String

Public Const Constant As String = vbNullString

Public Enum Enumeration
    EnumerationMember
End Enum
";

            var(vbe, state) = ArrangeAndParseTestCode(ComponentType.StandardModule, "Module1", code);
            using (state)
            {
                var addTestModuleCommand = ArrangeAddTestModuleCommand(vbe, state, ArrangeCodeGenerator(vbe.Object, state));
                var addWithStubsCommand  = ArrangeAddTestModuleWithStubsCommand(vbe, addTestModuleCommand);

                var project = state.DeclarationFinder.FindProject(TestProjectName);
                var target  = state.DeclarationFinder.FindStdModule("Module1", project);

                var _     = Enumerable.Empty <Declaration>().ToList();
                var model = new CodeExplorerComponentViewModel(null, target, ref _, vbe.Object);

                addWithStubsCommand.Execute(model);

                var testModule = state.DeclarationFinder.FindStdModule($"{TestModuleBaseName}1", project);

                Assert.IsTrue(testModule.Annotations.Any(a => a.Annotation is TestModuleAnnotation));
                var stubs = state.DeclarationFinder.AllUserDeclarations.Where(d => d.IdentifierName.EndsWith(TestMethodBaseName)).ToList();

                Assert.AreEqual(0, stubs.Count);
            }
        }
        public void Synchronize_PlacesAllTrackedDeclarations_AddedMember(string added, DeclarationType type = DeclarationType.Member)
        {
            var declarations = CodeExplorerTestSetup.TestProjectOneDeclarations
                               .TestProjectWithMemberRemoved(added, out var componentDeclaration, type);

            var component = new CodeExplorerComponentViewModel(null, componentDeclaration, ref declarations, null);
            var updates   = CodeExplorerTestSetup.TestProjectOneDeclarations.TestComponentDeclarations(componentDeclaration.IdentifierName);

            var expected = updates.Select(declaration => declaration.QualifiedName.ToString())
                           .OrderBy(_ => _)
                           .ToList();

            component.Synchronize(ref updates);

            var actual = component.GetAllChildDeclarations()
                         .Select(declaration => declaration.QualifiedName.ToString())
                         .OrderBy(_ => _);

            Assert.IsTrue(expected.SequenceEqual(actual));
        }
        public void FilteredIsTrueForCharactersNotInName(string name)
        {
            const string testCharacters = "abcdefghijklmnopqrstuwxyz";

            var componentDeclaration = CodeExplorerTestSetup.TestProjectOneDeclarations
                                       .First(declaration => declaration.DeclarationType.HasFlag(DeclarationType.Module) && declaration.IdentifierName.Equals(name));

            var declarations = new List <Declaration> {
                componentDeclaration
            };
            var component = new CodeExplorerComponentViewModel(null, componentDeclaration, ref declarations, null);

            var nonMatching = testCharacters.ToCharArray().Except(name.ToLowerInvariant().ToCharArray());

            foreach (var character in nonMatching.Select(letter => letter.ToString()))
            {
                component.Filter = character;
                Assert.IsTrue(component.Filtered);
            }
        }
        public void Synchronize_SetsDeclarationNull_NoDeclarationsForComponent(string name)
        {
            var declarations         = CodeExplorerTestSetup.TestProjectOneDeclarations;
            var componentDeclaration = declarations
                                       .First(declaration => declaration.DeclarationType.HasFlag(DeclarationType.Module) && declaration.IdentifierName.Equals(name));

            var original = declarations.TestComponentDeclarations(name);
            var updates  = declarations.Except(original).ToList();

            var component = new CodeExplorerComponentViewModel(null, componentDeclaration, ref original, null);

            if (component.Declaration is null)
            {
                Assert.Inconclusive("Component declaration is null. Fix test setup and see why no other tests failed.");
            }

            component.Synchronize(ref updates);

            Assert.IsNull(component.Declaration);
        }
        public void AddsTestModuleWithStubsNoStubsAddedPrivateProcedures()
        {
            const string code =
                @"Private Sub PrivateSub()
End Sub

Private Function PrivateFunction()
End Function

Private Property Get PrivateProperty()
End Property

Private Property Let PrivateProperty(v As Variant)
End Property

Private Property Set PrivateProperty(s As Object)
End Property
";

            var(vbe, state) = ArrangeAndParseTestCode(ComponentType.StandardModule, "Module1", code);
            using (state)
            {
                var addTestModuleCommand = new AddTestModuleCommand(vbe.Object, state, ArrangeCodeGenerator(vbe.Object, state));
                var addWithStubsCommand  = new AddTestModuleWithStubsCommand(vbe.Object, addTestModuleCommand);

                var project = state.DeclarationFinder.FindProject(TestProjectName);
                var target  = state.DeclarationFinder.FindStdModule("Module1", project);

                var _     = Enumerable.Empty <Declaration>().ToList();
                var model = new CodeExplorerComponentViewModel(null, target, ref _, vbe.Object);

                addWithStubsCommand.Execute(model);

                var testModule = state.DeclarationFinder.FindStdModule($"{TestModuleBaseName}1", project);

                Assert.IsTrue(testModule.Annotations.Any(a => a.AnnotationType == AnnotationType.TestModule));
                var stubs = state.DeclarationFinder.AllUserDeclarations.Where(d => d.IdentifierName.EndsWith(TestMethodBaseName)).ToList();

                Assert.AreEqual(0, stubs.Count);
            }
        }
        public void AddsTestModulePicksCorrectNumberWithStubs(int first, int second, int added)
        {
            var existing = new List <(ComponentType type, string name, string code)>
            {
                (ComponentType.StandardModule, $"{TestModuleBaseName}{first}", string.Empty),
                (ComponentType.StandardModule, $"{TestModuleBaseName}{second}", string.Empty)
            };

            var(testState, state) = ParseAndArrangeAddTestModuleCommandTests(TestProjectName, existing);
            using (state)
            {
                List <Declaration> declarations = null;
                var model = new CodeExplorerComponentViewModel(null, null, ref declarations, testState.Vbe.Object);
                testState.AddTestModuleWithStubsCommand.Execute(model);

                var expectedModule = $"{TestModuleBaseName}{added}";
                var generated      = state.DeclarationFinder.AllUserDeclarations.SingleOrDefault(test => test.IdentifierName.Equals(expectedModule));

                Assert.NotNull(generated);
            }
        }
        public void FilteredIsFalseIfMemberMatches(string name)
        {
            var declarations         = CodeExplorerTestSetup.TestProjectOneDeclarations.TestComponentDeclarations(name);
            var componentDeclaration = declarations
                                       .First(declaration => declaration.DeclarationType.HasFlag(DeclarationType.Module) && declaration.IdentifierName.Equals(name));

            var component = new CodeExplorerComponentViewModel(null, componentDeclaration, ref declarations, null);
            var childName = component.Children.First().Name;

            for (var characters = 1; characters <= childName.Length; characters++)
            {
                component.Filter = childName.Substring(0, characters);
                Assert.IsFalse(component.Filtered);
            }

            for (var position = childName.Length - 2; position > 0; position--)
            {
                component.Filter = childName.Substring(position);
                Assert.IsFalse(component.Filtered);
            }
        }
        public void FilteredIsFalseForSubsetsOfName(string name)
        {
            var componentDeclaration = CodeExplorerTestSetup.TestProjectOneDeclarations
                                       .First(declaration => declaration.DeclarationType.HasFlag(DeclarationType.Module) && declaration.IdentifierName.Equals(name));

            var declarations = new List <Declaration> {
                componentDeclaration
            };
            var component = new CodeExplorerComponentViewModel(null, componentDeclaration, ref declarations, null);

            for (var characters = 1; characters <= name.Length; characters++)
            {
                component.Filter = name.Substring(0, characters);
                Assert.IsFalse(component.Filtered);
            }

            for (var position = name.Length - 2; position > 0; position--)
            {
                component.Filter = name.Substring(position);
                Assert.IsFalse(component.Filtered);
            }
        }