72 lines
1.4 KiB
Go
72 lines
1.4 KiB
Go
|
package ginger
|
||
|
|
||
|
import (
|
||
|
"bytes"
|
||
|
"io"
|
||
|
. "testing"
|
||
|
|
||
|
"github.com/mediocregopher/lexgo"
|
||
|
"github.com/stretchr/testify/assert"
|
||
|
)
|
||
|
|
||
|
var lexTestSrc = `
|
||
|
// this is a comment
|
||
|
// // this is also a comment
|
||
|
a
|
||
|
anIdentifier
|
||
|
1
|
||
|
100
|
||
|
1.5
|
||
|
1.5e9
|
||
|
|
||
|
/* block comment */
|
||
|
prefix /*
|
||
|
Another block comment
|
||
|
/* Embedded */
|
||
|
/*
|
||
|
Super embedded
|
||
|
*/
|
||
|
*/ suffix
|
||
|
|
||
|
// this one is kind of fun, technically it's a comment
|
||
|
/*/
|
||
|
|
||
|
(punctuation,is{cool}<> )
|
||
|
-tab
|
||
|
`
|
||
|
|
||
|
func TestLex(t *T) {
|
||
|
l := newLexer(bytes.NewBufferString(lexTestSrc))
|
||
|
|
||
|
assertNext := func(typ lexgo.TokenType, val string) {
|
||
|
t.Logf("asserting %q", val)
|
||
|
tok := l.Next()
|
||
|
assert.Equal(t, typ, tok.TokenType)
|
||
|
assert.Equal(t, val, tok.Val)
|
||
|
}
|
||
|
|
||
|
assertNext(identifier, "a")
|
||
|
assertNext(identifier, "anIdentifier")
|
||
|
assertNext(number, "1")
|
||
|
assertNext(number, "100")
|
||
|
assertNext(number, "1.5")
|
||
|
assertNext(number, "1.5e9")
|
||
|
assertNext(identifier, "prefix")
|
||
|
assertNext(identifier, "suffix")
|
||
|
assertNext(punctuation, "(")
|
||
|
assertNext(identifier, "punctuation")
|
||
|
assertNext(punctuation, ",")
|
||
|
assertNext(identifier, "is")
|
||
|
assertNext(punctuation, "{")
|
||
|
assertNext(identifier, "cool")
|
||
|
assertNext(punctuation, "}")
|
||
|
assertNext(punctuation, "<")
|
||
|
assertNext(punctuation, ">")
|
||
|
assertNext(punctuation, ")")
|
||
|
assertNext(identifier, "-tab")
|
||
|
|
||
|
tok := l.Next()
|
||
|
assert.Equal(t, tok.TokenType, lexgo.Err)
|
||
|
assert.Equal(t, tok.Err, io.EOF)
|
||
|
}
|