more write conflict checks
parent
46d742fe49
commit
4a7f65f2f5
2
TODO
2
TODO
|
@ -1,4 +1,4 @@
|
|||
- look at test coverage
|
||||
- docs
|
||||
|
||||
- WritesPending and writes redundant?
|
||||
- make sure two different engines that Write the same component cannot have same priority
|
|
@ -186,6 +186,8 @@ namespace Encompass
|
|||
var writtenComponentTypesWithoutPriority = new HashSet<Type>();
|
||||
var writtenComponentTypesWithPriority = new HashSet<Type>();
|
||||
var duplicateWritesWithoutPriority = new List<Type>();
|
||||
var duplicateWritesWithSamePriority = new List<Type>();
|
||||
var writePriorities = new Dictionary<Type, HashSet<int>>();
|
||||
var writeMessageToEngines = new Dictionary<Type, List<Engine>>();
|
||||
|
||||
foreach (var engine in engines)
|
||||
|
@ -196,7 +198,31 @@ namespace Encompass
|
|||
{
|
||||
var componentType = writeType.GetGenericArguments()[0];
|
||||
|
||||
if (!engine.writePriorities.ContainsKey(componentType))
|
||||
if (engine.writePriorities.ContainsKey(componentType))
|
||||
{
|
||||
var priority = engine.writePriorities[componentType];
|
||||
|
||||
writtenComponentTypesWithPriority.Add(componentType);
|
||||
|
||||
if (!writePriorities.ContainsKey(componentType))
|
||||
{
|
||||
writePriorities[componentType] = new HashSet<int>();
|
||||
}
|
||||
|
||||
if (writePriorities[componentType].Contains(priority))
|
||||
{
|
||||
duplicateWritesWithSamePriority.Add(componentType);
|
||||
}
|
||||
else if (writtenComponentTypesWithoutPriority.Contains(componentType))
|
||||
{
|
||||
duplicateWritesWithoutPriority.Add(componentType);
|
||||
}
|
||||
else
|
||||
{
|
||||
writePriorities[componentType].Add(priority);
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
if (writtenComponentTypesWithoutPriority.Contains(componentType) || writtenComponentTypesWithPriority.Contains(componentType))
|
||||
{
|
||||
|
@ -207,10 +233,6 @@ namespace Encompass
|
|||
writtenComponentTypesWithoutPriority.Add(componentType);
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
writtenComponentTypesWithPriority.Add(componentType);
|
||||
}
|
||||
|
||||
if (!writeMessageToEngines.ContainsKey(componentType))
|
||||
{
|
||||
|
@ -235,6 +257,20 @@ namespace Encompass
|
|||
throw new EngineWriteConflictException(errorString);
|
||||
}
|
||||
|
||||
if (duplicateWritesWithSamePriority.Count > 0)
|
||||
{
|
||||
var errorString = "Multiple Engines write the same Component with the same priority: ";
|
||||
foreach (var componentType in duplicateWritesWithSamePriority)
|
||||
{
|
||||
errorString += "\n" +
|
||||
componentType.Name + " written by: " +
|
||||
string.Join(", ", writeMessageToEngines[componentType].Select(engine => engine.GetType().Name));
|
||||
}
|
||||
errorString += "\nTo resolve the conflict, add priority arguments to the Writes declarations.";
|
||||
|
||||
throw new EngineWriteConflictException(errorString);
|
||||
}
|
||||
|
||||
var engineOrder = new List<Engine>();
|
||||
foreach (var engine in engineGraph.TopologicalSort())
|
||||
{
|
||||
|
|
|
@ -275,6 +275,68 @@ namespace Tests
|
|||
}
|
||||
}
|
||||
|
||||
public class PriorityConflict
|
||||
{
|
||||
[Writes(typeof(MockComponent), 2)]
|
||||
class AEngine : Engine
|
||||
{
|
||||
public override void Update(double dt)
|
||||
{
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
[Writes(typeof(MockComponent), 2)]
|
||||
class BEngine : Engine
|
||||
{
|
||||
public override void Update(double dt)
|
||||
{
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
[Test]
|
||||
public void PriorityConflictTest()
|
||||
{
|
||||
var worldBuilder = new WorldBuilder();
|
||||
worldBuilder.AddEngine(new AEngine());
|
||||
worldBuilder.AddEngine(new BEngine());
|
||||
|
||||
Assert.Throws<EngineWriteConflictException>(() => worldBuilder.Build());
|
||||
}
|
||||
}
|
||||
|
||||
public class EngineWriteConflict
|
||||
{
|
||||
[Writes(typeof(MockComponent))]
|
||||
class AEngine : Engine
|
||||
{
|
||||
public override void Update(double dt)
|
||||
{
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
[Writes(typeof(MockComponent), 2)]
|
||||
class BEngine : Engine
|
||||
{
|
||||
public override void Update(double dt)
|
||||
{
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
[Test]
|
||||
public void EngineWriteConflictPriorityAndNoPriorityTest()
|
||||
{
|
||||
var worldBuilder = new WorldBuilder();
|
||||
worldBuilder.AddEngine(new AEngine());
|
||||
worldBuilder.AddEngine(new BEngine());
|
||||
|
||||
Assert.Throws<EngineWriteConflictException>(() => worldBuilder.Build());
|
||||
}
|
||||
}
|
||||
|
||||
public class LegalEngines
|
||||
{
|
||||
static List<Engine> order = new List<Engine>();
|
||||
|
|
Loading…
Reference in New Issue