private void DoPrinterTest(LNode node, StringBuilder sb)
        {
            sb.Length = 0;
            _messages.List.Clear();
            var p = LesNodePrinter.New(sb, "\t", "\n", _messages);

            p.Print(node);
            Assert.AreEqual(0, _messages.List.Count);
            var reparsed = LesLanguageService.Value.Parse(sb.ToString(), _messages);

            Assert.AreEqual(0, _messages.List.Count);
            Assert.AreEqual(1, reparsed.Count);
            Assert.AreEqual(node, reparsed[0]);
        }
        protected override MessageHolder Test(Mode mode, int parseErrors, string str, params LNode[] nodes)
        {
            var messages = new MessageHolder();

            if (parseErrors == 0)
            {
                if (mode == Mode.Exact)
                {
                    var sb      = new StringBuilder();
                    var printer = LesNodePrinter.New(sb, "  ", "\n", messages);
                    var sep     = "";
                    foreach (LNode node in nodes)
                    {
                        sb.Append(sep);
                        sep = "\n";
                        printer.Print(node);
                    }
                    Assert.AreEqual(str, sb.ToString());
                }
                else
                {
                    // Start by parsing. If parsing fails, just stop; such errors are
                    // already reported by LesParserTests so we need not report them here.
                    var results = LesLanguageService.Value.Parse(str, messages);
                    if (messages.List.Count == 0)
                    {
                        var sb = new StringBuilder();
                        foreach (LNode node in nodes)
                        {
                            DoPrinterTest(node, sb);
                        }
                    }
                }
            }
            return(messages);
        }