#!/usr/bin/ruby
# encoding: utf-8

require 'antlr3/test/functional'

class TestLexerRuleReference < ANTLR3::Test::Functional

  inline_grammar( <<-'END' )
    lexer grammar RuleProperty;
    options {
      language = Ruby;
    }
    
    @lexer::init {
      @properties = []
    }
    @lexer::members {
      attr_reader :properties
    }
    
    IDENTIFIER: 
            ('a'..'z'|'A'..'Z'|'_') ('a'..'z'|'A'..'Z'|'0'..'9'|'_')*
            {
              @properties << [$text, $type, $line, $pos, $index, $channel, $start, $stop]
            }
        ;
    WS: (' ' | '\n')+;
  END

  example "referencing lexer rule properties" do
    lexer = RuleProperty::Lexer.new( "foobar _ab98 \n A12sdf" )
    tokens = lexer.map { |tk| tk }
    
    lexer.properties.should have( 3 ).things
    text, type, line, pos, index, channel, start, stop = lexer.properties[ 0 ]
    text.should == 'foobar'
    type.should == RuleProperty::TokenData::IDENTIFIER
    line.should == 1
    pos.should == 0
    index.should == -1
    channel.should == ANTLR3::DEFAULT_CHANNEL
    start.should == 0
    stop.should == 5
    
    text, type, line, pos, index, channel, start, stop = lexer.properties[ 1 ]
    text.should == '_ab98'
    type.should == RuleProperty::TokenData::IDENTIFIER
    line.should == 1
    pos.should == 7
    index.should == -1
    channel.should == ANTLR3::DEFAULT_CHANNEL
    start.should == 7
    stop.should == 11
    
    lexer.properties.should have( 3 ).things
    text, type, line, pos, index, channel, start, stop = lexer.properties[ 2 ]
    text.should == 'A12sdf'
    type.should == RuleProperty::TokenData::IDENTIFIER
    line.should == 2
    pos.should == 1
    index.should == -1
    channel.should == ANTLR3::DEFAULT_CHANNEL
    start.should == 15
    stop.should == 20
  end


end

class TestLexerRuleLabel < ANTLR3::Test::Functional
  inline_grammar( <<-'END' )
    lexer grammar LexerRuleLabel;
    options {
      language = Ruby;
    }
    
    @members { attr_reader :token_text }
    
    A: 'a'..'z' WS '0'..'9'
            {
              @token_text = $WS.text
            }
        ;
    
    fragment WS  :
            (   ' '
            |   '\t'
            |  ( '\n'
                |	'\r\n'
                |	'\r'
                )
            )+
            { $channel = HIDDEN }
        ;
  END
  
  example "referencing other token rule values with labels" do
    lexer = LexerRuleLabel::Lexer.new 'a  2'
    lexer.next_token
    lexer.token_text.should == '  '
  end

end