Add SpawnAndDirtyAllEntities test (#13629)
This commit is contained in:
@@ -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);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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()
|
||||||
{
|
{
|
||||||
|
|||||||
@@ -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;
|
||||||
|
|||||||
@@ -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
|
||||||
|
|||||||
@@ -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;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -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
|
||||||
|
|||||||
Reference in New Issue
Block a user