public void IntermediateNodeWalker_Visit_TraversesEntireGraph()
        {
            // Arrange
            var walker = new DerivedIntermediateNodeWalker();

            var nodes = new IntermediateNode[]
            {
                new BasicIntermediateNode("Root"),
                new BasicIntermediateNode("Root->A"),
                new BasicIntermediateNode("Root->B"),
                new BasicIntermediateNode("Root->B->1"),
                new BasicIntermediateNode("Root->B->2"),
                new BasicIntermediateNode("Root->C"),
            };

            var builder = new DefaultRazorIntermediateNodeBuilder();

            builder.Push(nodes[0]);
            builder.Add(nodes[1]);
            builder.Push(nodes[2]);
            builder.Add(nodes[3]);
            builder.Add(nodes[4]);
            builder.Pop();
            builder.Add(nodes[5]);

            var root = builder.Pop();

            // Act
            walker.Visit(root);

            // Assert
            Assert.Equal(nodes, walker.Visited.ToArray());
        }
        public void IntermediateNodeWalker_Visit_SetsParentAndAncestors()
        {
            // Arrange
            var walker = new DerivedIntermediateNodeWalker();

            var nodes = new IntermediateNode[]
            {
                new BasicIntermediateNode("Root"),
                new BasicIntermediateNode("Root->A"),
                new BasicIntermediateNode("Root->B"),
                new BasicIntermediateNode("Root->B->1"),
                new BasicIntermediateNode("Root->B->2"),
                new BasicIntermediateNode("Root->C"),
            };

            var ancestors = new Dictionary <string, string[]>()
            {
                { "Root", new string[] { } },
                { "Root->A", new string[] { "Root" } },
                { "Root->B", new string[] { "Root" } },
                { "Root->B->1", new string[] { "Root->B", "Root" } },
                { "Root->B->2", new string[] { "Root->B", "Root" } },
                { "Root->C", new string[] { "Root" } },
            };

            walker.OnVisiting = (n) =>
            {
                Assert.Equal(ancestors[((BasicIntermediateNode)n).Name], walker.Ancestors.Cast <BasicIntermediateNode>().Select(b => b.Name));
                Assert.Equal(ancestors[((BasicIntermediateNode)n).Name].FirstOrDefault(), ((BasicIntermediateNode)walker.Parent)?.Name);
            };

            var builder = new DefaultRazorIntermediateNodeBuilder();

            builder.Push(nodes[0]);
            builder.Add(nodes[1]);
            builder.Push(nodes[2]);
            builder.Add(nodes[3]);
            builder.Add(nodes[4]);
            builder.Pop();
            builder.Add(nodes[5]);

            var root = builder.Pop();

            // Act & Assert
            walker.Visit(root);
        }