Skip to content

Commit e114ad7

Browse files
committed
Become with arguments
1 parent 77b26da commit e114ad7

File tree

4 files changed

+72
-22
lines changed

4 files changed

+72
-22
lines changed

Source/Orleankka.Runtime/Behaviors/Behavior.cs

Lines changed: 33 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -82,52 +82,68 @@ public Task<object> Receive(object message)
8282
return Current.Receive(message);
8383
}
8484

85-
public Task Become(Receive behavior)
85+
public Task Become(Receive behavior) => HandleBecome(behavior, Behaviors.Become.Message);
86+
public Task Become<TArg>(Receive behavior, TArg arg) => HandleBecome(behavior, new Become<TArg>(arg));
87+
88+
Task HandleBecome(Receive behavior, Become message)
8689
{
8790
Requires.NotNull(behavior, nameof(behavior));
88-
var name = behavior.Method.Name;
91+
92+
var state = states.Find(behavior.Method.Name)
93+
?? new State(behavior.Method.Name, behavior);
8994

90-
var configured = states.Find(name);
91-
return Become(configured ?? new State(name, behavior));
95+
return HandleBecome(state, message);
9296
}
9397

94-
public Task Become(string behavior)
98+
public Task Become(string behavior) => HandleBecome(behavior, Behaviors.Become.Message);
99+
public Task Become<TArg>(string behavior, TArg arg) => HandleBecome(behavior, new Become<TArg>(arg));
100+
101+
Task HandleBecome(string behavior, Become message)
95102
{
96103
Requires.NotNull(behavior, nameof(behavior));
97104

98-
return Become(State(behavior));
105+
return HandleBecome(State(behavior), message);
99106
}
100107

101-
public Task BecomeStacked(Receive behavior)
108+
public Task BecomeStacked(Receive behavior) => HandleBecomeStacked(behavior, Behaviors.Become.Message);
109+
public Task BecomeStacked<TArg>(Receive behavior, TArg arg) => HandleBecomeStacked(behavior, new Become<TArg>(arg));
110+
111+
Task HandleBecomeStacked(Receive behavior, Become message)
102112
{
103113
Requires.NotNull(behavior, nameof(behavior));
104-
var name = behavior.Method.Name;
114+
115+
var state = states.Find(behavior.Method.Name)
116+
?? new State(behavior.Method.Name, behavior);
105117

106-
var configured = states.Find(name);
107-
return BecomeStacked(configured ?? new State(name, behavior));
118+
return HandleBecomeStacked(state, message);
108119
}
109120

110-
public Task BecomeStacked(string behavior)
121+
public Task BecomeStacked(string behavior) => HandleBecomeStacked(behavior, Behaviors.Become.Message);
122+
public Task BecomeStacked<TArg>(string behavior, TArg arg) => HandleBecomeStacked(behavior, new Become<TArg>(arg));
123+
124+
Task HandleBecomeStacked(string behavior, Become message)
111125
{
112126
Requires.NotNull(behavior, nameof(behavior));
113-
return BecomeStacked(State(behavior));
127+
128+
return HandleBecomeStacked(State(behavior), message);
114129
}
115130

116-
async Task BecomeStacked(State next)
131+
async Task HandleBecomeStacked(State next, Become message)
117132
{
118133
history.Push(Current);
119-
await Become(next);
134+
135+
await HandleBecome(next, message);
120136
}
121137

122138
public async Task Unbecome()
123139
{
124140
if (history.Count == 0)
125141
throw new InvalidOperationException("The previous behavior has not been recorded. Use BecomeStacked method to stack behaviors");
126142

127-
await Become(history.Pop());
143+
await HandleBecome(history.Pop(), Behaviors.Become.Message);
128144
}
129145

130-
async Task Become(State next)
146+
async Task HandleBecome(State next, Become message)
131147
{
132148
if (!Initialized())
133149
throw new InvalidOperationException("Initial behavior should be set before calling Become");
@@ -146,7 +162,7 @@ async Task Become(State next)
146162
Previous = Current;
147163
Current = next;
148164

149-
await next.HandleBecome(transition);
165+
await next.HandleBecome(transition, message);
150166
await next.HandleActivate(transition);
151167

152168
transition = null;

Source/Orleankka.Runtime/Behaviors/BehaviorMessages.cs

Lines changed: 11 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -3,12 +3,21 @@
33
public interface BehaviorMessage
44
{}
55

6-
public sealed class Become : BehaviorMessage, LifecycleMessage
6+
public class Become : BehaviorMessage, LifecycleMessage
77
{
8-
Become(){}
8+
protected Become(){}
9+
910
public static readonly Become Message = new Become();
1011
}
1112

13+
public sealed class Become<TArg> : Become
14+
{
15+
public readonly TArg Argument;
16+
17+
internal Become(TArg argument) =>
18+
Argument = argument;
19+
}
20+
1221
public sealed class Unbecome : BehaviorMessage, LifecycleMessage
1322
{
1423
Unbecome(){}

Source/Orleankka.Runtime/Behaviors/State.cs

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -47,15 +47,15 @@ internal async Task<object> Receive(object message)
4747
return result;
4848
}
4949

50-
internal async Task HandleBecome(Transition transition)
50+
internal async Task HandleBecome(Transition transition, Become message)
5151
{
5252
if (IsSuperOf(transition.From))
5353
return;
5454

5555
if (Super != null)
56-
await Super.HandleBecome(transition);
56+
await Super.HandleBecome(transition, message);
5757

58-
await CallBehavior(Become.Message);
58+
await CallBehavior(message);
5959
}
6060

6161
internal async Task HandleUnbecome(Transition transition)

Tests/Orleankka.Tests/Features/Actor_behaviors/Switchable_behaviors.cs

Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -231,6 +231,31 @@ async Task<object> AttemptBecomeDuring<T>(Behavior b, string other, object messa
231231

232232
Assert.ThrowsAsync<InvalidOperationException>(async () => await behavior.Become("B"));
233233
}
234+
235+
[Test]
236+
public async Task When_become_with_arguments()
237+
{
238+
string passedArg = null;
239+
240+
Task<object> Receive(object message)
241+
{
242+
if (message is Become<string> m)
243+
passedArg = m.Argument;
244+
245+
return TaskResult.Done;
246+
};
247+
248+
Behavior behavior = new BehaviorTester(events)
249+
.State("A", Receive)
250+
.State("B", Receive)
251+
.Initial("A");
252+
253+
await behavior.Become("B", "arg1");
254+
Assert.That(passedArg, Is.EqualTo("arg1"));
255+
256+
await behavior.BecomeStacked("A", "arg2");
257+
Assert.That(passedArg, Is.EqualTo("arg2"));
258+
}
234259
}
235260
}
236261
}

0 commit comments

Comments
 (0)