Skip to content

Commit b0a3628

Browse files
author
rmla
committed
Fix #129
1 parent 34a8ec0 commit b0a3628

File tree

2 files changed

+66
-7
lines changed

2 files changed

+66
-7
lines changed

Tynamix.ObjectFiller.Test/BugfixTests/Bug129WrongDateTimeGeneration.cs

Lines changed: 10 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -15,17 +15,23 @@ public class TestEntity
1515
public void InvalidDateTimeValuesDueToDaylightSavingsTime()
1616
{
1717
Filler<TestEntity> filler = new Filler<TestEntity>();
18+
var timeZoneInfo = TimeZoneInfo.FindSystemTimeZoneById("Pacific Standard Time");
19+
filler.Setup().OnType<DateTime>().Use(new DateTimeRange(new DateTime(2007, 3, 11, 1, 0, 0, DateTimeKind.Unspecified), new DateTime(2007, 3, 11, 4, 00, 0, DateTimeKind.Unspecified), timeZoneInfo));
1820

19-
filler.Setup().OnType<DateTime>().Use(new DateTimeRange(new DateTime(2007, 3, 11, 1, 0, 0, DateTimeKind.Unspecified), new DateTime(2007, 3, 11, 4, 00, 0, DateTimeKind.Unspecified)));
20-
2121
for (int i = 0; i < 1000; i++)
2222
{
2323
var result = filler.Create();
24-
Assert.IsFalse(TimeZoneInfo.FindSystemTimeZoneById("Pacific Standard Time").IsInvalidTime(result.Date));
24+
Assert.IsFalse(timeZoneInfo.IsInvalidTime(result.Date));
2525
}
2626

27+
filler = new Filler<TestEntity>();
28+
filler.Setup().OnType<DateTime>().Use(new DateTimeRange(new DateTime(2022, 3, 27, 1, 0, 0, DateTimeKind.Unspecified), new DateTime(2022, 3, 27, 4, 00, 0, DateTimeKind.Unspecified)));
2729

28-
30+
for (int i = 0; i < 1000; i++)
31+
{
32+
var result = filler.Create();
33+
Assert.IsFalse(TimeZoneInfo.Local.IsInvalidTime(result.Date));
34+
}
2935
}
3036
}
3137
}

Tynamix.ObjectFiller/Plugins/DateTime/DateTimeRange.cs

Lines changed: 56 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -17,11 +17,27 @@ public class DateTimeRange : IRandomizerPlugin<DateTime>, IRandomizerPlugin<Date
1717
/// </summary>
1818
private readonly DateTime latestDate;
1919

20+
/// <summary>
21+
/// The target timezone to generate only valid date times
22+
/// </summary>
23+
private readonly TimeZoneInfo timeZoneInfo;
24+
2025
/// <summary>
2126
/// Initializes a new instance of the <see cref="DateTimeRange"/> class.
2227
/// </summary>
2328
public DateTimeRange()
24-
: this(DateTime.MinValue)
29+
: this(TimeZoneInfo.Local)
30+
{
31+
}
32+
33+
/// <summary>
34+
/// Initializes a new instance of the <see cref="DateTimeRange"/> class.
35+
/// </summary>
36+
/// <param name="timeZoneInfo">
37+
/// The target timezone to generate only valid date times
38+
/// </param>
39+
public DateTimeRange(TimeZoneInfo timeZoneInfo)
40+
: this(DateTime.MinValue, timeZoneInfo)
2541
{
2642
}
2743

@@ -32,10 +48,26 @@ public DateTimeRange()
3248
/// The earliest date.
3349
/// </param>
3450
public DateTimeRange(DateTime earliestDate)
35-
: this(earliestDate, DateTime.Now)
51+
: this(earliestDate, TimeZoneInfo.Local)
52+
{
53+
}
54+
55+
/// <summary>
56+
/// Initializes a new instance of the <see cref="DateTimeRange"/> class.
57+
/// </summary>
58+
/// <param name="earliestDate">
59+
/// The earliest date.
60+
/// </param>
61+
/// <param name="timeZoneInfo">
62+
/// The target timezone to generate only valid date times
63+
/// </param>
64+
public DateTimeRange(DateTime earliestDate, TimeZoneInfo timeZoneInfo)
65+
: this(earliestDate, DateTime.Now, timeZoneInfo)
3666
{
67+
3768
}
3869

70+
3971
/// <summary>
4072
/// Initializes a new instance of the <see cref="DateTimeRange"/> class.
4173
/// </summary>
@@ -46,7 +78,26 @@ public DateTimeRange(DateTime earliestDate)
4678
/// The latest date.
4779
/// </param>
4880
public DateTimeRange(DateTime earliestDate, DateTime latestDate)
81+
: this(earliestDate, latestDate, TimeZoneInfo.Local)
82+
{
83+
84+
}
85+
86+
/// <summary>
87+
/// Initializes a new instance of the <see cref="DateTimeRange"/> class.
88+
/// </summary>
89+
/// <param name="earliestDate">
90+
/// The earliest date.
91+
/// </param>
92+
/// <param name="latestDate">
93+
/// The latest date.
94+
/// </param>
95+
/// <param name="timeZoneInfo">
96+
/// The target timezone to generate only valid date times
97+
/// </param>
98+
public DateTimeRange(DateTime earliestDate, DateTime latestDate, TimeZoneInfo timeZoneInfo)
4999
{
100+
this.timeZoneInfo = timeZoneInfo;
50101
if (earliestDate > latestDate)
51102
{
52103
this.latestDate = earliestDate;
@@ -75,7 +126,9 @@ public DateTime GetValue()
75126
var diff = Random.NextLong(0, timeSpan.Ticks);
76127

77128
var generatedDate = this.latestDate.AddTicks(diff * -1);
78-
return TimeZoneInfo.Utc.IsInvalidTime(generatedDate) ? GetValue() : generatedDate;
129+
return this.timeZoneInfo.IsInvalidTime(generatedDate)
130+
? GetValue()
131+
: generatedDate;
79132
}
80133

81134
/// <summary>

0 commit comments

Comments
 (0)