Пример #1
0
        public void CanReadAhead_OnMovedEnumeratorWithinSequence_ReturnsTrue()
        {
            var enumerator = new ReadAheadEnumerator<char>("ab");
            enumerator.MoveNext();

            enumerator.CanReadAhead.Should().BeTrue();
        }
Пример #2
0
        public void CanReadAhead_OnLastItem_ReturnsFalse()
        {
            var enumerator = new ReadAheadEnumerator<char>("ab");
            enumerator.MoveNext();
            enumerator.MoveNext();

            enumerator.CanReadAhead.Should().BeFalse();
        }
Пример #3
0
 private IToken GetToken(ReadAheadEnumerator<char> enumerator)
 {
     var c = enumerator.Current;
     if (char.IsLetterOrDigit(c))
         return new Character(c);
     if (c == ' ' || c == '\t')
         return new Character(c);
     if (@".:,;-/\(){}#+*".Contains(c))
         return new Character(c);
     if (c == '\r' && enumerator.CanReadAhead && enumerator.ItemAhead == '\n')
     {
         enumerator.MoveNext();
         return new EOL();
     }
     throw new ArgumentOutOfRangeException("c", string.Format("'{0}' is not a supported character.", c));
 }
Пример #4
0
        public IEnumerable<IToken> Tokenize(string inputText)
        {
            var enumer = new ReadAheadEnumerator<char>(inputText);

            while (enumer.MoveNext())
            {
                yield return GetToken(enumer);
                //if (enumer.ReadAhead(1) == '\n')
                //{
                //    enumer.MoveNext();
                //    yield return
                //}
            }
            //foreach (char c in inputText)
            //{
            //    yield return GetToken(c);
            //}
            yield return new EOF();
        }
Пример #5
0
        public void ApiDemo()
        {
            var enumerator = new ReadAheadEnumerator<char>("ab");

            bool thereIsAnItem;
            Action moveNextAction = () => { enumerator.MoveNext(); };
            char currentItem;
            Action getCurrentAction = () => { var dummy = enumerator.Current; };
            Action getItemAheadAction = () => { var dummy = enumerator.ItemAhead; };

            // Enumerator has not been moved
            getCurrentAction.ShouldThrow<InvalidOperationException>()
                            .WithMessage("Move next has never been called.");

            // Move to the 1st item
            thereIsAnItem = enumerator.MoveNext();

            thereIsAnItem.Should().BeTrue();
            currentItem = enumerator.Current;
            currentItem.Should().Be('a');
            enumerator.CanReadAhead.Should().BeTrue();
            enumerator.ItemAhead.Should().Be('b');

            // Move to the 2nd item
            thereIsAnItem = enumerator.MoveNext();

            thereIsAnItem.Should().BeTrue();
            enumerator.Current.Should().Be('b');
            enumerator.CanReadAhead.Should().BeFalse();
            getItemAheadAction.ShouldThrow<InvalidOperationException>()
                              .WithMessage("The enumerator reached the last item of the sequence and thus cannot read ahead.");

            // Move beyond the end
            thereIsAnItem = enumerator.MoveNext();

            thereIsAnItem.Should().BeFalse();
            getCurrentAction.ShouldThrow<InvalidOperationException>()
                            .WithMessage("The enumerator reached the end of the sequence.");
            moveNextAction.ShouldThrow<InvalidOperationException>()
                          .WithMessage("The enumerator reached the end of the sequence.");
        }
Пример #6
0
        public void Current_AfterTheFirstMoveNext_ReturnsTheFirstItem()
        {
            var enumerator = new ReadAheadEnumerator<char>("ab");
            enumerator.MoveNext();

            var actual = enumerator.Current;

            actual.Should().Be('a');
        }
Пример #7
0
        public void MoveNext_ToTheLastItem_ReturnsTrue()
        {
            var enumerator = new ReadAheadEnumerator<char>("ab");
            enumerator.MoveNext();

            // Act
            var actual = enumerator.MoveNext();

            actual.Should().BeTrue();
        }
Пример #8
0
        public void MoveNext_OnNewEnumeratorWithNonEmptySequence_ReturnsTrue()
        {
            var enumerator = new ReadAheadEnumerator<char>("ab");

            var actual = enumerator.MoveNext();

            actual.Should().BeTrue();
        }
Пример #9
0
        public void ItemAhead_OnLastItem_ThrowsProperException()
        {
            var enumerator = new ReadAheadEnumerator<char>("ab");
            enumerator.MoveNext();
            enumerator.MoveNext();

            new Action(() => { var dummy = enumerator.ItemAhead; }).ShouldThrow<InvalidOperationException>()
                                                                   .WithMessage("The enumerator reached the last item of the sequence and thus cannot read ahead.");
        }
Пример #10
0
        public void FullScenarioWithEmptySequence()
        {
            var enumerator = new ReadAheadEnumerator<char>("");

            Action moveNextAction = () => { enumerator.MoveNext(); };
            Action getCurrentAction = () => { var dummy = enumerator.Current; };
            Action getItemAheadAction = () => { var dummy = enumerator.ItemAhead; };

            var thereIsAnItem = enumerator.MoveNext();
            thereIsAnItem.Should().BeFalse();
            enumerator.CanReadAhead.Should().BeFalse();
            getCurrentAction.ShouldThrow<InvalidOperationException>();
            getItemAheadAction.ShouldThrow<InvalidOperationException>();
            moveNextAction.ShouldThrow<InvalidOperationException>();
        }
Пример #11
0
        public void Current_OnNewEnumeratorWithinSequence_ThrowsAProperException()
        {
            var enumerator = new ReadAheadEnumerator<char>("ab");

            new Action(() => { var dummy = enumerator.Current; }).ShouldThrow<InvalidOperationException>()
                                                                 .WithMessage("Move next has never been called.");
        }