// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. using System.Threading.Tasks; using EntityFrameworkCore.Jet.FunctionalTests.TestUtilities; using Microsoft.EntityFrameworkCore; using Microsoft.EntityFrameworkCore.TestUtilities; using Xunit; namespace EntityFrameworkCore.Jet.FunctionalTests { public abstract class FindJetTest : FindTestBase { protected FindJetTest(FindJetFixture fixture) : base(fixture) { fixture.TestSqlLoggerFactory.Clear(); } public class FindJetTestSet : FindJetTest { public FindJetTestSet(FindJetFixture fixture) : base(fixture) { } protected override TestFinder Finder { get; } = new FindViaSetFinder(); } public class FindJetTestContext : FindJetTest { public FindJetTestContext(FindJetFixture fixture) : base(fixture) { } protected override TestFinder Finder { get; } = new FindViaContextFinder(); } public class FindJetTestNonGeneric : FindJetTest { public FindJetTestNonGeneric(FindJetFixture fixture) : base(fixture) { } protected override TestFinder Finder { get; } = new FindViaNonGenericContextFinder(); } public override void Find_int_key_tracked() { base.Find_int_key_tracked(); Assert.Equal("", Sql); } public override void Find_int_key_from_store() { base.Find_int_key_from_store(); AssertSql( $@"{AssertSqlHelper.Declaration("@__p_0='77'")} SELECT TOP 1 `i`.`Id`, `i`.`Foo` FROM `IntKey` AS `i` WHERE `i`.`Id` = {AssertSqlHelper.Parameter("@__p_0")}"); } public override void Returns_null_for_int_key_not_in_store() { base.Returns_null_for_int_key_not_in_store(); AssertSql( $@"{AssertSqlHelper.Declaration("@__p_0='99'")} SELECT TOP 1 `i`.`Id`, `i`.`Foo` FROM `IntKey` AS `i` WHERE `i`.`Id` = {AssertSqlHelper.Parameter("@__p_0")}"); } public override void Find_nullable_int_key_tracked() { base.Find_int_key_tracked(); Assert.Equal("", Sql); } public override void Find_nullable_int_key_from_store() { base.Find_int_key_from_store(); AssertSql( $@"{AssertSqlHelper.Declaration("@__p_0='77'")} SELECT TOP 1 `i`.`Id`, `i`.`Foo` FROM `IntKey` AS `i` WHERE `i`.`Id` = {AssertSqlHelper.Parameter("@__p_0")}"); } public override void Returns_null_for_nullable_int_key_not_in_store() { base.Returns_null_for_int_key_not_in_store(); AssertSql( $@"{AssertSqlHelper.Declaration("@__p_0='99'")} SELECT TOP 1 `i`.`Id`, `i`.`Foo` FROM `IntKey` AS `i` WHERE `i`.`Id` = {AssertSqlHelper.Parameter("@__p_0")}"); } public override void Find_string_key_tracked() { base.Find_string_key_tracked(); Assert.Equal("", Sql); } public override void Find_string_key_from_store() { base.Find_string_key_from_store(); AssertSql( $@"{AssertSqlHelper.Declaration("@__p_0='Cat' (Size = 255)")} SELECT TOP 1 `s`.`Id`, `s`.`Foo` FROM `StringKey` AS `s` WHERE `s`.`Id` = {AssertSqlHelper.Parameter("@__p_0")}"); } public override void Returns_null_for_string_key_not_in_store() { base.Returns_null_for_string_key_not_in_store(); AssertSql( $@"{AssertSqlHelper.Declaration("@__p_0='Fox' (Size = 255)")} SELECT TOP 1 `s`.`Id`, `s`.`Foo` FROM `StringKey` AS `s` WHERE `s`.`Id` = {AssertSqlHelper.Parameter("@__p_0")}"); } public override void Find_composite_key_tracked() { base.Find_composite_key_tracked(); Assert.Equal("", Sql); } public override void Find_composite_key_from_store() { base.Find_composite_key_from_store(); AssertSql( $@"{AssertSqlHelper.Declaration("@__p_0='77'")} {AssertSqlHelper.Declaration("@__p_1='Dog' (Size = 255)")} SELECT TOP 1 `c`.`Id1`, `c`.`Id2`, `c`.`Foo` FROM `CompositeKey` AS `c` WHERE `c`.`Id1` = {AssertSqlHelper.Parameter("@__p_0")} AND `c`.`Id2` = {AssertSqlHelper.Parameter("@__p_1")}"); } public override void Returns_null_for_composite_key_not_in_store() { base.Returns_null_for_composite_key_not_in_store(); AssertSql( $@"{AssertSqlHelper.Declaration("@__p_0='77'")} {AssertSqlHelper.Declaration("@__p_1='Fox' (Size = 255)")} SELECT TOP 1 `c`.`Id1`, `c`.`Id2`, `c`.`Foo` FROM `CompositeKey` AS `c` WHERE `c`.`Id1` = {AssertSqlHelper.Parameter("@__p_0")} AND `c`.`Id2` = {AssertSqlHelper.Parameter("@__p_1")}"); } public override void Find_base_type_tracked() { base.Find_base_type_tracked(); Assert.Equal("", Sql); } public override async Task Find_base_type_tracked_async(CancellationType cancellationType) { await base.Find_base_type_tracked_async(cancellationType); Assert.Equal("", Sql); } public override void Find_base_type_from_store() { base.Find_base_type_from_store(); AssertSql( $@"{AssertSqlHelper.Declaration("@__p_0='77'")} SELECT TOP 1 `b`.`Id`, `b`.`Discriminator`, `b`.`Foo`, `b`.`Boo` FROM `BaseType` AS `b` WHERE `b`.`Id` = {AssertSqlHelper.Parameter("@__p_0")}"); } public override async Task Find_base_type_from_store_async(CancellationType cancellationType) { await base.Find_base_type_from_store_async(cancellationType); AssertSql( $@"{AssertSqlHelper.Declaration("@__p_0='77'")} SELECT TOP 1 `b`.`Id`, `b`.`Discriminator`, `b`.`Foo`, `b`.`Boo` FROM `BaseType` AS `b` WHERE `b`.`Id` = {AssertSqlHelper.Parameter("@__p_0")}"); } public override void Returns_null_for_base_type_not_in_store() { base.Returns_null_for_base_type_not_in_store(); AssertSql( $@"{AssertSqlHelper.Declaration("@__p_0='99'")} SELECT TOP 1 `b`.`Id`, `b`.`Discriminator`, `b`.`Foo`, `b`.`Boo` FROM `BaseType` AS `b` WHERE `b`.`Id` = {AssertSqlHelper.Parameter("@__p_0")}"); } public override void Find_derived_type_tracked() { base.Find_derived_type_tracked(); Assert.Equal("", Sql); } public override void Find_derived_type_from_store() { base.Find_derived_type_from_store(); AssertSql( $@"{AssertSqlHelper.Declaration("@__p_0='78'")} SELECT TOP 1 `b`.`Id`, `b`.`Discriminator`, `b`.`Foo`, `b`.`Boo` FROM `BaseType` AS `b` WHERE `b`.`Discriminator` = 'DerivedType' AND `b`.`Id` = {AssertSqlHelper.Parameter("@__p_0")}"); } public override void Returns_null_for_derived_type_not_in_store() { base.Returns_null_for_derived_type_not_in_store(); AssertSql( $@"{AssertSqlHelper.Declaration("@__p_0='99'")} SELECT TOP 1 `b`.`Id`, `b`.`Discriminator`, `b`.`Foo`, `b`.`Boo` FROM `BaseType` AS `b` WHERE `b`.`Discriminator` = 'DerivedType' AND `b`.`Id` = {AssertSqlHelper.Parameter("@__p_0")}"); } public override void Find_base_type_using_derived_set_tracked() { base.Find_base_type_using_derived_set_tracked(); AssertSql( $@"{AssertSqlHelper.Declaration("@__p_0='88'")} SELECT TOP 1 `b`.`Id`, `b`.`Discriminator`, `b`.`Foo`, `b`.`Boo` FROM `BaseType` AS `b` WHERE `b`.`Discriminator` = 'DerivedType' AND `b`.`Id` = {AssertSqlHelper.Parameter("@__p_0")}"); } public override void Find_base_type_using_derived_set_from_store() { base.Find_base_type_using_derived_set_from_store(); AssertSql( $@"{AssertSqlHelper.Declaration("@__p_0='77'")} SELECT TOP 1 `b`.`Id`, `b`.`Discriminator`, `b`.`Foo`, `b`.`Boo` FROM `BaseType` AS `b` WHERE `b`.`Discriminator` = 'DerivedType' AND `b`.`Id` = {AssertSqlHelper.Parameter("@__p_0")}"); } public override void Find_derived_type_using_base_set_tracked() { base.Find_derived_type_using_base_set_tracked(); Assert.Equal("", Sql); } public override void Find_derived_using_base_set_type_from_store() { base.Find_derived_using_base_set_type_from_store(); AssertSql( $@"{AssertSqlHelper.Declaration("@__p_0='78'")} SELECT TOP 1 `b`.`Id`, `b`.`Discriminator`, `b`.`Foo`, `b`.`Boo` FROM `BaseType` AS `b` WHERE `b`.`Id` = {AssertSqlHelper.Parameter("@__p_0")}"); } public override void Find_shadow_key_tracked() { base.Find_shadow_key_tracked(); Assert.Equal("", Sql); } public override void Find_shadow_key_from_store() { base.Find_shadow_key_from_store(); AssertSql( $@"{AssertSqlHelper.Declaration("@__p_0='77'")} SELECT TOP 1 `s`.`Id`, `s`.`Foo` FROM `ShadowKey` AS `s` WHERE `s`.`Id` = {AssertSqlHelper.Parameter("@__p_0")}"); } public override void Returns_null_for_shadow_key_not_in_store() { base.Returns_null_for_shadow_key_not_in_store(); AssertSql( $@"{AssertSqlHelper.Declaration("@__p_0='99'")} SELECT TOP 1 `s`.`Id`, `s`.`Foo` FROM `ShadowKey` AS `s` WHERE `s`.`Id` = {AssertSqlHelper.Parameter("@__p_0")}"); } private string Sql => Fixture.TestSqlLoggerFactory.Sql; private void AssertSql(params string[] expected) => Fixture.TestSqlLoggerFactory.AssertBaseline(expected); public class FindJetFixture : FindFixtureBase { public TestSqlLoggerFactory TestSqlLoggerFactory => (TestSqlLoggerFactory)ListLoggerFactory; protected override ITestStoreFactory TestStoreFactory => JetTestStoreFactory.Instance; } } }