93 lines
4.0 KiB
C#
93 lines
4.0 KiB
C#
using Age.Engine.Sys4;
|
|
|
|
public class MovieSurfaceRegistryTests
|
|
{
|
|
[Fact]
|
|
public void SameResourceOnTwoSurfacesHasIndependentFramesCompletionAndRelease()
|
|
{
|
|
var registry = new MovieSurfaceRegistry();
|
|
MovieSurfaceBinding first = registry.Begin(7, 0x2b42, out _);
|
|
MovieSurfaceBinding second = registry.Begin(8, 0x2b42, out _);
|
|
var firstFrame = Frame(1);
|
|
var secondFrame = Frame(2);
|
|
|
|
Assert.True(registry.PublishFrame(first.PlaybackId, firstFrame, "MVB126.AGF", 0x2b42));
|
|
Assert.True(registry.PublishFrame(second.PlaybackId, secondFrame, "MVB126.AGF", 0x2b42));
|
|
Assert.True(registry.Complete(first.PlaybackId));
|
|
|
|
MovieSurfaceRelease released = registry.ReleaseIfCompleted(7);
|
|
|
|
Assert.Equal(MovieSurfaceReleaseKind.Released, released.Kind);
|
|
Assert.False(registry.IsBound(7));
|
|
Assert.True(registry.IsActive(8));
|
|
Assert.True(registry.TryResolveSurface(8, out MovieSurfaceFrame? remaining));
|
|
Assert.Same(secondFrame, remaining!.Image);
|
|
Assert.True(registry.Complete(second.PlaybackId));
|
|
Assert.Equal(MovieSurfaceReleaseKind.Released, registry.ReleaseIfCompleted(8).Kind);
|
|
Assert.False(registry.HasActivePlayback);
|
|
}
|
|
|
|
[Fact]
|
|
public void ReplacingSurfaceInvalidatesLateEventsFromPriorPlayback()
|
|
{
|
|
var registry = new MovieSurfaceRegistry();
|
|
MovieSurfaceBinding prior = registry.Begin(7, 0x2bdc, out _);
|
|
|
|
MovieSurfaceBinding current = registry.Begin(7, 0x2bad, out MovieSurfaceBinding? replaced);
|
|
|
|
Assert.Equal(prior, replaced);
|
|
Assert.False(registry.Complete(prior.PlaybackId));
|
|
Assert.False(registry.PublishFrame(prior.PlaybackId, Frame(1), "OLD.AGF", 1));
|
|
Assert.True(registry.IsActive(7));
|
|
Assert.True(registry.PublishFrame(current.PlaybackId, Frame(2), "NEW.AGF", 2));
|
|
Assert.True(registry.TryResolveSurface(7, out MovieSurfaceFrame? frame));
|
|
Assert.Equal("NEW.AGF", frame!.Name);
|
|
}
|
|
|
|
[Fact]
|
|
public void ReleasedMovieResourceRemainsTypedAsMovieForCleanupFrame()
|
|
{
|
|
var registry = new MovieSurfaceRegistry();
|
|
MovieSurfaceBinding binding = registry.Begin(7, 0x2bde, out _);
|
|
|
|
Assert.True(registry.IsKnownMovieResource(0x2bde));
|
|
Assert.True(registry.Complete(binding.PlaybackId));
|
|
Assert.Equal(MovieSurfaceReleaseKind.Released, registry.ReleaseIfCompleted(7).Kind);
|
|
|
|
Assert.False(registry.IsBound(7));
|
|
Assert.False(registry.TryResolveResource(0x2bde, out _));
|
|
Assert.True(registry.IsKnownMovieResource(0x2bde));
|
|
Assert.False(registry.IsKnownMovieResource(0x2af5));
|
|
}
|
|
|
|
[Fact]
|
|
public void ResourceLookup_SelectsNewestPublishedPlaybackWithoutAllocating()
|
|
{
|
|
var registry = new MovieSurfaceRegistry();
|
|
MovieSurfaceBinding older = registry.Begin(7, 0x2b42, out _);
|
|
MovieSurfaceBinding unrelated = registry.Begin(8, 0x2bad, out _);
|
|
MovieSurfaceBinding newer = registry.Begin(9, 0x2b42, out _);
|
|
Assert.True(registry.PublishFrame(older.PlaybackId, Frame(1), "OLDER.AGF", 1));
|
|
Assert.True(registry.PublishFrame(unrelated.PlaybackId, Frame(2), "OTHER.AGF", 2));
|
|
Assert.True(registry.PublishFrame(newer.PlaybackId, Frame(3), "NEWER.AGF", 3));
|
|
Assert.True(registry.TryResolveResource(0x2b42, out MovieSurfaceFrame? warm));
|
|
Assert.Equal("NEWER.AGF", warm!.Name);
|
|
Assert.False(registry.TryResolveResource(0x2af5, out _));
|
|
|
|
long before = GC.GetAllocatedBytesForCurrentThread();
|
|
bool resultsCorrect = true;
|
|
for (int i = 0; i < 10_000; i++)
|
|
{
|
|
resultsCorrect &= registry.TryResolveResource(0x2b42, out _);
|
|
resultsCorrect &= !registry.TryResolveResource(0x2af5, out _);
|
|
}
|
|
long allocated = GC.GetAllocatedBytesForCurrentThread() - before;
|
|
|
|
Assert.True(resultsCorrect);
|
|
Assert.Equal(0, allocated);
|
|
}
|
|
|
|
private static RgbaImage Frame(byte value)
|
|
=> new(1, 1, new[] { value, value, value, (byte)255 });
|
|
}
|