using NUnit.Framework; using MCPForUnity.Editor.Services; using MCPForUnity.Editor.Constants; using UnityEditor; namespace MCPForUnityTests.Editor.Services { /// /// Unit tests for EditorConfigurationCache. /// [TestFixture] public class EditorConfigurationCacheTests { private bool _originalUseHttpTransport; private bool _originalDebugLogs; private string _originalUvxPath; [SetUp] public void SetUp() { // Save original values _originalUseHttpTransport = EditorPrefs.GetBool(EditorPrefKeys.UseHttpTransport, true); _originalDebugLogs = EditorPrefs.GetBool(EditorPrefKeys.DebugLogs, false); _originalUvxPath = EditorPrefs.GetString(EditorPrefKeys.UvxPathOverride, string.Empty); // Refresh cache to ensure clean state EditorConfigurationCache.Instance.Refresh(); } [TearDown] public void TearDown() { // Restore original values EditorPrefs.SetBool(EditorPrefKeys.UseHttpTransport, _originalUseHttpTransport); EditorPrefs.SetBool(EditorPrefKeys.DebugLogs, _originalDebugLogs); EditorPrefs.SetString(EditorPrefKeys.UvxPathOverride, _originalUvxPath); // Refresh cache EditorConfigurationCache.Instance.Refresh(); } #region Singleton Tests [Test] public void Instance_ReturnsSameInstance() { // Act var instance1 = EditorConfigurationCache.Instance; var instance2 = EditorConfigurationCache.Instance; // Assert Assert.AreSame(instance1, instance2, "Should return the same singleton instance"); } [Test] public void Instance_IsNotNull() { // Assert Assert.IsNotNull(EditorConfigurationCache.Instance); } #endregion #region Read Tests [Test] public void UseHttpTransport_ReturnsEditorPrefsValue() { // Arrange EditorPrefs.SetBool(EditorPrefKeys.UseHttpTransport, true); EditorConfigurationCache.Instance.Refresh(); // Assert Assert.IsTrue(EditorConfigurationCache.Instance.UseHttpTransport); // Arrange - change value EditorPrefs.SetBool(EditorPrefKeys.UseHttpTransport, false); EditorConfigurationCache.Instance.Refresh(); // Assert Assert.IsFalse(EditorConfigurationCache.Instance.UseHttpTransport); } [Test] public void DebugLogs_ReturnsEditorPrefsValue() { // Arrange EditorPrefs.SetBool(EditorPrefKeys.DebugLogs, true); EditorConfigurationCache.Instance.Refresh(); // Assert Assert.IsTrue(EditorConfigurationCache.Instance.DebugLogs); } [Test] public void UvxPathOverride_ReturnsEditorPrefsValue() { // Arrange string testPath = "/custom/path/to/uvx"; EditorPrefs.SetString(EditorPrefKeys.UvxPathOverride, testPath); EditorConfigurationCache.Instance.Refresh(); // Assert Assert.AreEqual(testPath, EditorConfigurationCache.Instance.UvxPathOverride); } #endregion #region Write Tests [Test] public void SetUseHttpTransport_UpdatesCacheAndEditorPrefs() { // Arrange bool initialValue = EditorConfigurationCache.Instance.UseHttpTransport; bool newValue = !initialValue; // Act EditorConfigurationCache.Instance.SetUseHttpTransport(newValue); // Assert - cache is updated Assert.AreEqual(newValue, EditorConfigurationCache.Instance.UseHttpTransport); // Assert - EditorPrefs is updated Assert.AreEqual(newValue, EditorPrefs.GetBool(EditorPrefKeys.UseHttpTransport, !newValue)); } [Test] public void SetDebugLogs_UpdatesCacheAndEditorPrefs() { // Act EditorConfigurationCache.Instance.SetDebugLogs(true); // Assert Assert.IsTrue(EditorConfigurationCache.Instance.DebugLogs); Assert.IsTrue(EditorPrefs.GetBool(EditorPrefKeys.DebugLogs, false)); } [Test] public void SetUvxPathOverride_UpdatesCacheAndEditorPrefs() { // Arrange string testPath = "/test/uvx/path"; // Act EditorConfigurationCache.Instance.SetUvxPathOverride(testPath); // Assert Assert.AreEqual(testPath, EditorConfigurationCache.Instance.UvxPathOverride); Assert.AreEqual(testPath, EditorPrefs.GetString(EditorPrefKeys.UvxPathOverride, string.Empty)); } [Test] public void SetUvxPathOverride_NullBecomesEmptyString() { // Act EditorConfigurationCache.Instance.SetUvxPathOverride(null); // Assert Assert.AreEqual(string.Empty, EditorConfigurationCache.Instance.UvxPathOverride); } #endregion #region Change Notification Tests [Test] public void SetUseHttpTransport_FiresOnConfigurationChanged() { // Arrange string changedKey = null; EditorConfigurationCache.Instance.OnConfigurationChanged += (key) => changedKey = key; bool initialValue = EditorConfigurationCache.Instance.UseHttpTransport; // Act EditorConfigurationCache.Instance.SetUseHttpTransport(!initialValue); // Assert Assert.AreEqual(nameof(EditorConfigurationCache.UseHttpTransport), changedKey); // Cleanup EditorConfigurationCache.Instance.OnConfigurationChanged -= (key) => changedKey = key; } [Test] public void SetSameValue_DoesNotFireOnConfigurationChanged() { // Arrange int eventCount = 0; EditorConfigurationCache.Instance.OnConfigurationChanged += (key) => eventCount++; bool currentValue = EditorConfigurationCache.Instance.UseHttpTransport; // Act - set same value EditorConfigurationCache.Instance.SetUseHttpTransport(currentValue); // Assert - no event fired Assert.AreEqual(0, eventCount, "Should not fire event when value doesn't change"); // Cleanup EditorConfigurationCache.Instance.OnConfigurationChanged -= (key) => eventCount++; } #endregion #region InvalidateKey Tests [Test] public void InvalidateKey_RefreshesSingleValue() { // Arrange EditorConfigurationCache.Instance.SetDebugLogs(false); Assert.IsFalse(EditorConfigurationCache.Instance.DebugLogs); // Directly modify EditorPrefs (simulating external change) EditorPrefs.SetBool(EditorPrefKeys.DebugLogs, true); // Act EditorConfigurationCache.Instance.InvalidateKey(nameof(EditorConfigurationCache.DebugLogs)); // Assert Assert.IsTrue(EditorConfigurationCache.Instance.DebugLogs); } [Test] public void InvalidateKey_FiresOnConfigurationChanged() { // Arrange string changedKey = null; EditorConfigurationCache.Instance.OnConfigurationChanged += (key) => changedKey = key; // Act EditorConfigurationCache.Instance.InvalidateKey(nameof(EditorConfigurationCache.DebugLogs)); // Assert Assert.AreEqual(nameof(EditorConfigurationCache.DebugLogs), changedKey); // Cleanup EditorConfigurationCache.Instance.OnConfigurationChanged -= (key) => changedKey = key; } #endregion #region Refresh Tests [Test] public void Refresh_UpdatesAllCachedValues() { // Arrange - directly set EditorPrefs EditorPrefs.SetBool(EditorPrefKeys.UseHttpTransport, false); EditorPrefs.SetBool(EditorPrefKeys.DebugLogs, true); EditorPrefs.SetString(EditorPrefKeys.UvxPathOverride, "/refreshed/path"); // Act EditorConfigurationCache.Instance.Refresh(); // Assert Assert.IsFalse(EditorConfigurationCache.Instance.UseHttpTransport); Assert.IsTrue(EditorConfigurationCache.Instance.DebugLogs); Assert.AreEqual("/refreshed/path", EditorConfigurationCache.Instance.UvxPathOverride); } #endregion } }