public static IUnitTestGeneratorOptions Create(string solutionFilePath, IGenerationOptions generationOptions, IVersioningOptions versioningOptions)
        {
            if (generationOptions == null)
            {
                throw new ArgumentNullException(nameof(generationOptions));
            }

            if (versioningOptions == null)
            {
                throw new ArgumentNullException(nameof(versioningOptions));
            }

            var mutableGenerationOptions = new MutableGenerationOptions(generationOptions);
            var mutableVersioningOptions = new MutableVersioningOptions(versioningOptions);

            if (!string.IsNullOrWhiteSpace(solutionFilePath))
            {
                var allFiles      = new EditorConfigParser(".unitTestGeneratorConfig").GetConfigurationFilesTillRoot(solutionFilePath);
                var allProperties = allFiles.SelectMany(x => x.Sections).SelectMany(x => x);
                var properties    = new Dictionary <string, string>();
                foreach (var pair in allProperties)
                {
                    properties[pair.Key] = pair.Value;
                }

                properties.ApplyTo(mutableGenerationOptions);
                properties.ApplyTo(mutableVersioningOptions);
            }

            return(new UnitTestGeneratorOptions(mutableGenerationOptions, mutableVersioningOptions));
        }
예제 #2
0
 public GenerationItem(ProjectItemModel source, SyntaxNode sourceSymbol, ProjectItems targetProjectItems, string targetPath, HashSet <TargetAsset> requiredAssets, HashSet <IReferencedAssembly> assemblyReferences, Func <string, string> namespaceTransform, IGenerationOptions options)
 {
     _options           = options ?? throw new ArgumentNullException(nameof(options));
     Source             = source ?? throw new ArgumentNullException(nameof(source));
     SourceSymbol       = sourceSymbol;
     TargetProjectItems = targetProjectItems;
     _targetPath        = targetPath;
     RequiredAssets     = requiredAssets ?? throw new ArgumentNullException(nameof(requiredAssets));
     NamespaceTransform = namespaceTransform ?? throw new ArgumentNullException(nameof(namespaceTransform));
     AssemblyReferences = assemblyReferences ?? throw new ArgumentNullException(nameof(assemblyReferences));
 }
예제 #3
0
        public MutableGenerationOptions(IGenerationOptions options)
        {
            if (options == null)
            {
                throw new ArgumentNullException(nameof(options));
            }

            FrameworkType                       = options.FrameworkType;
            MockingFrameworkType                = options.MockingFrameworkType;
            CreateProjectAutomatically          = options.CreateProjectAutomatically;
            AddReferencesAutomatically          = options.AddReferencesAutomatically;
            AllowGenerationWithoutTargetProject = options.AllowGenerationWithoutTargetProject;
            TestProjectNaming                   = options.TestProjectNaming;
            TestFileNaming                      = options.TestFileNaming;
            TestTypeNaming                      = options.TestTypeNaming;
        }
        public static string GetTargetFileName(this IGenerationOptions options, string sourceFileName)
        {
            if (options == null)
            {
                throw new ArgumentNullException(nameof(options));
            }

            if (string.IsNullOrWhiteSpace(sourceFileName))
            {
                throw new ArgumentNullException(nameof(sourceFileName));
            }

            try
            {
                return(string.Format(CultureInfo.CurrentCulture, options.TestFileNaming, sourceFileName));
            }
            catch (FormatException)
            {
                throw new InvalidOperationException(Strings.TargetNameTransform_GetTargetFileName_Cannot_not_derive_target_file_name__please_check_the_test_file_naming_setting_);
            }
        }
        public ProjectItemModel(ProjectItem projectItem, IGenerationOptions options)
        {
            if (options == null)
            {
                throw new ArgumentNullException(nameof(options));
            }

            ThreadHelper.ThrowIfNotOnUIThread();

            Item              = projectItem ?? throw new ArgumentNullException(nameof(projectItem));
            FilePath          = projectItem.FileNames[1];
            TargetProjectName = options.GetTargetProjectName(Item.ContainingProject.Name);
            SourceProjectName = Item.ContainingProject.Name;
            try
            {
                TargetProjectName = string.Format(CultureInfo.CurrentCulture, options.TestProjectNaming, Item.ContainingProject.Name);
            }
            catch (FormatException)
            {
                throw new InvalidOperationException(Strings.ProjectItemModel_ProjectItemModel_Cannot_not_derive_target_project_name__please_check_the_test_project_naming_setting_);
            }
        }
 public UnitTestGeneratorOptions(IGenerationOptions generationOptions, IVersioningOptions versioningOptions)
 {
     GenerationOptions = generationOptions ?? throw new ArgumentNullException(nameof(generationOptions));
     VersioningOptions = versioningOptions ?? throw new ArgumentNullException(nameof(versioningOptions));
 }
        public static Project CreateTestProjectInCurrentSolution(DTE2 dte, Project sourceProject, IGenerationOptions options)
        {
            if (dte == null)
            {
                throw new ArgumentNullException(nameof(dte));
            }

            if (sourceProject == null)
            {
                throw new ArgumentNullException(nameof(sourceProject));
            }

            if (options == null)
            {
                throw new ArgumentNullException(nameof(options));
            }

            ThreadHelper.ThrowIfNotOnUIThread();

            // ReSharper disable once SuspiciousTypeConversion.Global
            var solution        = (Solution4)dte.Solution;
            var testProjectName = options.GetTargetProjectName(sourceProject.Name);

            var directoryName = Path.GetDirectoryName(solution.FileName);

            if (string.IsNullOrWhiteSpace(directoryName))
            {
                throw new InvalidOperationException(Strings.SolutionUtilities_CreateTestProjectInCurrentSolution_Cannot_find_source_project_location);
            }

            var destination = Path.Combine(directoryName, testProjectName);

            var templatePath = solution.GetProjectTemplate("ClassLibrary.zip", "CSharp");
            var testProject  = dte.Solution.AddFromTemplate(templatePath, destination, testProjectName);

            foreach (var p in solution.Projects.OfType <Project>())
            {
                if (p.Name == testProjectName)
                {
                    (p.Object as VSLangProj.VSProject)?.References.AddProject(sourceProject);

                    foreach (var projectItem in p.ProjectItems.OfType <ProjectItem>())
                    {
                        try
                        {
                            if (projectItem.FileCount > 0)
                            {
                                File.Delete(projectItem.FileNames[0]);
                            }
                        }
                        catch (IOException)
                        {
                        }

                        try
                        {
                            projectItem.Remove();
                        }
#pragma warning disable CA1031 // Do not catch general exception types
                        catch
#pragma warning restore CA1031 // Do not catch general exception types
                        {
                            // ignored - VS project system is extensible and we don't know exception types up-front
                        }
                    }

                    return(p);
                }
            }

            return(testProject);
        }
        public static IEnumerable <ProjectItemModel> GetSelectedFiles(DTE2 dte, bool recursive, IGenerationOptions options)
        {
            if (dte == null)
            {
                throw new ArgumentNullException(nameof(dte));
            }

            ThreadHelper.ThrowIfNotOnUIThread();

            if (dte.ToolWindows.SolutionExplorer.SelectedItems is Array selectedItems)
            {
#pragma warning disable VSTHRD010
                var selectedItemObjects = selectedItems.Cast <UIHierarchyItem>().Select(x => x.Object).ToList();
                var items = selectedItemObjects.OfType <ProjectItem>().Concat(selectedItemObjects.OfType <Project>().Select(x => x.ProjectItems).SelectMany(x => x.OfType <ProjectItem>()));
#pragma warning restore VSTHRD010

                return(GetSelectedFiles(items, recursive, options));
            }

            return(Enumerable.Empty <ProjectItemModel>());
        }
        private static IEnumerable <ProjectItemModel> GetSelectedFiles(IEnumerable <ProjectItem> items, bool recursive, IGenerationOptions options)
        {
            ThreadHelper.ThrowIfNotOnUIThread();

            foreach (var item in items)
            {
                if (item.ProjectItems.Count > 0)
                {
                    if (recursive)
                    {
                        foreach (var projectItemSummary in GetSelectedFiles(item.ProjectItems.OfType <ProjectItem>(), true, options))
                        {
                            yield return(projectItemSummary);
                        }
                    }
                }
                else
                {
                    yield return(new ProjectItemModel(item, options));
                }
            }
        }
 public void SetUp()
 {
     _generationOptions = Substitute.For <IGenerationOptions>();
     _versioningOptions = Substitute.For <IVersioningOptions>();
     _testClass         = new UnitTestGeneratorOptions(_generationOptions, _versioningOptions);
 }
예제 #11
0
        public static FindTargetStatus FindExistingTargetItem(ProjectItemModel source, IGenerationOptions options, out ProjectItem targetItem)
        {
            ThreadHelper.ThrowIfNotOnUIThread();

#pragma warning disable VSTHRD010
            var nameParts = VsProjectHelper.GetNameParts(source.Item);
            targetItem = null;

            var targetProject = source.TargetProject;
            if (targetProject == null)
            {
                return(FindTargetStatus.ProjectNotFound);
            }

            var targetProjectItems = FindTargetFolder(targetProject, nameParts, false, out _);
            if (targetProjectItems == null)
            {
                return(FindTargetStatus.FolderNotFound);
            }

            var extension = Path.GetExtension(source.FilePath);
            var baseName  = Path.GetFileNameWithoutExtension(source.FilePath);

            var testFileName = options.GetTargetFileName(baseName);
            targetItem = targetProjectItems.OfType <ProjectItem>().FirstOrDefault(x => string.Equals(x.Name, testFileName + extension, StringComparison.OrdinalIgnoreCase));
            return(targetItem == null ? FindTargetStatus.FileNotFound : FindTargetStatus.Found);

#pragma warning restore VSTHRD010
        }
 public void SetUp()
 {
     _options   = Substitute.For <IGenerationOptions>();
     _testClass = new MutableGenerationOptions(_options);
 }