An easy to use Unity 3D library for creating illustrated Interactive Fiction games and more.
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.

124 lines
4.4 KiB

using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using UnityEditor;
using UnityEngine;
using UnityTest.UnitTestRunner;
namespace UnityTest
{
public static partial class Batch
{
const string k_ResultFilePathParam = "-resultFilePath=";
const string k_TestFilterParam = "-filter=";
const string k_CategoryParam = "-categories=";
const string k_DefaultResultFileName = "UnitTestResults.xml";
public static int returnCodeTestsOk = 0;
public static int returnCodeTestsFailed = 2;
public static int returnCodeRunError = 3;
public static void RunUnitTests()
{
PlayerSettings.useMacAppStoreValidation = false;
var filter = GetTestFilter();
var resultFilePath = GetParameterArgument(k_ResultFilePathParam) ?? Directory.GetCurrentDirectory();
if (Directory.Exists(resultFilePath))
resultFilePath = Path.Combine(resultFilePath, k_DefaultResultFileName);
EditorApplication.NewScene();
var engine = new NUnitTestEngine();
UnitTestResult[] results;
string[] categories;
engine.GetTests(out results, out categories);
engine.RunTests(filter, new TestRunnerEventListener(resultFilePath, results.ToList()));
}
private static TestFilter GetTestFilter()
{
var testFilterArg = GetParameterArgumentArray(k_TestFilterParam);
var testCategoryArg = GetParameterArgumentArray(k_CategoryParam);
var filter = new TestFilter
{
names = testFilterArg,
categories = testCategoryArg
};
return filter;
}
private static string[] GetParameterArgumentArray(string parameterName)
{
var arg = GetParameterArgument(parameterName);
if (string.IsNullOrEmpty(arg)) return null;
return arg.Split(',').Select(s => s.Trim()).ToArray();
}
private static string GetParameterArgument(string parameterName)
{
foreach (var arg in Environment.GetCommandLineArgs())
{
if (arg.ToLower().StartsWith(parameterName.ToLower()))
{
return arg.Substring(parameterName.Length);
}
}
return null;
}
private class TestRunnerEventListener : ITestRunnerCallback
{
private readonly string m_ResultFilePath;
private readonly List<UnitTestResult> m_Results;
public TestRunnerEventListener(string resultFilePath, List<UnitTestResult> resultList)
{
m_ResultFilePath = resultFilePath;
m_Results = resultList;
}
public void TestFinished(ITestResult test)
{
m_Results.Single(r => r.Id == test.Id).Update(test, false);
}
public void RunFinished()
{
var resultDestiantion = Application.dataPath;
if (!string.IsNullOrEmpty(m_ResultFilePath))
resultDestiantion = m_ResultFilePath;
var fileName = Path.GetFileName(resultDestiantion);
if (!string.IsNullOrEmpty(fileName))
resultDestiantion = resultDestiantion.Substring(0, resultDestiantion.Length - fileName.Length);
else
fileName = "UnitTestResults.xml";
#if !UNITY_METRO
var resultWriter = new XmlResultWriter("Unit Tests", "Editor", m_Results.ToArray());
resultWriter.WriteToFile(resultDestiantion, fileName);
#endif
var executed = m_Results.Where(result => result.Executed);
if (!executed.Any())
{
EditorApplication.Exit(returnCodeRunError);
return;
}
var failed = executed.Where(result => !result.IsSuccess);
EditorApplication.Exit(failed.Any() ? returnCodeTestsFailed : returnCodeTestsOk);
}
public void TestStarted(string fullName)
{
}
public void RunStarted(string suiteName, int testCount)
{
}
public void RunFinishedException(Exception exception)
{
EditorApplication.Exit(returnCodeRunError);
throw exception;
}
}
}
}