112 lines
3.9 KiB
C#
112 lines
3.9 KiB
C#
using System.Text.RegularExpressions;
|
|
using AcDream.App.Runtime;
|
|
using AcDream.App.Streaming;
|
|
using AcDream.Runtime;
|
|
using AcDream.Runtime.World;
|
|
|
|
namespace AcDream.App.Tests.Runtime;
|
|
|
|
public sealed class RuntimeWorldTransitOwnershipTests
|
|
{
|
|
[Fact]
|
|
public void ProductionConstructsOneRuntimeTransitOwnerAndNoAppLifecycleOwner()
|
|
{
|
|
string root = FindRepositoryRoot();
|
|
string appRoot = Path.Combine(root, "src", "AcDream.App");
|
|
string app = string.Join(
|
|
"\n",
|
|
Directory.EnumerateFiles(appRoot, "*.cs", SearchOption.AllDirectories)
|
|
.Select(File.ReadAllText));
|
|
|
|
Assert.False(File.Exists(Path.Combine(
|
|
appRoot,
|
|
"Streaming",
|
|
"WorldRevealLifecycleTelemetry.cs")));
|
|
Assert.False(File.Exists(Path.Combine(
|
|
appRoot,
|
|
"Streaming",
|
|
"TeleportTransitCoordinator.cs")));
|
|
Assert.DoesNotContain(
|
|
"class WorldRevealLifecycleTelemetry",
|
|
app,
|
|
StringComparison.Ordinal);
|
|
Assert.DoesNotContain(
|
|
"class TeleportTransitCoordinator",
|
|
app,
|
|
StringComparison.Ordinal);
|
|
Assert.DoesNotContain(
|
|
"record struct WorldRevealLifecycleSnapshot",
|
|
app,
|
|
StringComparison.Ordinal);
|
|
Assert.Single(Regex.Matches(
|
|
app,
|
|
@"new\s+RuntimeWorldTransitState\s*\(")
|
|
.Cast<Match>());
|
|
}
|
|
|
|
[Fact]
|
|
public void GraphicalAdaptersBorrowRuntimeStateWithoutReconstructingPortalView()
|
|
{
|
|
var availabilityFields = typeof(WorldGenerationAvailabilityState)
|
|
.GetFields(
|
|
System.Reflection.BindingFlags.Instance
|
|
| System.Reflection.BindingFlags.NonPublic);
|
|
Assert.Single(availabilityFields);
|
|
Assert.Equal(
|
|
typeof(RuntimeWorldTransitState),
|
|
availabilityFields[0].FieldType);
|
|
|
|
var viewFields = typeof(CurrentGameRuntimeViewAdapter)
|
|
.GetFields(
|
|
System.Reflection.BindingFlags.Instance
|
|
| System.Reflection.BindingFlags.NonPublic);
|
|
Assert.Contains(
|
|
viewFields,
|
|
field => field.FieldType == typeof(IRuntimePortalView));
|
|
Assert.DoesNotContain(
|
|
typeof(CurrentGameRuntimeViewAdapter).GetNestedTypes(
|
|
System.Reflection.BindingFlags.NonPublic),
|
|
type => type.Name.Contains(
|
|
"PortalView",
|
|
StringComparison.Ordinal));
|
|
|
|
var coordinatorFields = typeof(WorldRevealCoordinator)
|
|
.GetFields(
|
|
System.Reflection.BindingFlags.Instance
|
|
| System.Reflection.BindingFlags.NonPublic);
|
|
Assert.Contains(
|
|
coordinatorFields,
|
|
field => field.FieldType == typeof(RuntimeWorldTransitState));
|
|
Assert.DoesNotContain(
|
|
coordinatorFields,
|
|
field => field.Name is "_activeGeneration"
|
|
or "_worldSimulationReleased"
|
|
or "_lifecycle");
|
|
|
|
var teleportFields = typeof(LocalPlayerTeleportController)
|
|
.GetFields(
|
|
System.Reflection.BindingFlags.Instance
|
|
| System.Reflection.BindingFlags.NonPublic);
|
|
Assert.Single(
|
|
teleportFields,
|
|
field => field.FieldType == typeof(RuntimeWorldTransitState));
|
|
Assert.DoesNotContain(
|
|
teleportFields,
|
|
field => field.Name.Contains(
|
|
"acceptedDestination",
|
|
StringComparison.OrdinalIgnoreCase));
|
|
}
|
|
|
|
private static string FindRepositoryRoot()
|
|
{
|
|
var current = new DirectoryInfo(AppContext.BaseDirectory);
|
|
while (current is not null)
|
|
{
|
|
if (File.Exists(Path.Combine(current.FullName, "AcDream.slnx")))
|
|
return current.FullName;
|
|
current = current.Parent;
|
|
}
|
|
|
|
throw new DirectoryNotFoundException("AcDream.slnx was not found.");
|
|
}
|
|
}
|