src.elv.sh@v0.21.0-dev.0.20240515223629-06979efb9a2a/pkg/eval/options_test.go (about)

     1  package eval
     2  
     3  import (
     4  	"reflect"
     5  	"testing"
     6  
     7  	"src.elv.sh/pkg/tt"
     8  )
     9  
    10  var Args = tt.Args
    11  
    12  type opts struct {
    13  	Foo string
    14  	bar int
    15  }
    16  
    17  // Equal is required by cmp.Diff, since opts contains unexported fields.
    18  func (o opts) Equal(p opts) bool { return o == p }
    19  
    20  func TestScanOptions(t *testing.T) {
    21  	// A wrapper of ScanOptions, to make it easier to test
    22  	wrapper := func(src RawOptions, dstInit any) (any, error) {
    23  		ptr := reflect.New(reflect.TypeOf(dstInit))
    24  		ptr.Elem().Set(reflect.ValueOf(dstInit))
    25  		err := scanOptions(src, ptr.Interface())
    26  		return ptr.Elem().Interface(), err
    27  	}
    28  
    29  	tt.Test(t, tt.Fn(wrapper).Named("scanOptions"),
    30  		Args(RawOptions{"foo": "lorem ipsum"}, opts{}).
    31  			Rets(opts{Foo: "lorem ipsum"}, nil),
    32  		Args(RawOptions{"bar": 20}, opts{bar: 10}).
    33  			Rets(opts{bar: 10}, UnknownOption{"bar"}),
    34  	)
    35  }