Files
mrgameeng/tests/MrGameEng.Core.Tests/SceneManagerTests.cs
T

88 lines
2.2 KiB
C#

using MrGameEng.Core;
using Xunit;
namespace MrGameEng.Core.Tests;
public class SceneManagerTests
{
private sealed class TrackingScene : Scene
{
public int LoadCount;
public int UnloadCount;
public int UpdateCount;
protected override void OnLoad() => LoadCount++;
protected override void OnUnload() => UnloadCount++;
public override void Update(GameClock clock)
{
UpdateCount++;
base.Update(clock);
}
}
[Fact]
public void Switch_IsDeferred_UntilNextUpdate()
{
var context = new EngineContext();
var scene = new TrackingScene();
context.Scenes.Switch(scene);
Assert.Null(context.Scenes.Current);
Assert.Equal(0, scene.LoadCount);
context.Scenes.Update(context.Clock);
Assert.Same(scene, context.Scenes.Current);
Assert.Equal(1, scene.LoadCount);
Assert.Equal(1, scene.UpdateCount);
Assert.True(scene.IsLoaded);
}
[Fact]
public void Switch_UnloadsPreviousScene_AndLoadsNext()
{
var context = new EngineContext();
var first = new TrackingScene();
var second = new TrackingScene();
context.Scenes.Switch(first);
context.Scenes.Update(context.Clock);
context.Scenes.Switch(second);
context.Scenes.Update(context.Clock);
Assert.Equal(1, first.UnloadCount);
Assert.False(first.IsLoaded);
Assert.Same(second, context.Scenes.Current);
Assert.Equal(1, second.LoadCount);
}
[Fact]
public void Switch_ToNull_UnloadsCurrentScene()
{
var context = new EngineContext();
var scene = new TrackingScene();
context.Scenes.Switch(scene);
context.Scenes.Update(context.Clock);
context.Scenes.Switch(null);
context.Scenes.Update(context.Clock);
Assert.Null(context.Scenes.Current);
Assert.Equal(1, scene.UnloadCount);
}
[Fact]
public void Update_WithoutScene_DoesNothing()
{
var context = new EngineContext();
context.Scenes.Update(context.Clock);
context.Scenes.Draw(context.Clock);
Assert.Null(context.Scenes.Current);
}
}