public void Should_generate_root_node_from_compile_unit()
        {
            var inputText = "(+ 1 2)";
            var tree      = (NQLParser.CompileUnitContext)inputText.ParseWith <NqlLanguage>();

            var converter  = new ParseTreeConverter();
            var outputNode = converter.VisitCompileUnit(tree);

            (outputNode != null).ShouldBe(true);

            outputNode.ShouldBeOfType <RootNode>();
        }
        public void Should_create_nil_nodes()
        {
            var inputText = "(nil 1)";
            var tree      = inputText.ParseWith <NqlLanguage>();
            var converter = new ParseTreeConverter();

            var root         = (RootNode)converter.Visit(tree);
            var listNode     = root.Children.Cast <ListNode>().First(c => c != null);
            var listElements = listNode.Children.ToArray();

            listElements[0].GetType().ShouldBe(typeof(NilNode));
            listElements[1].GetType().ShouldBe(typeof(NumberNode));
        }
        public void Should_generate_keyword_node()
        {
            var             inputText = ":keyword123";
            var             converter = new ParseTreeConverter();
            var             tree      = inputText.ParseWith <NqlLanguage>();
            INode <AstNode> root      = converter.Visit(tree);

            root.ShouldNotBe(null);
            root.Children.Count().ShouldBe(1);

            var keywordNode = (KeywordNode)root.Children.First();

            keywordNode.Keyword.ShouldBe(":keyword123");
        }
        public void Should_create_quoted_list()
        {
            var inputText         = "'(+ 1 2)";
            var tree              = inputText.ParseWith <NqlLanguage>();
            var elementDescendant = tree.Descendants()
                                    .First(d => d.GetType().Name.StartsWith("Element") && d.Children().Any(c => c.GetType().Name.StartsWith("Quoted")));

            var converter  = new ParseTreeConverter();
            var outputNode = converter.Visit(elementDescendant) as QuotedListNode;

            Assert.IsNotNull(outputNode);

            outputNode.Children.Count().ShouldBe(1);
        }
        public void Should_unwrap_operator_from_atom()
        {
            var inputText = "(+)";
            var tree      = inputText.ParseWith <NqlLanguage>();

            var atomDescendant = tree.Descendants()
                                 .First(d => d.GetType().Name.StartsWith("Atom"));

            var converter  = new ParseTreeConverter();
            var outputNode = converter.Visit(atomDescendant) as OperatorNode;

            Assert.IsNotNull(outputNode);
            outputNode.Operator.ShouldBe("+");
        }
        public void Should_unwrap_atom_from_element()
        {
            var inputText = "(123)";
            var tree      = inputText.ParseWith <NqlLanguage>();

            var elementDescendant = tree.Descendants()
                                    .First(d => d.GetType().Name.StartsWith("Element"));

            var converter  = new ParseTreeConverter();
            var outputNode = converter.Visit(elementDescendant) as NumberNode;

            Assert.IsNotNull(outputNode);
            outputNode.Number.ShouldBe("123");
        }
        public void Should_generate_set_node()
        {
            var             inputText = "#{1 2 3}";
            var             converter = new ParseTreeConverter();
            var             tree      = inputText.ParseWith <NqlLanguage>();
            INode <AstNode> root      = converter.Visit(tree);

            root.ShouldNotBe(null);
            root.Children.Count().ShouldBe(1);

            var setNode = root.Children.Cast <SetNode>().First();

            setNode.Children.Count().ShouldBe(3);
            setNode.Children.All(child => child.GetType() == typeof(NumberNode)).ShouldBe(true);
        }
        public void Should_generate_false_boolean_node()
        {
            var inputText = "(false)";
            var converter = new ParseTreeConverter();
            var tree      = inputText.ParseWith <NqlLanguage>();

            var rootNode = (RootNode)converter.Visit(tree);
            var listNode = rootNode.Children.Cast <ListNode>().First();

            listNode.ShouldNotBe(null);

            var childNodes = listNode.Children.ToArray();

            childNodes.Count().ShouldBe(1);

            childNodes[0].ShouldBeOfType <FalseNode>();
        }
        public void Should_create_map()
        {
            var inputText = "{:language \"Clojure\", :creator \"Rich Hickey\"}";
            var tree      = inputText.ParseWith <NqlLanguage>();
            var converter = new ParseTreeConverter();
            var rootNode  = (RootNode)converter.Visit(tree);

            rootNode.Children.Count().ShouldBe(1);

            var mapNode = rootNode.Children.Cast <MapNode>().First();

            mapNode.ShouldNotBe(null);

            var entries = mapNode.Entries.ToArray();

            entries.Count().ShouldBe(2);
        }
        public void Should_generate_operator_node_from_compile_unit()
        {
            var inputText = "(+)";

            var converter = new ParseTreeConverter();

            var             tree = inputText.ParseWith <NqlLanguage>();
            INode <AstNode> root = converter.Visit(tree);

            root.ShouldNotBe(null);
            root.Children.Count().ShouldBe(1);

            var listNode = root.Children.First();

            listNode.ShouldBeOfType <ListNode>();

            var targetNode = (OperatorNode)listNode.Children.First();

            targetNode.Operator.ShouldBe("+");
        }
        public void Should_generate_vector_node()
        {
            var inputText = "[1 2 3]";

            var             tree      = inputText.ParseWith <NqlLanguage>();
            var             converter = new ParseTreeConverter();
            INode <AstNode> root      = converter.Visit(tree);

            root.ShouldNotBe(null);
            root.Children.Count().ShouldBe(1);

            var vectorNode = root.Children.First() as VectorNode;

            vectorNode.ShouldNotBe(null);
            vectorNode.Children.Count().ShouldBe(3);

            var numberNodes = vectorNode.Children.Cast <NumberNode>().ToArray();

            numberNodes[0].Number.ShouldBe("1");
            numberNodes[1].Number.ShouldBe("2");
            numberNodes[2].Number.ShouldBe("3");
        }