diff options
Diffstat (limited to 'internal/rpn/operations_test.go')
| -rw-r--r-- | internal/rpn/operations_test.go | 166 |
1 files changed, 83 insertions, 83 deletions
diff --git a/internal/rpn/operations_test.go b/internal/rpn/operations_test.go index 02e07c3..dc70ebe 100644 --- a/internal/rpn/operations_test.go +++ b/internal/rpn/operations_test.go @@ -23,9 +23,9 @@ func TestStackNewStack(t *testing.T) { func TestStackPushPop(t *testing.T) { s := NewStack() - s.Push(NewNumberValue(1.0)) - s.Push(NewNumberValue(2.0)) - s.Push(NewNumberValue(3.0)) + s.Push(NewNumber(1.0, FloatMode)) + s.Push(NewNumber(2.0, FloatMode)) + s.Push(NewNumber(3.0, FloatMode)) if s.Len() != 3 { t.Errorf("Length after 3 pushes = %d, want 3", s.Len()) @@ -35,7 +35,7 @@ func TestStackPushPop(t *testing.T) { if err != nil { t.Fatalf("Pop() returned error: %v", err) } - if val.Number() != 3.0 { + if val.Float64() != 3.0 { t.Errorf("Pop() = %v, want 3.0", val) } @@ -46,13 +46,13 @@ func TestStackPushPop(t *testing.T) { func TestStackPeek(t *testing.T) { s := NewStack() - s.Push(NewNumberValue(5.0)) + s.Push(NewNumber(5.0, FloatMode)) val, err := s.Peek() if err != nil { t.Fatalf("Peek() returned error: %v", err) } - if val.Number() != 5.0 { + if val.Float64() != 5.0 { t.Errorf("Peek() = %v, want 5.0", val) } @@ -83,9 +83,9 @@ func TestStackPopEmpty(t *testing.T) { func TestStackValues(t *testing.T) { s := NewStack() - s.Push(NewNumberValue(1.0)) - s.Push(NewNumberValue(2.0)) - s.Push(NewNumberValue(3.0)) + s.Push(NewNumber(1.0, FloatMode)) + s.Push(NewNumber(2.0, FloatMode)) + s.Push(NewNumber(3.0, FloatMode)) vals := s.Values() if len(vals) != 3 { @@ -94,16 +94,16 @@ func TestStackValues(t *testing.T) { // Values() returns values in storage order (bottom-to-top) // Push order: 1, 2, 3 so storage is [1, 2, 3] with 3 on top - if vals[0].Number() != 1.0 || vals[1].Number() != 2.0 || vals[2].Number() != 3.0 { + if vals[0].Float64() != 1.0 || vals[1].Float64() != 2.0 || vals[2].Float64() != 3.0 { t.Errorf("Values() = %v, want [1 2 3] (bottom-to-top)", vals) } } func TestStackClear(t *testing.T) { s := NewStack() - s.Push(NewNumberValue(1.0)) - s.Push(NewNumberValue(2.0)) - s.Push(NewNumberValue(3.0)) + s.Push(NewNumber(1.0, FloatMode)) + s.Push(NewNumber(2.0, FloatMode)) + s.Push(NewNumber(3.0, FloatMode)) s.Clear() @@ -116,8 +116,8 @@ func TestOperationsAdd(t *testing.T) { v := NewVariables() o := NewOperations(v) s := NewStack() - s.Push(NewNumberValue(3.0)) - s.Push(NewNumberValue(4.0)) + s.Push(NewNumber(3.0, FloatMode)) + s.Push(NewNumber(4.0, FloatMode)) err := o.Add(s) if err != nil { @@ -128,7 +128,7 @@ func TestOperationsAdd(t *testing.T) { if err != nil { t.Fatalf("Pop() after Add() returned error: %v", err) } - if val.Number() != 7.0 { + if val.Float64() != 7.0 { t.Errorf("Add result = %v, want 7.0", val) } } @@ -137,8 +137,8 @@ func TestOperationsSubtract(t *testing.T) { v := NewVariables() o := NewOperations(v) s := NewStack() - s.Push(NewNumberValue(10.0)) - s.Push(NewNumberValue(4.0)) + s.Push(NewNumber(10.0, FloatMode)) + s.Push(NewNumber(4.0, FloatMode)) err := o.Subtract(s) if err != nil { @@ -149,7 +149,7 @@ func TestOperationsSubtract(t *testing.T) { if err != nil { t.Fatalf("Pop() after Subtract() returned error: %v", err) } - if val.Number() != 6.0 { + if val.Float64() != 6.0 { t.Errorf("Subtract result = %v, want 6.0 (10 - 4)", val) } } @@ -158,8 +158,8 @@ func TestOperationsMultiply(t *testing.T) { v := NewVariables() o := NewOperations(v) s := NewStack() - s.Push(NewNumberValue(5.0)) - s.Push(NewNumberValue(3.0)) + s.Push(NewNumber(5.0, FloatMode)) + s.Push(NewNumber(3.0, FloatMode)) err := o.Multiply(s) if err != nil { @@ -170,7 +170,7 @@ func TestOperationsMultiply(t *testing.T) { if err != nil { t.Fatalf("Pop() after Multiply() returned error: %v", err) } - if val.Number() != 15.0 { + if val.Float64() != 15.0 { t.Errorf("Multiply result = %v, want 15.0", val) } } @@ -179,8 +179,8 @@ func TestOperationsDivide(t *testing.T) { v := NewVariables() o := NewOperations(v) s := NewStack() - s.Push(NewNumberValue(20.0)) - s.Push(NewNumberValue(4.0)) + s.Push(NewNumber(20.0, FloatMode)) + s.Push(NewNumber(4.0, FloatMode)) err := o.Divide(s) if err != nil { @@ -191,7 +191,7 @@ func TestOperationsDivide(t *testing.T) { if err != nil { t.Fatalf("Pop() after Divide() returned error: %v", err) } - if val.Number() != 5.0 { + if val.Float64() != 5.0 { t.Errorf("Divide result = %v, want 5.0", val) } } @@ -200,8 +200,8 @@ func TestOperationsDivideByZero(t *testing.T) { v := NewVariables() o := NewOperations(v) s := NewStack() - s.Push(NewNumberValue(10.0)) - s.Push(NewNumberValue(0.0)) + s.Push(NewNumber(10.0, FloatMode)) + s.Push(NewNumber(0.0, FloatMode)) err := o.Divide(s) if err == nil { @@ -216,8 +216,8 @@ func TestOperationsPower(t *testing.T) { v := NewVariables() o := NewOperations(v) s := NewStack() - s.Push(NewNumberValue(2.0)) - s.Push(NewNumberValue(3.0)) + s.Push(NewNumber(2.0, FloatMode)) + s.Push(NewNumber(3.0, FloatMode)) err := o.Power(s) if err != nil { @@ -228,7 +228,7 @@ func TestOperationsPower(t *testing.T) { if err != nil { t.Fatalf("Pop() after Power() returned error: %v", err) } - if val.Number() != 8.0 { + if val.Float64() != 8.0 { t.Errorf("Power result = %v, want 8.0 (2^3)", val) } } @@ -237,8 +237,8 @@ func TestOperationsModulo(t *testing.T) { v := NewVariables() o := NewOperations(v) s := NewStack() - s.Push(NewNumberValue(10.0)) - s.Push(NewNumberValue(3.0)) + s.Push(NewNumber(10.0, FloatMode)) + s.Push(NewNumber(3.0, FloatMode)) err := o.Modulo(s) if err != nil { @@ -249,7 +249,7 @@ func TestOperationsModulo(t *testing.T) { if err != nil { t.Fatalf("Pop() after Modulo() returned error: %v", err) } - if val.Number() != 1.0 { + if val.Float64() != 1.0 { t.Errorf("Modulo result = %v, want 1.0 (10 %% 3)", val) } } @@ -258,8 +258,8 @@ func TestOperationsModuloByZero(t *testing.T) { v := NewVariables() o := NewOperations(v) s := NewStack() - s.Push(NewNumberValue(10.0)) - s.Push(NewNumberValue(0.0)) + s.Push(NewNumber(10.0, FloatMode)) + s.Push(NewNumber(0.0, FloatMode)) err := o.Modulo(s) if err == nil { @@ -271,7 +271,7 @@ func TestOperationsInsufficientOperands(t *testing.T) { v := NewVariables() o := NewOperations(v) s := NewStack() - s.Push(NewNumberValue(5.0)) + s.Push(NewNumber(5.0, FloatMode)) // Try to add with only one operand err := o.Add(s) @@ -284,7 +284,7 @@ func TestOperationsDup(t *testing.T) { v := NewVariables() o := NewOperations(v) s := NewStack() - s.Push(NewNumberValue(7.0)) + s.Push(NewNumber(7.0, FloatMode)) err := o.Dup(s) if err != nil { @@ -297,7 +297,7 @@ func TestOperationsDup(t *testing.T) { val1, _ := s.Pop() val2, _ := s.Pop() - if val1.Number() != 7.0 || val2.Number() != 7.0 { + if val1.Float64() != 7.0 || val2.Float64() != 7.0 { t.Errorf("Dup values = %v, %v, want both 7.0", val1, val2) } } @@ -306,8 +306,8 @@ func TestOperationsSwap(t *testing.T) { v := NewVariables() o := NewOperations(v) s := NewStack() - s.Push(NewNumberValue(1.0)) - s.Push(NewNumberValue(2.0)) + s.Push(NewNumber(1.0, FloatMode)) + s.Push(NewNumber(2.0, FloatMode)) err := o.Swap(s) if err != nil { @@ -316,7 +316,7 @@ func TestOperationsSwap(t *testing.T) { val1, _ := s.Pop() val2, _ := s.Pop() - if val1.Number() != 1.0 || val2.Number() != 2.0 { + if val1.Float64() != 1.0 || val2.Float64() != 2.0 { t.Errorf("After Swap, values = %v, %v, want 1.0, 2.0 (swapped)", val1, val2) } } @@ -325,7 +325,7 @@ func TestOperationsSwapInsufficient(t *testing.T) { v := NewVariables() o := NewOperations(v) s := NewStack() - s.Push(NewNumberValue(5.0)) + s.Push(NewNumber(5.0, FloatMode)) err := o.Swap(s) if err == nil { @@ -337,9 +337,9 @@ func TestOperationsPop(t *testing.T) { v := NewVariables() o := NewOperations(v) s := NewStack() - s.Push(NewNumberValue(1.0)) - s.Push(NewNumberValue(2.0)) - s.Push(NewNumberValue(3.0)) + s.Push(NewNumber(1.0, FloatMode)) + s.Push(NewNumber(2.0, FloatMode)) + s.Push(NewNumber(3.0, FloatMode)) err := o.Pop(s) if err != nil { @@ -366,9 +366,9 @@ func TestOperationsShow(t *testing.T) { v := NewVariables() o := NewOperations(v) s := NewStack() - s.Push(NewNumberValue(1.0)) - s.Push(NewNumberValue(2.0)) - s.Push(NewNumberValue(3.0)) + s.Push(NewNumber(1.0, FloatMode)) + s.Push(NewNumber(2.0, FloatMode)) + s.Push(NewNumber(3.0, FloatMode)) result, err := o.Show(s) if err != nil { @@ -399,7 +399,7 @@ func TestOperationsAssignVariable(t *testing.T) { v := NewVariables() o := NewOperations(v) s := NewStack() - s.Push(NewNumberValue(5.0)) + s.Push(NewNumber(5.0, FloatMode)) err := o.AssignVariable(s, "x") if err != nil { @@ -449,7 +449,7 @@ func TestOperationsUseVariable(t *testing.T) { if err != nil { t.Fatalf("Pop() after UseVariable() returned error: %v", err) } - if val.Number() != 3.14159 { + if val.Float64() != 3.14159 { t.Errorf("Variable value pushed to stack = %v, want 3.14159", val) } } @@ -545,7 +545,7 @@ func TestOperationsConcurrent(t *testing.T) { go func(id int) { name := fmt.Sprintf("concurrent%d", id) s := NewStack() - s.Push(NewNumberValue(float64(id))) + s.Push(NewNumber(float64(id), FloatMode)) if err := o.AssignVariable(s, name); err != nil { t.Errorf("AssignVariable() returned error: %v", err) } @@ -567,7 +567,7 @@ func TestLog2(t *testing.T) { stack := NewStack() // Test log₂(8) = 3 - stack.Push(NewNumberValue(8)) + stack.Push(NewNumber(8, FloatMode)) err := o.Log2(stack) if err != nil { t.Errorf("Log2() returned error: %v", err) @@ -576,12 +576,12 @@ func TestLog2(t *testing.T) { if err != nil { t.Errorf("Pop() returned error: %v", err) } - if val.Number() != 3.0 { - t.Errorf("Log2(8) = %f, want 3.0)", val.Number()) + if val.Float64() != 3.0 { + t.Errorf("Log2(8) = %f, want 3.0)", val.Float64()) } // Test log₂(1) = 0 - stack.Push(NewNumberValue(1)) + stack.Push(NewNumber(1.0, FloatMode)) err = o.Log2(stack) if err != nil { t.Errorf("Log2(1) returned error: %v", err) @@ -590,12 +590,12 @@ func TestLog2(t *testing.T) { if err != nil { t.Errorf("Pop() returned error: %v", err) } - if val.Number() != 0.0 { - t.Errorf("Log2(1) = %f, want 0.0)", val.Number()) + if val.Float64() != 0.0 { + t.Errorf("Log2(1) = %f, want 0.0)", val.Float64()) } // Test log₂(0) should error - stack.Push(NewNumberValue(0)) + stack.Push(NewNumber(0.0, FloatMode)) err = o.Log2(stack) if err == nil { t.Errorf("Log2(0) should return error, got nil") @@ -607,7 +607,7 @@ func TestLog10(t *testing.T) { stack := NewStack() // Test log₁₀(100) = 2 - stack.Push(NewNumberValue(100)) + stack.Push(NewNumber(100.0, FloatMode)) err := o.Log10(stack) if err != nil { t.Errorf("Log10() returned error: %v", err) @@ -616,12 +616,12 @@ func TestLog10(t *testing.T) { if err != nil { t.Errorf("Pop() returned error: %v", err) } - if val.Number() != 2.0 { - t.Errorf("Log10(100) = %f, want 2.0)", val.Number()) + if val.Float64() != 2.0 { + t.Errorf("Log10(100) = %f, want 2.0)", val.Float64()) } // Test log₁₀(1) = 0 - stack.Push(NewNumberValue(1)) + stack.Push(NewNumber(1.0, FloatMode)) err = o.Log10(stack) if err != nil { t.Errorf("Log10(1) returned error: %v", err) @@ -630,8 +630,8 @@ func TestLog10(t *testing.T) { if err != nil { t.Errorf("Pop() returned error: %v", err) } - if val.Number() != 0.0 { - t.Errorf("Log10(1) = %f, want 0.0)", val.Number()) + if val.Float64() != 0.0 { + t.Errorf("Log10(1) = %f, want 0.0)", val.Float64()) } } @@ -640,7 +640,7 @@ func TestLn(t *testing.T) { stack := NewStack() // Test ln(e) ≈ 1 - stack.Push(NewNumberValue(math.E)) + stack.Push(NewNumber(math.E, FloatMode)) err := o.Ln(stack) if err != nil { t.Errorf("Ln() returned error: %v", err) @@ -649,12 +649,12 @@ func TestLn(t *testing.T) { if err != nil { t.Errorf("Pop() returned error: %v", err) } - if math.Abs(val.Number()-1.0) > 0.0001 { - t.Errorf("ln(e) = %f, want ~1.0", val.Number()) + if math.Abs(val.Float64()-1.0) > 0.0001 { + t.Errorf("ln(e) = %f, want ~1.0", val.Float64()) } // Test ln(1) = 0 - stack.Push(NewNumberValue(1)) + stack.Push(NewNumber(1.0, FloatMode)) err = o.Ln(stack) if err != nil { t.Errorf("Ln(1) returned error: %v", err) @@ -663,8 +663,8 @@ func TestLn(t *testing.T) { if err != nil { t.Errorf("Pop() returned error: %v", err) } - if val.Number() != 0.0 { - t.Errorf("Ln(1) = %f, want 0.0)", val.Number()) + if val.Float64() != 0.0 { + t.Errorf("Ln(1) = %f, want 0.0)", val.Float64()) } } @@ -673,8 +673,8 @@ func TestHyperLog2(t *testing.T) { stack := NewStack() // Test hyperlog₂(4, 16) = log₂(4) + log₂(16) = 2 + 4 = 6 - stack.Push(NewNumberValue(4)) - stack.Push(NewNumberValue(16)) + stack.Push(NewNumber(4.0, FloatMode)) + stack.Push(NewNumber(16, FloatMode)) err := o.HyperLog2(stack) if err != nil { t.Errorf("HyperLog2() returned error: %v", err) @@ -683,12 +683,12 @@ func TestHyperLog2(t *testing.T) { if err != nil { t.Errorf("Pop() returned error: %v", err) } - if val.Number() != 6.0 { - t.Errorf("HyperLog2(4, 16) = %f, want 6.0)", val.Number()) + if val.Float64() != 6.0 { + t.Errorf("HyperLog2(4, 16) = %f, want 6.0)", val.Float64()) } // Test with single value (should error, like other hyper operators) - stack.Push(NewNumberValue(8)) + stack.Push(NewNumber(8, FloatMode)) err = o.HyperLog2(stack) if err == nil { t.Errorf("HyperLog2 with single value should return error, got nil") @@ -700,8 +700,8 @@ func TestHyperLog10(t *testing.T) { stack := NewStack() // Test hyperlog₁₀(10, 100) = log₁₀(10) + log₁₀(100) = 1 + 2 = 3 - stack.Push(NewNumberValue(10)) - stack.Push(NewNumberValue(100)) + stack.Push(NewNumber(10.0, FloatMode)) + stack.Push(NewNumber(100.0, FloatMode)) err := o.HyperLog10(stack) if err != nil { t.Errorf("HyperLog10() returned error: %v", err) @@ -710,8 +710,8 @@ func TestHyperLog10(t *testing.T) { if err != nil { t.Errorf("Pop() returned error: %v", err) } - if val.Number() != 3.0 { - t.Errorf("HyperLog10(10, 100) = %f, want 3.0)", val.Number()) + if val.Float64() != 3.0 { + t.Errorf("HyperLog10(10, 100) = %f, want 3.0)", val.Float64()) } } @@ -720,8 +720,8 @@ func TestHyperLn(t *testing.T) { stack := NewStack() // Test hyperln(e, e²) = ln(e) + ln(e²) = 1 + 2 = 3 - stack.Push(NewNumberValue(math.E)) - stack.Push(NewNumberValue(math.E * math.E)) + stack.Push(NewNumber(math.E, FloatMode)) + stack.Push(NewNumber(math.E * math.E, FloatMode)) err := o.HyperLn(stack) if err != nil { t.Errorf("HyperLn() returned error: %v", err) @@ -730,7 +730,7 @@ func TestHyperLn(t *testing.T) { if err != nil { t.Errorf("Pop() returned error: %v", err) } - if math.Abs(val.Number()-3.0) > 0.0001 { - t.Errorf("HyperLn(e, e²) = %f, want ~3.0", val.Number()) + if math.Abs(val.Float64()-3.0) > 0.0001 { + t.Errorf("HyperLn(e, e²) = %f, want ~3.0", val.Float64()) } } |
