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.

110 lines
3.4 KiB

using System;
using System.Collections.Generic;
using System.Linq;
using UnityEngine;
namespace UnityTest.IntegrationTestRunner
{
class IntegrationTestsProvider
{
internal Dictionary<ITestComponent, HashSet<ITestComponent>> testCollection = new Dictionary<ITestComponent, HashSet<ITestComponent>>();
internal ITestComponent currentTestGroup;
internal IEnumerable<ITestComponent> testToRun;
public IntegrationTestsProvider(IEnumerable<ITestComponent> tests)
{
testToRun = tests;
foreach (var test in tests.OrderBy(component => component))
{
if (test.IsTestGroup())
{
throw new Exception(test.Name + " is test a group");
}
AddTestToList(test);
}
if (currentTestGroup == null)
{
currentTestGroup = FindInnerTestGroup(TestComponent.NullTestComponent);
}
}
private void AddTestToList(ITestComponent test)
{
var group = test.GetTestGroup();
if (!testCollection.ContainsKey(group))
testCollection.Add(group, new HashSet<ITestComponent>());
testCollection[group].Add(test);
if (group == TestComponent.NullTestComponent) return;
AddTestToList(group);
}
public ITestComponent GetNextTest()
{
var test = testCollection[currentTestGroup].First();
testCollection[currentTestGroup].Remove(test);
test.EnableTest(true);
return test;
}
public void FinishTest(ITestComponent test)
{
try
{
test.EnableTest(false);
currentTestGroup = FindNextTestGroup(currentTestGroup);
}
catch (MissingReferenceException e)
{
Debug.LogException(e);
}
}
private ITestComponent FindNextTestGroup(ITestComponent testGroup)
{
if (testGroup == null)
throw new Exception ("No test left");
if (testCollection[testGroup].Any())
{
testGroup.EnableTest(true);
return FindInnerTestGroup(testGroup);
}
testCollection.Remove(testGroup);
testGroup.EnableTest(false);
var parentTestGroup = testGroup.GetTestGroup();
if (parentTestGroup == null) return null;
testCollection[parentTestGroup].Remove(testGroup);
return FindNextTestGroup(parentTestGroup);
}
private ITestComponent FindInnerTestGroup(ITestComponent group)
{
var innerGroups = testCollection[group];
foreach (var innerGroup in innerGroups)
{
if (!innerGroup.IsTestGroup()) continue;
innerGroup.EnableTest(true);
return FindInnerTestGroup(innerGroup);
}
return group;
}
public bool AnyTestsLeft()
{
return testCollection.Count != 0;
}
public List<ITestComponent> GetRemainingTests()
{
var remainingTests = new List<ITestComponent>();
foreach (var test in testCollection)
{
remainingTests.AddRange(test.Value);
}
return remainingTests;
}
}
}