summaryrefslogtreecommitdiff
path: root/parser
diff options
context:
space:
mode:
Diffstat (limited to 'parser')
-rw-r--r--parser/parser_test.go66
1 files changed, 66 insertions, 0 deletions
diff --git a/parser/parser_test.go b/parser/parser_test.go
new file mode 100644
index 0000000..f7158bf
--- /dev/null
+++ b/parser/parser_test.go
@@ -0,0 +1,66 @@
+package parser
+
+import (
+ "github.com/mewsen/interpreter/ast"
+ "github.com/mewsen/interpreter/lexer"
+ "testing"
+)
+
+func TestLetStatements(t *testing.T) {
+ input := `
+let x = 5;
+let y = 10;
+let foobar = 838383;
+`
+ l := lexer.New(input)
+ p := New(l)
+
+ program := p.ParseProgram()
+ if program == nil {
+ t.Fatalf("ParseProgram() returned nil")
+ }
+ if len(program.Statements) != 3 {
+ t.Fatalf("program.Statements does not contain 3 statements. got=%d",
+ len(program.Statements))
+ }
+
+ tests := []struct {
+ expectedIdentifier string
+ }{
+ {"x"},
+ {"y"},
+ {"foobar"},
+ }
+
+ for i, tt := range tests {
+ stmt := program.Statements[i]
+ if !testLetStatement(t, stmt, tt.expectedIdentifier) {
+ return
+ }
+ }
+}
+
+func testLetStatement(t *testing.T, s ast.Statement, name string) bool {
+ if s.TokenLiteral() != "let" {
+ t.Errorf("s.TokenLiteral not 'let'. got=%q", s.TokenLiteral())
+ return false
+ }
+
+ letStmt, ok := s.(*ast.LetStatement)
+ if !ok {
+ t.Errorf("s not *ast.LetStatement. got=%T", s)
+ return false
+ }
+
+ if letStmt.Name.Value != name {
+ t.Errorf("letStmt.Name.Value not '%s'. got =%s", name, letStmt.Name.Value)
+ return false
+ }
+
+ if letStmt.Name.TokenLiteral() != name {
+ t.Errorf("s.Name not '%s'. got=%s", name, letStmt.Name)
+ return false
+ }
+
+ return true
+}