diff options
Diffstat (limited to 'internal/rpn/rpn_test.go')
| -rw-r--r-- | internal/rpn/rpn_test.go | 65 |
1 files changed, 65 insertions, 0 deletions
diff --git a/internal/rpn/rpn_test.go b/internal/rpn/rpn_test.go index 76f6dbb..b5e1739 100644 --- a/internal/rpn/rpn_test.go +++ b/internal/rpn/rpn_test.go @@ -1324,3 +1324,68 @@ func TestRPNConcurrentModeAndEval(t *testing.T) { wg.Wait() } + +// TestParseAndEvaluateAssignmentLeftRight tests := and =: assignment operators in RPN +func TestParseAndEvaluateAssignmentLeftRight(t *testing.T) { + tests := []struct { + name string + input string + expectedVar string + expectedValue float64 + }{ + { + name: "5 x := (left assignment)", + input: "5 x :=", + expectedVar: "x", + expectedValue: 5, + }, + { + name: "x 5 =: (right assignment)", + input: "x 5 =:", + expectedVar: "x", + expectedValue: 5, + }, + { + name: "3 y := (left assignment)", + input: "3 y :=", + expectedVar: "y", + expectedValue: 3, + }, + { + name: "y 3 =: (right assignment)", + input: "y 3 =:", + expectedVar: "y", + expectedValue: 3, + }, + { + name: "pi 3.14159 =: (assignment with constant)", + input: "pi 3.14159 =:", + expectedVar: "pi", + expectedValue: 3.14159, + }, + } + + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + v := NewVariables() + r := NewRPN(v) + + _, err := r.ParseAndEvaluate(tt.input) + if err != nil { + t.Fatalf("ParseAndEvaluate(%q) returned error: %v", tt.input, err) + } + + // For assignment, result may be empty (side effect is variable setting) + // The important thing is the variable was set correctly + + // Verify variable was set + val, exists := v.GetVariable(tt.expectedVar) + if !exists { + t.Errorf("Variable %q should exist after assignment", tt.expectedVar) + } + if val != tt.expectedValue { + t.Errorf("Variable %q = %v, want %v", tt.expectedVar, val, tt.expectedValue) + } + }) + } +} |
