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 } } }