Skip to content

Commit 578b3fa

Browse files
committed
DateTime/TimeOnly values adjusting for test purposes changed
1 parent 11857bb commit 578b3fa

7 files changed

Lines changed: 88 additions & 48 deletions

File tree

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

Lines changed: 69 additions & 32 deletions
Original file line numberDiff line numberDiff line change
@@ -50,61 +50,98 @@ 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>
56-
/// <param name="origin">The value to fix.</param>
57-
/// <param name="provider">Type of provider.</param>
58-
/// <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)
67+
/// <param name="origin">The value to adjust.</param>
68+
/// <param name="providerInfo">Type of provider.</param>
69+
/// <returns>New value with less resolution if the provider requires it, otherwise, untouched <paramref name="origin"/>.</returns>
70+
private static DateTime AdjustDateTimeForProvider(this DateTime origin, StorageProviderInfo providerInfo)
6071
{
61-
long? divider;
72+
//long? divider;
6273
var provider = providerInfo.Provider;
6374
switch (provider) {
6475
case StorageProvider.MySql:
65-
divider = providerInfo.Info.StorageVersion < StorageProviderVersion.MySql56 ? 10000000 : 10;
66-
break;
76+
return providerInfo.Info.StorageVersion < StorageProviderVersion.MySql56
77+
? AdjustDateTime(origin, 0)
78+
: AdjustDateTime(origin, 6);
6779
case StorageProvider.Firebird:
68-
divider = 1000;
69-
break;
80+
return AdjustDateTime(origin, 4);
7081
case StorageProvider.PostgreSql:
71-
divider = 10;
72-
break;
82+
return AdjustDateTime(origin, 6);
7383
case StorageProvider.Oracle:
74-
divider = 10;
75-
break;
84+
return AdjustDateTime(origin, 6, true);
7685
default:
77-
divider = null;
78-
break;
86+
return origin;
7987
}
88+
}
8089

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

100126
#if NET6_0_OR_GREATER //DO_DATEONLY
127+
/// <summary>
128+
/// Cuts down resolution of <see cref="TimeOnly"/> value if needed, according to current <see cref="StorageProviderInfo.Instance"/>.
129+
/// </summary>
130+
/// <param name="origin">The value to adjust.</param>
131+
/// <returns>New value with less resolution if the provider requires it, otherwise, untouched <paramref name="origin"/>.</returns>
132+
public static TimeOnly AdjustTimeOnlyForCurrentProvider(this TimeOnly origin)
133+
{
134+
var provider = StorageProviderInfo.Instance;
135+
return AdjustTimeOnlyForProvider(origin, provider);
136+
}
137+
101138
/// <summary>
102139
/// Cuts down resolution of <see cref="TimeOnly"/> value if needed.
103140
/// </summary>
104-
/// <param name="origin">The value to fix.</param>
105-
/// <param name="provider">Type of provider.</param>
106-
/// <returns>New value with less resolution if <paramref name="provider"/> requires it or untouched <paramref name="origin"/> if the provider doesn't</returns>
107-
public static TimeOnly FixTimeOnlyForProvider(this TimeOnly origin, StorageProviderInfo providerInfo)
141+
/// <param name="origin">The value to adjust.</param>
142+
/// <param name="providerInfo">Type of provider.</param>
143+
/// <returns>New value with less resolution if the provider requires it, otherwise, untouched <paramref name="origin"/>.</returns>
144+
public static TimeOnly AdjustTimeOnlyForProvider(this TimeOnly origin, StorageProviderInfo providerInfo)
108145
{
109146
long? divider;
110147
var provider = providerInfo.Provider;

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

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -700,10 +700,10 @@ private static void CheckQueryable(IQueryable<TimeSpan?> query)
700700
private static void CheckQueryable(IQueryable<DateTime> query)
701701
{
702702
var localArray = query.ToArray();
703-
Assert.AreEqual(localArray.Min().FixDateTimeForProvider(StorageProviderInfo.Instance), query.Min(c => c));
704-
Assert.AreEqual(localArray.Min().FixDateTimeForProvider(StorageProviderInfo.Instance), query.Min());
705-
Assert.AreEqual(localArray.Max().FixDateTimeForProvider(StorageProviderInfo.Instance), query.Max(c => c));
706-
Assert.AreEqual(localArray.Max().FixDateTimeForProvider(StorageProviderInfo.Instance), query.Max());
703+
Assert.AreEqual(localArray.Min().AdjustDateTimeForCurrentProvider(), query.Min(c => c));
704+
Assert.AreEqual(localArray.Min().AdjustDateTimeForCurrentProvider(), query.Min());
705+
Assert.AreEqual(localArray.Max().AdjustDateTimeForCurrentProvider(), query.Max(c => c));
706+
Assert.AreEqual(localArray.Max().AdjustDateTimeForCurrentProvider(), query.Max());
707707
Assert.AreEqual(localArray.Count(), query.Count());
708708
}
709709

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: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -111,7 +111,7 @@ public void MysqlExtractMillisecondTest()
111111
{
112112
Require.ProviderIs(StorageProvider.MySql);
113113
ExecuteInsideSession((s) => {
114-
var firstMillisecondDateTime = FirstMillisecondDateTime.FixDateTimeForProvider(StorageProviderInfo.Instance);
114+
var firstMillisecondDateTime = FirstMillisecondDateTime.AdjustDateTimeForCurrentProvider();
115115
RunTest<SingleDateTimeEntity>(s, c => c.MillisecondDateTime.Millisecond == firstMillisecondDateTime.Millisecond);
116116
RunWrongTest<SingleDateTimeEntity>(s, c => c.MillisecondDateTime.Second == WrongMillisecondDateTime.Millisecond);
117117
});

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

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -92,10 +92,10 @@ public void MysqlMinisTimeOnlyTest()
9292
{
9393
Require.ProviderIs(StorageProvider.MySql);
9494
ExecuteInsideSession((s) => {
95-
var firstTimeOnly = FirstTimeOnly.FixTimeOnlyForProvider(StorageProviderInfo.Instance);
96-
var firstMillisecondTimeOnly = FirstMillisecondTimeOnly.FixTimeOnlyForProvider(StorageProviderInfo.Instance);
97-
var secondTimeOnly = SecondTimeOnly.FixTimeOnlyForProvider(StorageProviderInfo.Instance);
98-
var nullableTimeOnly = NullableTimeOnly.FixTimeOnlyForProvider(StorageProviderInfo.Instance);
95+
var firstTimeOnly = FirstTimeOnly.AdjustTimeOnlyForCurrentProvider();
96+
var firstMillisecondTimeOnly = FirstMillisecondTimeOnly.AdjustTimeOnlyForCurrentProvider();
97+
var secondTimeOnly = SecondTimeOnly.AdjustTimeOnlyForCurrentProvider();
98+
var nullableTimeOnly = NullableTimeOnly.AdjustTimeOnlyForCurrentProvider();
9999

100100
RunTest<SingleTimeOnlyEntity>(s, c => c.TimeOnly - secondTimeOnly == firstTimeOnly - secondTimeOnly);
101101
RunTest<SingleTimeOnlyEntity>(s, c => c.MillisecondTimeOnly - secondTimeOnly == firstMillisecondTimeOnly - secondTimeOnly);

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

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -70,7 +70,7 @@ public void MysqlExtractMillisecondTest()
7070
Require.ProviderIs(StorageProvider.MySql);
7171
Require.ProviderVersionAtLeast(new Version(5, 6));// no support for fractions below 5.6
7272
ExecuteInsideSession((s) => {
73-
var firstMillisecondTimeOnly = FirstMillisecondTimeOnly.FixTimeOnlyForProvider(StorageProviderInfo.Instance);
73+
var firstMillisecondTimeOnly = FirstMillisecondTimeOnly.AdjustTimeOnlyForCurrentProvider();
7474
RunTest<SingleTimeOnlyEntity>(s, c => c.MillisecondTimeOnly.Millisecond == firstMillisecondTimeOnly.Millisecond);
7575
RunWrongTest<SingleTimeOnlyEntity>(s, c => c.MillisecondTimeOnly.Second == WrongMillisecondTimeOnly.Millisecond);
7676
});

Orm/Xtensive.Orm.Tests/Storage/DateTimeStoragePrecisionTest.cs

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -89,9 +89,12 @@ public void TimeOnlyTest()
8989
}
9090
}
9191

92-
private static TimeOnly GetExpectedValue(in TimeOnly baseTimeOnly) => baseTimeOnly.FixTimeOnlyForProvider(StorageProviderInfo.Instance);
92+
private static TimeOnly GetExpectedValue(in TimeOnly baseTimeOnly) => baseTimeOnly.AdjustTimeOnlyForCurrentProvider();
9393

9494
#endif
95-
private static DateTime GetExpectedValue(in DateTime baseDateTime) => baseDateTime.FixDateTimeForProvider(StorageProviderInfo.Instance);
95+
private static DateTime GetExpectedValue(in DateTime baseDateTime) =>
96+
StorageProviderInfo.Instance.Provider == StorageProvider.MySql
97+
? baseDateTime.AdjustDateTime(0, true)
98+
: baseDateTime.AdjustDateTimeForCurrentProvider();
9699
}
97100
}

0 commit comments

Comments
 (0)