No Description
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

EnableTestOutLoggerTask.cs 2.3KB

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