Files
Test/Library/PackageCache/com.unity.render-pipelines.universal@ffe395a3a1d1/Tests/Editor/ScriptableRendererDataEditorTests.cs
T
2026-11-01 23:39:55 +02:00

180 lines
6.0 KiB
C#

using NUnit.Framework;
using UnityEditor;
using UnityEditor.Rendering.Universal;
using UnityEngine;
using UnityEngine.Rendering;
using UnityEngine.Rendering.Universal;
class ScriptableRendererDataEditorTests
{
const string k_TempAssetPath = "Assets/ScriptableRendererDataEditorTests";
UniversalRendererData m_RendererData;
string m_AssetPath;
Editor m_Editor;
[SetUp]
public void Setup()
{
m_RendererData = ScriptableObject.CreateInstance<UniversalRendererData>();
CoreUtils.EnsureFolderTreeInAssetFilePath($"{k_TempAssetPath}/test.asset");
m_AssetPath = $"{k_TempAssetPath}/RendererData_{System.Guid.NewGuid():N}.asset";
AssetDatabase.CreateAsset(m_RendererData, m_AssetPath);
AssetDatabase.SaveAssets();
// Clear undo stack to ensure clean state
Undo.ClearAll();
}
[TearDown]
public void TearDown()
{
// Ensure editor is destroyed before clearing undo or deleting assets
if (m_Editor != null)
{
Object.DestroyImmediate(m_Editor);
m_Editor = null;
}
Undo.ClearAll();
if (m_RendererData != null)
{
AssetDatabase.DeleteAsset(m_AssetPath);
m_RendererData = null;
}
if (AssetDatabase.IsValidFolder(k_TempAssetPath))
AssetDatabase.DeleteAsset(k_TempAssetPath);
}
ScriptableRendererDataEditor CreateEditor()
{
m_Editor = Editor.CreateEditor(m_RendererData);
return (ScriptableRendererDataEditor)m_Editor;
}
[Test]
public void AddComponent_AddsRendererFeature()
{
var editor = CreateEditor();
Assert.AreEqual(0, m_RendererData.rendererFeatures.Count, "Renderer should start with no features");
editor.AddComponent(typeof(RenderObjects));
Assert.AreEqual(1, m_RendererData.rendererFeatures.Count, "Renderer should have one feature after adding");
Assert.IsInstanceOf<RenderObjects>(m_RendererData.rendererFeatures[0], "Added feature should be RenderObjects");
}
[Test]
public void AddComponent_SetsHideFlags()
{
var editor = CreateEditor();
editor.AddComponent(typeof(RenderObjects));
var feature = m_RendererData.rendererFeatures[0];
Assert.IsTrue((feature.hideFlags & HideFlags.HideInHierarchy) != 0,
"Added feature should have HideInHierarchy flag set");
}
[Test]
public void AddComponent_StoresFeatureInSameAsset()
{
var editor = CreateEditor();
// Verify target is persistent (required for sub-asset creation)
Assert.IsTrue(EditorUtility.IsPersistent(m_RendererData), "RendererData should be persistent");
editor.AddComponent(typeof(RenderObjects));
AssetDatabase.SaveAssets();
AssetDatabase.ImportAsset(m_AssetPath);
// Reload the asset to get fresh references
m_RendererData = AssetDatabase.LoadAssetAtPath<UniversalRendererData>(m_AssetPath);
var feature = m_RendererData.rendererFeatures[0];
// Feature should be stored at the same asset path as the renderer data
string featurePath = AssetDatabase.GetAssetPath(feature);
Assert.AreEqual(m_AssetPath, featurePath, "Feature asset path should match renderer data path");
// Feature should not be the main asset (it's embedded in the renderer data)
Assert.IsFalse(AssetDatabase.IsMainAsset(feature), "Feature should not be the main asset");
}
[Test]
public void AddComponent_CanBeUndone()
{
var editor = CreateEditor();
Assert.AreEqual(0, m_RendererData.rendererFeatures.Count);
editor.AddComponent(typeof(RenderObjects));
Assert.AreEqual(1, m_RendererData.rendererFeatures.Count);
Undo.PerformUndo();
// Reload asset to get fresh state
m_RendererData = AssetDatabase.LoadAssetAtPath<UniversalRendererData>(m_AssetPath);
Assert.AreEqual(0, m_RendererData.rendererFeatures.Count, "Feature count should be 0 after undo");
}
[Test]
public void AddComponent_CanBeRedone()
{
var editor = CreateEditor();
editor.AddComponent(typeof(RenderObjects));
Assert.AreEqual(1, m_RendererData.rendererFeatures.Count);
Undo.PerformUndo();
m_RendererData = AssetDatabase.LoadAssetAtPath<UniversalRendererData>(m_AssetPath);
Assert.AreEqual(0, m_RendererData.rendererFeatures.Count);
Undo.PerformRedo();
m_RendererData = AssetDatabase.LoadAssetAtPath<UniversalRendererData>(m_AssetPath);
Assert.AreEqual(1, m_RendererData.rendererFeatures.Count, "Feature count should be 1 after redo");
}
[Test]
public void AddMultipleComponents_MaintainsOrder()
{
var editor = CreateEditor();
editor.AddComponent(typeof(RenderObjects));
editor.AddComponent(typeof(FullScreenPassRendererFeature));
Assert.AreEqual(2, m_RendererData.rendererFeatures.Count);
Assert.IsInstanceOf<RenderObjects>(m_RendererData.rendererFeatures[0]);
Assert.IsInstanceOf<FullScreenPassRendererFeature>(m_RendererData.rendererFeatures[1]);
}
[Test]
public void NewFeatures_HaveHideInHierarchyFlag()
{
var editor = CreateEditor();
editor.AddComponent(typeof(RenderObjects));
editor.AddComponent(typeof(FullScreenPassRendererFeature));
foreach (var feature in m_RendererData.rendererFeatures)
{
Assert.IsTrue((feature.hideFlags & HideFlags.HideInHierarchy) != 0,
$"Feature {feature.name} should have HideInHierarchy flag");
}
}
[Test]
public void RendererFeatureMapCount_MatchesFeatureCount()
{
var editor = CreateEditor();
editor.AddComponent(typeof(RenderObjects));
editor.AddComponent(typeof(FullScreenPassRendererFeature));
Assert.AreEqual(m_RendererData.m_RendererFeatures.Count, m_RendererData.m_RendererFeatureMap.Count,
"Feature map count should match features count");
}
}