Skip to content

Commit 47d7f76

Browse files
committed
Added simple conditional abort test for composite
1 parent 60140c3 commit 47d7f76

File tree

3 files changed

+107
-13
lines changed

3 files changed

+107
-13
lines changed

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

Lines changed: 67 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -15,10 +15,12 @@ public void SetSelector () {
1515
_selector = new Selector();
1616
}
1717

18-
public void CheckUpdateCalls (List<int> updateCalls) {
18+
public void CheckUpdateCalls (ITaskParent selector, List<int> updateCalls) {
1919
for (var i = 0; i < updateCalls.Count; i++) {
20-
var child = _selector.children[i];
21-
child.Received(updateCalls[i]).Update();
20+
var child = selector.children[i];
21+
if (updateCalls[i] >= 0) {
22+
child.Received(updateCalls[i]).Update();
23+
}
2224
}
2325
}
2426

@@ -62,7 +64,7 @@ public void Stops_on_continue () {
6264
_selector.Update();
6365

6466
var updateCalls = new List<int> {1, 1, 0};
65-
CheckUpdateCalls(updateCalls);
67+
CheckUpdateCalls(_selector, updateCalls);
6668
}
6769

6870
[Test]
@@ -77,7 +79,7 @@ public void Reruns_the_same_node_if_it_returns_continue () {
7779
_selector.Update();
7880

7981
var updateCalls = new List<int> {1, 2};
80-
CheckUpdateCalls(updateCalls);
82+
CheckUpdateCalls(_selector, updateCalls);
8183
}
8284

8385
[Test]
@@ -105,7 +107,7 @@ public void Stops_on_first_success_node () {
105107
_selector.Update();
106108

107109
var updateCalls = new List<int> {1, 1, 0};
108-
CheckUpdateCalls(updateCalls);
110+
CheckUpdateCalls(_selector, updateCalls);
109111
}
110112
}
111113

@@ -137,7 +139,7 @@ public void Revaultes_first_condition_node_when_it_goes_from_failure_to_success
137139
_selector.Update();
138140

139141
var updateCalls = new List<int> {3, 1};
140-
CheckUpdateCalls(updateCalls);
142+
CheckUpdateCalls(_selector, updateCalls);
141143
}
142144

143145
[Test]
@@ -152,7 +154,7 @@ public void Does_not_revaluate_if_no_abort_type () {
152154
_selector.Update();
153155

154156
var updateCalls = new List<int> {1, 2};
155-
CheckUpdateCalls(updateCalls);
157+
CheckUpdateCalls(_selector, updateCalls);
156158
}
157159

158160
[Test]
@@ -167,7 +169,7 @@ public void Does_not_crash_if_self_abort_is_null () {
167169
_selector.Update();
168170

169171
var updateCalls = new List<int> {1, 2};
170-
CheckUpdateCalls(updateCalls);
172+
CheckUpdateCalls(_selector, updateCalls);
171173
}
172174

173175
[Test]
@@ -221,6 +223,62 @@ public void Returns_failure_if_nested_condition_is_followed_by_failure_task () {
221223
Assert.AreEqual(TaskStatus.Continue, _selector.Update());
222224
}
223225
}
226+
227+
public class ConditionalAbortLowerPrioritySelector {
228+
public class AbortTypeSelector : UpdateMethod {
229+
[Test]
230+
public void Revaluates_from_where_a_conditional_abort_goes_from_failure_to_success () {
231+
var sequenceSub = new Sequence();
232+
sequenceSub.AbortType = AbortType.LowerPriority;
233+
234+
var childFailure = A.TaskStub()
235+
.WithAbortConditionSelf(true)
236+
.WithUpdateStatus(TaskStatus.Failure)
237+
.Build();
238+
sequenceSub.AddChild(childFailure);
239+
sequenceSub.AddChild(A.TaskStub().Build());
240+
241+
_selector
242+
.AddChild(sequenceSub)
243+
.AddChild(A.TaskStub().Build());
244+
245+
_selector.Update();
246+
childFailure.Update().Returns(TaskStatus.Success);
247+
_selector.Update();
248+
249+
CheckUpdateCalls(sequenceSub, new List<int>{3, 1});
250+
CheckUpdateCalls(_selector, new List<int>{-1, 1});
251+
}
252+
253+
[Test]
254+
public void Returns_success_when_a_conditional_abort_goes_from_failure_to_success () {
255+
var sequenceSub = new Sequence();
256+
sequenceSub.AbortType = AbortType.LowerPriority;
257+
258+
var childFailure = A.TaskStub()
259+
.WithAbortConditionSelf(true)
260+
.WithUpdateStatus(TaskStatus.Failure)
261+
.Build();
262+
sequenceSub.AddChild(childFailure);
263+
sequenceSub.AddChild(A.TaskStub().Build());
264+
265+
_selector
266+
.AddChild(sequenceSub)
267+
.AddChild(A.TaskStub().Build());
268+
269+
_selector.Update();
270+
childFailure.Update().Returns(TaskStatus.Success);
271+
272+
Assert.AreEqual(TaskStatus.Success, _selector.Update());
273+
}
274+
275+
// @TODO Verify nested conditional abort runs from correct starting point (currently tests all children)
276+
}
277+
278+
public class AbortTypeComposite {
279+
// @TODO Add composite abort type tests
280+
}
281+
}
224282
}
225283
}
226284
}

Assets/FluidBehaviorTree/Scripts/TaskParents/Composites/Selector.cs

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,14 @@ protected override TaskStatus OnUpdate () {
77
return Update();
88
}
99

10+
foreach (var abort in AbortLowerPriorities) {
11+
if (abort.Update() != TaskStatus.Success) continue;
12+
children[ChildIndex].End();
13+
Reset();
14+
// @TODO Should use the abort's index to figure out what to revaluate
15+
return Update();
16+
}
17+
1018
for (var i = ChildIndex; i < children.Count; i++) {
1119
var child = children[ChildIndex];
1220

@@ -16,6 +24,14 @@ protected override TaskStatus OnUpdate () {
1624
case TaskStatus.Continue:
1725
return TaskStatus.Continue;
1826
}
27+
28+
if (child.IsLowerPriority) {
29+
var abortCondition = child.GetAbortCondition();
30+
if (abortCondition != null) {
31+
// @TODO Abort must include the current child index
32+
AbortLowerPriorities.Add(abortCondition);
33+
}
34+
}
1935

2036
ChildIndex++;
2137
}
Lines changed: 24 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,17 +1,37 @@
11
namespace Adnc.FluidBT.Tasks {
22
public interface ITask {
3+
/// <summary>
4+
/// Is this task enabled or not? Disabled tasks are excluded from the runtime
5+
/// </summary>
36
bool Enabled { get; set; }
7+
8+
/// <summary>
9+
/// Check if this node is a valid lower priority abort
10+
/// </summary>
411
bool IsLowerPriority { get; }
5-
12+
13+
/// <summary>
14+
/// Triggered every tick
15+
/// </summary>
16+
/// <returns></returns>
617
TaskStatus Update ();
718

19+
/// <summary>
20+
/// Returns the valid abort condition
21+
/// </summary>
22+
/// <returns></returns>
823
ITask GetAbortCondition ();
924

10-
/**
11-
* Forcibly end this task. Firing all necessary completion logic
12-
*/
25+
/// <summary>
26+
/// Forcibly end this task. Firing all necessary completion logic
27+
/// </summary>
1328
void End ();
1429

30+
/// <summary>
31+
/// Reset this task back to its initial state. Hard reset should run all
32+
/// one time run only logic (meant for pooling)
33+
/// </summary>
34+
/// <param name="hardReset"></param>
1535
void Reset (bool hardReset = false);
1636
}
1737
}

0 commit comments

Comments
 (0)