using System; using Newtonsoft.Json.Linq; using NUnit.Framework; using UnityEditor; using UnityEngine; using MCPForUnity.Editor.Tools; namespace MCPForUnityTests.Editor.Tools { public class ManageMaterialPropertiesTests { private const string TempRoot = "Assets/Temp/ManageMaterialPropertiesTests"; private string _matPath; [SetUp] public void SetUp() { if (!AssetDatabase.IsValidFolder("Assets/Temp")) { AssetDatabase.CreateFolder("Assets", "Temp"); } if (!AssetDatabase.IsValidFolder(TempRoot)) { AssetDatabase.CreateFolder("Assets/Temp", "ManageMaterialPropertiesTests"); } _matPath = $"{TempRoot}/PropTest.mat"; } [TearDown] public void TearDown() { if (AssetDatabase.IsValidFolder(TempRoot)) { AssetDatabase.DeleteAsset(TempRoot); } } private static JObject ToJObject(object result) { return result as JObject ?? JObject.FromObject(result); } [Test] public void CreateMaterial_WithValidJsonStringArray_SetsProperty() { string jsonProps = "{\"_Color\": [1.0, 0.0, 0.0, 1.0]}"; var paramsObj = new JObject { ["action"] = "create", ["materialPath"] = _matPath, ["shader"] = "Standard", ["properties"] = jsonProps }; var result = ToJObject(ManageMaterial.HandleCommand(paramsObj)); Assert.IsTrue(result.Value("success"), result.ToString()); var mat = AssetDatabase.LoadAssetAtPath(_matPath); Assert.AreEqual(Color.red, mat.color); } [Test] public void CreateMaterial_WithJObjectArray_SetsProperty() { var props = new JObject(); props["_Color"] = new JArray(0.0f, 1.0f, 0.0f, 1.0f); var paramsObj = new JObject { ["action"] = "create", ["materialPath"] = _matPath, ["shader"] = "Standard", ["properties"] = props }; var result = ToJObject(ManageMaterial.HandleCommand(paramsObj)); Assert.IsTrue(result.Value("success"), result.ToString()); var mat = AssetDatabase.LoadAssetAtPath(_matPath); Assert.AreEqual(Color.green, mat.color); } [Test] public void CreateMaterial_WithEmptyProperties_Succeeds() { var paramsObj = new JObject { ["action"] = "create", ["materialPath"] = _matPath, ["shader"] = "Standard", ["properties"] = new JObject() }; var result = ToJObject(ManageMaterial.HandleCommand(paramsObj)); Assert.IsTrue(result.Value("success"), result.ToString()); } [Test] public void CreateMaterial_WithInvalidJsonSyntax_ReturnsDetailedError() { // Missing closing brace string invalidJson = "{\"_Color\": [1,0,0,1]"; var paramsObj = new JObject { ["action"] = "create", ["materialPath"] = _matPath, ["shader"] = "Standard", ["properties"] = invalidJson }; var result = ToJObject(ManageMaterial.HandleCommand(paramsObj)); Assert.IsFalse(result.Value("success")); string msg = result.Value("error"); // Verify we get exception details Assert.IsTrue(msg.Contains("Invalid JSON"), "Should mention Invalid JSON"); // Verify the message contains more than just the prefix (has exception details) Assert.IsTrue(msg.Length > "Invalid JSON".Length, $"Message should contain exception details. Got: {msg}"); } [Test] public void CreateMaterial_WithNullProperty_HandlesGracefully() { var props = new JObject(); props["_Color"] = null; var paramsObj = new JObject { ["action"] = "create", ["materialPath"] = _matPath, ["shader"] = "Standard", ["properties"] = props }; // Should probably succeed but warn or ignore, or fail gracefully var result = ToJObject(ManageMaterial.HandleCommand(paramsObj)); // We accept either success (ignored) or specific error, but not crash // The new response format uses a bool "success" field var success = result.Value("success"); Assert.IsNotNull(success, "Response should have success field"); } } }