From d5fd0560a0184a42c859163c236afe6c33df5cda Mon Sep 17 00:00:00 2001 From: Esun Kim Date: Mon, 11 Jul 2016 15:27:35 +0900 Subject: [PATCH] Add InterfacedMessageBuilder --- .../Akka.Interfaced.Tests.csproj | 1 + .../InterfacedMessageBuilderTest.cs | 25 ++++++++ core/Akka.Interfaced/Akka.Interfaced.csproj | 1 + .../InterfacedMessageBuilder.cs | 60 +++++++++++++++++++ 4 files changed, 87 insertions(+) create mode 100644 core/Akka.Interfaced.Tests/InterfacedMessageBuilderTest.cs create mode 100644 core/Akka.Interfaced/InterfacedMessageBuilder.cs diff --git a/core/Akka.Interfaced.Tests/Akka.Interfaced.Tests.csproj b/core/Akka.Interfaced.Tests/Akka.Interfaced.Tests.csproj index 84fbe0a..9895f52 100644 --- a/core/Akka.Interfaced.Tests/Akka.Interfaced.Tests.csproj +++ b/core/Akka.Interfaced.Tests/Akka.Interfaced.Tests.csproj @@ -85,6 +85,7 @@ + diff --git a/core/Akka.Interfaced.Tests/InterfacedMessageBuilderTest.cs b/core/Akka.Interfaced.Tests/InterfacedMessageBuilderTest.cs new file mode 100644 index 0000000..6975c8e --- /dev/null +++ b/core/Akka.Interfaced.Tests/InterfacedMessageBuilderTest.cs @@ -0,0 +1,25 @@ +using Xunit; + +namespace Akka.Interfaced +{ + public class InterfacedMessageBuilderTest + { + [Fact] + public void BuildRequestMessage() + { + var message = InterfacedMessageBuilder.Request(x => x.CallWithParameter(10)); + var payload = message.InvokePayload as IBasic_PayloadTable.CallWithParameter_Invoke; + Assert.NotNull(payload); + Assert.Equal(10, payload.value); + } + + [Fact] + public void BuildNotificationMessage() + { + var message = InterfacedMessageBuilder.Notification(x => x.Event("A")); + var payload = message.InvokePayload as ISubject2Observer_PayloadTable.Event_Invoke; + Assert.NotNull(payload); + Assert.Equal("A", payload.eventName); + } + } +} diff --git a/core/Akka.Interfaced/Akka.Interfaced.csproj b/core/Akka.Interfaced/Akka.Interfaced.csproj index 69c2642..5c4e1f5 100644 --- a/core/Akka.Interfaced/Akka.Interfaced.csproj +++ b/core/Akka.Interfaced/Akka.Interfaced.csproj @@ -78,6 +78,7 @@ + diff --git a/core/Akka.Interfaced/InterfacedMessageBuilder.cs b/core/Akka.Interfaced/InterfacedMessageBuilder.cs new file mode 100644 index 0000000..7c6c9ab --- /dev/null +++ b/core/Akka.Interfaced/InterfacedMessageBuilder.cs @@ -0,0 +1,60 @@ +using System; +using System.Threading.Tasks; + +namespace Akka.Interfaced +{ + public class InterfacedMessageBuilder + { + private class SinkRequestWaiter : IRequestWaiter + { + public RequestMessage Message { get; private set; } + + void IRequestWaiter.SendRequest(IRequestTarget target, RequestMessage requestMessage) + { + Message = requestMessage; + } + + Task IRequestWaiter.SendRequestAndWait(IRequestTarget target, RequestMessage requestMessage, TimeSpan? timeout) + { + Message = requestMessage; + return Task.FromResult(0); + } + + Task IRequestWaiter.SendRequestAndReceive(IRequestTarget target, RequestMessage requestMessage, TimeSpan? timeout) + { + Message = requestMessage; + return Task.FromResult(default(TReturn)); + } + } + + public static RequestMessage Request(Action action) + where T : IInterfacedActor + { + var waiter = new SinkRequestWaiter(); + var actorRef = InterfacedActorRef.Create(typeof(T)); + InterfacedActorRefModifier.SetRequestWaiter(actorRef, waiter); + action((T)(object)actorRef); + return waiter.Message; + } + + private class SinkNotificationChannel : INotificationChannel + { + public NotificationMessage Message { get; private set; } + + void INotificationChannel.Notify(NotificationMessage notificationMessage) + { + Message = notificationMessage; + } + } + + public static NotificationMessage Notification(Action action) + where T : IInterfacedObserver + { + var channel = new SinkNotificationChannel(); + var observer = InterfacedObserver.Create(typeof(T)); + observer.Channel = channel; + action((T)(object)observer); + return channel.Message; + } + } +}