// throws VisitFailure
 public virtual void testDepth2()
 {
     IVisitor recognize = new SucceedAtNodes(n1, n12);
     NestingDepth nd = new NestingDepth(recognize);
     nd.visit(n0);
     Assertion.AssertEquals(2,nd.getDepth());
 }
 // throws VisitFailure
 public virtual void testNestingStopAt()
 {
     IVisitor recognize = new FailAtNodes(n1, n12);
     IVisitor goOnWhile = new SucceedAtNodes(n0, n1);
     NestingDepth nd = new NestingDepth(recognize, goOnWhile);
     nd.visit(n0);
     Assertion.AssertEquals(1, nd.getDepth());
 }
        // throws VisitFailure
        public virtual void testTopDownUntil()
        {
            IVisitor stopAt = new SucceedAtNodes(n1, n2);

            Logger expected = new Logger();
            expected.log(new Event(stopAt, n0));
            expected.log(new Event(stopAt, n1));
            expected.log(new Event(stopAt, n2));

            IVisitable nodeReturned =
                DoWhileSuccess.TopDownUntil(logVisitor(stopAt)).visit(n0);

            Assertion.AssertEquals(expected, logger);
            Assertion.AssertEquals(n0, nodeReturned);
        }
        // throws VisitFailure
        public virtual void testn2Success()
        {
            IVisitor action = new Identity();
            IVisitor goDown = new Identity();
            IVisitor successNode = new SucceedAtNodes(n2);
            AllSpinesBottomUp asbu =
                new AllSpinesBottomUp(goDown, successNode, logVisitor(action));

            Logger expected = new Logger(action, new IVisitable[]{n2,n0});

            IVisitable nodeReturned = asbu.visit(n0);

            Assertion.AssertEquals("visit trace",expected, logger);
            Assertion.AssertEquals("return value",n0, nodeReturned);
        }
        // throws VisitFailure
        public virtual void testTopDownUntilAtBorder()
        {
            IVisitor stopAt = new SucceedAtNodes(n1, n2);

            Logger expected = new Logger();

            IVisitor borderAction = new Identity();

            expected.log(new Event(stopAt, n0));
            expected.log(new Event(stopAt, n1));
            expected.log(new Event(borderAction, n1));
            expected.log(new Event(stopAt, n2));
            expected.log(new Event(borderAction, n2));

            IVisitable nodeReturned =
                new TopDownUntil(logVisitor(stopAt),
                logVisitor(borderAction)
                ).visit(n0);

            Assertion.AssertEquals(expected, logger);
            Assertion.AssertEquals(n0, nodeReturned);
        }