summaryrefslogtreecommitdiff
path: root/internal/rpn/rpn_test.go
diff options
context:
space:
mode:
Diffstat (limited to 'internal/rpn/rpn_test.go')
-rw-r--r--internal/rpn/rpn_test.go65
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)
+ }
+ })
+ }
+}