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.
191 lines
6.8 KiB
191 lines
6.8 KiB
using System.Linq; |
|
using NUnit.Framework; |
|
using UnityEngine; |
|
using UnityEditor.Graphing; |
|
|
|
namespace UnityEditor.ShaderGraph.UnitTests |
|
{ |
|
[TestFixture] |
|
class TargetTests |
|
{ |
|
[OneTimeSetUp] |
|
public void RunBeforeAnyTests() |
|
{ |
|
Debug.unityLogger.logHandler = new ConsoleLogHandler(); |
|
} |
|
|
|
[Test] |
|
public void CanCreateBlankGraph() |
|
{ |
|
GraphData graph = new GraphData(); |
|
graph.AddContexts(); |
|
|
|
Assert.IsNotNull(graph.activeTargets); |
|
Assert.AreEqual(0, graph.activeTargets.Count()); |
|
} |
|
|
|
public static bool s_ForceVFXFakeTargetVisible = false; |
|
#if !VFX_GRAPH_10_0_0_OR_NEWER |
|
//A barebone VFXTarget for testing coverage. |
|
sealed class VFXTarget : UnityEditor.ShaderGraph.Target |
|
{ |
|
public VFXTarget() |
|
{ |
|
displayName = "Fake VFX Target"; //Should not be displayed outside the test runner. |
|
isHidden = !s_ForceVFXFakeTargetVisible; |
|
} |
|
|
|
public override void GetActiveBlocks(ref UnityEditor.ShaderGraph.TargetActiveBlockContext context) |
|
{ |
|
context.AddBlock(ShaderGraph.BlockFields.SurfaceDescription.BaseColor); |
|
context.AddBlock(ShaderGraph.BlockFields.SurfaceDescription.Alpha); |
|
} |
|
|
|
public override void GetFields(ref TargetFieldContext context) |
|
{ |
|
} |
|
|
|
public override void Setup(ref TargetSetupContext context) |
|
{ |
|
} |
|
|
|
public override bool IsActive() => false; |
|
public override bool WorksWithSRP(UnityEngine.Rendering.RenderPipelineAsset scriptableRenderPipeline) |
|
{ |
|
return false; |
|
} |
|
|
|
public override void GetPropertiesGUI(ref TargetPropertyGUIContext context, System.Action onChange, System.Action<System.String> registerUndo) |
|
{ |
|
} |
|
} |
|
#endif |
|
|
|
[Test] |
|
public void CanInitializeOutputTargets() |
|
{ |
|
s_ForceVFXFakeTargetVisible = true; |
|
GraphData graph = new GraphData(); |
|
graph.AddContexts(); |
|
graph.InitializeOutputs(new[] { new VFXTarget() }, null); |
|
|
|
Assert.IsNotNull(graph.activeTargets); |
|
Assert.AreEqual(1, graph.activeTargets.Count()); |
|
Assert.AreEqual(typeof(VFXTarget), graph.activeTargets.ElementAt(0).GetType()); |
|
s_ForceVFXFakeTargetVisible = false; |
|
} |
|
|
|
[Test] |
|
public void CanAddTarget() |
|
{ |
|
s_ForceVFXFakeTargetVisible = true; |
|
GraphData graph = new GraphData(); |
|
graph.AddContexts(); |
|
|
|
var vfxTarget = graph.allPotentialTargets.FirstOrDefault(x => x is VFXTarget); |
|
graph.SetTargetActive(vfxTarget); |
|
|
|
Assert.IsNotNull(graph.activeTargets); |
|
Assert.AreEqual(1, graph.activeTargets.Count()); |
|
Assert.AreEqual(vfxTarget, graph.activeTargets.ElementAt(0)); |
|
s_ForceVFXFakeTargetVisible = false; |
|
} |
|
|
|
[Test] |
|
public void ActiveTargetsArePotentialTargets() |
|
{ |
|
s_ForceVFXFakeTargetVisible = true; |
|
GraphData graph = new GraphData(); |
|
graph.AddContexts(); |
|
|
|
var vfxTarget = new VFXTarget(); |
|
graph.SetTargetActive(vfxTarget); |
|
Assert.IsTrue(graph.allPotentialTargets.Contains(vfxTarget)); |
|
|
|
s_ForceVFXFakeTargetVisible = false; |
|
} |
|
|
|
[Test] |
|
public void GetTargetIndexWorks() |
|
{ |
|
s_ForceVFXFakeTargetVisible = true; |
|
|
|
GraphData graph = new GraphData(); |
|
graph.AddContexts(); |
|
|
|
int targetIndex = graph.GetTargetIndexByKnownType(typeof(VFXTarget)); |
|
Assert.IsTrue(targetIndex >= 0); |
|
|
|
var vfxTarget = new VFXTarget(); |
|
graph.SetTargetActive(vfxTarget); |
|
|
|
var targetIndex2 = graph.GetTargetIndex(vfxTarget); |
|
Assert.AreEqual(targetIndex, targetIndex2); |
|
|
|
var nonActiveVFXTarget = new VFXTarget(); |
|
Assert.AreEqual(-1, graph.GetTargetIndex(nonActiveVFXTarget)); |
|
|
|
s_ForceVFXFakeTargetVisible = false; |
|
} |
|
|
|
[Test] |
|
public void CanRemoveTarget() |
|
{ |
|
s_ForceVFXFakeTargetVisible = true; |
|
GraphData graph = new GraphData(); |
|
graph.AddContexts(); |
|
|
|
var vfxTarget = new VFXTarget(); |
|
graph.InitializeOutputs(new[] { vfxTarget }, null); |
|
|
|
graph.SetTargetInactive(vfxTarget); |
|
|
|
Assert.IsNotNull(graph.activeTargets); |
|
Assert.AreEqual(0, graph.activeTargets.Count()); |
|
s_ForceVFXFakeTargetVisible = false; |
|
} |
|
|
|
[Test] |
|
public void CanSetBlockActive() |
|
{ |
|
s_ForceVFXFakeTargetVisible = true; |
|
GraphData graph = new GraphData(); |
|
graph.AddContexts(); |
|
graph.InitializeOutputs(new[] { new VFXTarget() }, new BlockFieldDescriptor[] { BlockFields.SurfaceDescription.BaseColor, BlockFields.SurfaceDescription.NormalTS }); |
|
|
|
// Block active state should match VFX Target's default GetActiveBlocks |
|
var blocks = graph.GetNodes<BlockNode>().ToList(); |
|
Assert.AreEqual(2, blocks.Count); |
|
Assert.AreEqual(BlockFields.SurfaceDescription.BaseColor, blocks[0].descriptor); |
|
Assert.AreEqual(true, blocks[0].isActive); |
|
Assert.AreEqual(BlockFields.SurfaceDescription.NormalTS, blocks[1].descriptor); |
|
Assert.AreEqual(false, blocks[1].isActive); |
|
s_ForceVFXFakeTargetVisible = false; |
|
} |
|
|
|
[Test] |
|
public void CanUpdateBlockActiveState() |
|
{ |
|
s_ForceVFXFakeTargetVisible = true; |
|
GraphData graph = new GraphData(); |
|
graph.AddContexts(); |
|
graph.InitializeOutputs(new[] { new VFXTarget() }, new BlockFieldDescriptor[] { BlockFields.SurfaceDescription.BaseColor, BlockFields.SurfaceDescription.NormalTS }); |
|
|
|
// Remove VFX target |
|
var vfxTarget = graph.allPotentialTargets.FirstOrDefault(x => x is VFXTarget); |
|
graph.SetTargetInactive(vfxTarget); |
|
|
|
var activeBlocks = graph.GetActiveBlocksForAllActiveTargets(); |
|
graph.UpdateActiveBlocks(activeBlocks); |
|
|
|
// All blocks should be inactive as there are no active targets |
|
var blocks = graph.GetNodes<BlockNode>().ToList(); |
|
Assert.AreEqual(2, blocks.Count); |
|
Assert.AreEqual(BlockFields.SurfaceDescription.BaseColor, blocks[0].descriptor); |
|
Assert.AreEqual(false, blocks[0].isActive); |
|
Assert.AreEqual(BlockFields.SurfaceDescription.NormalTS, blocks[1].descriptor); |
|
Assert.AreEqual(false, blocks[1].isActive); |
|
s_ForceVFXFakeTargetVisible = false; |
|
} |
|
} |
|
}
|
|
|