diff --git a/Content.IntegrationTests/Tests/SaveLoadSaveTest.cs b/Content.IntegrationTests/Tests/SaveLoadSaveTest.cs index 85b95ef117..c85ca1952a 100644 --- a/Content.IntegrationTests/Tests/SaveLoadSaveTest.cs +++ b/Content.IntegrationTests/Tests/SaveLoadSaveTest.cs @@ -78,6 +78,8 @@ namespace Content.IntegrationTests.Tests await pairTracker.CleanReturnAsync(); } + const string TestMap = "Maps/bagel.yml"; + /// /// Loads the default map, runs it for 5 ticks, then assert that it did not change. /// @@ -91,13 +93,13 @@ namespace Content.IntegrationTests.Tests MapId mapId = default; - // Load saltern.yml as uninitialized map, and save it to ensure it's up to date. + // Load bagel.yml as uninitialized map, and save it to ensure it's up to date. server.Post(() => { mapId = mapManager.CreateMap(); mapManager.AddUninitializedMap(mapId); mapManager.SetMapPaused(mapId, true); - mapLoader.LoadMap(mapId, "Maps/bagel.yml"); + mapLoader.LoadMap(mapId, TestMap); mapLoader.SaveMap(mapId, "load save ticks save 1.yml"); }); @@ -145,6 +147,78 @@ namespace Content.IntegrationTests.Tests TestContext.Error.WriteLine(twoTmp); } }); + + await server.WaitPost(() => mapManager.DeleteMap(mapId)); + await pairTracker.CleanReturnAsync(); + } + + /// + /// Loads the same uninitialized map at slightly different times, and then checks that they are the same + /// when getting saved. + /// + /// + /// Should ensure that entities do not perform randomization prior to initialization and should prevents + /// bugs like the one discussed in github.com/space-wizards/RobustToolbox/issues/3870. This test is somewhat + /// similar to and , but neither of these + /// caught the mentioned bug. + /// + [Test] + public async Task LoadTickLoadBagel() + { + await using var pairTracker = await PoolManager.GetServerClient(new PoolSettings{NoClient = true}); + var server = pairTracker.Pair.Server; + + var mapLoader = server.ResolveDependency().GetEntitySystem(); + var mapManager = server.ResolveDependency(); + var userData = server.ResolveDependency().UserData; + + MapId mapId = default; + const string fileA = "/load tick load a.yml"; + const string fileB = "/load tick load b.yml"; + string yamlA; + string yamlB; + + // Load & save the first map + server.Post(() => + { + mapId = mapManager.CreateMap(); + mapManager.AddUninitializedMap(mapId); + mapManager.SetMapPaused(mapId, true); + mapLoader.LoadMap(mapId, TestMap); + mapLoader.SaveMap(mapId, fileA); + }); + + await server.WaitIdleAsync(); + await using (var stream = userData.Open(new ResourcePath(fileA), FileMode.Open)) + using (var reader = new StreamReader(stream)) + { + yamlA = await reader.ReadToEndAsync(); + } + + server.RunTicks(5); + + // Load & save the second map + server.Post(() => + { + mapManager.DeleteMap(mapId); + mapManager.CreateMap(mapId); + mapManager.AddUninitializedMap(mapId); + mapManager.SetMapPaused(mapId, true); + mapLoader.LoadMap(mapId, TestMap); + mapLoader.SaveMap(mapId, fileB); + }); + + await server.WaitIdleAsync(); + + await using (var stream = userData.Open(new ResourcePath(fileB), FileMode.Open)) + using (var reader = new StreamReader(stream)) + { + yamlB = await reader.ReadToEndAsync(); + } + + Assert.That(yamlA, Is.EqualTo(yamlB)); + + await server.WaitPost(() => mapManager.DeleteMap(mapId)); await pairTracker.CleanReturnAsync(); } } diff --git a/Resources/Maps/bagel.yml b/Resources/Maps/bagel.yml index 28768d89b9..71f31e9914 100644 --- a/Resources/Maps/bagel.yml +++ b/Resources/Maps/bagel.yml @@ -9373,9 +9373,6 @@ entities: - nextUpdate: 8187.135845 type: GridPathfinding - type: RadiationGridResistance - - nextShake: 0 - shakeTimes: 10 - type: GravityShake - type: GasTileOverlay - uid: 61 type: GasVentScrubber