// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information.

using EntityFrameworkCore.Jet.FunctionalTests.TestUtilities;
using Microsoft.EntityFrameworkCore.Query;
using Microsoft.EntityFrameworkCore.TestUtilities;
using Xunit.Abstractions;

namespace EntityFrameworkCore.Jet.FunctionalTests.Query
{
    public class IncludeOneToOneJetTest : IncludeOneToOneTestBase<IncludeOneToOneJetTest.OneToOneQueryJetFixture>
    {
        public IncludeOneToOneJetTest(OneToOneQueryJetFixture fixture, ITestOutputHelper testOutputHelper)
            : base(fixture)
        {
            fixture.TestSqlLoggerFactory.Clear();
        }

        public override void Include_person()
        {
            base.Include_person();

            AssertSql(
                $@"SELECT `a`.`Id`, `a`.`City`, `a`.`Street`, `p`.`Id`, `p`.`Name`
FROM `Address` AS `a`
INNER JOIN `Person` AS `p` ON `a`.`Id` = `p`.`Id`");
        }

        public override void Include_person_shadow()
        {
            base.Include_person_shadow();

            AssertSql(
                $@"SELECT `a`.`Id`, `a`.`City`, `a`.`PersonId`, `a`.`Street`, `p`.`Id`, `p`.`Name`
FROM `Address2` AS `a`
INNER JOIN `Person2` AS `p` ON `a`.`PersonId` = `p`.`Id`");
        }

        public override void Include_address()
        {
            base.Include_address();

            AssertSql(
                $@"SELECT `p`.`Id`, `p`.`Name`, `a`.`Id`, `a`.`City`, `a`.`Street`
FROM `Person` AS `p`
LEFT JOIN `Address` AS `a` ON `p`.`Id` = `a`.`Id`");
        }

        public override void Include_address_shadow()
        {
            base.Include_address_shadow();

            AssertSql(
                $@"SELECT `p`.`Id`, `p`.`Name`, `a`.`Id`, `a`.`City`, `a`.`PersonId`, `a`.`Street`
FROM `Person2` AS `p`
LEFT JOIN `Address2` AS `a` ON `p`.`Id` = `a`.`PersonId`");
        }

        private void AssertSql(params string[] expected)
            => Fixture.TestSqlLoggerFactory.AssertBaseline(expected);

        public class OneToOneQueryJetFixture : OneToOneQueryFixtureBase
        {
            protected override ITestStoreFactory TestStoreFactory => JetTestStoreFactory.Instance;
            public TestSqlLoggerFactory TestSqlLoggerFactory => (TestSqlLoggerFactory)ListLoggerFactory;
        }
    }
}
