github.com/mithrandie/csvq@v1.18.1/lib/query/arithmetic_test.go (about) 1 package query 2 3 import ( 4 "math" 5 "reflect" 6 "testing" 7 8 "github.com/mithrandie/csvq/lib/value" 9 ) 10 11 var calculateTests = []struct { 12 LHS value.Primary 13 RHS value.Primary 14 Operator int 15 Result value.Primary 16 Error string 17 }{ 18 { 19 LHS: value.NewString("9"), 20 RHS: value.NewNull(), 21 Operator: '+', 22 Result: value.NewNull(), 23 }, 24 { 25 LHS: value.NewNull(), 26 RHS: value.NewString("9"), 27 Operator: '+', 28 Result: value.NewNull(), 29 }, 30 { 31 LHS: value.NewString("9"), 32 RHS: value.NewString("2"), 33 Operator: '+', 34 Result: value.NewInteger(11), 35 }, 36 { 37 LHS: value.NewString("9"), 38 RHS: value.NewString("2"), 39 Operator: '-', 40 Result: value.NewInteger(7), 41 }, 42 { 43 LHS: value.NewString("9"), 44 RHS: value.NewString("2"), 45 Operator: '*', 46 Result: value.NewInteger(18), 47 }, 48 { 49 LHS: value.NewString("9"), 50 RHS: value.NewString("2"), 51 Operator: '%', 52 Result: value.NewInteger(1), 53 }, 54 { 55 LHS: value.NewString("9.5"), 56 RHS: value.NewString("2"), 57 Operator: '+', 58 Result: value.NewFloat(11.5), 59 }, 60 { 61 LHS: value.NewString("9.5"), 62 RHS: value.NewString("2"), 63 Operator: '-', 64 Result: value.NewFloat(7.5), 65 }, 66 { 67 LHS: value.NewString("9.5"), 68 RHS: value.NewString("2"), 69 Operator: '*', 70 Result: value.NewFloat(19), 71 }, 72 { 73 LHS: value.NewString("9"), 74 RHS: value.NewString("2"), 75 Operator: '/', 76 Result: value.NewInteger(4), 77 }, 78 { 79 LHS: value.NewString("8.5"), 80 RHS: value.NewString("2"), 81 Operator: '%', 82 Result: value.NewFloat(0.5), 83 }, 84 { 85 LHS: value.NewString("8"), 86 RHS: value.NewString("0"), 87 Operator: '/', 88 Error: "integer devided by zero", 89 }, 90 { 91 LHS: value.NewString("8"), 92 RHS: value.NewString("0"), 93 Operator: '%', 94 Error: "integer devided by zero", 95 }, 96 { 97 LHS: value.NewFloat(math.Inf(1)), 98 RHS: value.NewFloat(100), 99 Operator: '+', 100 Result: value.NewFloat(math.Inf(1)), 101 }, 102 { 103 LHS: value.NewFloat(math.Inf(1)), 104 RHS: value.NewFloat(math.Inf(-1)), 105 Operator: '-', 106 Result: value.NewFloat(math.Inf(1)), 107 }, 108 { 109 LHS: value.NewFloat(math.Inf(1)), 110 RHS: value.NewFloat(math.NaN()), 111 Operator: '+', 112 Result: value.NewFloat(math.NaN()), 113 }, 114 } 115 116 func TestCalculate(t *testing.T) { 117 for _, v := range calculateTests { 118 r, err := Calculate(v.LHS, v.RHS, v.Operator) 119 120 if err != nil { 121 if len(v.Error) < 1 { 122 t.Errorf("unexpected error %q for (%s %s %s)", err, v.LHS, string(rune(v.Operator)), v.RHS) 123 } else if err.Error() != v.Error { 124 t.Errorf("error %q, want error %q for (%s %s %s)", err.Error(), v.Error, v.LHS, string(rune(v.Operator)), v.RHS) 125 } 126 continue 127 } 128 if 0 < len(v.Error) { 129 t.Errorf("no error, want error %q for (%s %s %s)", v.Error, v.LHS, string(rune(v.Operator)), v.RHS) 130 continue 131 } 132 133 if !reflect.DeepEqual(r, v.Result) { 134 if expectF, ok := r.(*value.Float); ok && math.IsNaN(expectF.Raw()) { 135 if retF, ok := r.(*value.Float); ok && math.IsNaN(retF.Raw()) { 136 continue 137 } 138 } 139 140 t.Errorf("result = %s, want %s for (%s %s %s)", r, v.Result, v.LHS, string(rune(v.Operator)), v.RHS) 141 } 142 } 143 }