feature: parser
This commit is contained in:
88
scanner/scanner_test.go
Normal file
88
scanner/scanner_test.go
Normal file
@@ -0,0 +1,88 @@
|
||||
package scanner
|
||||
|
||||
import (
|
||||
"testing"
|
||||
)
|
||||
|
||||
func TestSimpleLine(t *testing.T) {
|
||||
src := "origin is (1, 2);"
|
||||
sc := NewScannerFromString(src)
|
||||
|
||||
expect := []TokenType{
|
||||
ORIGIN, IS, L_BRACKET, CONST_ID, COMMA,
|
||||
CONST_ID, R_BRACKET, SEMICO, NONTOKEN,
|
||||
}
|
||||
|
||||
for i, et := range expect {
|
||||
tok := sc.GetToken()
|
||||
t.Logf("%s: type %d, value: %f, func: %p", tok.Lexeme, tok.Type, tok.Value, tok.Func)
|
||||
if tok.Type != et {
|
||||
t.Fatalf("token %d: expect %v, got %v (lexeme=%q)",
|
||||
i, et, tok.Type, tok.Lexeme)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
func TestMultiLine(t *testing.T) {
|
||||
src := `
|
||||
-- Arrow
|
||||
color is (255,255,0);
|
||||
|
||||
scale is (1, 1);
|
||||
size is 10;
|
||||
|
||||
origin is (450, 450);
|
||||
rot is pi;
|
||||
for t from 0 to 400 step 1 draw( t, t );
|
||||
|
||||
|
||||
-- 心形曲线
|
||||
|
||||
origin is (200, 200);
|
||||
rot is pi/2;
|
||||
size is 5;
|
||||
|
||||
-- 圆润型
|
||||
color is blue;
|
||||
scale is (50, 50);
|
||||
for t from -pi to pi step pi/200 draw((2*cos(t) - cos(2*t)), (2*sin(t)-sin(2*t)) );
|
||||
|
||||
-- 尖锐型
|
||||
origin is (200+80, 200+80);
|
||||
color is red;
|
||||
rot is pi;
|
||||
scale is (8, 8);
|
||||
for t from 0 to 2*pi step pi/200 draw(
|
||||
16*(sin(t)**3),
|
||||
13*cos(t) - 5*cos(2*t) - 2*cos(3*t)-cos(4*t)
|
||||
);
|
||||
`
|
||||
sc := NewScannerFromString(src)
|
||||
|
||||
expect := []TokenType{
|
||||
COLOR, IS, L_BRACKET, CONST_ID, COMMA,
|
||||
CONST_ID, COMMA, CONST_ID, R_BRACKET, SEMICO,
|
||||
SCALE,
|
||||
}
|
||||
|
||||
for i, et := range expect {
|
||||
tok := sc.GetToken()
|
||||
t.Logf("%s: type %d, value: %f, func: %p", tok.Lexeme, tok.Type, tok.Value, tok.Func)
|
||||
if tok.Type != et {
|
||||
t.Fatalf("token %d: expect %v, got %v (lexeme=%q)",
|
||||
i, et, tok.Type, tok.Lexeme)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
func TestWrongNumber(t *testing.T) {
|
||||
data := "123.456abc"
|
||||
s := NewScannerFromString(data)
|
||||
for {
|
||||
token := s.GetToken()
|
||||
t.Logf("%s: type %d, value: %f, func: %p", token.Lexeme, token.Type, token.Value, token.Func)
|
||||
if token.Type == NONTOKEN {
|
||||
break
|
||||
}
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user