// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. using System; using System.Linq; using EntityFrameworkCore.Jet.Internal; using Microsoft.EntityFrameworkCore; using Microsoft.EntityFrameworkCore.Query; using Microsoft.EntityFrameworkCore.TestUtilities; using Xunit; using Xunit.Abstractions; using EF = Microsoft.EntityFrameworkCore.EF; // ReSharper disable InconsistentNaming namespace EntityFrameworkCore.Jet.FunctionalTests.Query { public class DbFunctionsJetTest : DbFunctionsTestBase> { public DbFunctionsJetTest( NorthwindQueryJetFixture fixture, ITestOutputHelper testOutputHelper) : base(fixture) { Fixture.TestSqlLoggerFactory.Clear(); //Fixture.TestSqlLoggerFactory.SetTestOutputHelper(testOutputHelper); } public override void Like_literal() { base.Like_literal(); AssertSql( $@"SELECT COUNT(*) FROM `Customers` AS `c` WHERE `c`.`ContactName` LIKE '%M%'"); } public override void Like_identity() { base.Like_identity(); AssertSql( $@"SELECT COUNT(*) FROM `Customers` AS `c` WHERE `c`.`ContactName` LIKE `c`.`ContactName`"); } public override void Like_literal_with_escape() { base.Like_literal_with_escape(); AssertSql( $@"SELECT COUNT(*) FROM `Customers` AS `c` WHERE `c`.`ContactName` LIKE '!%' ESCAPE '!'"); } [ConditionalFact] public virtual void DateDiff_Year() { using (var context = CreateContext()) { var count = context.Orders .Count(c => EF.Functions.DateDiffYear(c.OrderDate, DateTime.Now) == 0); Assert.Equal(0, count); AssertSql( $@"SELECT COUNT(*) FROM `Orders` AS `o` WHERE DATEDIFF(YEAR, `o`.`OrderDate`, GETDATE()) = 0"); } } [ConditionalFact] public virtual void DateDiff_Month() { using (var context = CreateContext()) { var count = context.Orders .Count(c => EF.Functions.DateDiffMonth(c.OrderDate, DateTime.Now) == 0); Assert.Equal(0, count); AssertSql( $@"SELECT COUNT(*) FROM `Orders` AS `o` WHERE DATEDIFF(MONTH, `o`.`OrderDate`, GETDATE()) = 0"); } } [ConditionalFact] public virtual void DateDiff_Day() { using (var context = CreateContext()) { var count = context.Orders .Count(c => EF.Functions.DateDiffDay(c.OrderDate, DateTime.Now) == 0); Assert.Equal(0, count); AssertSql( $@"SELECT COUNT(*) FROM `Orders` AS `o` WHERE DATEDIFF(DAY, `o`.`OrderDate`, GETDATE()) = 0"); } } [ConditionalFact] public virtual void DateDiff_Hour() { using (var context = CreateContext()) { var count = context.Orders .Count(c => EF.Functions.DateDiffHour(c.OrderDate, DateTime.Now) == 0); Assert.Equal(0, count); AssertSql( $@"SELECT COUNT(*) FROM `Orders` AS `o` WHERE DATEDIFF(HOUR, `o`.`OrderDate`, GETDATE()) = 0"); } } [ConditionalFact] public virtual void DateDiff_Minute() { using (var context = CreateContext()) { var count = context.Orders .Count(c => EF.Functions.DateDiffMinute(c.OrderDate, DateTime.Now) == 0); Assert.Equal(0, count); AssertSql( $@"SELECT COUNT(*) FROM `Orders` AS `o` WHERE DATEDIFF(MINUTE, `o`.`OrderDate`, GETDATE()) = 0"); } } [ConditionalFact] public virtual void DateDiff_Second() { using (var context = CreateContext()) { var count = context.Orders .Count(c => EF.Functions.DateDiffSecond(c.OrderDate, DateTime.Now) == 0); Assert.Equal(0, count); AssertSql( $@"SELECT COUNT(*) FROM `Orders` AS `o` WHERE DATEDIFF(SECOND, `o`.`OrderDate`, GETDATE()) = 0"); } } [ConditionalFact] public virtual void IsDate_not_valid() { using (var context = CreateContext()) { var actual = context .Orders .Where(c => !EF.Functions.IsDate(c.CustomerID)) .Select(c => EF.Functions.IsDate(c.CustomerID)) .FirstOrDefault(); Assert.False(actual); AssertSql( $@"SELECT TOP 1 CAST(ISDATE(`o`.`CustomerID`) AS bit) FROM `Orders` AS `o` WHERE CAST(ISDATE(`o`.`CustomerID`) AS bit) <> True"); } } [ConditionalFact] public virtual void IsDate_valid() { using (var context = CreateContext()) { var actual = context .Orders .Where(c => EF.Functions.IsDate(c.OrderDate.Value.ToString())) .Select(c => EF.Functions.IsDate(c.OrderDate.Value.ToString())) .FirstOrDefault(); Assert.True(actual); AssertSql( $@"SELECT TOP 1 CAST(ISDATE(CONVERT(VARCHAR(100), `o`.`OrderDate`)) AS bit) FROM `Orders` AS `o` WHERE CAST(ISDATE(CONVERT(VARCHAR(100), `o`.`OrderDate`)) AS bit) = True"); } } [ConditionalFact] public virtual void IsDate_join_fields() { using (var context = CreateContext()) { var count = context.Orders.Count(c => EF.Functions.IsDate(c.CustomerID + c.OrderID)); Assert.Equal(0, count); AssertSql( $@"SELECT COUNT(*) FROM `Orders` AS `o` WHERE CAST(ISDATE(`o`.`CustomerID` + CAST(`o`.`OrderID` AS nchar(5))) AS bit) = True"); } } [ConditionalFact] public void IsDate_should_throw_on_client_eval() { var exIsDate = Assert.Throws(() => EF.Functions.IsDate("#ISDATE#")); Assert.Equal( JetStrings.FunctionOnClient(nameof(JetDbFunctionsExtensions.IsDate)), exIsDate.Message); } private void AssertSql(params string[] expected) => Fixture.TestSqlLoggerFactory.AssertBaseline(expected); } }