2023-06-21 13:28:15 -04:00
#if TEST_FRAMEWORK
using System ;
using System.Linq ;
using System.Text ;
using UnityEditor.TestTools.TestRunner.Api ;
using UnityEngine ;
namespace Packages.Rider.Editor.UnitTesting
{
internal class TestsCallback : ScriptableObject , IErrorCallbacks
{
public void RunFinished ( ITestResultAdaptor result )
{
CallbackData . instance . isRider = false ;
CallbackData . instance . events . Add (
new TestEvent ( EventType . RunFinished , "" , "" , "" , 0 , ParseTestStatus ( result . TestStatus ) , "" ) ) ;
CallbackData . instance . RaiseChangedEvent ( ) ;
}
public void RunStarted ( ITestAdaptor testsToRun )
{
CallbackData . instance . events . Add (
new TestEvent ( EventType . RunStarted , "" , "" , "" , 0 , NUnit . Framework . Interfaces . TestStatus . Passed , "" ) ) ;
CallbackData . instance . RaiseChangedEvent ( ) ;
}
public void TestStarted ( ITestAdaptor result )
{
// RIDER-69927 "Test not run" status is shown for the test suite when running unit tests for Unity project
var method = result . Method ? ? result . Children . Select ( a = > a . Method ) . FirstOrDefault ( b = > b ! = null ) ;
if ( method = = null ) return ;
CallbackData . instance . events . Add (
new TestEvent ( EventType . TestStarted , GenerateId ( result ) , method . TypeInfo . Assembly . GetName ( ) . Name , "" , 0 , NUnit . Framework . Interfaces . TestStatus . Passed , GenerateId ( result . Parent ) ) ) ;
CallbackData . instance . RaiseChangedEvent ( ) ;
}
public void TestFinished ( ITestResultAdaptor result )
{
var method = result . Test . Method ? ? result . Children . Select ( a = > a . Test . Method ) . FirstOrDefault ( b = > b ! = null ) ;
if ( method = = null ) return ;
CallbackData . instance . events . Add (
new TestEvent ( EventType . TestFinished , GenerateId ( result . Test ) , method . TypeInfo . Assembly . GetName ( ) . Name , ExtractOutput ( result ) , ( result . EndTime - result . StartTime ) . Milliseconds , ParseTestStatus ( result . TestStatus ) , GenerateId ( result . Test . Parent ) ) ) ;
CallbackData . instance . RaiseChangedEvent ( ) ;
}
public void OnError ( string message )
{
CallbackData . instance . isRider = false ;
CallbackData . instance . events . Add (
new TestEvent ( EventType . RunFinished , "" , "" , message , 0 , NUnit . Framework . Interfaces . TestStatus . Failed , "" ) ) ;
CallbackData . instance . RaiseChangedEvent ( ) ;
}
// see explanation in https://jetbrains.team/p/net/code/dotnet-libs/files/f04cde7d1dd70ee13bf5532e30f929b9b5ed08a4/ReSharperTestRunner/src/Adapters/TestRunner.Adapters.NUnit3/RemoteTaskDepot.cs?tab=source&line=129
private static string GenerateId ( ITestAdaptor node )
{
// ES: Parameterized tests defined in a parametrized test fixture, though
// constructed for a particular test fixture with the given parameter, have identical fullname that does
// not include parameters of parent testfixture (name of the without parameters is used instead).
// This leads to 'Test with {id} id is already running' message.
if ( node . TypeInfo = = null )
return $"{node.Parent.FullName}.{node.Name}" ;
return node . FullName ;
}
private static NUnit . Framework . Interfaces . TestStatus ParseTestStatus ( TestStatus testStatus )
{
return ( NUnit . Framework . Interfaces . TestStatus ) Enum . Parse ( typeof ( NUnit . Framework . Interfaces . TestStatus ) , testStatus . ToString ( ) ) ;
}
private static string ExtractOutput ( ITestResultAdaptor testResult )
{
var stringBuilder = new StringBuilder ( ) ;
if ( testResult . Message ! = null )
{
stringBuilder . AppendLine ( "Message: " ) ;
stringBuilder . AppendLine ( testResult . Message ) ;
}
if ( ! string . IsNullOrEmpty ( testResult . Output ) )
{
stringBuilder . AppendLine ( "Output: " ) ;
stringBuilder . AppendLine ( testResult . Output ) ;
}
if ( ! string . IsNullOrEmpty ( testResult . StackTrace ) )
{
stringBuilder . AppendLine ( "Stacktrace: " ) ;
stringBuilder . AppendLine ( testResult . StackTrace ) ;
}
var result = stringBuilder . ToString ( ) ;
if ( result . Length > 0 )
return result ;
return testResult . Output ? ? string . Empty ;
}
}
}
2023-06-19 23:21:21 -04:00
#endif