using System.Collections.Generic;
using NUnit.Framework;
using UnityEngine;
using MCPForUnity.Editor.Helpers;
namespace MCPForUnityTests.Editor.Tools
{
///
/// Tests specifically for the material and mesh instantiation warnings fix.
/// These tests verify that the GameObjectSerializer uses sharedMaterial/sharedMesh
/// in edit mode to prevent Unity's instantiation warnings.
///
public class MaterialMeshInstantiationTests
{
private GameObject testGameObject;
private Material testMaterial;
private Mesh testMesh;
[SetUp]
public void SetUp()
{
// Create a test GameObject for each test
testGameObject = new GameObject("MaterialMeshTestObject");
// Create test material and mesh
testMaterial = new Material(Shader.Find("Standard"));
testMaterial.name = "TestMaterial";
var temp = GameObject.CreatePrimitive(PrimitiveType.Cube);
testMesh = temp.GetComponent().sharedMesh;
UnityEngine.Object.DestroyImmediate(temp);
testMesh.name = "TestMesh";
}
[TearDown]
public void TearDown()
{
// Clean up test objects
if (testMaterial != null)
{
UnityEngine.Object.DestroyImmediate(testMaterial);
}
if (testGameObject != null)
{
UnityEngine.Object.DestroyImmediate(testGameObject);
}
}
[Test]
public void GetComponentData_UsesSharedMaterialInsteadOfMaterial()
{
var meshRenderer = testGameObject.AddComponent();
meshRenderer.sharedMaterial = testMaterial;
int beforeId = meshRenderer.sharedMaterial != null ? meshRenderer.sharedMaterial.GetInstanceID() : 0;
var result = GameObjectSerializer.GetComponentData(meshRenderer);
int afterId = meshRenderer.sharedMaterial != null ? meshRenderer.sharedMaterial.GetInstanceID() : 0;
Assert.AreEqual(beforeId, afterId, "sharedMaterial instanceID must not change during edit-mode serialization (no instantiation)");
Assert.IsNotNull(result, "GetComponentData should return a result");
var propsObj = (result as Dictionary) != null && ((Dictionary)result).TryGetValue("properties", out var p)
? p as Dictionary
: null;
if (propsObj != null)
{
long? foundInstanceId = null;
if (propsObj.TryGetValue("material", out var materialObj) && materialObj is Dictionary matDict && matDict.TryGetValue("instanceID", out var idObj1) && idObj1 is long id1)
{
foundInstanceId = id1;
}
else if (propsObj.TryGetValue("sharedMaterial", out var sharedMatObj) && sharedMatObj is Dictionary sharedMatDict && sharedMatDict.TryGetValue("instanceID", out var idObj2) && idObj2 is long id2)
{
foundInstanceId = id2;
}
else if (propsObj.TryGetValue("materials", out var materialsObj) && materialsObj is List