75 lines
2.0 KiB
C#
75 lines
2.0 KiB
C#
using System.Threading;
|
|
using System.Threading.Tasks;
|
|
using Age.Engine.Hosting;
|
|
using Xunit;
|
|
|
|
public class ScriptPresentationBarrierTests
|
|
{
|
|
[Fact]
|
|
public void ScriptBurstWithholdsPresentationUntilExit()
|
|
{
|
|
var barrier = new ScriptPresentationBarrier();
|
|
|
|
barrier.EnterScript();
|
|
Assert.False(barrier.TryEnterPresentation());
|
|
|
|
barrier.ExitScript();
|
|
Assert.True(barrier.TryEnterPresentation());
|
|
barrier.ExitPresentation();
|
|
}
|
|
|
|
[Fact]
|
|
public void NestedScriptsRemainOneAtomicBurst()
|
|
{
|
|
var barrier = new ScriptPresentationBarrier();
|
|
|
|
barrier.EnterScript();
|
|
barrier.EnterScript();
|
|
barrier.ExitScript();
|
|
Assert.False(barrier.TryEnterPresentation());
|
|
|
|
barrier.ExitScript();
|
|
Assert.True(barrier.TryEnterPresentation());
|
|
barrier.ExitPresentation();
|
|
}
|
|
|
|
[Fact]
|
|
public void ServiceBoundaryTemporarilyAllowsPresentation()
|
|
{
|
|
var barrier = new ScriptPresentationBarrier();
|
|
|
|
barrier.EnterScript();
|
|
bool suspended = barrier.SuspendScript();
|
|
Assert.True(suspended);
|
|
Assert.True(barrier.TryEnterPresentation());
|
|
barrier.ExitPresentation();
|
|
|
|
barrier.ResumeScript(suspended);
|
|
Assert.False(barrier.TryEnterPresentation());
|
|
barrier.ExitScript();
|
|
}
|
|
|
|
[Fact]
|
|
public async Task RenderThreadCannotEnterWhileVmThreadIsRebuilding()
|
|
{
|
|
var barrier = new ScriptPresentationBarrier();
|
|
using var entered = new ManualResetEventSlim();
|
|
using var release = new ManualResetEventSlim();
|
|
Task vmBurst = Task.Run(() =>
|
|
{
|
|
barrier.EnterScript();
|
|
entered.Set();
|
|
release.Wait();
|
|
barrier.ExitScript();
|
|
});
|
|
|
|
await Task.Run(entered.Wait);
|
|
Assert.False(barrier.TryEnterPresentation());
|
|
|
|
release.Set();
|
|
await vmBurst;
|
|
Assert.True(barrier.TryEnterPresentation());
|
|
barrier.ExitPresentation();
|
|
}
|
|
}
|