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