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)
{
object key;
int index;
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.LayerSetColor(key, layer.Value.Color ?? Color.White);
sprite.LayerSetState(index, layer.Value.State);
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(() =>
{
var entityMetas = entityMan.EntityQuery<MetaDataComponent>(true).ToList();
foreach (var meta in entityMetas)
{
if(!entityMan.Deleted(meta.Owner))
if(!meta.EntityDeleted)
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});
var server = pairTracker.Pair.Server;
var map = await PoolManager.CreateTestMap(pairTracker);
IEntityManager entityMan = null;
await server.WaitPost(() =>
@@ -81,21 +81,18 @@ namespace Content.IntegrationTests.Tests
.Where(p=>!p.Abstract)
.Select(p => p.ID)
.ToList();
var mapId = mapManager.CreateMap();
var grid = mapManager.CreateGrid(mapId);
var coord = new EntityCoordinates(grid.Owner, 0, 0);
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(() =>
{
var entityMetas = entityMan.EntityQuery<MetaDataComponent>(true).ToList();
foreach (var meta in entityMetas)
{
if(!entityMan.Deleted(meta.Owner))
if(!meta.EntityDeleted)
entityMan.DeleteEntity(meta.Owner);
}
@@ -103,6 +100,54 @@ namespace Content.IntegrationTests.Tests
});
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]
public async Task AllComponentsOneToOneDeleteTest()
{

View File

@@ -86,7 +86,7 @@ namespace Content.Server.Decals
return;
// 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);
return;

View File

@@ -361,7 +361,8 @@ namespace Content.Server.GameTicking
}
// 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;
}
#endregion

View File

@@ -102,9 +102,11 @@ public sealed class MindSystem : EntitySystem
}
// TODO refactor observer spawning.
// please.
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;
}

View File

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