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);
 | |
|             }
 | |
|         }
 | |
|     }
 | |
| }
 |