Skip to content

Commit 3a82904

Browse files
committed
Added builder pattern for task stubs
1 parent e6cece0 commit 3a82904

File tree

6 files changed

+81
-21
lines changed

6 files changed

+81
-21
lines changed

Assets/FluidBehaviorTree/Editor/Testing/Builders.meta

Lines changed: 3 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.
Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,7 @@
1+
namespace Adnc.FluidBT.Testing {
2+
public static class A {
3+
public static TaskStubBuilder TaskStub () {
4+
return new TaskStubBuilder();
5+
}
6+
}
7+
}

Assets/FluidBehaviorTree/Editor/Testing/Builders/A.cs.meta

Lines changed: 3 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.
Lines changed: 40 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,40 @@
1+
using Adnc.FluidBT.Tasks;
2+
using NSubstitute;
3+
4+
namespace Adnc.FluidBT.Testing {
5+
public class TaskStubBuilder {
6+
private bool _enabled = true;
7+
private TaskStatus _status = TaskStatus.Success;
8+
private bool _abortConditionSelf;
9+
10+
public TaskStubBuilder WithEnabled (bool enabled) {
11+
_enabled = enabled;
12+
13+
return this;
14+
}
15+
16+
public TaskStubBuilder WithUpdateStatus (TaskStatus status) {
17+
_status = status;
18+
19+
return this;
20+
}
21+
22+
public TaskStubBuilder WithAbortConditionSelf (bool abortCondition) {
23+
_abortConditionSelf = abortCondition;
24+
25+
return this;
26+
}
27+
28+
public ITask Build () {
29+
var task = Substitute.For<ITask>();
30+
task.Enabled.Returns(_enabled);
31+
task.Update().Returns(_status);
32+
33+
if (_abortConditionSelf) {
34+
task.GetAbortCondition().Returns(task);
35+
}
36+
37+
return task;
38+
}
39+
}
40+
}

Assets/FluidBehaviorTree/Editor/Testing/Builders/TaskStubBuilder.cs.meta

Lines changed: 3 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

Assets/FluidBehaviorTree/Editor/Testing/ParentTasks/TaskSequenceTest.cs

Lines changed: 25 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,7 @@
1-
using Adnc.FluidBT.TaskParents;
1+
using System;
2+
using Adnc.FluidBT.TaskParents;
23
using Adnc.FluidBT.Tasks;
4+
using Adnc.FluidBT.Tasks.Actions;
35
using NSubstitute;
46
using NSubstitute.ReturnsExtensions;
57
using NUnit.Framework;
@@ -86,13 +88,15 @@ public void It_should_not_update_previous_nodes_when_a_continue_node_is_rerun ()
8688
// @TODO Builder API for tasks
8789
public class WhenAbortLowerPriority : UpdateMethod {
8890
private Sequence _seqChild;
91+
private ITask _taskCondition;
8992

9093
[SetUp]
9194
public void Setup_lower_priority_trigger () {
9295
_seqChild = new Sequence { AbortType = AbortType.LowerPriority };
93-
_seqChild.AddChild(_childA);
94-
_childA.GetAbortCondition().Returns(_childA);
9596

97+
_taskCondition = A.TaskStub().WithAbortConditionSelf(true).Build();
98+
_seqChild.AddChild(_taskCondition);
99+
96100
_sequence.children.Clear();
97101
_sequence.AddChild(_seqChild);
98102
_sequence.AddChild(_childB);
@@ -107,18 +111,18 @@ public void Does_not_trigger_abort_on_first_update () {
107111
[Test]
108112
public void Triggers_when_a_lower_priority_sibling_composite_changes_from_success_to_failure () {
109113
_sequence.Update();
110-
_childA.Update().Returns(TaskStatus.Failure);
114+
_taskCondition.Update().Returns(TaskStatus.Failure);
111115

112116
Assert.AreEqual(TaskStatus.Failure, _sequence.Update());
113117
}
114118

115119
[Test]
116120
public void Parent_task_triggers_reset_on_all_nodes () {
117121
_sequence.Update();
118-
_childA.Update().Returns(TaskStatus.Failure);
122+
_taskCondition.Update().Returns(TaskStatus.Failure);
119123
_sequence.Update();
120124

121-
_childA.Received(1).Reset();
125+
_taskCondition.Received(1).Reset();
122126
_childB.Received(1).Reset();
123127
}
124128

@@ -127,34 +131,34 @@ public void Does_not_crash_on_a_conditional_abort_without_tasks () {
127131
_seqChild.children.Clear();
128132

129133
_sequence.Update();
130-
_childA.Update().Returns(TaskStatus.Failure);
134+
_taskCondition.Update().Returns(TaskStatus.Failure);
131135
_sequence.Update();
132136
}
133137

134138
[Test]
135139
public void Does_not_recheck_conditional_aborts_after_reset_is_called () {
136140
_sequence.Update();
137-
_childA.Update().Returns(TaskStatus.Failure);
141+
_taskCondition.Update().Returns(TaskStatus.Failure);
138142
_sequence.Update();
139143
_sequence.Update();
140144

141-
_childA.Received(3).Update();
145+
_taskCondition.Received(3).Update();
142146
}
143147

144148
[Test]
145149
public void Triggers_on_valid_conditional_task () {
146150
_sequence.Update();
147-
_childA.Update().Returns(TaskStatus.Failure);
151+
_taskCondition.Update().Returns(TaskStatus.Failure);
148152

149153
Assert.AreEqual(TaskStatus.Failure, _sequence.Update());
150154
}
151155

152156
[Test]
153157
public void Does_not_trigger_on_invalid_conditional_task () {
154-
_childA.GetAbortCondition().ReturnsNull();
158+
_taskCondition.GetAbortCondition().ReturnsNull();
155159

156160
_sequence.Update();
157-
_childA.Update().Returns(TaskStatus.Failure);
161+
_taskCondition.Update().Returns(TaskStatus.Failure);
158162

159163
Assert.AreEqual(TaskStatus.Continue, _sequence.Update());
160164
}
@@ -163,11 +167,11 @@ public void Does_not_trigger_on_invalid_conditional_task () {
163167
public void Triggers_abort_on_nested_sequence_with_first_node_a_condition () {
164168
_seqChild.children.Clear();
165169
var nestedSeqChild = new Sequence();
166-
nestedSeqChild.AddChild(_childA);
170+
nestedSeqChild.AddChild(_taskCondition);
167171
_seqChild.AddChild(nestedSeqChild);
168172

169173
_sequence.Update();
170-
_childA.Update().Returns(TaskStatus.Failure);
174+
_taskCondition.Update().Returns(TaskStatus.Failure);
171175

172176
Assert.AreEqual(TaskStatus.Failure, _sequence.Update());
173177
}
@@ -176,21 +180,21 @@ public void Triggers_abort_on_nested_sequence_with_first_node_a_condition () {
176180
public void Does_not_trigger_on_nested_sequence_with_first_node_a_non_condition () {
177181
_seqChild.children.Clear();
178182
var nestedSeqChild = new Sequence();
179-
nestedSeqChild.AddChild(_childA);
183+
nestedSeqChild.AddChild(_taskCondition);
180184
_seqChild.AddChild(nestedSeqChild);
181185

182-
_childA.GetAbortCondition().ReturnsNull();
186+
_taskCondition.GetAbortCondition().ReturnsNull();
183187

184188
_sequence.Update();
185-
_childA.Update().Returns(TaskStatus.Failure);
189+
_taskCondition.Update().Returns(TaskStatus.Failure);
186190

187191
Assert.AreEqual(TaskStatus.Continue, _sequence.Update());
188192
}
189193

190194
[Test]
191195
public void Triggers_end_on_exited_pointer_task () {
192196
_sequence.Update();
193-
_childA.Update().Returns(TaskStatus.Failure);
197+
_taskCondition.Update().Returns(TaskStatus.Failure);
194198
_sequence.Update();
195199

196200
_childB.Received(1).End();
@@ -207,7 +211,7 @@ public void Triggers_end_on_nested_task () {
207211
_sequence.AddChild(sequence);
208212

209213
_sequence.Update();
210-
_childA.Update().Returns(TaskStatus.Failure);
214+
_taskCondition.Update().Returns(TaskStatus.Failure);
211215
_sequence.Update();
212216

213217
child.Received(1).End();
@@ -222,7 +226,7 @@ public void Triggers_on_lower_priority_2nd_sibling () {
222226
_sequence.AddChild(_childB);
223227

224228
_sequence.Update();
225-
_childA.Update().Returns(TaskStatus.Failure);
229+
_taskCondition.Update().Returns(TaskStatus.Failure);
226230

227231
Assert.AreEqual(TaskStatus.Failure, _sequence.Update());
228232
}
@@ -238,7 +242,7 @@ public void Triggers_on_lower_priority_3rd_sibling () {
238242
_sequence.AddChild(_childB);
239243

240244
_sequence.Update();
241-
_childA.Update().Returns(TaskStatus.Failure);
245+
_taskCondition.Update().Returns(TaskStatus.Failure);
242246

243247
Assert.AreEqual(TaskStatus.Failure, _sequence.Update());
244248
}

0 commit comments

Comments
 (0)