Пример #1
0
        public void TickSequenceParentSelectorChildrenFirstChildFailsOnBothSequenceFails()
        {
            Sequence     sequence  = new Sequence();
            MockSelector selector1 = new MockSelector(2);
            MockSelector selector2 = new MockSelector(2);

            sequence.Add(selector1);
            sequence.Add(selector2);

            sequence.Tick();
            Assert.AreEqual(Status.BhRunning, sequence.Status);
            Assert.AreEqual(1, selector1[0].InitializeCalled);

            selector1[0].ReturnStatus = Status.BhFailure;
            sequence.Tick();
            Assert.AreEqual(Status.BhRunning, sequence.Status);

            // if the child of the first selector fails, then
            // the second child should be running and the first
            // child should be terminated
            Assert.AreEqual(1, selector1[1].InitializeCalled);
            Assert.AreEqual(Status.BhRunning, selector1[1].Status);
            Assert.AreEqual(1, selector1[0].TerminateCalled);

            // the first child of the second selector should not
            // yet be called
            Assert.AreEqual(0, selector2[0].InitializeCalled);


            selector1[1].ReturnStatus = Status.BhSuccess;
            sequence.Tick();
            Assert.AreEqual(Status.BhRunning, selector2[0].Status);
            Assert.AreEqual(1, selector1[1].TerminateCalled);
            Assert.AreEqual(1, selector2[0].InitializeCalled);

            // mark the first child of the second selector as failed
            selector2[0].ReturnStatus = Status.BhFailure;
            sequence.Tick();
            Assert.AreEqual(Status.BhRunning, sequence.Status);

            selector2[1].ReturnStatus = Status.BhFailure;
            sequence.Tick();
            Assert.AreEqual(Status.BhFailure, selector2.Status);
            Assert.AreEqual(Status.BhFailure, sequence.Status);
        }
Пример #2
0
        public void TickSequenceParentSelectorChildrenSequenceSucceedes()
        {
            Sequence     sequence  = new Sequence();
            MockSelector selector1 = new MockSelector(2);
            MockSelector selector2 = new MockSelector(2);

            sequence.Add(selector1);
            sequence.Add(selector2);

            sequence.Tick();
            Assert.AreEqual(Status.BhRunning, sequence.Status);
            Assert.AreEqual(1, selector1[0].InitializeCalled);

            selector1[0].ReturnStatus = Status.BhSuccess;
            sequence.Tick();
            Assert.AreEqual(Status.BhRunning, sequence.Status);

            // if the first selector succeedes, then none of the
            // other childrne of the selector will be touched
            Assert.AreEqual(Status.BhInvalid, selector1[1].Status);
            Assert.AreEqual(1, selector1[0].TerminateCalled);

            // since a sequence has to go trough all of its selectors (if any)
            // if they succeed. So the first child of the second selector
            // should now be initialized
            Assert.AreEqual(1, selector2[0].InitializeCalled);

            sequence.Tick();
            Assert.AreEqual(Status.BhRunning, sequence.Status);
            Assert.AreEqual(0, selector2[0].TerminateCalled);
            Assert.AreEqual(0, selector2[1].TerminateCalled);
            Assert.AreEqual(Status.BhRunning, selector2[0].Status);

            selector2[0].ReturnStatus = Status.BhSuccess;
            sequence.Tick();
            Assert.AreEqual(Status.BhSuccess, sequence.Status);
        }