70 lines
		
	
	
		
			2.4 KiB
		
	
	
	
		
			C#
		
	
	
	
	
	
		
		
			
		
	
	
			70 lines
		
	
	
		
			2.4 KiB
		
	
	
	
		
			C#
		
	
	
	
	
	
|  | using System; | ||
|  | using System.Collections.Generic; | ||
|  | using System.Linq; | ||
|  | 
 | ||
|  | namespace UnityEditor.TestTools.TestRunner.Api | ||
|  | { | ||
|  |     internal class CallbacksHolder : ScriptableSingleton<CallbacksHolder>, ICallbacksHolder | ||
|  |     { | ||
|  |         private List<CallbackWithPriority> m_Callbacks = new List<CallbackWithPriority>(); | ||
|  |         public void Add(ICallbacks callback, int priority) | ||
|  |         { | ||
|  |             m_Callbacks.Add(new CallbackWithPriority(callback, priority)); | ||
|  |         } | ||
|  | 
 | ||
|  |         public void Remove(ICallbacks callback) | ||
|  |         { | ||
|  |             m_Callbacks.RemoveAll(callbackWithPriority => callbackWithPriority.Callback == callback); | ||
|  |         } | ||
|  | 
 | ||
|  |         public ICallbacks[] GetAll() | ||
|  |         { | ||
|  |             return m_Callbacks.OrderByDescending(callback => callback.Priority).Select(callback => callback.Callback).ToArray(); | ||
|  |         } | ||
|  | 
 | ||
|  |         public void Clear() | ||
|  |         { | ||
|  |             m_Callbacks.Clear(); | ||
|  |         } | ||
|  | 
 | ||
|  |         private struct CallbackWithPriority | ||
|  |         { | ||
|  |             public ICallbacks Callback; | ||
|  |             public int Priority; | ||
|  |             public CallbackWithPriority(ICallbacks callback, int priority) | ||
|  |             { | ||
|  |                 Callback = callback; | ||
|  |                 Priority = priority; | ||
|  |             } | ||
|  |         } | ||
|  | 
 | ||
|  |         // Sometimes - such as when we want to test the test framework itself - it's necessary to launch a test run from | ||
|  |         // inside a test. Because callbacks are registered globally, this can cause a lot of confusion (e.g. the in-test | ||
|  |         // run will emit UTP messages, utterly confusing UTR). In such circumstances the safest thing to do is to | ||
|  |         // temporarily suppress all registered callbacks for the duration of the in-test run. This method can be called | ||
|  |         // to set up a using() block which will suppress the callbacks for the scope. | ||
|  |         public IDisposable TemporarilySuppressCallbacks() | ||
|  |         { | ||
|  |             return new Suppressor(this); | ||
|  |         } | ||
|  | 
 | ||
|  |         private sealed class Suppressor : IDisposable | ||
|  |         { | ||
|  |             private readonly CallbacksHolder _instance; | ||
|  |             private readonly List<CallbackWithPriority> _suppressed; | ||
|  | 
 | ||
|  |             public Suppressor(CallbacksHolder instance) | ||
|  |             { | ||
|  |                 _instance = instance; | ||
|  |                 _suppressed = new List<CallbackWithPriority>(instance.m_Callbacks); | ||
|  |                 instance.m_Callbacks.Clear(); | ||
|  |             } | ||
|  | 
 | ||
|  |             public void Dispose() | ||
|  |             { | ||
|  |                 _instance.m_Callbacks.AddRange(_suppressed); | ||
|  |             } | ||
|  |         } | ||
|  |     } | ||
|  | } |