/**
  * @param int $index
  *
  * @return mixed
  */
 public function readAt($index)
 {
     if ($index > 0 && $this->lexer->getStream()->cursor() - $this->cursor < $index) {
         $i = 0;
         while (($token = $this->lexer->nextToken()) && $i < $index) {
             $this->input[] = $token;
             ++$i;
         }
     }
     return parent::readAt($index);
 }
Example #2
0
 public function testItShouldReturnNextTokenWhenICallNextTokenMethod()
 {
     $stringStreamProphecy = $this->prophet->prophesize('RegexParser\\Lexer\\StringStream');
     $input = array('^', '[', '_', 'a', '-', 'z', '0', '-', '9', '-', ']', '+', '(', '\\', '.', '\\', '\\');
     $inputReadAt = array('.', '\\');
     $output = array('T_HAT', 'T_LEFT_BRACKET', 'T_UNDERSCORE', 'T_CHAR', 'T_MINUS', 'T_CHAR', 'T_INTEGER', 'T_MINUS', 'T_INTEGER', 'T_MINUS', 'T_RIGHT_BRACKET', 'T_PLUS', 'T_LEFT_PARENTHESIS', null, 'T_CHAR', null, 'T_BACKSLASH');
     $stringStreamProphecy->next()->will(new ReturnPromise($input));
     $stringStreamProphecy->readAt(Argument::type('integer'))->will(new ReturnPromise($inputReadAt));
     $lexer = new Lexer($stringStreamProphecy->reveal());
     foreach ($input as $key => $char) {
         if ($key === 13 || $key === 15) {
             // For escaping
             continue;
         }
         $token = $lexer->nextToken();
         $this->assertInstanceOf('RegexParser\\Lexer\\TokenInterface', $token);
         $this->assertEquals($char, $token->getValue());
         $this->assertEquals($output[$key], $token->getName());
     }
     $stringStreamProphecy->next()->shouldHaveBeenCalledTimes(17);
     // One call for each char and a final one which return false
     $stringStreamProphecy->readAt(Argument::type('integer'))->shouldHaveBeenCalledTimes(2);
     // For escaping
 }