parse integer literals, identifiers, expressions
This commit is contained in:
@@ -79,3 +79,95 @@ func testLetStatement(t *testing.T, s ast.Statement, name string) bool {
|
||||
|
||||
return true
|
||||
}
|
||||
|
||||
func TestReturnStatements(t *testing.T) {
|
||||
input := `
|
||||
return 5;
|
||||
return 10;
|
||||
return 993322;
|
||||
`
|
||||
l := lexer.New(input)
|
||||
p := New(l)
|
||||
|
||||
program := p.ParseProgram()
|
||||
checkParserErrors(t, p)
|
||||
|
||||
if len(program.Statements) != 3 {
|
||||
t.Fatalf("program.Statements does not contain 3 statements. got=%d",
|
||||
len(program.Statements))
|
||||
}
|
||||
|
||||
for _, stmt := range program.Statements {
|
||||
returnStmt, ok := stmt.(*ast.ReturnStatement)
|
||||
if !ok {
|
||||
t.Errorf("stmt not *ast.returnStatement. got=%T", stmt)
|
||||
continue
|
||||
}
|
||||
if returnStmt.TokenLiteral() != "return" {
|
||||
t.Errorf("returnStmt.TokenLiteral not 'return', got %q",
|
||||
returnStmt.TokenLiteral())
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
func TestIdentifierExpression(t *testing.T) {
|
||||
input := "foobar;"
|
||||
|
||||
l := lexer.New(input)
|
||||
p := New(l)
|
||||
program := p.ParseProgram()
|
||||
checkParserErrors(t, p)
|
||||
|
||||
if len(program.Statements) != 1 {
|
||||
t.Fatalf("program has not enough statements. got=%d",
|
||||
len(program.Statements))
|
||||
}
|
||||
stmt, ok := program.Statements[0].(*ast.ExpressionStatement)
|
||||
if !ok {
|
||||
t.Fatalf("program.Statements[0] is not ast.ExpressionStatement. got=%T",
|
||||
program.Statements[0])
|
||||
}
|
||||
|
||||
ident, ok := stmt.Expression.(*ast.Identifier)
|
||||
if !ok {
|
||||
t.Fatalf("exp not *ast.Identifier. got=%T", stmt.Expression)
|
||||
}
|
||||
if ident.Value != "foobar" {
|
||||
t.Errorf("ident.Value not %s. got=%s", "foobar", ident.Value)
|
||||
}
|
||||
if ident.TokenLiteral() != "foobar" {
|
||||
t.Errorf("ident.TokenLiteral not %s. got=%s", "foobar",
|
||||
ident.TokenLiteral())
|
||||
}
|
||||
}
|
||||
|
||||
func TestIntegerLiteralExpression(t *testing.T) {
|
||||
input := "5;"
|
||||
|
||||
l := lexer.New(input)
|
||||
p := New(l)
|
||||
program := p.ParseProgram()
|
||||
checkParserErrors(t, p)
|
||||
|
||||
if len(program.Statements) != 1 {
|
||||
t.Fatalf("program has not enough statements. got=%d",
|
||||
len(program.Statements))
|
||||
}
|
||||
stmt, ok := program.Statements[0].(*ast.ExpressionStatement)
|
||||
if !ok {
|
||||
t.Fatalf("program.Statements[0] is not ast.ExpressionStatement. got=%T",
|
||||
program.Statements[0])
|
||||
}
|
||||
|
||||
literal, ok := stmt.Expression.(*ast.IntegerLiteral)
|
||||
if !ok {
|
||||
t.Fatalf("exp not *ast.IntegerLiteral. got=%T", stmt.Expression)
|
||||
}
|
||||
if literal.Value != 5 {
|
||||
t.Errorf("literal.Value not %d. got=%d", 5, literal.Value)
|
||||
}
|
||||
if literal.TokenLiteral() != "5" {
|
||||
t.Errorf("literal.TokenLiteral not %s. got=%s", "5",
|
||||
literal.TokenLiteral())
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user