diff --git a/README.md b/README.md index 8352d7e..d92f073 100644 --- a/README.md +++ b/README.md @@ -30,6 +30,7 @@ AutoFaker.Configure(builder => { builder .WithLocale() // Configures the locale to use + .WithDateTimeKind() // Configures the DateTimeKind to use when generating date and time values. Defaults to `DateTimeKind.Local`. .WithRepeatCount() // Configures the number of items in a collection .WithDataTableRowCount() // Configures the number of data table rows to generate .WithRecursiveDepth() // Configures how deep nested types should recurse diff --git a/src/AutoBogus.Playground/DateTimeKindFixture.cs b/src/AutoBogus.Playground/DateTimeKindFixture.cs new file mode 100644 index 0000000..cc9e8e4 --- /dev/null +++ b/src/AutoBogus.Playground/DateTimeKindFixture.cs @@ -0,0 +1,33 @@ +using FluentAssertions; +using System; +using Xunit; + +namespace AutoBogus.Playground +{ + public class DateTimeKindFixture + { + private sealed class Obj + { + public DateTime Birthday { get; set; } + } + + [Fact] + public void Should_ConvertToUtc() + { + var obj = AutoFaker.Generate(builder => + { + builder.WithDateTimeKind(DateTimeKind.Utc); + }); + + obj.Birthday.Should().Be(obj.Birthday.ToUniversalTime()); + } + + [Fact] + public void Should_BeLocal() + { + var obj = AutoFaker.Generate(); + + obj.Birthday.Should().Be(obj.Birthday.ToLocalTime()); + } + } +} diff --git a/src/AutoBogus.Tests/AutoConfigBuilderFixture.cs b/src/AutoBogus.Tests/AutoConfigBuilderFixture.cs index 0fe6268..f6d4ca8 100644 --- a/src/AutoBogus.Tests/AutoConfigBuilderFixture.cs +++ b/src/AutoBogus.Tests/AutoConfigBuilderFixture.cs @@ -46,6 +46,27 @@ public void Should_Set_Config_Locale_To_Default_If_Null() } } + public class WithDateTimeKind + : AutoConfigBuilderFixture + { + [Fact] + public void Should_Set_Config_DateTimeKind() + { + var kind = DateTimeKind.Utc; + + _builder.WithDateTimeKind(context => kind, null); + + _config.DateTimeKind.Should().Be(kind); + } + + [Fact] + public void Should_Set_Config_DateTimeKind_To_Default_If_Null() + { + _builder.WithRepeatCount(null, null); + _config.DateTimeKind.Invoke(null).Should().Be(DateTimeKind.Utc); + } + } + public class WithRepeatCount : AutoConfigBuilderFixture { @@ -94,7 +115,7 @@ public void Should_Set_Config_RecursiveDepth_To_Default_If_Null() } } - + public class WithTreeDepth : AutoConfigBuilderFixture { diff --git a/src/AutoBogus/AutoConfig.cs b/src/AutoBogus/AutoConfig.cs index 77aa65b..191d918 100644 --- a/src/AutoBogus/AutoConfig.cs +++ b/src/AutoBogus/AutoConfig.cs @@ -10,6 +10,7 @@ internal sealed class AutoConfig internal const string DefaultLocale = "en"; internal const int GenerateAttemptsThreshold = 3; + internal static readonly Func DefaultDateTimeKind = context => System.DateTimeKind.Local; internal static readonly Func DefaultRepeatCount = context => 3; internal static readonly Func DefaultDataTableRowCount = context => 15; internal static readonly Func DefaultRecursiveDepth = context => 2; @@ -18,6 +19,7 @@ internal sealed class AutoConfig internal AutoConfig() { Locale = DefaultLocale; + DateTimeKind = DefaultDateTimeKind; RepeatCount = DefaultRepeatCount; DataTableRowCount = DefaultDataTableRowCount; RecursiveDepth = DefaultRecursiveDepth; @@ -31,6 +33,7 @@ internal AutoConfig() internal AutoConfig(AutoConfig config) { Locale = config.Locale; + DateTimeKind = config.DateTimeKind; RepeatCount = config.RepeatCount; DataTableRowCount = config.DataTableRowCount; RecursiveDepth = config.RecursiveDepth; @@ -43,6 +46,7 @@ internal AutoConfig(AutoConfig config) } internal string Locale { get; set; } + internal Func DateTimeKind { get; set; } internal Func RepeatCount { get; set; } internal Func DataTableRowCount { get; set; } internal Func RecursiveDepth { get; set; } diff --git a/src/AutoBogus/AutoConfigBuilder.cs b/src/AutoBogus/AutoConfigBuilder.cs index 492f522..7c1051c 100644 --- a/src/AutoBogus/AutoConfigBuilder.cs +++ b/src/AutoBogus/AutoConfigBuilder.cs @@ -17,6 +17,8 @@ internal AutoConfigBuilder(AutoConfig config) internal object[] Args { get; private set; } IAutoFakerDefaultConfigBuilder IAutoConfigBuilder.WithLocale(string locale) => WithLocale(locale, this); + IAutoFakerDefaultConfigBuilder IAutoConfigBuilder.WithDateTimeKind(Func dateTimeKind) => WithDateTimeKind(dateTimeKind, this); + IAutoFakerDefaultConfigBuilder IAutoConfigBuilder.WithDateTimeKind(DateTimeKind dateTimeKind) => WithDateTimeKind(_ => dateTimeKind, this); IAutoFakerDefaultConfigBuilder IAutoConfigBuilder.WithRepeatCount(int count) => WithRepeatCount(context => count, this); IAutoFakerDefaultConfigBuilder IAutoConfigBuilder.WithRepeatCount(Func count) => WithRepeatCount(count, this); IAutoFakerDefaultConfigBuilder IAutoConfigBuilder.WithDataTableRowCount(int count) => WithDataTableRowCount(context => count, this); @@ -31,8 +33,10 @@ internal AutoConfigBuilder(AutoConfig config) IAutoFakerDefaultConfigBuilder IAutoConfigBuilder.WithSkip(Type type, string memberName) => WithSkip(type, memberName, this); IAutoFakerDefaultConfigBuilder IAutoConfigBuilder.WithSkip(string memberName) => WithSkip(memberName, this); IAutoFakerDefaultConfigBuilder IAutoConfigBuilder.WithOverride(AutoGeneratorOverride generatorOverride) => WithOverride(generatorOverride, this); - + IAutoGenerateConfigBuilder IAutoConfigBuilder.WithLocale(string locale) => WithLocale(locale, this); + IAutoGenerateConfigBuilder IAutoConfigBuilder.WithDateTimeKind(Func dateTimeKind) => WithDateTimeKind(dateTimeKind, this); + IAutoGenerateConfigBuilder IAutoConfigBuilder.WithDateTimeKind(DateTimeKind dateTimeKind) => WithDateTimeKind(_ => dateTimeKind, this); IAutoGenerateConfigBuilder IAutoConfigBuilder.WithRepeatCount(int count) => WithRepeatCount(context => count, this); IAutoGenerateConfigBuilder IAutoConfigBuilder.WithRepeatCount(Func count) => WithRepeatCount(count, this); IAutoGenerateConfigBuilder IAutoConfigBuilder.WithDataTableRowCount(int count) => WithDataTableRowCount(context => count, this); @@ -47,8 +51,10 @@ internal AutoConfigBuilder(AutoConfig config) IAutoGenerateConfigBuilder IAutoConfigBuilder.WithSkip(Type type, string memberName) => WithSkip(type, memberName, this); IAutoGenerateConfigBuilder IAutoConfigBuilder.WithSkip(string memberName) => WithSkip(memberName, this); IAutoGenerateConfigBuilder IAutoConfigBuilder.WithOverride(AutoGeneratorOverride generatorOverride) => WithOverride(generatorOverride, this); - + IAutoFakerConfigBuilder IAutoConfigBuilder.WithLocale(string locale) => WithLocale(locale, this); + IAutoFakerConfigBuilder IAutoConfigBuilder.WithDateTimeKind(Func dateTimeKind) => WithDateTimeKind(dateTimeKind, this); + IAutoFakerConfigBuilder IAutoConfigBuilder.WithDateTimeKind(DateTimeKind dateTimeKind) => WithDateTimeKind(_ => dateTimeKind, this); IAutoFakerConfigBuilder IAutoConfigBuilder.WithRepeatCount(int count) => WithRepeatCount(context => count, this); IAutoFakerConfigBuilder IAutoConfigBuilder.WithRepeatCount(Func count) => WithRepeatCount(count, this); IAutoFakerConfigBuilder IAutoConfigBuilder.WithDataTableRowCount(int count) => WithDataTableRowCount(context => count, this); @@ -71,6 +77,12 @@ internal TBuilder WithLocale(string locale, TBuilder builder) return builder; } + internal TBuilder WithDateTimeKind(Func kind, TBuilder builder) + { + Config.DateTimeKind = kind ?? AutoConfig.DefaultDateTimeKind; + return builder; + } + internal TBuilder WithRepeatCount(Func count, TBuilder builder) { Config.RepeatCount = count ?? AutoConfig.DefaultRepeatCount; diff --git a/src/AutoBogus/Generators/DateTimeGenerator.cs b/src/AutoBogus/Generators/DateTimeGenerator.cs index 97402b9..c5f7ec9 100644 --- a/src/AutoBogus/Generators/DateTimeGenerator.cs +++ b/src/AutoBogus/Generators/DateTimeGenerator.cs @@ -1,11 +1,15 @@ namespace AutoBogus.Generators { + using System; + internal sealed class DateTimeGenerator : IAutoGenerator { object IAutoGenerator.Generate(AutoGenerateContext context) { - return context.Faker.Date.Recent(); + return context.Config.DateTimeKind.Invoke(context) == DateTimeKind.Utc + ? context.Faker.Date.Recent().ToUniversalTime() + : context.Faker.Date.Recent(); } } } diff --git a/src/AutoBogus/Generators/DateTimeOffsetGenerator.cs b/src/AutoBogus/Generators/DateTimeOffsetGenerator.cs index b1d5e7a..4b5846b 100644 --- a/src/AutoBogus/Generators/DateTimeOffsetGenerator.cs +++ b/src/AutoBogus/Generators/DateTimeOffsetGenerator.cs @@ -7,7 +7,9 @@ internal sealed class DateTimeOffsetGenerator { object IAutoGenerator.Generate(AutoGenerateContext context) { - var dateTime = context.Faker.Date.Recent(); + var dateTime = context.Config.DateTimeKind.Invoke(context) == DateTimeKind.Utc + ? context.Faker.Date.Recent().ToUniversalTime() + : context.Faker.Date.Recent(); return new DateTimeOffset(dateTime); } } diff --git a/src/AutoBogus/IAutoConfigBuilder.cs b/src/AutoBogus/IAutoConfigBuilder.cs index dfa4c19..f6483bd 100644 --- a/src/AutoBogus/IAutoConfigBuilder.cs +++ b/src/AutoBogus/IAutoConfigBuilder.cs @@ -17,6 +17,20 @@ public interface IAutoConfigBuilder /// The current configuration builder instance. TBuilder WithLocale(string locale); + /// + /// Registers the DateTimeKind to use when generating date and time values. + /// + /// The dateTimeKind to use. + /// The current configuration builder instance. + TBuilder WithDateTimeKind(Func dateTimeKind); + + /// + /// Registers the DateTimeKind to use when generating date and time values. + /// + /// The dateTimeKind to use. + /// The current configuration builder instance. + TBuilder WithDateTimeKind(DateTimeKind dateTimeKind); + /// /// Registers the number of items to generate for a collection. ///