...

Source file src/github.com/PaesslerAG/gval/gval_test.go

Documentation: github.com/PaesslerAG/gval

     1  package gval
     2  
     3  import (
     4  	"fmt"
     5  	"reflect"
     6  	"strings"
     7  	"testing"
     8  
     9  	"github.com/shopspring/decimal"
    10  )
    11  
    12  type evaluationTest struct {
    13  	name         string
    14  	expression   string
    15  	extension    Language
    16  	parameter    interface{}
    17  	want         interface{}
    18  	equalityFunc func(x, y interface{}) bool
    19  	wantErr      string
    20  }
    21  
    22  func testEvaluate(tests []evaluationTest, t *testing.T) {
    23  	for _, tt := range tests {
    24  		t.Run(tt.name, func(t *testing.T) {
    25  			got, err := Evaluate(tt.expression, tt.parameter, tt.extension)
    26  
    27  			if tt.wantErr != "" {
    28  				if err == nil {
    29  					t.Fatalf("Evaluate(%s) expected error but got %v", tt.expression, got)
    30  				}
    31  				if !strings.Contains(err.Error(), tt.wantErr) {
    32  					t.Fatalf("Evaluate(%s) expected error %s but got error %v", tt.expression, tt.wantErr, err)
    33  				}
    34  				return
    35  			}
    36  			if err != nil {
    37  				t.Errorf("Evaluate() error = %v", err)
    38  				return
    39  			}
    40  			if ef := tt.equalityFunc; ef != nil {
    41  				if !ef(got, tt.want) {
    42  					t.Errorf("Evaluate(%s) = %v, want %v", tt.expression, got, tt.want)
    43  				}
    44  			} else if !reflect.DeepEqual(got, tt.want) {
    45  				t.Errorf("Evaluate(%s) = %v, want %v", tt.expression, got, tt.want)
    46  			}
    47  		})
    48  	}
    49  }
    50  
    51  //dummyParameter used to test "parameter calls".
    52  type dummyParameter struct {
    53  	String    string
    54  	Int       int
    55  	BoolFalse bool
    56  	Nil       interface{}
    57  	Nested    dummyNestedParameter
    58  }
    59  
    60  func (d dummyParameter) Func() string {
    61  	return "funk"
    62  }
    63  
    64  func (d dummyParameter) Func2() (string, error) {
    65  	return "frink", nil
    66  }
    67  
    68  func (d *dummyParameter) PointerFunc() (string, error) {
    69  	return "point", nil
    70  }
    71  
    72  func (d dummyParameter) FuncErr() (string, error) {
    73  	return "", fmt.Errorf("fumps")
    74  }
    75  
    76  func (d dummyParameter) FuncArgStr(arg1 string) string {
    77  	return arg1
    78  }
    79  
    80  func (d dummyParameter) AlwaysFail() (interface{}, error) {
    81  	return nil, fmt.Errorf("function should always fail")
    82  }
    83  
    84  type dummyNestedParameter struct {
    85  	Funk  string
    86  	Map   map[string]int
    87  	Slice []int
    88  }
    89  
    90  func (d dummyNestedParameter) Dunk(arg1 string) string {
    91  	return arg1 + "dunk"
    92  }
    93  
    94  var foo = dummyParameter{
    95  	String:    "string!",
    96  	Int:       101,
    97  	BoolFalse: false,
    98  	Nil:       nil,
    99  	Nested: dummyNestedParameter{
   100  		Funk:  "funkalicious",
   101  		Map:   map[string]int{"a": 1, "b": 2, "c": 3},
   102  		Slice: []int{1, 2, 3},
   103  	},
   104  }
   105  
   106  var fooFailureParameters = map[string]interface{}{
   107  	"foo":    foo,
   108  	"fooptr": &foo,
   109  }
   110  
   111  var decimalEqualityFunc = func(x, y interface{}) bool {
   112  	v1, ok1 := x.(decimal.Decimal)
   113  	v2, ok2 := y.(decimal.Decimal)
   114  
   115  	if !ok1 || !ok2 {
   116  		return false
   117  	}
   118  
   119  	return v1.Equal(v2)
   120  }
   121  

View as plain text