1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374 |
- package parser
- import (
- "fmt"
- "testing"
- "code.osinet.fr/fgm/waiig15/ast"
- "code.osinet.fr/fgm/waiig15/lexer"
- )
- func testIntegerLiteral(t *testing.T, il ast.Expression, value int64) bool {
- integ, ok := il.(*ast.IntegerLiteral)
- if !ok {
- t.Errorf("il not *ast.IntegerLiteral. got=%T", il)
- return false
- }
- if integ.Value != value {
- t.Errorf("integ.Value not %d. got =%d", value, integ.Value)
- return false
- }
- if integ.TokenLiteral() != fmt.Sprintf("%d", value) {
- t.Errorf("integ.TokenLiteral not %d. got=%s",
- value, integ.TokenLiteral())
- return false
- }
- return true
- }
- func TestParsingPrefixExpressions(t *testing.T) {
- prefixTests := []struct {
- input string
- operator string
- integerValue int64
- }{
- {"!5", "!", 5},
- {"-15", "-", 15},
- }
- for _, tt := range prefixTests {
- l := lexer.New(tt.input)
- p := New(l)
- program := p.ParseProgram()
- checkParserErrors(t, p)
- if len(program.Statements) != 1 {
- t.Fatalf("program.Statements does not contain %d statements, got=%d\n",
- 1, 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])
- }
- exp, ok := stmt.Expression.(*ast.PrefixExpression)
- if !ok {
- t.Fatalf("stms is not ast.PrefixExpression. got=%T",
- stmt.Expression)
- }
- if exp.Operator != tt.operator {
- t.Fatalf("exp.Operator is not '%s'. got=%s",
- tt.operator, exp.Operator)
- }
- if !testIntegerLiteral(t, exp.Right, tt.integerValue) {
- return
- }
- }
- }
|