Add SpawnAndDirtyAllEntities test (#13629)

This commit is contained in:
Leon Friedrich
2023-01-24 13:33:49 +13:00
committed by GitHub
parent fb3df96654
commit 554ec85069
6 changed files with 86 additions and 32 deletions

View File

@@ -41,18 +41,23 @@ public sealed class RandomSpriteSystem : SharedRandomSpriteSystem
foreach (var layer in component.Selected) foreach (var layer in component.Selected)
{ {
object key; int index;
if (_reflection.TryParseEnumReference(layer.Key, out var @enum)) if (_reflection.TryParseEnumReference(layer.Key, out var @enum))
{ {
key = @enum; if (!sprite.LayerMapTryGet(@enum, out index, logError: true))
return;
} }
else else if (!sprite.LayerMapTryGet(layer.Key, out index))
{ {
key = layer.Key; if (layer.Key is not string strKey || !int.TryParse(strKey, out index))
{
Logger.Error($"Invalid key `{layer.Key}` for entity with random sprite {ToPrettyString(uid)}");
return;
}
} }
sprite.LayerSetState(key, layer.Value.State); sprite.LayerSetState(index, layer.Value.State);
sprite.LayerSetColor(key, layer.Value.Color ?? Color.White); sprite.LayerSetColor(index, layer.Value.Color ?? Color.White);
} }
} }
} }

View File

@@ -46,14 +46,14 @@ namespace Content.IntegrationTests.Tests
} }
}); });
await server.WaitRunTicks(5); await server.WaitRunTicks(15);
await server.WaitPost(() => await server.WaitPost(() =>
{ {
var entityMetas = entityMan.EntityQuery<MetaDataComponent>(true).ToList(); var entityMetas = entityMan.EntityQuery<MetaDataComponent>(true).ToList();
foreach (var meta in entityMetas) foreach (var meta in entityMetas)
{ {
if(!entityMan.Deleted(meta.Owner)) if(!meta.EntityDeleted)
entityMan.DeleteEntity(meta.Owner); entityMan.DeleteEntity(meta.Owner);
} }
@@ -67,7 +67,7 @@ namespace Content.IntegrationTests.Tests
{ {
await using var pairTracker = await PoolManager.GetServerClient(new PoolSettings{NoClient = true, Destructive = true}); await using var pairTracker = await PoolManager.GetServerClient(new PoolSettings{NoClient = true, Destructive = true});
var server = pairTracker.Pair.Server; var server = pairTracker.Pair.Server;
var map = await PoolManager.CreateTestMap(pairTracker);
IEntityManager entityMan = null; IEntityManager entityMan = null;
await server.WaitPost(() => await server.WaitPost(() =>
@@ -81,21 +81,18 @@ namespace Content.IntegrationTests.Tests
.Where(p=>!p.Abstract) .Where(p=>!p.Abstract)
.Select(p => p.ID) .Select(p => p.ID)
.ToList(); .ToList();
var mapId = mapManager.CreateMap();
var grid = mapManager.CreateGrid(mapId);
var coord = new EntityCoordinates(grid.Owner, 0, 0);
foreach (var protoId in protoIds) foreach (var protoId in protoIds)
{ {
entityMan.SpawnEntity(protoId, coord); entityMan.SpawnEntity(protoId, map.GridCoords);
} }
}); });
await server.WaitRunTicks(5); await server.WaitRunTicks(15);
await server.WaitPost(() => await server.WaitPost(() =>
{ {
var entityMetas = entityMan.EntityQuery<MetaDataComponent>(true).ToList(); var entityMetas = entityMan.EntityQuery<MetaDataComponent>(true).ToList();
foreach (var meta in entityMetas) foreach (var meta in entityMetas)
{ {
if(!entityMan.Deleted(meta.Owner)) if(!meta.EntityDeleted)
entityMan.DeleteEntity(meta.Owner); entityMan.DeleteEntity(meta.Owner);
} }
@@ -103,6 +100,54 @@ namespace Content.IntegrationTests.Tests
}); });
await pairTracker.CleanReturnAsync(); await pairTracker.CleanReturnAsync();
} }
/// <summary>
/// Variant of <see cref="SpawnAndDeleteAllEntitiesInTheSameSpot"/> that also launches a client and dirties
/// all components on every entity.
/// </summary>
[Test]
public async Task SpawnAndDirtyAllEntities()
{
await using var pairTracker = await PoolManager.GetServerClient(new PoolSettings { NoClient = false, Destructive = true });
var server = pairTracker.Pair.Server;
var map = await PoolManager.CreateTestMap(pairTracker);
IEntityManager entityMan = null;
await server.WaitPost(() =>
{
entityMan = IoCManager.Resolve<IEntityManager>();
var prototypeMan = IoCManager.Resolve<IPrototypeManager>();
var protoIds = prototypeMan
.EnumeratePrototypes<EntityPrototype>()
.Where(p => !p.Abstract)
.Select(p => p.ID)
.ToList();
foreach (var protoId in protoIds)
{
var ent = entityMan.SpawnEntity(protoId, map.GridCoords);
foreach (var (netId, component) in entityMan.GetNetComponents(ent))
{
entityMan.Dirty(component);
}
}
});
await server.WaitRunTicks(15);
await server.WaitPost(() =>
{
var entityMetas = entityMan.EntityQuery<MetaDataComponent>(true).ToList();
foreach (var meta in entityMetas)
{
if (!meta.EntityDeleted)
entityMan.DeleteEntity(meta.Owner);
}
Assert.That(entityMan.EntityCount, Is.Zero);
});
await pairTracker.CleanReturnAsync();
}
[Test] [Test]
public async Task AllComponentsOneToOneDeleteTest() public async Task AllComponentsOneToOneDeleteTest()
{ {

View File

@@ -86,7 +86,7 @@ namespace Content.Server.Decals
return; return;
// Should this be a full component state or a delta-state? // Should this be a full component state or a delta-state?
if (args.FromTick <= component.CreationTick && args.FromTick <= component.ForceTick) if (args.FromTick <= component.CreationTick || args.FromTick <= component.ForceTick)
{ {
args.State = new DecalGridState(component.ChunkCollection.ChunkCollection); args.State = new DecalGridState(component.ChunkCollection.ChunkCollection);
return; return;

View File

@@ -361,7 +361,8 @@ namespace Content.Server.GameTicking
} }
// AAAAAAAAAAAAA // AAAAAAAAAAAAA
_sawmill.Error("Found no observer spawn points!"); // This should be an error, if it didn't cause tests to start erroring when they delete a player.
_sawmill.Warning("Found no observer spawn points!");
return EntityCoordinates.Invalid; return EntityCoordinates.Invalid;
} }
#endregion #endregion

View File

@@ -102,9 +102,11 @@ public sealed class MindSystem : EntitySystem
} }
// TODO refactor observer spawning. // TODO refactor observer spawning.
// please.
if (!spawnPosition.IsValid(EntityManager)) if (!spawnPosition.IsValid(EntityManager))
{ {
Logger.ErrorS("mind", $"Entity \"{ToPrettyString(uid)}\" for {mind.Mind?.CharacterName} was deleted, and no applicable spawn location is available."); // This should be an error, if it didn't cause tests to start erroring when they delete a player.
Logger.WarningS("mind", $"Entity \"{ToPrettyString(uid)}\" for {mind.Mind?.CharacterName} was deleted, and no applicable spawn location is available.");
return; return;
} }

View File

@@ -33,20 +33,21 @@
name: bar sign name: bar sign
suffix: Random suffix: Random
- type: entity # Missing appearance components & various other sprite issues.
id: LargeBarSign #- type: entity
name: large bar sign # id: LargeBarSign
noSpawn: true # name: large bar sign
components: # noSpawn: true
- type: Clickable # components:
- type: InteractionOutline # - type: Clickable
- type: Sprite # - type: InteractionOutline
drawdepth: WallTops # - type: Sprite
sprite: Structures/Wallmounts/sylphs.rsi # drawdepth: WallTops
state: sylph # sprite: Structures/Wallmounts/sylphs.rsi
- type: ApcPowerReceiver # state: sylph
- type: ExtensionCableReceiver # - type: ApcPowerReceiver
- type: BarSign # - type: ExtensionCableReceiver
# - type: BarSign
- type: entity - type: entity
parent: BaseBarSign parent: BaseBarSign