internal static FormatPatternNode[] Parse(string source)
 {
     FormatToken[] tokens = FormatTokenizer.Tokenize(source);
     FormatTokenBuffer buffer = new FormatTokenBuffer(tokens);
     FormatPatternParser parser = new FormatPatternParser(buffer);
     return parser.Parse();
 }
        public void FormatTokenBuffer_Peek()
        {
            Buffer<FormatToken> buffer = new FormatTokenBuffer(new List<FormatToken>
            {
                FormatToken.CreateLiteral("Hello World")
            });

            Assert.AreEqual(0, buffer.Position);
            Assert.AreEqual("Hello World", buffer.Peek().Value);
            Assert.AreEqual(0, buffer.Position);
        }
        public void FormatTokenBuffer_Create()
        {
            Buffer<FormatToken> buffer = new FormatTokenBuffer(new List<FormatToken>
            {
                FormatToken.CreateLiteral("Hello World"),
                FormatToken.CreateSymbol('@')
            });

            Assert.AreEqual(2, buffer.Length);
            Assert.AreEqual(0, buffer.Position);
        }
        public void FormatTokenBuffer_Consume()
        {
            Buffer<FormatToken> buffer = new FormatTokenBuffer(new List<FormatToken>
            {
                FormatToken.CreateLiteral("0"),
                FormatToken.CreateLiteral("1"),
                FormatToken.CreateLiteral("2"),
                FormatToken.CreateLiteral("3")
            });

            Assert.AreEqual(0, buffer.Position);
            buffer.Consume(2);
            Assert.AreEqual(2, buffer.Position);
            Assert.AreEqual("2", buffer.Read().Value);
            Assert.AreEqual(3, buffer.Position);
        }
        public void TokenBuffer_Seek()
        {
            Buffer<FormatToken> buffer = new FormatTokenBuffer(new List<FormatToken>
            {
                FormatToken.CreateLiteral("Hello World"),
                FormatToken.CreateSymbol('@')
            });

            Assert.AreEqual(0, buffer.Position);
            Assert.AreEqual("Hello World", buffer.Read().Value);
            Assert.AreEqual(1, buffer.Position);
            Assert.IsTrue(buffer.Seek(0));
            Assert.AreEqual(0, buffer.Position);
            Assert.IsFalse(buffer.Seek(2));
            Assert.AreEqual(0, buffer.Position);
        }
        public void TokenBuffer_Rewind()
        {
            Buffer<FormatToken> buffer = new FormatTokenBuffer(new List<FormatToken>
            {
                FormatToken.CreateLiteral("Hello World"),
                FormatToken.CreateSymbol('@'),
                FormatToken.CreateWhitespace('\t')
            });

            buffer.Seek(2);
            Assert.AreEqual(2, buffer.Position);
            buffer.Rewind();
            Assert.AreEqual(0, buffer.Position);
        }
 private FormatPatternParser(FormatTokenBuffer buffer)
 {
     _buffer = buffer;
 }