using System.Reflection; using AcDream.App.World; using AcDream.Runtime.Entities; namespace AcDream.App.Tests.World; public sealed class RuntimeEntityOwnershipTests { [Fact] public void LiveEntityRuntime_ComposesCanonicalRuntimeDirectory() { FieldInfo directory = typeof(LiveEntityRuntime).GetField( "_directory", BindingFlags.Instance | BindingFlags.NonPublic) ?? throw new InvalidOperationException("Missing canonical entity directory."); FieldInfo sidecars = typeof(LiveEntityRuntime).GetField( "_activeRecords", BindingFlags.Instance | BindingFlags.NonPublic) ?? throw new InvalidOperationException("Missing App projection sidecar store."); Assert.Equal(typeof(RuntimeEntityDirectory), directory.FieldType); Assert.Equal(typeof(RuntimeEntityRecord), sidecars.FieldType.GetGenericArguments()[0]); Assert.Equal(typeof(LiveEntityRecord), sidecars.FieldType.GetGenericArguments()[1]); } [Fact] public void AppCompatibilityLookup_IsNotASecondGuidDictionary() { FieldInfo compatibilityView = typeof(LiveEntityRuntime).GetField( "_recordsByGuid", BindingFlags.Instance | BindingFlags.NonPublic) ?? throw new InvalidOperationException("Missing migration compatibility view."); Assert.False(compatibilityView.FieldType.IsGenericType); Assert.DoesNotContain( compatibilityView.FieldType.GetInterfaces(), type => type.IsGenericType && type.GetGenericTypeDefinition() == typeof(IDictionary<,>)); } [Fact] public void CanonicalRuntimeRecord_HasNoProjectionOrBackendSurface() { string[] forbiddenPropertyNames = [ "WorldEntity", "AnimationRuntime", "RemoteMotionRuntime", "ProjectileRuntime", "EffectProfile", "ResourcesRegistered", "IsSpatiallyProjected", "IsSpatiallyVisible", ]; PropertyInfo[] properties = typeof(RuntimeEntityRecord).GetProperties( BindingFlags.Instance | BindingFlags.Public); Assert.DoesNotContain( properties, property => forbiddenPropertyNames.Contains( property.Name, StringComparer.Ordinal)); Assert.DoesNotContain( properties, property => IsPresentationType(property.PropertyType)); } private static bool IsPresentationType(Type type) { string? ns = type.Namespace; return ns?.StartsWith("AcDream.App", StringComparison.Ordinal) == true || ns?.StartsWith("AcDream.UI", StringComparison.Ordinal) == true || ns?.StartsWith("Silk.NET", StringComparison.Ordinal) == true || ns?.StartsWith("ImGuiNET", StringComparison.Ordinal) == true; } }