You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
EntityFrameworkCore.Jet/test/EFCore.Jet.CustomBaseTests/GearsOfWarModel/GearsOfWarQueryFixtureBase.cs

391 lines
14 KiB
C#

// Licensed to the .NET Foundation under one or more agreements.
// The .NET Foundation licenses this file to you under the MIT license.
using System;
using System.Collections.Generic;
using System.Linq;
using EFCore.Jet.CustomBaseTests.GearsOfWarModel;
using Microsoft.EntityFrameworkCore;
using Microsoft.EntityFrameworkCore.Diagnostics;
using Microsoft.EntityFrameworkCore.Query;
using Microsoft.EntityFrameworkCore.TestUtilities;
using Xunit;
namespace EFCore.Jet.CustomBaseTests.GearsOfWarModel;
public abstract class GearsOfWarQueryFixtureBase : SharedStoreFixtureBase<GearsOfWarContext>, IQueryFixtureBase
{
protected override string StoreName
=> "GearsOfWarQueryTest";
public Func<DbContext> GetContextCreator()
=> () => CreateContext();
public virtual ISetSource GetExpectedData()
=> GearsOfWarData.Instance;
public virtual Dictionary<(Type, string), Func<object, object>> GetShadowPropertyMappings()
=> new()
{
{
(typeof(Gear), "AssignedCityName"), e => GetExpectedData().Set<Gear>().AsEnumerable()
.SingleOrDefault(g => g.Nickname == ((Gear)e)?.Nickname)?.AssignedCity
?.Name
},
};
public IReadOnlyDictionary<Type, object> EntitySorters { get; } = new Dictionary<Type, Func<object, object>>
{
{ typeof(City), e => ((City)e)?.Name },
{ typeof(CogTag), e => ((CogTag)e)?.Id },
{ typeof(Faction), e => ((Faction)e)?.Id },
{ typeof(LocustHorde), e => ((LocustHorde)e)?.Id },
{ typeof(Gear), e => (((Gear)e)?.SquadId, ((Gear)e)?.Nickname) },
{ typeof(Officer), e => (((Officer)e)?.SquadId, ((Officer)e)?.Nickname) },
{ typeof(LocustLeader), e => ((LocustLeader)e)?.Name },
{ typeof(LocustCommander), e => ((LocustCommander)e)?.Name },
{ typeof(Mission), e => ((Mission)e)?.Id },
{ typeof(Squad), e => ((Squad)e)?.Id },
{ typeof(SquadMission), e => (((SquadMission)e)?.SquadId, ((SquadMission)e)?.MissionId) },
{ typeof(Weapon), e => ((Weapon)e)?.Id },
{ typeof(LocustHighCommand), e => ((LocustHighCommand)e)?.Id }
}.ToDictionary(e => e.Key, e => (object)e.Value);
public IReadOnlyDictionary<Type, object> EntityAsserters { get; } = new Dictionary<Type, Action<object, object>>
{
{
typeof(City), (e, a) =>
{
Assert.Equal(e == null, a == null);
if (a != null)
{
var ee = (City)e;
var aa = (City)a;
Assert.Equal(ee.Name, aa.Name);
Assert.Equal(ee.Location, aa.Location);
Assert.Equal(ee.Nation, aa.Nation);
}
}
},
{
typeof(CogTag), (e, a) =>
{
Assert.Equal(e == null, a == null);
if (a != null)
{
var ee = (CogTag)e;
var aa = (CogTag)a;
Assert.Equal(ee.Id, aa.Id);
Assert.Equal(ee.Note, aa.Note);
Assert.Equal(ee.GearNickName, aa.GearNickName);
Assert.Equal(ee.GearSquadId, aa.GearSquadId);
}
}
},
{
typeof(Faction), (e, a) =>
{
Assert.Equal(e == null, a == null);
if (a != null)
{
var ee = (Faction)e;
var aa = (Faction)a;
Assert.Equal(ee.Id, aa.Id);
Assert.Equal(ee.Name, aa.Name);
Assert.Equal(ee.CapitalName, aa.CapitalName);
if (ee is LocustHorde locustHorde)
{
var actualLocustHorde = (LocustHorde)aa;
Assert.Equal(locustHorde.CommanderName, actualLocustHorde.CommanderName);
Assert.Equal(locustHorde.Eradicated, actualLocustHorde.Eradicated);
}
}
}
},
{
typeof(LocustHorde), (e, a) =>
{
Assert.Equal(e == null, a == null);
if (a != null)
{
var ee = (LocustHorde)e;
var aa = (LocustHorde)a;
Assert.Equal(ee.Id, aa.Id);
Assert.Equal(ee.Name, aa.Name);
Assert.Equal(ee.CapitalName, aa.CapitalName);
Assert.Equal(ee.CommanderName, aa.CommanderName);
Assert.Equal(ee.Eradicated, aa.Eradicated);
}
}
},
{
typeof(Gear), (e, a) =>
{
Assert.Equal(e == null, a == null);
if (a != null)
{
var ee = (Gear)e;
var aa = (Gear)a;
Assert.Equal(ee.Nickname, aa.Nickname);
Assert.Equal(ee.SquadId, aa.SquadId);
Assert.Equal(ee.CityOfBirthName, aa.CityOfBirthName);
Assert.Equal(ee.FullName, aa.FullName);
Assert.Equal(ee.HasSoulPatch, aa.HasSoulPatch);
Assert.Equal(ee.LeaderNickname, aa.LeaderNickname);
Assert.Equal(ee.LeaderSquadId, aa.LeaderSquadId);
Assert.Equal(ee.Rank, aa.Rank);
}
}
},
{
typeof(Officer), (e, a) =>
{
Assert.Equal(e == null, a == null);
if (a != null)
{
var ee = (Officer)e;
var aa = (Officer)a;
Assert.Equal(ee.Nickname, aa.Nickname);
Assert.Equal(ee.SquadId, aa.SquadId);
Assert.Equal(ee.CityOfBirthName, aa.CityOfBirthName);
Assert.Equal(ee.FullName, aa.FullName);
Assert.Equal(ee.HasSoulPatch, aa.HasSoulPatch);
Assert.Equal(ee.LeaderNickname, aa.LeaderNickname);
Assert.Equal(ee.LeaderSquadId, aa.LeaderSquadId);
Assert.Equal(ee.Rank, aa.Rank);
}
}
},
{
typeof(LocustLeader), (e, a) =>
{
Assert.Equal(e == null, a == null);
if (a != null)
{
var ee = (LocustLeader)e;
var aa = (LocustLeader)a;
Assert.Equal(ee.Name, aa.Name);
Assert.Equal(ee.ThreatLevel, aa.ThreatLevel);
Assert.Equal(ee.ThreatLevelByte, aa.ThreatLevelByte);
Assert.Equal(ee.ThreatLevelNullableByte, aa.ThreatLevelNullableByte);
if (e is LocustCommander locustCommander)
{
var actualLocustCommander = (LocustCommander)aa;
Assert.Equal(locustCommander.DefeatedByNickname, actualLocustCommander.DefeatedByNickname);
Assert.Equal(locustCommander.DefeatedBySquadId, actualLocustCommander.DefeatedBySquadId);
}
}
}
},
{
typeof(LocustCommander), (e, a) =>
{
Assert.Equal(e == null, a == null);
if (a != null)
{
var ee = (LocustCommander)e;
var aa = (LocustCommander)a;
Assert.Equal(ee.Name, aa.Name);
Assert.Equal(ee.ThreatLevel, aa.ThreatLevel);
Assert.Equal(ee.ThreatLevelByte, aa.ThreatLevelByte);
Assert.Equal(ee.ThreatLevelNullableByte, aa.ThreatLevelNullableByte);
Assert.Equal(ee.DefeatedByNickname, aa.DefeatedByNickname);
Assert.Equal(ee.DefeatedBySquadId, aa.DefeatedBySquadId);
}
}
},
{
typeof(Mission), (e, a) =>
{
Assert.Equal(e == null, a == null);
if (a != null)
{
var ee = (Mission)e;
var aa = (Mission)a;
Assert.Equal(ee.Id, aa.Id);
Assert.Equal(ee.CodeName, aa.CodeName);
Assert.Equal(ee.Rating, aa.Rating);
Assert.Equal(ee.Timeline, aa.Timeline);
}
}
},
{
typeof(Squad), (e, a) =>
{
Assert.Equal(e == null, a == null);
if (a != null)
{
var ee = (Squad)e;
var aa = (Squad)a;
Assert.Equal(ee.Id, aa.Id);
Assert.Equal(ee.Name, aa.Name);
Assert.Equal(ee.Banner == null, aa.Banner == null);
if (ee.Banner != null)
{
Assert.True(ee.Banner.SequenceEqual(aa.Banner));
}
Assert.Equal(ee.Banner5 == null, aa.Banner5 == null);
if (ee.Banner5 != null)
{
Assert.True(ee.Banner5.SequenceEqual(aa.Banner5));
}
}
}
},
{
typeof(SquadMission), (e, a) =>
{
Assert.Equal(e == null, a == null);
if (a != null)
{
var ee = (SquadMission)e;
var aa = (SquadMission)a;
Assert.Equal(ee.SquadId, aa.SquadId);
Assert.Equal(ee.MissionId, aa.MissionId);
}
}
},
{
typeof(Weapon), (e, a) =>
{
Assert.Equal(e == null, a == null);
if (a != null)
{
var ee = (Weapon)e;
var aa = (Weapon)a;
Assert.Equal(ee.Id, aa.Id);
Assert.Equal(ee.IsAutomatic, aa.IsAutomatic);
Assert.Equal(ee.Name, aa.Name);
Assert.Equal(ee.OwnerFullName, aa.OwnerFullName);
Assert.Equal(ee.SynergyWithId, aa.SynergyWithId);
}
}
},
{
typeof(LocustHighCommand), (e, a) =>
{
Assert.Equal(e == null, a == null);
if (a != null)
{
var ee = (LocustHighCommand)e;
var aa = (LocustHighCommand)a;
Assert.Equal(ee.Id, aa.Id);
Assert.Equal(ee.IsOperational, aa.IsOperational);
Assert.Equal(ee.Name, aa.Name);
}
}
}
}.ToDictionary(e => e.Key, e => (object)e.Value);
protected override void OnModelCreating(ModelBuilder modelBuilder, DbContext context)
{
modelBuilder.Entity<City>(
b =>
{
b.HasKey(c => c.Name);
});
modelBuilder.Entity<Gear>(
b =>
{
b.HasKey(
g => new { g.Nickname, g.SquadId });
b.HasOne(g => g.CityOfBirth).WithMany(c => c.BornGears).HasForeignKey(g => g.CityOfBirthName).IsRequired();
b.HasOne(g => g.Tag).WithOne(t => t.Gear).HasForeignKey<CogTag>(
t => new { t.GearNickName, t.GearSquadId });
b.HasOne(g => g.AssignedCity).WithMany(c => c.StationedGears).IsRequired(false);
});
modelBuilder.Entity<Officer>().HasMany(o => o.Reports).WithOne().HasForeignKey(
o => new { o.LeaderNickname, o.LeaderSquadId });
modelBuilder.Entity<Squad>(
b =>
{
b.HasKey(s => s.Id);
b.Property(s => s.Id).ValueGeneratedNever();
b.Property(s => s.Banner5).HasMaxLength(5);
b.HasMany(s => s.Members).WithOne(g => g.Squad).HasForeignKey(g => g.SquadId);
});
modelBuilder.Entity<Weapon>(
b =>
{
b.Property(w => w.Id).ValueGeneratedNever();
b.HasOne(w => w.SynergyWith).WithOne().HasForeignKey<Weapon>(w => w.SynergyWithId);
b.HasOne(w => w.Owner).WithMany(g => g.Weapons).HasForeignKey(w => w.OwnerFullName).HasPrincipalKey(g => g.FullName);
});
modelBuilder.Entity<Mission>().Property(m => m.Id).ValueGeneratedNever();
modelBuilder.Entity<SquadMission>(
b =>
{
b.HasKey(
sm => new { sm.SquadId, sm.MissionId });
b.HasOne(sm => sm.Mission).WithMany(m => m.ParticipatingSquads).HasForeignKey(sm => sm.MissionId);
b.HasOne(sm => sm.Squad).WithMany(s => s.Missions).HasForeignKey(sm => sm.SquadId);
});
modelBuilder.Entity<Faction>().HasKey(f => f.Id);
modelBuilder.Entity<Faction>().Property(f => f.Id).ValueGeneratedNever();
modelBuilder.Entity<LocustHorde>().HasBaseType<Faction>();
modelBuilder.Entity<LocustHorde>().HasMany(h => h.Leaders).WithOne();
modelBuilder.Entity<LocustHorde>().HasOne(h => h.Commander).WithOne(c => c.CommandingFaction);
modelBuilder.Entity<LocustLeader>().HasKey(l => l.Name);
modelBuilder.Entity<LocustCommander>().HasBaseType<LocustLeader>();
modelBuilder.Entity<LocustCommander>().HasOne(c => c.DefeatedBy).WithOne().HasForeignKey<LocustCommander>(
c => new { c.DefeatedByNickname, c.DefeatedBySquadId });
modelBuilder.Entity<LocustHighCommand>().HasKey(l => l.Id);
modelBuilder.Entity<LocustHighCommand>().Property(l => l.Id).ValueGeneratedNever();
}
protected override void Seed(GearsOfWarContext context)
=> GearsOfWarContext.Seed(context);
public override DbContextOptionsBuilder AddOptions(DbContextOptionsBuilder builder)
=> base.AddOptions(builder).ConfigureWarnings(
w =>
w.Log(CoreEventId.RowLimitingOperationWithoutOrderByWarning));
public override GearsOfWarContext CreateContext()
{
var context = base.CreateContext();
context.ChangeTracker.QueryTrackingBehavior = QueryTrackingBehavior.NoTracking;
return context;
}
}