|
@@ -0,0 +1,74 @@
|
|
|
+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
|
|
|
+ }
|
|
|
+ }
|
|
|
+}
|