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);
        }
        public void Add_AddsToChildrenAndSetsParent()
        {
            // Arrange
            var builder = new DefaultRazorIntermediateNodeBuilder();

            var parent = new BasicIntermediateNode();

            builder.Push(parent);

            var node = new BasicIntermediateNode();

            // Act
            builder.Add(node);

            // Assert
            Assert.Same(parent, builder.Current);
            Assert.Collection(parent.Children, n => Assert.Same(node, n));
        }
        public void Insert_AddsToChildren_NonEmpyCollection_AtEnd()
        {
            // Arrange
            var builder = new DefaultRazorIntermediateNodeBuilder();

            var parent = new BasicIntermediateNode();

            builder.Push(parent);

            var child = new BasicIntermediateNode();

            builder.Add(child);

            var node = new BasicIntermediateNode();

            // Act
            builder.Insert(1, node);

            // Assert
            Assert.Same(parent, builder.Current);
            Assert.Collection(parent.Children, n => Assert.Same(child, n), n => Assert.Same(node, n));
        }