Skip to content

Commit cc1e507

Browse files
committed
Add test of IntervalToMillisecond conversion
1 parent 58c0c7c commit cc1e507

File tree

1 file changed

+198
-0
lines changed

1 file changed

+198
-0
lines changed
Lines changed: 198 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,198 @@
1+
using System;
2+
using System.Collections.Generic;
3+
using System.Linq;
4+
using System.Text;
5+
using System.Threading.Tasks;
6+
using NUnit.Framework;
7+
using Xtensive.Sql;
8+
using Xtensive.Sql.Dml;
9+
10+
namespace Xtensive.Orm.Tests.Sql.PostgreSql
11+
{
12+
public sealed class IntervalToMillisecondsTest : SqlTest
13+
{
14+
private const string IdColumnName = "Id";
15+
private const string ValueColumnName = "Value";
16+
private const string TableName = "IntervalToMsTest";
17+
18+
private TypeMapping longMapping;
19+
private TypeMapping timeSpanMapping;
20+
private TypeMapping doubleMapping;
21+
22+
private SqlSelect selectQuery;
23+
24+
private static TimeSpan[] TestValues
25+
{
26+
get => new[] {
27+
TimeSpan.MinValue,
28+
TimeSpan.MaxValue,
29+
TimeSpan.FromMinutes(1).Add(TimeSpan.FromSeconds(1)),
30+
TimeSpan.FromMinutes(10).Add(TimeSpan.FromSeconds(10)),
31+
TimeSpan.FromMinutes(15).Add(TimeSpan.FromSeconds(15)),
32+
TimeSpan.FromMinutes(27).Add(TimeSpan.FromSeconds(27)),
33+
TimeSpan.FromMinutes(30).Add(TimeSpan.FromSeconds(30)),
34+
TimeSpan.FromMinutes(43).Add(TimeSpan.FromSeconds(43)),
35+
TimeSpan.FromMinutes(55).Add(TimeSpan.FromSeconds(55)),
36+
TimeSpan.FromMinutes(59).Add(TimeSpan.FromSeconds(59)),
37+
TimeSpan.FromHours(1).Add(TimeSpan.FromMinutes(1).Add(TimeSpan.FromSeconds(1))),
38+
TimeSpan.FromHours(10).Add(TimeSpan.FromMinutes(10).Add(TimeSpan.FromSeconds(10))),
39+
TimeSpan.FromHours(15).Add(TimeSpan.FromMinutes(15).Add(TimeSpan.FromSeconds(15))),
40+
TimeSpan.FromHours(20).Add(TimeSpan.FromMinutes(27).Add(TimeSpan.FromSeconds(27))),
41+
TimeSpan.FromHours(23).Add(TimeSpan.FromMinutes(30).Add(TimeSpan.FromSeconds(30))),
42+
TimeSpan.FromDays(1).Add(TimeSpan.FromHours(1).Add(TimeSpan.FromMinutes(1).Add(TimeSpan.FromSeconds(1)))),
43+
TimeSpan.FromDays(30).Add(TimeSpan.FromHours(10).Add(TimeSpan.FromMinutes(10).Add(TimeSpan.FromSeconds(10)))),
44+
TimeSpan.FromDays(15).Add(TimeSpan.FromHours(15).Add(TimeSpan.FromMinutes(15).Add(TimeSpan.FromSeconds(15)))),
45+
TimeSpan.FromDays(20).Add(TimeSpan.FromHours(20).Add(TimeSpan.FromMinutes(27).Add(TimeSpan.FromSeconds(27)))),
46+
TimeSpan.FromDays(23).Add(TimeSpan.FromHours(23).Add(TimeSpan.FromMinutes(30).Add(TimeSpan.FromSeconds(30)))),
47+
TimeSpan.FromDays(28).Add(TimeSpan.FromHours(23).Add(TimeSpan.FromMinutes(30).Add(TimeSpan.FromSeconds(30)))),
48+
TimeSpan.FromDays(29).Add(TimeSpan.FromHours(23).Add(TimeSpan.FromMinutes(30).Add(TimeSpan.FromSeconds(30)))),
49+
TimeSpan.FromDays(32).Add(TimeSpan.FromHours(1).Add(TimeSpan.FromMinutes(1).Add(TimeSpan.FromSeconds(1)))),
50+
TimeSpan.FromDays(40).Add(TimeSpan.FromHours(10).Add(TimeSpan.FromMinutes(10).Add(TimeSpan.FromSeconds(10)))),
51+
TimeSpan.FromDays(65).Add(TimeSpan.FromHours(15).Add(TimeSpan.FromMinutes(15).Add(TimeSpan.FromSeconds(15)))),
52+
TimeSpan.FromDays(181).Add(TimeSpan.FromHours(20).Add(TimeSpan.FromMinutes(27).Add(TimeSpan.FromSeconds(27)))),
53+
TimeSpan.FromDays(182).Add(TimeSpan.FromHours(23).Add(TimeSpan.FromMinutes(30).Add(TimeSpan.FromSeconds(30)))),
54+
TimeSpan.FromDays(360).Add(TimeSpan.FromHours(23).Add(TimeSpan.FromMinutes(30).Add(TimeSpan.FromSeconds(30)))),
55+
TimeSpan.FromDays(363).Add(TimeSpan.FromHours(23).Add(TimeSpan.FromMinutes(30).Add(TimeSpan.FromSeconds(30)))),
56+
TimeSpan.FromDays(364).Add(TimeSpan.FromHours(23).Add(TimeSpan.FromMinutes(30).Add(TimeSpan.FromSeconds(30)))),
57+
TimeSpan.FromDays(365).Add(TimeSpan.FromHours(23).Add(TimeSpan.FromMinutes(30).Add(TimeSpan.FromSeconds(30)))),
58+
TimeSpan.FromDays(366).Add(TimeSpan.FromHours(23).Add(TimeSpan.FromMinutes(30).Add(TimeSpan.FromSeconds(30)))),
59+
TimeSpan.FromDays(730).Add(TimeSpan.FromHours(23).Add(TimeSpan.FromMinutes(30).Add(TimeSpan.FromSeconds(30)))),
60+
61+
TimeSpan.FromMinutes(1).Add(TimeSpan.FromSeconds(1)).Negate(),
62+
TimeSpan.FromMinutes(10).Add(TimeSpan.FromSeconds(10)).Negate(),
63+
TimeSpan.FromMinutes(15).Add(TimeSpan.FromSeconds(15)).Negate(),
64+
TimeSpan.FromMinutes(27).Add(TimeSpan.FromSeconds(27)).Negate(),
65+
TimeSpan.FromMinutes(30).Add(TimeSpan.FromSeconds(30)).Negate(),
66+
TimeSpan.FromMinutes(43).Add(TimeSpan.FromSeconds(43)).Negate(),
67+
TimeSpan.FromMinutes(55).Add(TimeSpan.FromSeconds(55)).Negate(),
68+
TimeSpan.FromMinutes(59).Add(TimeSpan.FromSeconds(59)).Negate(),
69+
TimeSpan.FromHours(1).Add(TimeSpan.FromMinutes(1).Add(TimeSpan.FromSeconds(1))).Negate(),
70+
TimeSpan.FromHours(10).Add(TimeSpan.FromMinutes(10).Add(TimeSpan.FromSeconds(10))).Negate(),
71+
TimeSpan.FromHours(15).Add(TimeSpan.FromMinutes(15).Add(TimeSpan.FromSeconds(15))).Negate(),
72+
TimeSpan.FromHours(20).Add(TimeSpan.FromMinutes(27).Add(TimeSpan.FromSeconds(27))).Negate(),
73+
TimeSpan.FromHours(23).Add(TimeSpan.FromMinutes(30).Add(TimeSpan.FromSeconds(30))).Negate(),
74+
TimeSpan.FromDays(1).Add(TimeSpan.FromHours(1).Add(TimeSpan.FromMinutes(1).Add(TimeSpan.FromSeconds(1)))).Negate(),
75+
TimeSpan.FromDays(30).Add(TimeSpan.FromHours(10).Add(TimeSpan.FromMinutes(10).Add(TimeSpan.FromSeconds(10)))).Negate(),
76+
TimeSpan.FromDays(15).Add(TimeSpan.FromHours(15).Add(TimeSpan.FromMinutes(15).Add(TimeSpan.FromSeconds(15)))).Negate(),
77+
TimeSpan.FromDays(20).Add(TimeSpan.FromHours(20).Add(TimeSpan.FromMinutes(27).Add(TimeSpan.FromSeconds(27)))).Negate(),
78+
TimeSpan.FromDays(23).Add(TimeSpan.FromHours(23).Add(TimeSpan.FromMinutes(30).Add(TimeSpan.FromSeconds(30)))).Negate(),
79+
TimeSpan.FromDays(28).Add(TimeSpan.FromHours(23).Add(TimeSpan.FromMinutes(30).Add(TimeSpan.FromSeconds(30)))).Negate(),
80+
TimeSpan.FromDays(29).Add(TimeSpan.FromHours(23).Add(TimeSpan.FromMinutes(30).Add(TimeSpan.FromSeconds(30)))).Negate(),
81+
TimeSpan.FromDays(32).Add(TimeSpan.FromHours(1).Add(TimeSpan.FromMinutes(1).Add(TimeSpan.FromSeconds(1)))).Negate(),
82+
TimeSpan.FromDays(40).Add(TimeSpan.FromHours(10).Add(TimeSpan.FromMinutes(10).Add(TimeSpan.FromSeconds(10)))).Negate(),
83+
TimeSpan.FromDays(65).Add(TimeSpan.FromHours(15).Add(TimeSpan.FromMinutes(15).Add(TimeSpan.FromSeconds(15)))).Negate(),
84+
TimeSpan.FromDays(181).Add(TimeSpan.FromHours(20).Add(TimeSpan.FromMinutes(27).Add(TimeSpan.FromSeconds(27)))).Negate(),
85+
TimeSpan.FromDays(182).Add(TimeSpan.FromHours(23).Add(TimeSpan.FromMinutes(30).Add(TimeSpan.FromSeconds(30)))).Negate(),
86+
TimeSpan.FromDays(360).Add(TimeSpan.FromHours(23).Add(TimeSpan.FromMinutes(30).Add(TimeSpan.FromSeconds(30)))).Negate(),
87+
TimeSpan.FromDays(363).Add(TimeSpan.FromHours(23).Add(TimeSpan.FromMinutes(30).Add(TimeSpan.FromSeconds(30)))).Negate(),
88+
TimeSpan.FromDays(364).Add(TimeSpan.FromHours(23).Add(TimeSpan.FromMinutes(30).Add(TimeSpan.FromSeconds(30)))).Negate(),
89+
TimeSpan.FromDays(365).Add(TimeSpan.FromHours(23).Add(TimeSpan.FromMinutes(30).Add(TimeSpan.FromSeconds(30)))).Negate(),
90+
TimeSpan.FromDays(366).Add(TimeSpan.FromHours(23).Add(TimeSpan.FromMinutes(30).Add(TimeSpan.FromSeconds(30)))).Negate(),
91+
TimeSpan.FromDays(730).Add(TimeSpan.FromHours(23).Add(TimeSpan.FromMinutes(30).Add(TimeSpan.FromSeconds(30)))).Negate()
92+
};
93+
}
94+
95+
protected override void CheckRequirements() => Require.ProviderIs(StorageProvider.PostgreSql);
96+
97+
protected override void TestFixtureSetUp()
98+
{
99+
base.TestFixtureSetUp();
100+
101+
longMapping = Driver.TypeMappings[typeof(long)];
102+
timeSpanMapping = Driver.TypeMappings[typeof(TimeSpan)];
103+
doubleMapping = Driver.TypeMappings[typeof(double)];
104+
105+
var dropTableCommand = Connection
106+
.CreateCommand(
107+
$"DROP TABLE IF EXISTS \"{TableName}\";");
108+
using (dropTableCommand) {
109+
_ = dropTableCommand.ExecuteNonQuery();
110+
}
111+
112+
var createTableCommand = Connection
113+
.CreateCommand(
114+
$"CREATE TABLE IF NOT EXISTS \"{TableName}\" (\"{IdColumnName}\" bigint CONSTRAINT PK_{TableName} PRIMARY KEY, \"{ValueColumnName}\" interval);");
115+
using (createTableCommand) {
116+
_ = createTableCommand.ExecuteNonQuery();
117+
}
118+
119+
var schema = ExtractDefaultSchema();
120+
var tableRef = SqlDml.TableRef(schema.Tables[TableName]);
121+
var selectTotalMsQuery = SqlDml.Select(tableRef);
122+
selectTotalMsQuery.Columns.Add(tableRef[IdColumnName], "id");
123+
selectTotalMsQuery.Columns.Add(tableRef[ValueColumnName], "timespan");
124+
selectTotalMsQuery.Columns.Add(SqlDml.IntervalToMilliseconds(tableRef[ValueColumnName]), "totalMs");
125+
selectTotalMsQuery.Where = tableRef[IdColumnName] == SqlDml.ParameterRef("pId");
126+
selectQuery = selectTotalMsQuery;
127+
}
128+
129+
protected override void TestFixtureTearDown()
130+
{
131+
longMapping = null;
132+
timeSpanMapping = null;
133+
doubleMapping = null;
134+
selectQuery = null;
135+
136+
base.TestFixtureTearDown();
137+
}
138+
139+
140+
[Test]
141+
[TestCaseSource(nameof(TestValues))]
142+
public void MainTest(TimeSpan testCase)
143+
{
144+
TestValue(testCase);
145+
}
146+
147+
148+
private void TestValue(TimeSpan testCase)
149+
{
150+
InsertValue(testCase.Ticks, testCase);
151+
var rowFromDb = SelectValue(testCase.Ticks);
152+
var trueTotalMilliseconds = testCase.TotalMilliseconds;
153+
var databaseValueTotalMilliseconds = rowFromDb.Item2.TotalMilliseconds;
154+
var extractedTotalMilliseconds = rowFromDb.Item3;
155+
156+
Assert.That(databaseValueTotalMilliseconds, Is.EqualTo(trueTotalMilliseconds));
157+
Assert.That(extractedTotalMilliseconds, Is.EqualTo(trueTotalMilliseconds));
158+
}
159+
160+
private void InsertValue(long id, TimeSpan testCase)
161+
{
162+
var command = Connection.CreateCommand($"INSERT INTO \"{TableName}\"(\"{IdColumnName}\", \"{ValueColumnName}\") VALUES (@pId, @pValue)");
163+
var pId = Connection.CreateParameter();
164+
pId.ParameterName = "pId";
165+
longMapping.BindValue(pId, id);
166+
_ = command.Parameters.Add(pId);
167+
168+
var pValue = Connection.CreateParameter();
169+
pValue.ParameterName = "pValue";
170+
timeSpanMapping.BindValue(pValue, testCase);
171+
_ = command.Parameters.Add(pValue);
172+
using (command) {
173+
_ = command.ExecuteNonQuery();
174+
}
175+
}
176+
177+
private (long, TimeSpan, double) SelectValue(long id)
178+
{
179+
var command = Connection.CreateCommand(selectQuery);
180+
var pId = Connection.CreateParameter();
181+
pId.ParameterName = "pId";
182+
longMapping.BindValue(pId, id);
183+
_ = command.Parameters.Add(pId);
184+
185+
using (command)
186+
using (var reader = command.ExecuteReader()) {
187+
while (reader.Read()) {
188+
var idFromDb = (long) longMapping.ReadValue(reader, 0);
189+
var valueFromDb = (TimeSpan) timeSpanMapping.ReadValue(reader, 1);
190+
var totalMs = (double) doubleMapping.ReadValue(reader, 2);
191+
return (idFromDb, valueFromDb, totalMs);
192+
}
193+
}
194+
195+
return default;
196+
}
197+
}
198+
}

0 commit comments

Comments
 (0)