void NextSecond_return_second()
        {
            var reader = new SourceStringReader("abc");

            reader.Advance();

            Assert.Equal('b', reader.CurrentChar());
        }
        void PeekAtStart_return_first()
        {
            var reader = new SourceStringReader("abc");

            var c = reader.CurrentChar();

            Assert.Equal('a', c);
        }
        void PeekAfterOneNext_return_second()
        {
            var reader = new SourceStringReader("abc");

            reader.Advance();
            var c = reader.CurrentChar();

            Assert.Equal('b', c);
        }
        void NextNonWhiteChar_at_start()
        {
            var reader = new SourceStringReader(" \t \r abc");

            var success = reader.AdvanceUntilNonWhite();

            Assert.True(success);

            Assert.Equal('a', reader.CurrentChar());
        }
        void PeekAtTheEOF_throws()
        {
            var reader = new SourceStringReader("abc");

            reader.Advance();
            reader.Advance();
            reader.Advance();

            Assert.Throws <InvalidOperationException>(() => reader.CurrentChar());
        }
        void NextAtStart_return_first()
        {
            var reader = new SourceStringReader("abc");

            Assert.Equal('a', reader.CurrentChar());
        }