A game about forced loneliness, made by TACStudios
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}