Merge pull request #1983 from shirou/master
[Go] Add CommonTokenStream test.
This commit is contained in:
commit
593b49fa3d
|
@ -0,0 +1,154 @@
|
||||||
|
// Copyright (c) 2012-2017 The ANTLR Project. All rights reserved.
|
||||||
|
// Use of this file is governed by the BSD 3-clause license that
|
||||||
|
// can be found in the LICENSE.txt file in the project root.
|
||||||
|
|
||||||
|
package antlr
|
||||||
|
|
||||||
|
import (
|
||||||
|
"testing"
|
||||||
|
)
|
||||||
|
|
||||||
|
type commonTokenStreamTestLexer struct {
|
||||||
|
*BaseLexer
|
||||||
|
|
||||||
|
tokens []Token
|
||||||
|
i int
|
||||||
|
}
|
||||||
|
|
||||||
|
func (l *commonTokenStreamTestLexer) NextToken() Token {
|
||||||
|
tmp := l.tokens[l.i]
|
||||||
|
l.i++
|
||||||
|
return tmp
|
||||||
|
}
|
||||||
|
|
||||||
|
func TestCommonTokenStreamOffChannel(t *testing.T) {
|
||||||
|
assert := assertNew(t)
|
||||||
|
lexEngine := &commonTokenStreamTestLexer{
|
||||||
|
tokens: []Token{
|
||||||
|
newTestCommonToken(1, " ", LexerHidden), // 0
|
||||||
|
newTestCommonToken(1, "x", LexerDefaultTokenChannel), // 1
|
||||||
|
newTestCommonToken(1, " ", LexerHidden), // 2
|
||||||
|
newTestCommonToken(1, "=", LexerDefaultTokenChannel), // 3
|
||||||
|
newTestCommonToken(1, "34", LexerDefaultTokenChannel), // 4
|
||||||
|
newTestCommonToken(1, " ", LexerHidden), // 5
|
||||||
|
newTestCommonToken(1, " ", LexerHidden), // 6
|
||||||
|
newTestCommonToken(1, ";", LexerDefaultTokenChannel), // 7
|
||||||
|
newTestCommonToken(1, "\n", LexerHidden), // 9
|
||||||
|
newTestCommonToken(TokenEOF, "", LexerDefaultTokenChannel), // 10
|
||||||
|
},
|
||||||
|
}
|
||||||
|
tokens := NewCommonTokenStream(lexEngine, TokenDefaultChannel)
|
||||||
|
|
||||||
|
assert.Equal("x", tokens.LT(1).GetText()) // must skip first off channel token
|
||||||
|
tokens.Consume()
|
||||||
|
assert.Equal("=", tokens.LT(1).GetText())
|
||||||
|
assert.Equal("x", tokens.LT(-1).GetText())
|
||||||
|
|
||||||
|
tokens.Consume()
|
||||||
|
assert.Equal("34", tokens.LT(1).GetText())
|
||||||
|
assert.Equal("=", tokens.LT(-1).GetText())
|
||||||
|
|
||||||
|
tokens.Consume()
|
||||||
|
assert.Equal(";", tokens.LT(1).GetText())
|
||||||
|
assert.Equal("34", tokens.LT(-1).GetText())
|
||||||
|
|
||||||
|
tokens.Consume()
|
||||||
|
assert.Equal(TokenEOF, tokens.LT(1).GetTokenType())
|
||||||
|
assert.Equal(";", tokens.LT(-1).GetText())
|
||||||
|
|
||||||
|
assert.Equal("34", tokens.LT(-2).GetText())
|
||||||
|
assert.Equal("=", tokens.LT(-3).GetText())
|
||||||
|
assert.Equal("x", tokens.LT(-4).GetText())
|
||||||
|
}
|
||||||
|
|
||||||
|
func TestCommonTokenStreamFetchOffChannel(t *testing.T) {
|
||||||
|
assert := assertNew(t)
|
||||||
|
lexEngine := &commonTokenStreamTestLexer{
|
||||||
|
tokens: []Token{
|
||||||
|
newTestCommonToken(1, " ", LexerHidden), // 0
|
||||||
|
newTestCommonToken(1, "x", LexerDefaultTokenChannel), // 1
|
||||||
|
newTestCommonToken(1, " ", LexerHidden), // 2
|
||||||
|
newTestCommonToken(1, "=", LexerDefaultTokenChannel), // 3
|
||||||
|
newTestCommonToken(1, "34", LexerDefaultTokenChannel), // 4
|
||||||
|
newTestCommonToken(1, " ", LexerHidden), // 5
|
||||||
|
newTestCommonToken(1, " ", LexerHidden), // 6
|
||||||
|
newTestCommonToken(1, ";", LexerDefaultTokenChannel), // 7
|
||||||
|
newTestCommonToken(1, " ", LexerHidden), // 8
|
||||||
|
newTestCommonToken(1, "\n", LexerHidden), // 9
|
||||||
|
newTestCommonToken(TokenEOF, "", LexerDefaultTokenChannel), // 10
|
||||||
|
},
|
||||||
|
}
|
||||||
|
tokens := NewCommonTokenStream(lexEngine, TokenDefaultChannel)
|
||||||
|
tokens.Fill()
|
||||||
|
|
||||||
|
assert.Nil(tokens.getHiddenTokensToLeft(0, -1))
|
||||||
|
assert.Nil(tokens.getHiddenTokensToRight(0, -1))
|
||||||
|
|
||||||
|
assert.Equal("[[@0,0:0=' ',<1>,channel=1,0:-1]]", tokensToString(tokens.getHiddenTokensToLeft(1, -1)))
|
||||||
|
assert.Equal("[[@2,0:0=' ',<1>,channel=1,0:-1]]", tokensToString(tokens.getHiddenTokensToRight(1, -1)))
|
||||||
|
|
||||||
|
assert.Nil(tokens.getHiddenTokensToLeft(2, -1))
|
||||||
|
assert.Nil(tokens.getHiddenTokensToRight(2, -1))
|
||||||
|
|
||||||
|
assert.Equal("[[@2,0:0=' ',<1>,channel=1,0:-1]]", tokensToString(tokens.getHiddenTokensToLeft(3, -1)))
|
||||||
|
assert.Nil(tokens.getHiddenTokensToRight(3, -1))
|
||||||
|
|
||||||
|
assert.Nil(tokens.getHiddenTokensToLeft(4, -1))
|
||||||
|
assert.Equal("[[@5,0:0=' ',<1>,channel=1,0:-1], [@6,0:0=' ',<1>,channel=1,0:-1]]",
|
||||||
|
tokensToString(tokens.getHiddenTokensToRight(4, -1)))
|
||||||
|
|
||||||
|
assert.Nil(tokens.getHiddenTokensToLeft(5, -1))
|
||||||
|
assert.Equal("[[@6,0:0=' ',<1>,channel=1,0:-1]]",
|
||||||
|
tokensToString(tokens.getHiddenTokensToRight(5, -1)))
|
||||||
|
|
||||||
|
assert.Equal("[[@5,0:0=' ',<1>,channel=1,0:-1]]",
|
||||||
|
tokensToString(tokens.getHiddenTokensToLeft(6, -1)))
|
||||||
|
assert.Nil(tokens.getHiddenTokensToRight(6, -1))
|
||||||
|
|
||||||
|
assert.Equal("[[@5,0:0=' ',<1>,channel=1,0:-1], [@6,0:0=' ',<1>,channel=1,0:-1]]",
|
||||||
|
tokensToString(tokens.getHiddenTokensToLeft(7, -1)))
|
||||||
|
assert.Equal("[[@8,0:0=' ',<1>,channel=1,0:-1], [@9,0:0='\\n',<1>,channel=1,0:-1]]",
|
||||||
|
tokensToString(tokens.getHiddenTokensToRight(7, -1)))
|
||||||
|
|
||||||
|
assert.Nil(tokens.getHiddenTokensToLeft(8, -1))
|
||||||
|
assert.Equal("[[@9,0:0='\\n',<1>,channel=1,0:-1]]",
|
||||||
|
tokensToString(tokens.getHiddenTokensToRight(8, -1)))
|
||||||
|
|
||||||
|
assert.Equal("[[@8,0:0=' ',<1>,channel=1,0:-1]]",
|
||||||
|
tokensToString(tokens.getHiddenTokensToLeft(9, -1)))
|
||||||
|
assert.Nil(tokens.getHiddenTokensToRight(9, -1))
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
type commonTokenStreamTestLexerSingleEOF struct {
|
||||||
|
*BaseLexer
|
||||||
|
|
||||||
|
tokens []Token
|
||||||
|
i int
|
||||||
|
}
|
||||||
|
|
||||||
|
func (l *commonTokenStreamTestLexerSingleEOF) NextToken() Token {
|
||||||
|
return newTestCommonToken(TokenEOF, "", LexerDefaultTokenChannel)
|
||||||
|
}
|
||||||
|
|
||||||
|
func TestCommonTokenStreamSingleEOF(t *testing.T) {
|
||||||
|
assert := assertNew(t)
|
||||||
|
lexEngine := &commonTokenStreamTestLexerSingleEOF{}
|
||||||
|
tokens := NewCommonTokenStream(lexEngine, TokenDefaultChannel)
|
||||||
|
tokens.Fill()
|
||||||
|
|
||||||
|
assert.Equal(TokenEOF, tokens.LA(1))
|
||||||
|
assert.Equal(0, tokens.index)
|
||||||
|
assert.Equal(1, tokens.Size())
|
||||||
|
}
|
||||||
|
|
||||||
|
func TestCommonTokenStreamCannotConsumeEOF(t *testing.T) {
|
||||||
|
assert := assertNew(t)
|
||||||
|
lexEngine := &commonTokenStreamTestLexerSingleEOF{}
|
||||||
|
tokens := NewCommonTokenStream(lexEngine, TokenDefaultChannel)
|
||||||
|
tokens.Fill()
|
||||||
|
assert.Equal(TokenEOF, tokens.LA(1))
|
||||||
|
assert.Equal(0, tokens.index)
|
||||||
|
assert.Equal(1, tokens.Size())
|
||||||
|
assert.Panics(tokens.Consume)
|
||||||
|
}
|
|
@ -0,0 +1,98 @@
|
||||||
|
// Copyright (c) 2012-2017 The ANTLR Project. All rights reserved.
|
||||||
|
// Use of this file is governed by the BSD 3-clause license that
|
||||||
|
// can be found in the LICENSE.txt file in the project root.
|
||||||
|
|
||||||
|
// These assert functions are borrowed from https://github.com/stretchr/testify/ (MIT License)
|
||||||
|
|
||||||
|
package antlr
|
||||||
|
|
||||||
|
import (
|
||||||
|
"fmt"
|
||||||
|
"reflect"
|
||||||
|
"testing"
|
||||||
|
)
|
||||||
|
|
||||||
|
type assert struct {
|
||||||
|
t *testing.T
|
||||||
|
}
|
||||||
|
|
||||||
|
func assertNew(t *testing.T) *assert {
|
||||||
|
return &assert{
|
||||||
|
t: t,
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
func (a *assert) Equal(expected, actual interface{}) bool {
|
||||||
|
if !objectsAreEqual(expected, actual) {
|
||||||
|
return a.Fail(fmt.Sprintf("Not equal:\n"+
|
||||||
|
"expected: %#v\n"+
|
||||||
|
" actual: %#v\n", expected, actual))
|
||||||
|
}
|
||||||
|
return true
|
||||||
|
}
|
||||||
|
|
||||||
|
func objectsAreEqual(expected, actual interface{}) bool {
|
||||||
|
if expected == nil || actual == nil {
|
||||||
|
return expected == actual
|
||||||
|
}
|
||||||
|
return reflect.DeepEqual(expected, actual)
|
||||||
|
}
|
||||||
|
|
||||||
|
func (a *assert) Nil(object interface{}) bool {
|
||||||
|
if isNil(object) {
|
||||||
|
return true
|
||||||
|
}
|
||||||
|
return a.Fail(fmt.Sprintf("Expected nil, but got: %#v", object))
|
||||||
|
}
|
||||||
|
|
||||||
|
func (a *assert) NotNil(object interface{}) bool {
|
||||||
|
if !isNil(object) {
|
||||||
|
return true
|
||||||
|
}
|
||||||
|
return a.Fail("Expected value not to be nil.")
|
||||||
|
}
|
||||||
|
|
||||||
|
// isNil checks if a specified object is nil or not, without Failing.
|
||||||
|
func isNil(object interface{}) bool {
|
||||||
|
if object == nil {
|
||||||
|
return true
|
||||||
|
}
|
||||||
|
|
||||||
|
value := reflect.ValueOf(object)
|
||||||
|
kind := value.Kind()
|
||||||
|
if kind >= reflect.Chan && kind <= reflect.Slice && value.IsNil() {
|
||||||
|
return true
|
||||||
|
}
|
||||||
|
|
||||||
|
return false
|
||||||
|
}
|
||||||
|
|
||||||
|
func (a *assert) Panics(f func()) bool {
|
||||||
|
if funcDidPanic, panicValue := didPanic(f); !funcDidPanic {
|
||||||
|
return a.Fail(fmt.Sprintf("func %#v should panic\n\r\tPanic value:\t%v", f, panicValue))
|
||||||
|
}
|
||||||
|
|
||||||
|
return true
|
||||||
|
}
|
||||||
|
|
||||||
|
// Fail reports a failure through
|
||||||
|
func (a *assert) Fail(failureMessage string) bool {
|
||||||
|
a.t.Errorf("%s", failureMessage)
|
||||||
|
return false
|
||||||
|
}
|
||||||
|
|
||||||
|
// didPanic returns true if the function passed to it panics. Otherwise, it returns false.
|
||||||
|
func didPanic(f func()) (bool, interface{}) {
|
||||||
|
didPanic := false
|
||||||
|
var message interface{}
|
||||||
|
func() {
|
||||||
|
defer func() {
|
||||||
|
if message = recover(); message != nil {
|
||||||
|
didPanic = true
|
||||||
|
}
|
||||||
|
}()
|
||||||
|
// call the target function
|
||||||
|
f()
|
||||||
|
}()
|
||||||
|
return didPanic, message
|
||||||
|
}
|
|
@ -0,0 +1,107 @@
|
||||||
|
// Copyright (c) 2012-2017 The ANTLR Project. All rights reserved.
|
||||||
|
// Use of this file is governed by the BSD 3-clause license that
|
||||||
|
// can be found in the LICENSE.txt file in the project root.
|
||||||
|
|
||||||
|
package antlr
|
||||||
|
|
||||||
|
/*
|
||||||
|
LexerB is a lexer for testing purpose.
|
||||||
|
|
||||||
|
This file is generated from this grammer.
|
||||||
|
|
||||||
|
lexer grammar LexerB;
|
||||||
|
|
||||||
|
ID : 'a'..'z'+;
|
||||||
|
INT : '0'..'9'+;
|
||||||
|
SEMI : ';';
|
||||||
|
ASSIGN : '=';
|
||||||
|
PLUS : '+';
|
||||||
|
MULT : '*';
|
||||||
|
WS : ' '+;
|
||||||
|
*/
|
||||||
|
|
||||||
|
var lexerB_serializedLexerAtn = []uint16{
|
||||||
|
3, 24715, 42794, 33075, 47597, 16764, 15335, 30598, 22884, 2, 9, 40, 8,
|
||||||
|
1, 4, 2, 9, 2, 4, 3, 9, 3, 4, 4, 9, 4, 4, 5, 9, 5, 4, 6, 9, 6, 4, 7, 9,
|
||||||
|
7, 4, 8, 9, 8, 3, 2, 6, 2, 19, 10, 2, 13, 2, 14, 2, 20, 3, 3, 6, 3, 24,
|
||||||
|
10, 3, 13, 3, 14, 3, 25, 3, 4, 3, 4, 3, 5, 3, 5, 3, 6, 3, 6, 3, 7, 3, 7,
|
||||||
|
3, 8, 6, 8, 37, 10, 8, 13, 8, 14, 8, 38, 2, 2, 9, 3, 3, 5, 4, 7, 5, 9,
|
||||||
|
6, 11, 7, 13, 8, 15, 9, 3, 2, 2, 2, 42, 2, 3, 3, 2, 2, 2, 2, 5, 3, 2, 2,
|
||||||
|
2, 2, 7, 3, 2, 2, 2, 2, 9, 3, 2, 2, 2, 2, 11, 3, 2, 2, 2, 2, 13, 3, 2,
|
||||||
|
2, 2, 2, 15, 3, 2, 2, 2, 3, 18, 3, 2, 2, 2, 5, 23, 3, 2, 2, 2, 7, 27, 3,
|
||||||
|
2, 2, 2, 9, 29, 3, 2, 2, 2, 11, 31, 3, 2, 2, 2, 13, 33, 3, 2, 2, 2, 15,
|
||||||
|
36, 3, 2, 2, 2, 17, 19, 4, 99, 124, 2, 18, 17, 3, 2, 2, 2, 19, 20, 3, 2,
|
||||||
|
2, 2, 20, 18, 3, 2, 2, 2, 20, 21, 3, 2, 2, 2, 21, 4, 3, 2, 2, 2, 22, 24,
|
||||||
|
4, 50, 59, 2, 23, 22, 3, 2, 2, 2, 24, 25, 3, 2, 2, 2, 25, 23, 3, 2, 2,
|
||||||
|
2, 25, 26, 3, 2, 2, 2, 26, 6, 3, 2, 2, 2, 27, 28, 7, 61, 2, 2, 28, 8, 3,
|
||||||
|
2, 2, 2, 29, 30, 7, 63, 2, 2, 30, 10, 3, 2, 2, 2, 31, 32, 7, 45, 2, 2,
|
||||||
|
32, 12, 3, 2, 2, 2, 33, 34, 7, 44, 2, 2, 34, 14, 3, 2, 2, 2, 35, 37, 7,
|
||||||
|
34, 2, 2, 36, 35, 3, 2, 2, 2, 37, 38, 3, 2, 2, 2, 38, 36, 3, 2, 2, 2, 38,
|
||||||
|
39, 3, 2, 2, 2, 39, 16, 3, 2, 2, 2, 6, 2, 20, 25, 38, 2,
|
||||||
|
}
|
||||||
|
|
||||||
|
var lexerB_lexerDeserializer = NewATNDeserializer(nil)
|
||||||
|
var lexerB_lexerAtn = lexerB_lexerDeserializer.DeserializeFromUInt16(lexerB_serializedLexerAtn)
|
||||||
|
|
||||||
|
var lexerB_lexerChannelNames = []string{
|
||||||
|
"DEFAULT_TOKEN_CHANNEL", "HIDDEN",
|
||||||
|
}
|
||||||
|
|
||||||
|
var lexerB_lexerModeNames = []string{
|
||||||
|
"DEFAULT_MODE",
|
||||||
|
}
|
||||||
|
|
||||||
|
var lexerB_lexerLiteralNames = []string{
|
||||||
|
"", "", "", "';'", "'='", "'+'", "'*'",
|
||||||
|
}
|
||||||
|
|
||||||
|
var lexerB_lexerSymbolicNames = []string{
|
||||||
|
"", "ID", "INT", "SEMI", "ASSIGN", "PLUS", "MULT", "WS",
|
||||||
|
}
|
||||||
|
|
||||||
|
var lexerB_lexerRuleNames = []string{
|
||||||
|
"ID", "INT", "SEMI", "ASSIGN", "PLUS", "MULT", "WS",
|
||||||
|
}
|
||||||
|
|
||||||
|
type LexerB struct {
|
||||||
|
*BaseLexer
|
||||||
|
channelNames []string
|
||||||
|
modeNames []string
|
||||||
|
// TODO: EOF string
|
||||||
|
}
|
||||||
|
|
||||||
|
var lexerB_lexerDecisionToDFA = make([]*DFA, len(lexerB_lexerAtn.DecisionToState))
|
||||||
|
|
||||||
|
func init() {
|
||||||
|
for index, ds := range lexerB_lexerAtn.DecisionToState {
|
||||||
|
lexerB_lexerDecisionToDFA[index] = NewDFA(ds, index)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
func NewLexerB(input CharStream) *LexerB {
|
||||||
|
l := new(LexerB)
|
||||||
|
|
||||||
|
l.BaseLexer = NewBaseLexer(input)
|
||||||
|
l.Interpreter = NewLexerATNSimulator(l, lexerB_lexerAtn, lexerB_lexerDecisionToDFA, NewPredictionContextCache())
|
||||||
|
|
||||||
|
l.channelNames = lexerB_lexerChannelNames
|
||||||
|
l.modeNames = lexerB_lexerModeNames
|
||||||
|
l.RuleNames = lexerB_lexerRuleNames
|
||||||
|
l.LiteralNames = lexerB_lexerLiteralNames
|
||||||
|
l.SymbolicNames = lexerB_lexerSymbolicNames
|
||||||
|
l.GrammarFileName = "LexerB.g4"
|
||||||
|
// TODO: l.EOF = TokenEOF
|
||||||
|
|
||||||
|
return l
|
||||||
|
}
|
||||||
|
|
||||||
|
// LexerB tokens.
|
||||||
|
const (
|
||||||
|
LexerBID = 1
|
||||||
|
LexerBINT = 2
|
||||||
|
LexerBSEMI = 3
|
||||||
|
LexerBASSIGN = 4
|
||||||
|
LexerBPLUS = 5
|
||||||
|
LexerBMULT = 6
|
||||||
|
LexerBWS = 7
|
||||||
|
)
|
|
@ -0,0 +1,30 @@
|
||||||
|
package antlr
|
||||||
|
|
||||||
|
import (
|
||||||
|
"fmt"
|
||||||
|
"strings"
|
||||||
|
)
|
||||||
|
|
||||||
|
// newTestCommonToken create common token with tokentype, text and channel
|
||||||
|
// notice: test purpose only
|
||||||
|
func newTestCommonToken(tokenType int, text string, channel int) *CommonToken {
|
||||||
|
t := new(CommonToken)
|
||||||
|
t.BaseToken = new(BaseToken)
|
||||||
|
t.tokenType = tokenType
|
||||||
|
t.channel = channel
|
||||||
|
t.text = text
|
||||||
|
t.line = 0
|
||||||
|
t.column = -1
|
||||||
|
return t
|
||||||
|
}
|
||||||
|
|
||||||
|
// tokensToString returnes []Tokens string
|
||||||
|
// notice: test purpose only
|
||||||
|
func tokensToString(tokens []Token) string {
|
||||||
|
buf := make([]string, len(tokens))
|
||||||
|
for i, token := range tokens {
|
||||||
|
buf[i] = fmt.Sprintf("%v", token)
|
||||||
|
}
|
||||||
|
|
||||||
|
return "[" + strings.Join(buf, ", ") + "]"
|
||||||
|
}
|
Loading…
Reference in New Issue