diff --git a/src/Unitverse.Core/Helpers/DetectedGenerationOptions.cs b/src/Unitverse.Core/Helpers/DetectedGenerationOptions.cs index 6be73f2..b301a0b 100644 --- a/src/Unitverse.Core/Helpers/DetectedGenerationOptions.cs +++ b/src/Unitverse.Core/Helpers/DetectedGenerationOptions.cs @@ -98,5 +98,7 @@ public DetectedGenerationOptions(IGenerationOptions baseOptions, bool? usefluent public bool OmitTestClassAttribute => _baseOptions.OmitTestClassAttribute; public bool UseSeparateChecksForNullAndEmpty => _baseOptions.UseSeparateChecksForNullAndEmpty; + + public bool IncludeSourceProjectAsFolder => _baseOptions.IncludeSourceProjectAsFolder; } } diff --git a/src/Unitverse.Core/Options/IGenerationOptions.cs b/src/Unitverse.Core/Options/IGenerationOptions.cs index 9cdd372..33901b0 100644 --- a/src/Unitverse.Core/Options/IGenerationOptions.cs +++ b/src/Unitverse.Core/Options/IGenerationOptions.cs @@ -77,5 +77,7 @@ public interface IGenerationOptions bool OmitTestClassAttribute { get; } bool UseSeparateChecksForNullAndEmpty { get; } + + bool IncludeSourceProjectAsFolder { get; } } } \ No newline at end of file diff --git a/src/Unitverse.Core/Options/MutableGenerationOptions.cs b/src/Unitverse.Core/Options/MutableGenerationOptions.cs index 994a0c2..930e6f7 100644 --- a/src/Unitverse.Core/Options/MutableGenerationOptions.cs +++ b/src/Unitverse.Core/Options/MutableGenerationOptions.cs @@ -48,6 +48,7 @@ public MutableGenerationOptions(IGenerationOptions options) EmitMultilinePocoInitializers = options.EmitMultilinePocoInitializers; UseFieldsForConstructorParameterTests = options.UseFieldsForConstructorParameterTests; UseSeparateChecksForNullAndEmpty = options.UseSeparateChecksForNullAndEmpty; + IncludeSourceProjectAsFolder = options.IncludeSourceProjectAsFolder; } public TestFrameworkTypes FrameworkType { get; set; } @@ -125,5 +126,7 @@ public MutableGenerationOptions(IGenerationOptions options) public bool OmitTestClassAttribute { get; set; } public bool UseSeparateChecksForNullAndEmpty { get; set; } + + public bool IncludeSourceProjectAsFolder { get; set; } } } \ No newline at end of file diff --git a/src/Unitverse.Tests.Common/DefaultGenerationOptions.cs b/src/Unitverse.Tests.Common/DefaultGenerationOptions.cs index aabc7f8..19763e5 100644 --- a/src/Unitverse.Tests.Common/DefaultGenerationOptions.cs +++ b/src/Unitverse.Tests.Common/DefaultGenerationOptions.cs @@ -80,5 +80,7 @@ public class DefaultGenerationOptions : IGenerationOptions public bool OmitTestClassAttribute { get; set; } = false; public bool UseSeparateChecksForNullAndEmpty { get; set; } = false; + + public bool IncludeSourceProjectAsFolder { get; set; } = false; } } \ No newline at end of file diff --git a/src/Unitverse/Commands/GenerationItem.cs b/src/Unitverse/Commands/GenerationItem.cs index c62e917..8bbea3d 100644 --- a/src/Unitverse/Commands/GenerationItem.cs +++ b/src/Unitverse/Commands/GenerationItem.cs @@ -3,6 +3,7 @@ using System; using System.Collections.Generic; using System.IO; + using System.Linq; using EnvDTE; using Microsoft.CodeAnalysis; using Microsoft.VisualStudio.Shell; @@ -25,6 +26,16 @@ public GenerationItem(ProjectItemModel source, ProjectMapping mapping) var nameParts = VsProjectHelper.GetFolderParts(source.Item); + if (mapping.Options.GenerationOptions.IncludeSourceProjectAsFolder) + { + var sourceName = mapping.SourceProject.Name; + var sourceNameParts = sourceName.Split('.'); + foreach (var sourceNamePart in sourceNameParts.Reverse()) + { + nameParts.Add(sourceNamePart); + } + } + var targetProject = mapping.TargetProject; TargetProjectItems = TargetFinder.FindTargetFolder(targetProject, nameParts, true, out _targetPath); diff --git a/src/Unitverse/Options/GenerationOptions.cs b/src/Unitverse/Options/GenerationOptions.cs index aa9eba2..1271d37 100644 --- a/src/Unitverse/Options/GenerationOptions.cs +++ b/src/Unitverse/Options/GenerationOptions.cs @@ -198,5 +198,10 @@ public class GenerationOptions : DialogPage, IGenerationOptions [DisplayName("Use separate checks for null and empty")] [Description("Whether to emit separate methods for null and empty string checks")] public bool UseSeparateChecksForNullAndEmpty { get; set; } = false; + + [Category("Naming")] + [DisplayName("Include source project as target folder")] + [Description("Whether to include the source project as part of the target folder structure")] + public bool IncludeSourceProjectAsFolder { get; set; } = false; } } \ No newline at end of file