using System.Linq; using NUnit.Framework; using MCPForUnity.Editor.Constants; using MCPForUnity.Editor.Services; using UnityEditor; namespace MCPForUnity.Editor.Tests.EditMode.Services { [TestFixture] public class ToolDiscoveryServiceTests { private const string TestToolName = "test_tool_for_testing"; [SetUp] public void SetUp() { // Clean up any test preferences string testKey = EditorPrefKeys.ToolEnabledPrefix + TestToolName; if (EditorPrefs.HasKey(testKey)) { EditorPrefs.DeleteKey(testKey); } } [TearDown] public void TearDown() { // Clean up test preferences after each test string testKey = EditorPrefKeys.ToolEnabledPrefix + TestToolName; if (EditorPrefs.HasKey(testKey)) { EditorPrefs.DeleteKey(testKey); } } [Test] public void SetToolEnabled_WritesToEditorPrefs() { // Arrange var service = new ToolDiscoveryService(); // Act service.SetToolEnabled(TestToolName, false); // Assert string key = EditorPrefKeys.ToolEnabledPrefix + TestToolName; Assert.IsTrue(EditorPrefs.HasKey(key), "Preference key should exist after SetToolEnabled"); Assert.IsFalse(EditorPrefs.GetBool(key, true), "Preference should be set to false"); } [Test] public void IsToolEnabled_ReturnsFalse_WhenToolDoesNotExist() { // Arrange - Ensure no preference exists string key = EditorPrefKeys.ToolEnabledPrefix + TestToolName; if (EditorPrefs.HasKey(key)) { EditorPrefs.DeleteKey(key); } var service = new ToolDiscoveryService(); // Act - For a non-existent tool, IsToolEnabled should return false // (since metadata.AutoRegister defaults to false for non-existent tools) bool result = service.IsToolEnabled(TestToolName); // Assert - Non-existent tools return false (no metadata found) Assert.IsFalse(result, "Non-existent tool should return false"); } [Test] public void IsToolEnabled_ReturnsStoredValue_WhenPreferenceExists() { // Arrange string key = EditorPrefKeys.ToolEnabledPrefix + TestToolName; EditorPrefs.SetBool(key, false); // Store false value var service = new ToolDiscoveryService(); // Act bool result = service.IsToolEnabled(TestToolName); // Assert Assert.IsFalse(result, "Should return the stored preference value (false)"); } [Test] public void IsToolEnabled_ReturnsTrue_WhenPreferenceSetToTrue() { // Arrange string key = EditorPrefKeys.ToolEnabledPrefix + TestToolName; EditorPrefs.SetBool(key, true); var service = new ToolDiscoveryService(); // Act bool result = service.IsToolEnabled(TestToolName); // Assert Assert.IsTrue(result, "Should return the stored preference value (true)"); } [Test] public void ToolToggle_PersistsAcrossServiceInstances() { // Arrange var service1 = new ToolDiscoveryService(); service1.SetToolEnabled(TestToolName, false); // Act - Create a new service instance var service2 = new ToolDiscoveryService(); bool result = service2.IsToolEnabled(TestToolName); // Assert - The disabled state should persist Assert.IsFalse(result, "Tool state should persist across service instances"); } [Test] public void DiscoverAllTools_DoesNotOverrideStoredFalse_ForBuiltInAutoRegisterFalseTool() { // Arrange var service = new ToolDiscoveryService(); var builtInTool = service.DiscoverAllTools() .FirstOrDefault(tool => tool.IsBuiltIn && !tool.AutoRegister); Assert.IsNotNull(builtInTool, "Expected at least one built-in tool with AutoRegister=false."); string key = EditorPrefKeys.ToolEnabledPrefix + builtInTool.Name; bool hadOriginalKey = EditorPrefs.HasKey(key); bool originalValue = hadOriginalKey && EditorPrefs.GetBool(key, true); try { EditorPrefs.SetBool(key, false); service.InvalidateCache(); // Act service.DiscoverAllTools(); bool enabled = service.IsToolEnabled(builtInTool.Name); // Assert Assert.IsFalse(enabled, $"Built-in tool '{builtInTool.Name}' should remain disabled when preference is false."); } finally { if (hadOriginalKey) { EditorPrefs.SetBool(key, originalValue); } else { EditorPrefs.DeleteKey(key); } } } } }