A game about forced loneliness, made by TACStudios
at master 227 lines 9.5 kB view raw
1using System; 2using System.Collections; 3using System.Collections.Generic; 4using NUnit.Framework; 5 6namespace UnityEngine.Rendering.Tests 7{ 8 [TestFixture("Local")] 9 [TestFixture("Global")] 10 class VolumeManagerTests 11 { 12 readonly LayerMask k_defaultLayer = 1; 13 VolumeProfile m_VolumeProfile; 14 readonly List<GameObject> m_Objects = new(); 15 readonly bool m_IsGlobal; 16 17 VolumeManager volumeManager { get; set; } 18 VolumeStack stack => volumeManager.stack; 19 GameObject camera { get; set; } 20 21 public VolumeManagerTests(string volumeType) 22 { 23 m_IsGlobal = volumeType switch 24 { 25 "Global" => true, 26 "Local" => false, 27 _ => throw new ArgumentException(volumeType) 28 }; 29 } 30 31 [SetUp] 32 public void Setup() 33 { 34 m_VolumeProfile = ScriptableObject.CreateInstance<VolumeProfile>(); 35 36 var volumeComponent = m_VolumeProfile.Add<TestVolume>(); 37 volumeComponent.param.Override(TestVolume.k_OverrideValue); 38 39 volumeManager = new VolumeManager(); 40 volumeManager.Initialize(); 41 camera = new GameObject("Camera", typeof(Camera)); 42 m_Objects.Add(camera); 43 } 44 45 [TearDown] 46 public void TearDown() 47 { 48 CoreUtils.Destroy(m_VolumeProfile); 49 50 foreach (var go in m_Objects) 51 CoreUtils.Destroy(go); 52 53 volumeManager.Deinitialize(); 54 } 55 56 static IEnumerable TestCaseSources() 57 { 58 yield return new TestCaseData( 59 new Action<VolumeManager, Volume>((vm, v) => vm.Unregister(v)), 60 new Action<VolumeManager, Volume>((vm, v) => vm.Register(v))) 61 .SetName("Parameter evaluation is correct when volume is unregistered and registered"); 62 63 yield return new TestCaseData( 64 new Action<VolumeManager, Volume>((vm, v) => v.enabled = false), 65 new Action<VolumeManager, Volume>((vm, v) => v.enabled = true)) 66 .SetName("Parameter evaluation is correct when volume is disabled and enabled"); 67 68 yield return new TestCaseData( 69 new Action<VolumeManager, Volume>((vm, v) => v.profileRef.components[0].SetAllOverridesTo(false)), 70 new Action<VolumeManager, Volume>((vm, v) => v.profileRef.components[0].SetAllOverridesTo(true))) 71 .SetName("Parameter evaluation is correct when overrides are disabled and enabled"); 72 } 73 74 Volume CreateVolume(string name) 75 { 76 var volumeGameObject = new GameObject(name, typeof(Volume)); 77 if (!m_IsGlobal) 78 volumeGameObject.AddComponent<BoxCollider>(); 79 var volume = volumeGameObject.GetComponent<Volume>(); 80 volume.isGlobal = m_IsGlobal; 81 82 m_Objects.Add(volume.gameObject); 83 84 return volume; 85 } 86 87 [TestCaseSource(nameof(TestCaseSources))] 88 public void ParameterEvaluationTest(Action<VolumeManager, Volume> disableAction, Action<VolumeManager, Volume> enableAction) 89 { 90 var volume = CreateVolume("Volume"); 91 volume.sharedProfile = m_VolumeProfile; 92 volumeManager.Register(volume); 93 94 volumeManager.Update(camera.transform, k_defaultLayer); 95 Assert.AreEqual(true, stack.requiresReset); // Local volume present - stack reset needed 96 Assert.AreEqual(TestVolume.k_OverrideValue, stack.GetComponent<TestVolume>().param.value); 97 98 disableAction.Invoke(volumeManager, volume); 99 volumeManager.Update(camera.transform, k_defaultLayer); 100 101 Assert.AreEqual(TestVolume.k_DefaultValue, stack.GetComponent<TestVolume>().param.value); // Value still resets to default 102 103 enableAction.Invoke(volumeManager, volume); 104 volumeManager.Update(camera.transform, k_defaultLayer); 105 106 Assert.AreEqual(true, stack.requiresReset); // Local volume is back - stack reset needed 107 Assert.AreEqual(TestVolume.k_OverrideValue, stack.GetComponent<TestVolume>().param.value); // Value overridden again 108 } 109 110 [Test] 111 public void ParameterOverrideTest() 112 { 113 var volume = CreateVolume("Volume"); 114 volume.priority = 0f; 115 volume.sharedProfile = m_VolumeProfile; 116 volumeManager.Register(volume); 117 118 volumeManager.Update(camera.transform, k_defaultLayer); 119 Assert.AreEqual(TestVolume.k_OverrideValue, stack.GetComponent<TestVolume>().param.value); 120 121 const float PriorityOverrideValue = 999.0f; 122 var priorityVolumeProfile = ScriptableObject.CreateInstance<VolumeProfile>(); 123 var priorityVolumeComponent = priorityVolumeProfile.Add<TestVolume>(); 124 priorityVolumeComponent.param.Override(PriorityOverrideValue); 125 126 var volume1 = CreateVolume("Volume Priority 1"); 127 volume1.priority = 1f; 128 volume1.sharedProfile = priorityVolumeProfile; 129 volumeManager.Register(volume1); 130 131 volumeManager.Update(camera.transform, k_defaultLayer); 132 Assert.AreEqual(PriorityOverrideValue, stack.GetComponent<TestVolume>().param.value); 133 134 volume.priority = 2f; // Raise priority of the original volume to be higher 135 volumeManager.SetLayerDirty(volume.gameObject.layer); // Mark dirty to apply new priority (normally done by Volume.Update()) 136 137 volumeManager.Update(camera.transform, k_defaultLayer); 138 Assert.AreEqual(TestVolume.k_OverrideValue, stack.GetComponent<TestVolume>().param.value); 139 140 CoreUtils.Destroy(priorityVolumeProfile); 141 } 142 } 143 144 class VolumeManagerDefaultProfileTests 145 { 146 VolumeProfile m_VolumeProfile1; 147 VolumeProfile m_VolumeProfile2; 148 VolumeProfile m_VolumeProfile3; 149 VolumeManager volumeManager { get; set; } 150 VolumeStack stack => volumeManager.stack; 151 TestVolume GetDefaultState() => volumeManager.GetVolumeComponentDefaultState(typeof(TestVolume)) as TestVolume; 152 153 [SetUp] 154 public void Setup() 155 { 156 m_VolumeProfile1 = ScriptableObject.CreateInstance<VolumeProfile>(); 157 m_VolumeProfile1.Add<TestVolume>().param.Override(TestVolume.k_OverrideValue); 158 159 m_VolumeProfile2 = ScriptableObject.CreateInstance<VolumeProfile>(); 160 m_VolumeProfile2.Add<TestVolume>().param.Override(TestVolume.k_OverrideValue2); 161 162 m_VolumeProfile3 = ScriptableObject.CreateInstance<VolumeProfile>(); 163 m_VolumeProfile3.Add<TestVolume>().param.Override(TestVolume.k_OverrideValue3); 164 } 165 166 [TearDown] 167 public void TearDown() 168 { 169 CoreUtils.Destroy(m_VolumeProfile1); 170 CoreUtils.Destroy(m_VolumeProfile2); 171 CoreUtils.Destroy(m_VolumeProfile3); 172 volumeManager.Deinitialize(); 173 } 174 175 [Test] 176 public void ParameterIsCorrectByDefault() 177 { 178 volumeManager = new VolumeManager(); 179 volumeManager.Initialize(); 180 181 LayerMask defaultLayer = 1; 182 var camera = new GameObject("Camera", typeof(Camera)); 183 Assert.AreEqual(true, stack.requiresReset); // Initially, reset is required 184 Assert.AreEqual(TestVolume.k_DefaultValue, stack.GetComponent<TestVolume>().param.value); // Default value retrievable without calling Update() 185 volumeManager.Update(camera.transform, defaultLayer); 186 Assert.AreEqual(false, stack.requiresReset); // No volumes - no stack reset needed 187 Assert.AreEqual(TestVolume.k_DefaultValue, stack.GetComponent<TestVolume>().param.value); 188 } 189 190 [Test] 191 public void DefaultProfilesAreAppliedToDefaultState() 192 { 193 volumeManager = new VolumeManager(); 194 volumeManager.Initialize(m_VolumeProfile1, null); 195 196 Assert.AreEqual(TestVolume.k_OverrideValue, GetDefaultState().param.value); 197 198 volumeManager.SetQualityDefaultProfile(m_VolumeProfile2); 199 Assert.AreEqual(TestVolume.k_OverrideValue2, GetDefaultState().param.value); 200 201 volumeManager.SetCustomDefaultProfiles(new List<VolumeProfile> { m_VolumeProfile3 }); 202 Assert.AreEqual(TestVolume.k_OverrideValue3, GetDefaultState().param.value); 203 204 volumeManager.SetGlobalDefaultProfile(null); 205 Assert.AreEqual(TestVolume.k_OverrideValue3, GetDefaultState().param.value); 206 207 volumeManager.SetQualityDefaultProfile(null); 208 Assert.AreEqual(TestVolume.k_OverrideValue3, GetDefaultState().param.value); 209 210 volumeManager.SetCustomDefaultProfiles(null); 211 Assert.AreEqual(TestVolume.k_DefaultValue, GetDefaultState().param.value); 212 } 213 214 [Test] 215 public void CustomDefaultProfilesAreAppliedInOrder() 216 { 217 volumeManager = new VolumeManager(); 218 volumeManager.Initialize(); 219 220 volumeManager.SetCustomDefaultProfiles(new List<VolumeProfile> { m_VolumeProfile1, m_VolumeProfile2 }); 221 Assert.AreEqual(TestVolume.k_OverrideValue2, GetDefaultState().param.value); 222 223 volumeManager.SetCustomDefaultProfiles(new List<VolumeProfile> { m_VolumeProfile2, m_VolumeProfile1 }); 224 Assert.AreEqual(TestVolume.k_OverrideValue, GetDefaultState().param.value); 225 } 226 } 227}