#if UNITY_EDITOR using System.Linq; using AibisDream.Kit; using AibisDream.UI; using AibisDream.Utility; using NUnit.Framework; using UnityEditor; using UnityEngine; namespace AibisDream.DeveloperMode.Editor { public sealed class DeveloperModeCoreTests { [Test] public void RuntimeLogBufferEvictsOldestAndPreservesOrder() { var buffer = new RuntimeLogBuffer(3); buffer.Add(LogEntry.System(LogLevel.Info, LogCategory.General, "one")); buffer.Add(LogEntry.System(LogLevel.Warning, LogCategory.Save, "two")); buffer.Add(LogEntry.System(LogLevel.Error, LogCategory.Yarn, "three")); buffer.Add(LogEntry.System(LogLevel.Fatal, LogCategory.Scene, "four")); var snapshot = buffer.Snapshot(); Assert.That(snapshot.Select(item => item.Message), Is.EqualTo(new[] { "two", "three", "four" })); Assert.That(snapshot.Select(item => item.Sequence), Is.Ordered.Ascending); Assert.That(snapshot.Length, Is.EqualTo(buffer.Capacity)); } [Test] public void RuntimeLogBufferAcceptsConcurrentWritersAndClears() { var buffer = new RuntimeLogBuffer(128); System.Threading.Tasks.Parallel.For(0, 1000, index => buffer.Add(LogEntry.System(LogLevel.Info, LogCategory.General, index.ToString()))); var snapshot = buffer.Snapshot(); Assert.That(snapshot.Length, Is.EqualTo(128)); Assert.That(snapshot.Select(item => item.Sequence), Is.Ordered.Ascending); buffer.Clear(); Assert.That(buffer.Snapshot(), Is.Empty); } [Test] public void YarnStorageTypedSettersAndDebugSnapshotAreReadOnlyAndConsistent() { var go = new GameObject("YarnVariableStorage Test"); try { var storage = go.AddComponent(); storage.SetValue("$score", 12.5f); storage.SetValue("$global_flag", true); storage.SetValue("$name", "AIBIS"); var snapshot = DeveloperVariableSnapshot.Capture(storage, null); Assert.That(snapshot.Select(item => item.Name), Is.EquivalentTo(new[] { "$score", "$global_flag", "$name" })); Assert.That(snapshot.Single(item => item.Name == "$score").Value, Is.EqualTo("12.5")); Assert.That(snapshot.Single(item => item.Name == "$global_flag").IsGlobal, Is.True); Assert.That(snapshot.All(item => item.HasRuntimeOverride), Is.True); storage.ClearLocal(); var remaining = DeveloperVariableSnapshot.Capture(storage, null); Assert.That(remaining.Select(item => item.Name), Is.EqualTo(new[] { "$global_flag" })); storage.Clear(); Assert.That(DeveloperVariableSnapshot.Capture(storage, null), Is.Empty); } finally { Object.DestroyImmediate(go); } } [Test] public void PrefabIsConfiguredAndPersistenceReferencesIt() { const string prefabPath = "Assets/GameContent/Feature_MainUI/Prefabs/DeveloperModePanel.prefab"; const string scenePath = "Assets/Scenes/Persistence.unity"; var prefab = AssetDatabase.LoadAssetAtPath(prefabPath); Assert.That(prefab, Is.Not.Null); Assert.That(prefab.activeSelf, Is.False); var panel = prefab.GetComponent(); Assert.That(panel, Is.Not.Null); Assert.That(panel.IsConfigured, Is.True); Assert.That(AssetDatabase.GetDependencies(scenePath), Does.Contain(prefabPath)); } [Test] public void PanelToggleIsNonModalAndEscapeClosesIt() { const string prefabPath = "Assets/GameContent/Feature_MainUI/Prefabs/DeveloperModePanel.prefab"; var prefab = AssetDatabase.LoadAssetAtPath(prefabPath); var instance = Object.Instantiate(prefab); try { var panel = instance.GetComponent(); var originalScale = Time.timeScale; panel.TogglePanel(); Assert.That(panel.IsOpen, Is.True); Assert.That(Time.timeScale, Is.EqualTo(originalScale)); Assert.That(panel.HandleEscape(), Is.True); Assert.That(panel.IsOpen, Is.False); } finally { Object.DestroyImmediate(instance); } } } } #endif