Skip to content

Commit d2805e7

Browse files
Copilotrenemadsen
andcommitted
Convert removed base test overrides to standalone MySQL-specific tests
Co-authored-by: renemadsen <76994+renemadsen@users.noreply.github.com>
1 parent 09e4cd5 commit d2805e7

File tree

3 files changed

+423
-0
lines changed

3 files changed

+423
-0
lines changed

test/EFCore.MySql.FunctionalTests/Query/GearsOfWarQueryMySqlTest.cs

Lines changed: 138 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -34,6 +34,26 @@ public override Task DateTimeOffset_Contains_Less_than_Greater_than(bool async)
3434
m => start <= m.Timeline.Date && m.Timeline < end && dates.Contains(m.Timeline)));
3535
}
3636

37+
[ConditionalTheory]
38+
[MemberData(nameof(IsAsyncData))]
39+
public virtual Task Where_datetimeoffset_milliseconds_parameter_and_constant(bool async)
40+
{
41+
var dateTimeOffset = MySqlTestHelpers.GetExpectedValue(new DateTimeOffset(599898024001234567, new TimeSpan(1, 30, 0)));
42+
43+
// Literal where clause
44+
var p = Expression.Parameter(typeof(Mission), "i");
45+
var dynamicWhere = Expression.Lambda<Func<Mission, bool>>(
46+
Expression.Equal(
47+
Expression.Property(p, "Timeline"),
48+
Expression.Constant(dateTimeOffset)
49+
), p);
50+
51+
return AssertCount(
52+
async,
53+
ss => ss.Set<Mission>().Where(dynamicWhere),
54+
ss => ss.Set<Mission>().Where(m => m.Timeline == dateTimeOffset));
55+
}
56+
3757
[ConditionalTheory(Skip = "TODO: Does not work as expected, probably due to some test definition issues.")]
3858
public override async Task DateTimeOffsetNow_minus_timespan(bool async)
3959
{
@@ -232,6 +252,106 @@ GROUP BY `g0`.`Key`
232252
""");
233253
}
234254

255+
[ConditionalTheory]
256+
[MemberData(nameof(IsAsyncData))]
257+
public virtual async Task Array_access_on_byte_array(bool async)
258+
{
259+
await AssertQuery(
260+
async,
261+
ss => ss.Set<Squad>().Where(s => s.Banner5[2] == 6));
262+
263+
AssertSql(
264+
"""
265+
SELECT `s`.`Id`, `s`.`Banner`, `s`.`Banner5`, `s`.`InternalNumber`, `s`.`Name`
266+
FROM `Squads` AS `s`
267+
WHERE ASCII(SUBSTRING(`s`.`Banner5`, 2 + 1, 1)) = 6
268+
""");
269+
}
270+
271+
[ConditionalTheory]
272+
[MemberData(nameof(IsAsyncData))]
273+
public virtual async Task DateTimeOffset_to_unix_time_milliseconds(bool async)
274+
{
275+
var unixEpochMilliseconds = 0L;
276+
277+
await AssertQuery(
278+
async,
279+
ss => from g in ss.Set<Gear>()
280+
join squad in ss.Set<Squad>() on g.SquadId equals squad.Id
281+
where !ss.Set<SquadMission>()
282+
.Join(ss.Set<Mission>(), sm => sm.MissionId, m => m.Id, (sm, m) => new { sm, m })
283+
.Where(x => x.sm.SquadId == squad.Id && x.m.Timeline.ToUnixTimeMilliseconds() == unixEpochMilliseconds)
284+
.Any()
285+
select g,
286+
ss => from g in ss.Set<Gear>()
287+
join squad in ss.Set<Squad>() on g.SquadId equals squad.Id
288+
where !ss.Set<SquadMission>()
289+
.Join(ss.Set<Mission>(), sm => sm.MissionId, m => m.Id, (sm, m) => new { sm, m })
290+
.Where(x => x.sm.SquadId == squad.Id && x.m.Timeline.ToUnixTimeMilliseconds() == unixEpochMilliseconds)
291+
.Any()
292+
select g,
293+
elementSorter: e => (e.Nickname, e.SquadId),
294+
elementAsserter: (e, a) => AssertEqual(e, a));
295+
296+
AssertSql(
297+
"""
298+
@__unixEpochMilliseconds_0='0'
299+
300+
SELECT `g`.`Nickname`, `g`.`SquadId`, `g`.`AssignedCityName`, `g`.`CityOfBirthName`, `g`.`Discriminator`, `g`.`FullName`, `g`.`HasSoulPatch`, `g`.`LeaderNickname`, `g`.`LeaderSquadId`, `g`.`Rank`, `s`.`Id`, `s`.`Banner`, `s`.`Banner5`, `s`.`InternalNumber`, `s`.`Name`, `s1`.`SquadId`, `s1`.`MissionId`
301+
FROM `Gears` AS `g`
302+
INNER JOIN `Squads` AS `s` ON `g`.`SquadId` = `s`.`Id`
303+
LEFT JOIN `SquadMissions` AS `s1` ON `s`.`Id` = `s1`.`SquadId`
304+
WHERE NOT EXISTS (
305+
SELECT 1
306+
FROM `SquadMissions` AS `s0`
307+
INNER JOIN `Missions` AS `m` ON `s0`.`MissionId` = `m`.`Id`
308+
WHERE (`s`.`Id` = `s0`.`SquadId`) AND (@__unixEpochMilliseconds_0 = (TIMESTAMPDIFF(microsecond, TIMESTAMP '1970-01-01 00:00:00', `m`.`Timeline`)) DIV (1000)))
309+
ORDER BY `g`.`Nickname`, `g`.`SquadId`, `s`.`Id`, `s1`.`SquadId`
310+
""");
311+
}
312+
313+
[ConditionalTheory]
314+
[MemberData(nameof(IsAsyncData))]
315+
public virtual async Task DateTimeOffset_to_unix_time_seconds(bool async)
316+
{
317+
var unixEpochSeconds = 0L;
318+
319+
await AssertQuery(
320+
async,
321+
ss => from g in ss.Set<Gear>()
322+
join squad in ss.Set<Squad>() on g.SquadId equals squad.Id
323+
where !ss.Set<SquadMission>()
324+
.Join(ss.Set<Mission>(), sm => sm.MissionId, m => m.Id, (sm, m) => new { sm, m })
325+
.Where(x => x.sm.SquadId == squad.Id && x.m.Timeline.ToUnixTimeSeconds() == unixEpochSeconds)
326+
.Any()
327+
select g,
328+
ss => from g in ss.Set<Gear>()
329+
join squad in ss.Set<Squad>() on g.SquadId equals squad.Id
330+
where !ss.Set<SquadMission>()
331+
.Join(ss.Set<Mission>(), sm => sm.MissionId, m => m.Id, (sm, m) => new { sm, m })
332+
.Where(x => x.sm.SquadId == squad.Id && x.m.Timeline.ToUnixTimeSeconds() == unixEpochSeconds)
333+
.Any()
334+
select g,
335+
elementSorter: e => (e.Nickname, e.SquadId),
336+
elementAsserter: (e, a) => AssertEqual(e, a));
337+
338+
AssertSql(
339+
"""
340+
@__unixEpochSeconds_0='0'
341+
342+
SELECT `g`.`Nickname`, `g`.`SquadId`, `g`.`AssignedCityName`, `g`.`CityOfBirthName`, `g`.`Discriminator`, `g`.`FullName`, `g`.`HasSoulPatch`, `g`.`LeaderNickname`, `g`.`LeaderSquadId`, `g`.`Rank`, `s`.`Id`, `s`.`Banner`, `s`.`Banner5`, `s`.`InternalNumber`, `s`.`Name`, `s1`.`SquadId`, `s1`.`MissionId`
343+
FROM `Gears` AS `g`
344+
INNER JOIN `Squads` AS `s` ON `g`.`SquadId` = `s`.`Id`
345+
LEFT JOIN `SquadMissions` AS `s1` ON `s`.`Id` = `s1`.`SquadId`
346+
WHERE NOT EXISTS (
347+
SELECT 1
348+
FROM `SquadMissions` AS `s0`
349+
INNER JOIN `Missions` AS `m` ON `s0`.`MissionId` = `m`.`Id`
350+
WHERE (`s`.`Id` = `s0`.`SquadId`) AND (@__unixEpochSeconds_0 = TIMESTAMPDIFF(second, TIMESTAMP '1970-01-01 00:00:00', `m`.`Timeline`)))
351+
ORDER BY `g`.`Nickname`, `g`.`SquadId`, `s`.`Id`, `s1`.`SquadId`
352+
""");
353+
}
354+
235355
public override async Task Group_by_with_having_StartsWith_with_null_parameter_as_argument(bool async)
236356
{
237357
await base.Group_by_with_having_StartsWith_with_null_parameter_as_argument(async);
@@ -267,6 +387,24 @@ public override async Task Where_subquery_with_ElementAt_using_column_as_index(b
267387
AssertSql("");
268388
}
269389

390+
[ConditionalTheory]
391+
[MemberData(nameof(IsAsyncData))]
392+
public virtual async Task Where_datetimeoffset_hour_component(bool async)
393+
{
394+
await AssertQuery(
395+
async,
396+
ss => from m in ss.Set<Mission>()
397+
where m.Timeline.Hour == /* 10 */ 8
398+
select m);
399+
400+
AssertSql(
401+
"""
402+
SELECT `m`.`Id`, `m`.`CodeName`, `m`.`Date`, `m`.`Difficulty`, `m`.`Duration`, `m`.`Rating`, `m`.`Time`, `m`.`Timeline`
403+
FROM `Missions` AS `m`
404+
WHERE EXTRACT(hour FROM `m`.`Timeline`) = 8
405+
""");
406+
}
407+
270408
// TODO: Implement once TimeSpan is translated as ticks instead of TIME.
271409
public override async Task Non_string_concat_uses_appropriate_type_mapping(bool async)
272410
{

test/EFCore.MySql.FunctionalTests/Query/TPCGearsOfWarQueryMySqlTest.cs

Lines changed: 157 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3956,6 +3956,24 @@ WHERE EXTRACT(day FROM `m`.`Timeline`) = 2
39563956
""");
39573957
}
39583958

3959+
[ConditionalTheory]
3960+
[MemberData(nameof(IsAsyncData))]
3961+
public virtual async Task Where_datetimeoffset_hour_component(bool async)
3962+
{
3963+
await AssertQuery(
3964+
async,
3965+
ss => from m in ss.Set<Mission>()
3966+
where m.Timeline.Hour == /* 10 */ 8
3967+
select m);
3968+
3969+
AssertSql(
3970+
"""
3971+
SELECT `m`.`Id`, `m`.`CodeName`, `m`.`Date`, `m`.`Difficulty`, `m`.`Duration`, `m`.`Rating`, `m`.`Time`, `m`.`Timeline`
3972+
FROM `Missions` AS `m`
3973+
WHERE EXTRACT(hour FROM `m`.`Timeline`) = 8
3974+
""");
3975+
}
3976+
39593977
public override async Task Where_datetimeoffset_minute_component(bool async)
39603978
{
39613979
await base.Where_datetimeoffset_minute_component(async);
@@ -4058,6 +4076,33 @@ SELECT DATE_ADD(`m`.`Timeline`, INTERVAL 1000 * CAST(300.0 AS signed) microsecon
40584076
""");
40594077
}
40604078

4079+
[ConditionalTheory]
4080+
[MemberData(nameof(IsAsyncData))]
4081+
public virtual async Task Where_datetimeoffset_milliseconds_parameter_and_constant(bool async)
4082+
{
4083+
var dateTimeOffset = MySqlTestHelpers.GetExpectedValue(new DateTimeOffset(599898024001234567, new TimeSpan(1, 30, 0)));
4084+
4085+
// Literal where clause
4086+
var p = Expression.Parameter(typeof(Mission), "i");
4087+
var dynamicWhere = Expression.Lambda<Func<Mission, bool>>(
4088+
Expression.Equal(
4089+
Expression.Property(p, "Timeline"),
4090+
Expression.Constant(dateTimeOffset)
4091+
), p);
4092+
4093+
await AssertCount(
4094+
async,
4095+
ss => ss.Set<Mission>().Where(dynamicWhere),
4096+
ss => ss.Set<Mission>().Where(m => m.Timeline == dateTimeOffset));
4097+
4098+
AssertSql(
4099+
"""
4100+
SELECT COUNT(*)
4101+
FROM `Missions` AS `m`
4102+
WHERE `m`.`Timeline` = TIMESTAMP '1902-01-02 08:30:00.123456'
4103+
""");
4104+
}
4105+
40614106
public override async Task Orderby_added_for_client_side_GroupJoin_composite_dependent_to_principal_LOJ_when_incomplete_key_is_used(
40624107
bool async)
40634108
{
@@ -11433,6 +11478,22 @@ WHERE ASCII(`s`.`Banner`) = 2
1143311478
""");
1143411479
}
1143511480

11481+
[ConditionalTheory]
11482+
[MemberData(nameof(IsAsyncData))]
11483+
public virtual async Task Array_access_on_byte_array(bool async)
11484+
{
11485+
await AssertQuery(
11486+
async,
11487+
ss => ss.Set<Squad>().Where(s => s.Banner5[2] == 6));
11488+
11489+
AssertSql(
11490+
"""
11491+
SELECT `s`.`Id`, `s`.`Banner`, `s`.`Banner5`, `s`.`InternalNumber`, `s`.`Name`
11492+
FROM `Squads` AS `s`
11493+
WHERE ASCII(SUBSTRING(`s`.`Banner5`, 2 + 1, 1)) = 6
11494+
""");
11495+
}
11496+
1143611497
public override async Task Project_shadow_properties(bool async)
1143711498
{
1143811499
await base.Project_shadow_properties(async);
@@ -13363,6 +13424,102 @@ public override async Task Using_indexer_on_byte_array_and_string_in_projection(
1336313424
""");
1336413425
}
1336513426

13427+
[ConditionalTheory]
13428+
[MemberData(nameof(IsAsyncData))]
13429+
public virtual async Task DateTimeOffset_to_unix_time_milliseconds(bool async)
13430+
{
13431+
var unixEpochMilliseconds = 0L;
13432+
13433+
await AssertQuery(
13434+
async,
13435+
ss => from g in ss.Set<Gear>()
13436+
join squad in ss.Set<Squad>() on g.SquadId equals squad.Id
13437+
where !ss.Set<SquadMission>()
13438+
.Join(ss.Set<Mission>(), sm => sm.MissionId, m => m.Id, (sm, m) => new { sm, m })
13439+
.Where(x => x.sm.SquadId == squad.Id && x.m.Timeline.ToUnixTimeMilliseconds() == unixEpochMilliseconds)
13440+
.Any()
13441+
select g,
13442+
ss => from g in ss.Set<Gear>()
13443+
join squad in ss.Set<Squad>() on g.SquadId equals squad.Id
13444+
where !ss.Set<SquadMission>()
13445+
.Join(ss.Set<Mission>(), sm => sm.MissionId, m => m.Id, (sm, m) => new { sm, m })
13446+
.Where(x => x.sm.SquadId == squad.Id && x.m.Timeline.ToUnixTimeMilliseconds() == unixEpochMilliseconds)
13447+
.Any()
13448+
select g,
13449+
elementSorter: e => (e.Nickname, e.SquadId),
13450+
elementAsserter: (e, a) => AssertEqual(e, a));
13451+
13452+
AssertSql(
13453+
"""
13454+
@__unixEpochMilliseconds_0='0'
13455+
13456+
SELECT `u`.`Nickname`, `u`.`SquadId`, `u`.`AssignedCityName`, `u`.`CityOfBirthName`, `u`.`FullName`, `u`.`HasSoulPatch`, `u`.`LeaderNickname`, `u`.`LeaderSquadId`, `u`.`Rank`, `u`.`Discriminator`, `s`.`Id`, `s`.`Banner`, `s`.`Banner5`, `s`.`InternalNumber`, `s`.`Name`, `s1`.`SquadId`, `s1`.`MissionId`
13457+
FROM (
13458+
SELECT `g`.`Nickname`, `g`.`SquadId`, `g`.`AssignedCityName`, `g`.`CityOfBirthName`, `g`.`FullName`, `g`.`HasSoulPatch`, `g`.`LeaderNickname`, `g`.`LeaderSquadId`, `g`.`Rank`, 'Gear' AS `Discriminator`
13459+
FROM `Gears` AS `g`
13460+
UNION ALL
13461+
SELECT `o`.`Nickname`, `o`.`SquadId`, `o`.`AssignedCityName`, `o`.`CityOfBirthName`, `o`.`FullName`, `o`.`HasSoulPatch`, `o`.`LeaderNickname`, `o`.`LeaderSquadId`, `o`.`Rank`, 'Officer' AS `Discriminator`
13462+
FROM `Officers` AS `o`
13463+
) AS `u`
13464+
INNER JOIN `Squads` AS `s` ON `u`.`SquadId` = `s`.`Id`
13465+
LEFT JOIN `SquadMissions` AS `s1` ON `s`.`Id` = `s1`.`SquadId`
13466+
WHERE NOT EXISTS (
13467+
SELECT 1
13468+
FROM `SquadMissions` AS `s0`
13469+
INNER JOIN `Missions` AS `m` ON `s0`.`MissionId` = `m`.`Id`
13470+
WHERE (`s`.`Id` = `s0`.`SquadId`) AND (@__unixEpochMilliseconds_0 = (TIMESTAMPDIFF(microsecond, TIMESTAMP '1970-01-01 00:00:00', `m`.`Timeline`)) DIV (1000)))
13471+
ORDER BY `u`.`Nickname`, `u`.`SquadId`, `s`.`Id`, `s1`.`SquadId`
13472+
""");
13473+
}
13474+
13475+
[ConditionalTheory]
13476+
[MemberData(nameof(IsAsyncData))]
13477+
public virtual async Task DateTimeOffset_to_unix_time_seconds(bool async)
13478+
{
13479+
var unixEpochSeconds = 0L;
13480+
13481+
await AssertQuery(
13482+
async,
13483+
ss => from g in ss.Set<Gear>()
13484+
join squad in ss.Set<Squad>() on g.SquadId equals squad.Id
13485+
where !ss.Set<SquadMission>()
13486+
.Join(ss.Set<Mission>(), sm => sm.MissionId, m => m.Id, (sm, m) => new { sm, m })
13487+
.Where(x => x.sm.SquadId == squad.Id && x.m.Timeline.ToUnixTimeSeconds() == unixEpochSeconds)
13488+
.Any()
13489+
select g,
13490+
ss => from g in ss.Set<Gear>()
13491+
join squad in ss.Set<Squad>() on g.SquadId equals squad.Id
13492+
where !ss.Set<SquadMission>()
13493+
.Join(ss.Set<Mission>(), sm => sm.MissionId, m => m.Id, (sm, m) => new { sm, m })
13494+
.Where(x => x.sm.SquadId == squad.Id && x.m.Timeline.ToUnixTimeSeconds() == unixEpochSeconds)
13495+
.Any()
13496+
select g,
13497+
elementSorter: e => (e.Nickname, e.SquadId),
13498+
elementAsserter: (e, a) => AssertEqual(e, a));
13499+
13500+
AssertSql(
13501+
"""
13502+
@__unixEpochSeconds_0='0'
13503+
13504+
SELECT `u`.`Nickname`, `u`.`SquadId`, `u`.`AssignedCityName`, `u`.`CityOfBirthName`, `u`.`FullName`, `u`.`HasSoulPatch`, `u`.`LeaderNickname`, `u`.`LeaderSquadId`, `u`.`Rank`, `u`.`Discriminator`, `s`.`Id`, `s`.`Banner`, `s`.`Banner5`, `s`.`InternalNumber`, `s`.`Name`, `s1`.`SquadId`, `s1`.`MissionId`
13505+
FROM (
13506+
SELECT `g`.`Nickname`, `g`.`SquadId`, `g`.`AssignedCityName`, `g`.`CityOfBirthName`, `g`.`FullName`, `g`.`HasSoulPatch`, `g`.`LeaderNickname`, `g`.`LeaderSquadId`, `g`.`Rank`, 'Gear' AS `Discriminator`
13507+
FROM `Gears` AS `g`
13508+
UNION ALL
13509+
SELECT `o`.`Nickname`, `o`.`SquadId`, `o`.`AssignedCityName`, `o`.`CityOfBirthName`, `o`.`FullName`, `o`.`HasSoulPatch`, `o`.`LeaderNickname`, `o`.`LeaderSquadId`, `o`.`Rank`, 'Officer' AS `Discriminator`
13510+
FROM `Officers` AS `o`
13511+
) AS `u`
13512+
INNER JOIN `Squads` AS `s` ON `u`.`SquadId` = `s`.`Id`
13513+
LEFT JOIN `SquadMissions` AS `s1` ON `s`.`Id` = `s1`.`SquadId`
13514+
WHERE NOT EXISTS (
13515+
SELECT 1
13516+
FROM `SquadMissions` AS `s0`
13517+
INNER JOIN `Missions` AS `m` ON `s0`.`MissionId` = `m`.`Id`
13518+
WHERE (`s`.`Id` = `s0`.`SquadId`) AND (@__unixEpochSeconds_0 = TIMESTAMPDIFF(second, TIMESTAMP '1970-01-01 00:00:00', `m`.`Timeline`)))
13519+
ORDER BY `u`.`Nickname`, `u`.`SquadId`, `s`.`Id`, `s1`.`SquadId`
13520+
""");
13521+
}
13522+
1336613523
public override async Task Set_operator_with_navigation_in_projection_groupby_aggregate(bool async)
1336713524
{
1336813525
await base.Set_operator_with_navigation_in_projection_groupby_aggregate(async);

0 commit comments

Comments
 (0)