@@ -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}
0 commit comments