You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
254 lines
9.3 KiB
254 lines
9.3 KiB
using NUnit.Framework;
|
|
using System;
|
|
using System.Collections.Generic;
|
|
using System.IO;
|
|
using System.Linq;
|
|
using System.Reflection;
|
|
using UnityEngine.Rendering;
|
|
|
|
namespace RenderPipelineGraphicsSettings
|
|
{
|
|
[TestFixture]
|
|
class StripperTests
|
|
{
|
|
#region Strippers
|
|
|
|
static HashSet<Type> s_EnabledStrippers = new();
|
|
|
|
private struct ActiveStrippersScope : IDisposable
|
|
{
|
|
private readonly List<FieldInfo> m_Fields;
|
|
|
|
public ActiveStrippersScope(List<Type> activeStrippers)
|
|
{
|
|
m_Fields = new List<FieldInfo>();
|
|
foreach (var stripper in activeStrippers)
|
|
{
|
|
var field = stripper.GetField("k_Invoked", BindingFlags.Static | BindingFlags.Public);
|
|
if (field != null)
|
|
{
|
|
field.SetValue(null, false);
|
|
m_Fields.Add(field);
|
|
s_EnabledStrippers.Add(stripper);
|
|
}
|
|
}
|
|
}
|
|
|
|
public void Dispose()
|
|
{
|
|
foreach (var field in m_Fields)
|
|
{
|
|
Assert.IsTrue((bool)field.GetValue(null), "CanRemoveSettings was not invoked");
|
|
}
|
|
|
|
m_Fields.Clear();
|
|
s_EnabledStrippers.Clear();
|
|
}
|
|
}
|
|
|
|
class RemoveAStripper : IRenderPipelineGraphicsSettingsStripper<A>
|
|
{
|
|
public static bool k_Invoked = false;
|
|
|
|
public bool active => s_EnabledStrippers.Contains(typeof(RemoveAStripper));
|
|
|
|
public bool CanRemoveSettings(A setting)
|
|
{
|
|
k_Invoked = true;
|
|
return true;
|
|
}
|
|
}
|
|
|
|
class KeepAStripper : IRenderPipelineGraphicsSettingsStripper<A>
|
|
{
|
|
public static bool k_Invoked = false;
|
|
|
|
public bool active => s_EnabledStrippers.Contains(typeof(KeepAStripper));
|
|
|
|
public bool CanRemoveSettings(A setting)
|
|
{
|
|
k_Invoked = true;
|
|
return false;
|
|
}
|
|
}
|
|
|
|
class PrivateCtorAStripper : IRenderPipelineGraphicsSettingsStripper<A>
|
|
{
|
|
public bool active => s_EnabledStrippers.Contains(typeof(PrivateCtorAStripper));
|
|
|
|
private PrivateCtorAStripper()
|
|
{
|
|
|
|
}
|
|
|
|
public bool CanRemoveSettings(A setting)
|
|
{
|
|
return true;
|
|
}
|
|
}
|
|
|
|
class WrongStripper : IStripper
|
|
{
|
|
public bool active => s_EnabledStrippers.Contains(typeof(PrivateCtorAStripper));
|
|
}
|
|
|
|
#endregion
|
|
|
|
#region SettingsDefinitions
|
|
|
|
class StripperTestsAsset : RenderPipelineAsset
|
|
{
|
|
protected override RenderPipeline CreatePipeline()
|
|
{
|
|
throw new NotImplementedException();
|
|
}
|
|
}
|
|
|
|
[Serializable]
|
|
[SupportedOnRenderPipeline(typeof(StripperTestsAsset))]
|
|
public abstract class Base : IRenderPipelineGraphicsSettings
|
|
{
|
|
int IRenderPipelineGraphicsSettings.version => 0;
|
|
public string name;
|
|
public Base() => name = GetType().Name;
|
|
public override string ToString() => name;
|
|
|
|
public virtual bool isAvailableInPlayerBuild => false;
|
|
}
|
|
|
|
[Serializable]
|
|
class A : Base
|
|
{
|
|
public override bool isAvailableInPlayerBuild => true;
|
|
}
|
|
|
|
[Serializable]
|
|
class B : Base
|
|
{
|
|
public override bool isAvailableInPlayerBuild => true;
|
|
}
|
|
|
|
[Serializable]
|
|
class C : Base
|
|
{
|
|
}
|
|
|
|
#endregion
|
|
|
|
private static A k_A = new A();
|
|
private static B k_B = new B();
|
|
private static C k_C = new C();
|
|
|
|
static string k_ResultsDirectory = "Packages/com.unity.render-pipelines.core/Tests/Editor/RenderPipeline/SettingsStrippingResults";
|
|
|
|
[SetUp]
|
|
public void Setup()
|
|
{
|
|
if (k_UpdateStrippingResult && !Directory.Exists(k_ResultsDirectory))
|
|
Directory.CreateDirectory(k_ResultsDirectory);
|
|
}
|
|
|
|
static TestCaseData[] s_TestCaseDatas =
|
|
{
|
|
new TestCaseData(
|
|
new List<IRenderPipelineGraphicsSettings>(),
|
|
new List<Type>())
|
|
.SetName("Given no settings and no strippers, nothing is performed")
|
|
.Returns(new List<IRenderPipelineGraphicsSettings>()),
|
|
|
|
new TestCaseData(
|
|
new List<IRenderPipelineGraphicsSettings>() { k_A, k_B, k_C },
|
|
new List<Type>())
|
|
.SetName(
|
|
"Given some settings without any stripper active, only settings that must be available on Player build are kept")
|
|
.Returns(new List<IRenderPipelineGraphicsSettings>() { k_A, k_B }),
|
|
|
|
new TestCaseData(
|
|
new List<IRenderPipelineGraphicsSettings>() { k_A, k_B, k_C },
|
|
new List<Type>() { typeof(WrongStripper) })
|
|
.SetName("Given an wrong stripper, the stripper is not taken into account.")
|
|
.Returns(new List<IRenderPipelineGraphicsSettings>() { k_A, k_B }),
|
|
|
|
new TestCaseData(
|
|
new List<IRenderPipelineGraphicsSettings>() { k_A, k_B, k_C },
|
|
new List<Type>() { typeof(PrivateCtorAStripper) })
|
|
.SetName("Given an user stripper with private constructor, the stripper is not taken into account.")
|
|
.Returns(new List<IRenderPipelineGraphicsSettings>() { k_A, k_B }),
|
|
|
|
new TestCaseData(
|
|
new List<IRenderPipelineGraphicsSettings>() { k_A, k_B, k_C },
|
|
new List<Type>() { typeof(RemoveAStripper) })
|
|
.SetName("Given an user stripper, the default behaviour of the setting is overriden")
|
|
.Returns(new List<IRenderPipelineGraphicsSettings>() { k_B }),
|
|
|
|
new TestCaseData(
|
|
new List<IRenderPipelineGraphicsSettings>() { k_A, k_B, k_C },
|
|
new List<Type>() { typeof(KeepAStripper), typeof(RemoveAStripper) })
|
|
.SetName("Given a settings keeper and a settings stripper, the setting is kept")
|
|
.Returns(new List<IRenderPipelineGraphicsSettings>() { k_A, k_B })
|
|
};
|
|
|
|
[Test, TestCaseSource(nameof(s_TestCaseDatas))]
|
|
public List<IRenderPipelineGraphicsSettings> DoStripping(List<IRenderPipelineGraphicsSettings> settings, List<Type> activeStrippers)
|
|
{
|
|
using (new ActiveStrippersScope(activeStrippers))
|
|
{
|
|
var runtimeSettings = new List<IRenderPipelineGraphicsSettings>();
|
|
RenderPipelineGraphicsSettingsStripper.PerformStripping(settings, runtimeSettings);
|
|
return runtimeSettings;
|
|
}
|
|
}
|
|
|
|
static bool k_UpdateStrippingResult = false;
|
|
|
|
private void CheckForceUpdate(string path, string loggedStrippedResult)
|
|
{
|
|
if (k_UpdateStrippingResult)
|
|
{
|
|
if (File.Exists(path))
|
|
File.Delete(path);
|
|
File.WriteAllText(path, loggedStrippedResult);
|
|
}
|
|
Assert.IsFalse(k_UpdateStrippingResult, "Note to Developer: You forgot to set back the variable `k_UpdateStrippingResult` to false");
|
|
}
|
|
|
|
private string GenerateFilePath(List<IRenderPipelineGraphicsSettings> settings, List<Type> activeStrippers)
|
|
{
|
|
string activeStrippersFilePath = activeStrippers.Count != 0
|
|
? string.Join('_', activeStrippers.Select(i => i.Name))
|
|
: "no_strippers_active";
|
|
|
|
string settingsFilePath = settings.Count != 0
|
|
? string.Join('_', settings.Select(i => i.GetType().Name))
|
|
: "no_settings";
|
|
|
|
return Path.GetFullPath(Path.Combine(k_ResultsDirectory, $"{activeStrippersFilePath}_{settingsFilePath}.json"));
|
|
}
|
|
|
|
[Test, TestCaseSource(nameof(s_TestCaseDatas))]
|
|
public List<IRenderPipelineGraphicsSettings> JSONOutput(List<IRenderPipelineGraphicsSettings> settings, List<Type> activeStrippers)
|
|
{
|
|
var runtimeSettings = DoStripping(settings, activeStrippers);
|
|
|
|
string path = GenerateFilePath(settings, activeStrippers);
|
|
var loggedStrippedResult = File.ReadAllText(RenderPipelineGraphicsSettingsStripper.Report.k_OutputPath);
|
|
|
|
CheckForceUpdate(path, loggedStrippedResult);
|
|
Assert.AreEqual(File.ReadAllText(path), loggedStrippedResult, "Note to Developer: You can set the variable `k_UpdateStrippingResult` to true, to override the output if you changed what is reported");
|
|
|
|
return runtimeSettings;
|
|
}
|
|
|
|
[Test]
|
|
public void NullArgumentsThrowsException()
|
|
{
|
|
var initializedList = new List<IRenderPipelineGraphicsSettings>();
|
|
var exception = Assert.Throws<ArgumentNullException>(() =>RenderPipelineGraphicsSettingsStripper.PerformStripping(null, initializedList));
|
|
Assert.AreEqual("settingsList", exception.ParamName);
|
|
|
|
exception = Assert.Throws<ArgumentNullException>(() => RenderPipelineGraphicsSettingsStripper.PerformStripping(initializedList, null));
|
|
Assert.AreEqual("runtimeSettingsList", exception.ParamName);
|
|
|
|
}
|
|
}
|
|
}
|