A game about forced loneliness, made by TACStudios
1using System;
2using System.Collections;
3using System.IO;
4using NUnit.Framework;
5using UnityEditor.TestTools.TestRunner.UnityTestProtocol;
6using UnityEngine;
7
8namespace UnityEditor.TestTools.TestRunner.TestRun.Tasks
9{
10 internal class EnableTestOutLoggerTask : TestTaskBase, IDisposable
11 {
12 internal Action<Action<PlayModeStateChange>> SubscribePlayModeStateChanged = callback =>
13 EditorApplication.playModeStateChanged += callback;
14 internal Action<Action<PlayModeStateChange>> UnsubscribePlayModeStateChanged = callback =>
15 EditorApplication.playModeStateChanged -= callback;
16 internal Action<Application.LogCallback> SubscribeLogMessageReceivedThreaded =
17 callback => Application.logMessageReceived += callback;
18 internal Action<Application.LogCallback> UnsubscribeLogMessageReceivedThreaded =
19 callback => Application.logMessageReceived -= callback;
20
21 internal Func<TextWriter> GetCurrentContextWriter = () => TestContext.Out;
22
23 public EnableTestOutLoggerTask()
24 {
25 RerunAfterResume = true;
26 }
27
28 public override IEnumerator Execute(TestJobData testJobData)
29 {
30 SubscribePlayModeStateChanged(WaitForExitPlaymode);
31 SubscribeLogMessageReceivedThreaded(LogReceived);
32 yield break;
33 }
34
35 private void WaitForExitPlaymode(PlayModeStateChange state)
36 {
37 if (state == PlayModeStateChange.EnteredEditMode)
38 {
39 UnsubscribePlayModeStateChanged(WaitForExitPlaymode);
40 UnsubscribeLogMessageReceivedThreaded(LogReceived);
41 SubscribeLogMessageReceivedThreaded(LogReceived);
42 }
43 }
44
45 private void LogReceived(string message, string stacktrace, LogType type)
46 {
47 if (message.StartsWith(UtpDebugLogger.UtpPrefix))
48 {
49 return;
50 }
51
52 var writer = GetCurrentContextWriter();
53 if (writer != null)
54 {
55 writer.WriteLine(message);
56 if (type == LogType.Exception)
57 {
58 writer.WriteLine(stacktrace);
59 }
60 }
61 }
62
63 public void Dispose()
64 {
65 UnsubscribeLogMessageReceivedThreaded(LogReceived);
66 }
67 }
68}