| package ast |
| |
| import ( |
| "matheval/token" |
| "testing" |
| ) |
| |
| // Compile-time check: both types satisfy Node. |
| var ( |
| _ Node = (*NumberLit)(nil) |
| _ Node = (*BinaryExpr)(nil) |
| ) |
| |
| func TestNumberLit(t *testing.T) { |
| n := &NumberLit{Value: 3.14} |
| if n.Value != 3.14 { |
| t.Fatalf("expected 3.14, got %f", n.Value) |
| } |
| } |
| |
| func TestBinaryExpr(t *testing.T) { |
| left := &NumberLit{Value: 1} |
| right := &NumberLit{Value: 2} |
| expr := &BinaryExpr{ |
| Op: token.Plus, |
| Left: left, |
| Right: right, |
| } |
| |
| if expr.Op != token.Plus { |
| t.Fatalf("expected Plus, got %v", expr.Op) |
| } |
| if expr.Left != left { |
| t.Fatal("Left child mismatch") |
| } |
| if expr.Right != right { |
| t.Fatal("Right child mismatch") |
| } |
| } |
| |
| func TestNestedBinaryExpr(t *testing.T) { |
| // Represents: (1 + 2) * 3 |
| tree := &BinaryExpr{ |
| Op: token.Star, |
| Left: &BinaryExpr{ |
| Op: token.Plus, |
| Left: &NumberLit{Value: 1}, |
| Right: &NumberLit{Value: 2}, |
| }, |
| Right: &NumberLit{Value: 3}, |
| } |
| |
| if tree.Op != token.Star { |
| t.Fatalf("expected Star, got %v", tree.Op) |
| } |
| |
| inner, ok := tree.Left.(*BinaryExpr) |
| if !ok { |
| t.Fatal("Left should be *BinaryExpr") |
| } |
| if inner.Op != token.Plus { |
| t.Fatalf("expected Plus, got %v", inner.Op) |
| } |
| } |