diff --git a/EasyCodeBuilder.Test/Csharp/PartialKeywordTests.cs b/EasyCodeBuilder.Test/Csharp/PartialKeywordTests.cs new file mode 100644 index 0000000..08fd2d4 --- /dev/null +++ b/EasyCodeBuilder.Test/Csharp/PartialKeywordTests.cs @@ -0,0 +1,140 @@ +using Fengb3.EasyCodeBuilder.Csharp; +using Fengb3.EasyCodeBuilder.Csharp.OptionConfigurations; +using Xunit.Abstractions; + +namespace EasyCodeBuilder.Test.Csharp; + +public class PartialKeywordTests(ITestOutputHelper testOutputHelper) +{ + private static string Normalize(string text) => text.Replace("\r\n", "\n").Trim(); + + [Fact] + public void TestPartialClassInNamespace() + { + var @namespace = new NamespaceOption() + .WithName("MyNamespace") + .Partial.Class(cls => + { + cls.WithName("MyClass"); + }); + + var code = @namespace.Build(); + + const string expected = + """ + namespace MyNamespace + { + partial class MyClass + { + } + } + """; + + Assert.Equal(Normalize(expected), Normalize(code)); + testOutputHelper.WriteLine(code); + } + + [Fact] + public void TestPublicPartialClass() + { + var @namespace = new NamespaceOption() + .WithName("MyNamespace") + .Public.Partial.Class(cls => + { + cls.WithName("MyClass"); + }); + + var code = @namespace.Build(); + + const string expected = + """ + namespace MyNamespace + { + public partial class MyClass + { + } + } + """; + + Assert.Equal(Normalize(expected), Normalize(code)); + testOutputHelper.WriteLine(code); + } + + [Fact] + public void TestPublicStaticPartialClass() + { + var @namespace = new NamespaceOption() + .WithName("MyNamespace") + .Public.Static.Partial.Class(cls => + { + cls.WithName("MyClass"); + }); + + var code = @namespace.Build(); + + const string expected = + """ + namespace MyNamespace + { + public static partial class MyClass + { + } + } + """; + + Assert.Equal(Normalize(expected), Normalize(code)); + testOutputHelper.WriteLine(code); + } + + [Fact] + public void TestPartialNestedClass() + { + var code = new TypeOption() + .WithTypeKind(TypeOption.Type.Class) + .WithName("OuterClass") + .WithKeywords("public") + .Partial.NestedClass(nc => nc + .WithName("InnerClass") + ) + .Build(); + + const string expected = + """ + public class OuterClass + { + partial class InnerClass + { + } + } + """; + + Assert.Equal(Normalize(expected), Normalize(code)); + testOutputHelper.WriteLine(code); + } + + [Fact] + public void TestPublicPartialNestedClass() + { + var code = new TypeOption() + .WithTypeKind(TypeOption.Type.Class) + .WithName("OuterClass") + .WithKeywords("public") + .Public.Partial.NestedClass(nc => nc + .WithName("InnerClass") + ) + .Build(); + + const string expected = + """ + public class OuterClass + { + public partial class InnerClass + { + } + } + """; + + Assert.Equal(Normalize(expected), Normalize(code)); + testOutputHelper.WriteLine(code); + } +} diff --git a/EasyCodeBuilder/Csharp/NamespaceOption.cs b/EasyCodeBuilder/Csharp/NamespaceOption.cs index f17b1c2..b18203a 100644 --- a/EasyCodeBuilder/Csharp/NamespaceOption.cs +++ b/EasyCodeBuilder/Csharp/NamespaceOption.cs @@ -42,6 +42,11 @@ public override CodeBuilder Build(CodeBuilder cb) /// 私有访问修饰符配置器 /// public KeywordOptionConfigurator Private => Has.Private; + + /// + /// partial 修饰符配置器 + /// + public KeywordOptionConfigurator Partial => Has.Partial; } /// diff --git a/EasyCodeBuilder/Csharp/OptionConfigurations/OptionConfigurations.cs b/EasyCodeBuilder/Csharp/OptionConfigurations/OptionConfigurations.cs index 56763eb..3dcde6b 100644 --- a/EasyCodeBuilder/Csharp/OptionConfigurations/OptionConfigurations.cs +++ b/EasyCodeBuilder/Csharp/OptionConfigurations/OptionConfigurations.cs @@ -132,6 +132,47 @@ Action configure #endregion + #region Add nested type to type + + /// + /// 添加嵌套类 + /// + /// 关键字配置器 + /// 嵌套类选项配置委托 + /// 类型选项 + public static TypeOption NestedClass( + this KeywordOptionConfigurator configurator, + Func configure + ) + { + configurator.Parent.AddChild(to => + { + configurator.Configure(keyword => to.WithKeyword(keyword)); + configure(to); + }); + return configurator.Parent; + } + + /// + /// 添加嵌套类 + /// + /// 关键字配置器 + /// 嵌套类选项配置委托 + /// 类型选项 + public static TypeOption NestedClass( + this KeywordOptionConfigurator configurator, + Action configure + ) + { + return configurator.NestedClass(to => + { + configure(to); + return to; + }); + } + + #endregion + #region Add member to type /// diff --git a/EasyCodeBuilder/Csharp/TypeOption.cs b/EasyCodeBuilder/Csharp/TypeOption.cs index 7756de8..c50add9 100644 --- a/EasyCodeBuilder/Csharp/TypeOption.cs +++ b/EasyCodeBuilder/Csharp/TypeOption.cs @@ -112,6 +112,11 @@ public override CodeBuilder Build(CodeBuilder cb) /// 静态修饰符配置器 /// public KeywordOptionConfigurator Static => KeywordConfigurator.Static; + + /// + /// partial 修饰符配置器 + /// + public KeywordOptionConfigurator Partial => KeywordConfigurator.Partial; } ///