diff --git a/encompass-cs/WorldBuilder.cs b/encompass-cs/WorldBuilder.cs index 7498caf..b8c21c4 100644 --- a/encompass-cs/WorldBuilder.cs +++ b/encompass-cs/WorldBuilder.cs @@ -187,7 +187,7 @@ namespace Encompass { foreach (var senderEngine in senders) { - foreach (var messageType in senderEngine.sendTypes.Where((type) => type.GetInterfaces().Contains(typeof(IMessage)))) + foreach (var messageType in senderEngine.sendTypes) { if (typeToReaders.ContainsKey(messageType)) { @@ -195,7 +195,10 @@ namespace Encompass { if (senderEngine != readerEngine) { - engineGraph.AddEdge(senderEngine, readerEngine); + if (!engineGraph.Exists(senderEngine, readerEngine)) + { + engineGraph.AddEdge(senderEngine, readerEngine); + } } } } diff --git a/test/WorldBuilderTest.cs b/test/WorldBuilderTest.cs index f1f84fa..d154697 100644 --- a/test/WorldBuilderTest.cs +++ b/test/WorldBuilderTest.cs @@ -518,5 +518,48 @@ namespace Tests resultMessages.First().Should().BeOfType(); } } + + public class MultipleMessagesBetweenEngines + { + static List order = new List(); + + struct AMessage : IMessage { } + struct BMessage : IMessage { } + + [Sends(typeof(AMessage), typeof(BMessage))] + class AEngine : Engine + { + public override void Update(double dt) + { + order.Add(this); + } + } + + [Receives(typeof(AMessage), typeof(BMessage))] + class BEngine : Engine + { + public override void Update(double dt) + { + order.Add(this); + } + } + + [Test] + public void WorldBuilderDoesNotThrowError() + { + var worldBuilder = new WorldBuilder(); + + var engineA = worldBuilder.AddEngine(new AEngine()); + var engineB = worldBuilder.AddEngine(new BEngine()); + + Assert.DoesNotThrow(() => worldBuilder.Build()); + + var world = worldBuilder.Build(); + + world.Update(0.01f); + + Assert.That(order.IndexOf(engineA), Is.LessThan(order.IndexOf(engineB))); + } + } } }