parser_prefix_test.go 1.5 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374
  1. package parser
  2. import (
  3. "fmt"
  4. "testing"
  5. "code.osinet.fr/fgm/waiig15/ast"
  6. "code.osinet.fr/fgm/waiig15/lexer"
  7. )
  8. func testIntegerLiteral(t *testing.T, il ast.Expression, value int64) bool {
  9. integ, ok := il.(*ast.IntegerLiteral)
  10. if !ok {
  11. t.Errorf("il not *ast.IntegerLiteral. got=%T", il)
  12. return false
  13. }
  14. if integ.Value != value {
  15. t.Errorf("integ.Value not %d. got =%d", value, integ.Value)
  16. return false
  17. }
  18. if integ.TokenLiteral() != fmt.Sprintf("%d", value) {
  19. t.Errorf("integ.TokenLiteral not %d. got=%s",
  20. value, integ.TokenLiteral())
  21. return false
  22. }
  23. return true
  24. }
  25. func TestParsingPrefixExpressions(t *testing.T) {
  26. prefixTests := []struct {
  27. input string
  28. operator string
  29. integerValue int64
  30. }{
  31. {"!5", "!", 5},
  32. {"-15", "-", 15},
  33. }
  34. for _, tt := range prefixTests {
  35. l := lexer.New(tt.input)
  36. p := New(l)
  37. program := p.ParseProgram()
  38. checkParserErrors(t, p)
  39. if len(program.Statements) != 1 {
  40. t.Fatalf("program.Statements does not contain %d statements, got=%d\n",
  41. 1, len(program.Statements))
  42. }
  43. stmt, ok := program.Statements[0].(*ast.ExpressionStatement)
  44. if !ok {
  45. t.Fatalf("program.STatements[0] is not ast.ExpressionStatement. got=%T",
  46. program.Statements[0])
  47. }
  48. exp, ok := stmt.Expression.(*ast.PrefixExpression)
  49. if !ok {
  50. t.Fatalf("stms is not ast.PrefixExpression. got=%T",
  51. stmt.Expression)
  52. }
  53. if exp.Operator != tt.operator {
  54. t.Fatalf("exp.Operator is not '%s'. got=%s",
  55. tt.operator, exp.Operator)
  56. }
  57. if !testIntegerLiteral(t, exp.Right, tt.integerValue) {
  58. return
  59. }
  60. }
  61. }