Skip to content

Commit bde6121

Browse files
committed
Test framework: FixDateTimeForProvider() -> AdjustDateTimeForProvider()
and apply it to some tests
1 parent 303ac4d commit bde6121

4 files changed

Lines changed: 61 additions & 22 deletions

File tree

Orm/Xtensive.Orm.Tests.Framework/TestHelper.cs

Lines changed: 51 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -50,36 +50,75 @@ public static System.Configuration.Configuration GetConfigurationForAssembly(thi
5050
return instanceOfTypeFromAssembly.GetType().Assembly.GetAssemblyConfiguration();
5151
}
5252

53+
/// <summary>
54+
/// Cuts down resolution of <see cref="DateTime"/> value if needed, according to current <see cref="StorageProviderInfo.Instance"/>.
55+
/// </summary>
56+
/// <param name="origin">The value to adjust.</param>
57+
/// <returns>New value with less resolution if the provider requires it, otherwise, untouched <paramref name="origin"/>.</returns>
58+
public static DateTime AdjustDateTimeForCurrentProvider(this DateTime origin)
59+
{
60+
var provider = StorageProviderInfo.Instance;
61+
return AdjustDateTimeForProvider(origin, provider);
62+
}
63+
5364
/// <summary>
5465
/// Cuts down resolution of <see cref="DateTime"/> value if needed.
5566
/// </summary>
5667
/// <param name="origin">The value to fix.</param>
5768
/// <param name="provider">Type of provider.</param>
5869
/// <returns>New value with less resolution if <paramref name="provider"/> requires it or untouched <paramref name="origin"/> if the provider doesn't</returns>
59-
public static DateTime FixDateTimeForProvider(this DateTime origin, StorageProviderInfo providerInfo)
70+
public static DateTime AdjustDateTimeForProvider(this DateTime origin, StorageProviderInfo providerInfo)
6071
{
61-
long? divider;
6272
var provider = providerInfo.Provider;
6373
switch (provider) {
6474
case StorageProvider.MySql:
65-
divider = providerInfo.Info.StorageVersion < StorageProviderVersion.MySql56 ? 10000000 : 10;
66-
break;
75+
return providerInfo.Info.StorageVersion < StorageProviderVersion.MySql56
76+
? AdjustDateTime(origin, 0)
77+
: AdjustDateTime(origin, 6);
6778
case StorageProvider.Firebird:
68-
divider = 1000;
69-
break;
79+
return AdjustDateTime(origin, 4);
7080
case StorageProvider.PostgreSql:
71-
divider = 10;
72-
break;
81+
return AdjustDateTime(origin, 6);
82+
case StorageProvider.Oracle:
83+
return AdjustDateTime(origin, 7);
7384
default:
74-
divider = null;
75-
break;
85+
return origin;
7686
}
87+
}
7788

78-
if (!divider.HasValue) {
89+
/// <summary>
90+
/// Cuts down fractions of <see cref="DateTime"/> value (nanoseconds, milliseconds, etc) to desired value.
91+
/// </summary>
92+
/// <param name="origin"></param>
93+
/// <param name="desiredFractions">Number of fractional points to keep (from 0 to 7).</param>
94+
/// <param name="requireRound">Indicates whether value should be rounded after cutting off.</param>
95+
/// <returns>Result value.</returns>
96+
/// <exception cref="ArgumentOutOfRangeException">Valid fractions should be between 0 and 7 (7 included).</exception>
97+
public static DateTime AdjustDateTime(this DateTime origin, byte desiredFractions, bool requireRound = false)
98+
{
99+
if (desiredFractions == 7) {
79100
return origin;
80101
}
102+
103+
const int baseDivider = 10_000_000; // no fractions
104+
var currentDivider = baseDivider / (desiredFractions switch {
105+
0 => 1,
106+
1 => 10,
107+
2 => 100,
108+
3 => 1000,
109+
4 => 10000,
110+
5 => 100000,
111+
6 => 1000000,
112+
_ => throw new ArgumentOutOfRangeException(nameof(desiredFractions))
113+
});
114+
81115
var ticks = origin.Ticks;
82-
var newTicks = ticks - (ticks % divider.Value);
116+
117+
var newTicks = requireRound
118+
? ((ticks % currentDivider) / (currentDivider / 10)) >= 5
119+
? ticks - (ticks % currentDivider) + currentDivider
120+
: ticks - (ticks % currentDivider)
121+
: ticks - (ticks % currentDivider);
83122
return new DateTime(newTicks);
84123
}
85124
}

Orm/Xtensive.Orm.Tests/Issues/IssueJira0593_AggregateForSingleColumnTest.cs

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -768,10 +768,10 @@ private static void CheckQueryable(IQueryable<TimeSpan?> query)
768768
private static void CheckQueryable(IQueryable<DateTime> query)
769769
{
770770
var localArray = query.ToArray();
771-
Assert.AreEqual(localArray.Min().FixDateTimeForProvider(StorageProviderInfo.Instance), query.Min(c => c));
772-
Assert.AreEqual(localArray.Min().FixDateTimeForProvider(StorageProviderInfo.Instance), query.Min());
773-
Assert.AreEqual(localArray.Max().FixDateTimeForProvider(StorageProviderInfo.Instance), query.Max(c => c));
774-
Assert.AreEqual(localArray.Max().FixDateTimeForProvider(StorageProviderInfo.Instance), query.Max());
771+
Assert.AreEqual(localArray.Min().AdjustDateTimeForCurrentProvider(), query.Min(c => c));
772+
Assert.AreEqual(localArray.Min().AdjustDateTimeForCurrentProvider(), query.Min());
773+
Assert.AreEqual(localArray.Max().AdjustDateTimeForCurrentProvider(), query.Max(c => c));
774+
Assert.AreEqual(localArray.Max().AdjustDateTimeForCurrentProvider(), query.Max());
775775
Assert.AreEqual(localArray.Count(), query.Count());
776776
}
777777

Orm/Xtensive.Orm.Tests/Linq/DateTimeAndDateTimeOffset/DateTime/OperationsTest.cs

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -196,10 +196,10 @@ public void MysqlMinisDateTimeTest()
196196
{
197197
Require.ProviderIs(StorageProvider.MySql);
198198
ExecuteInsideSession(() => {
199-
var firstDateTime = FirstDateTime.FixDateTimeForProvider(StorageProviderInfo.Instance);
200-
var firstMillisecondDateTime = FirstMillisecondDateTime.FixDateTimeForProvider(StorageProviderInfo.Instance);
201-
var secondDateTime = SecondDateTime.FixDateTimeForProvider(StorageProviderInfo.Instance);
202-
var nullableDateTime = NullableDateTime.FixDateTimeForProvider(StorageProviderInfo.Instance);
199+
var firstDateTime = FirstDateTime.AdjustDateTimeForCurrentProvider();
200+
var firstMillisecondDateTime = FirstMillisecondDateTime.AdjustDateTimeForCurrentProvider();
201+
var secondDateTime = SecondDateTime.AdjustDateTimeForCurrentProvider();
202+
var nullableDateTime = NullableDateTime.AdjustDateTimeForCurrentProvider();
203203

204204
RunTest<SingleDateTimeEntity>(c => c.DateTime - secondDateTime == firstDateTime - secondDateTime);
205205
RunTest<SingleDateTimeEntity>(c => c.MillisecondDateTime - secondDateTime == firstMillisecondDateTime - secondDateTime);

Orm/Xtensive.Orm.Tests/Linq/DateTimeAndDateTimeOffset/DateTime/PartsExtractionTest.cs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -111,7 +111,7 @@ public void MysqlExtractMillisecondTest()
111111
{
112112
Require.ProviderIs(StorageProvider.MySql);
113113
ExecuteInsideSession(() => {
114-
var firstMillisecondDateTime = FirstMillisecondDateTime.FixDateTimeForProvider(StorageProviderInfo.Instance);
114+
var firstMillisecondDateTime = FirstMillisecondDateTime.AdjustDateTimeForProvider(StorageProviderInfo.Instance);
115115
RunTest<SingleDateTimeEntity>(c => c.MillisecondDateTime.Millisecond == firstMillisecondDateTime.Millisecond);
116116
RunWrongTest<SingleDateTimeEntity>(c => c.MillisecondDateTime.Second == WrongMillisecondDateTime.Millisecond);
117117
});
@@ -152,7 +152,7 @@ public void ExtractTimeOfDayTest()
152152
{
153153
ExecuteInsideSession(() => {
154154
RunTest<SingleDateTimeEntity>(c => c.DateTime.TimeOfDay == FirstDateTime.TimeOfDay);
155-
RunTest<SingleDateTimeEntity>(c => c.MillisecondDateTime.TimeOfDay == FirstMillisecondDateTime.TimeOfDay);
155+
RunTest<SingleDateTimeEntity>(c => c.MillisecondDateTime.TimeOfDay == FirstMillisecondDateTime.AdjustDateTimeForCurrentProvider().TimeOfDay);
156156
RunTest<SingleDateTimeEntity>(c => c.NullableDateTime.Value.TimeOfDay == NullableDateTime.TimeOfDay);
157157

158158
RunWrongTest<SingleDateTimeEntity>(c => c.DateTime.TimeOfDay == WrongDateTime.TimeOfDay);

0 commit comments

Comments
 (0)