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  }