github.com/markusbkk/elvish@v0.0.0-20231204143114-91dc52438621/pkg/eval/vals/assoc_test.go (about)

     1  package vals
     2  
     3  import (
     4  	"errors"
     5  	"testing"
     6  
     7  	"github.com/markusbkk/elvish/pkg/eval/errs"
     8  	. "github.com/markusbkk/elvish/pkg/tt"
     9  )
    10  
    11  type customAssocer struct{}
    12  
    13  var errCustomAssoc = errors.New("custom assoc error")
    14  
    15  func (a customAssocer) Assoc(k, v interface{}) (interface{}, error) {
    16  	return "custom result", errCustomAssoc
    17  }
    18  
    19  func TestAssoc(t *testing.T) {
    20  	Test(t, Fn("Assoc", Assoc), Table{
    21  		Args("0123", "0", "foo").Rets("foo123", nil),
    22  		Args("0123", "1..3", "bar").Rets("0bar3", nil),
    23  		Args("0123", "1..3", 12).Rets(nil, errReplacementMustBeString),
    24  		Args("0123", "x", "y").Rets(nil, errIndexMustBeInteger),
    25  
    26  		Args(MakeList("0", "1", "2", "3"), "0", "foo").Rets(
    27  			eq(MakeList("foo", "1", "2", "3")), nil),
    28  		Args(MakeList("0", "1", "2", "3"), 0, "foo").Rets(
    29  			eq(MakeList("foo", "1", "2", "3")), nil),
    30  		Args(MakeList("0"), MakeList("0"), "1").Rets(nil, errIndexMustBeInteger),
    31  		Args(MakeList("0"), "1", "x").Rets(nil, errs.OutOfRange{
    32  			What: "index", ValidLow: "0", ValidHigh: "0", Actual: "1"}),
    33  		// TODO: Support list assoc with slice
    34  		Args(MakeList("0", "1", "2", "3"), "1..3", MakeList("foo")).Rets(
    35  			nil, errAssocWithSlice),
    36  
    37  		Args(MakeMap("k", "v", "k2", "v2"), "k", "newv").Rets(
    38  			eq(MakeMap("k", "newv", "k2", "v2")), nil),
    39  		Args(MakeMap("k", "v"), "k2", "v2").Rets(
    40  			eq(MakeMap("k", "v", "k2", "v2")), nil),
    41  
    42  		Args(customAssocer{}, "x", "y").Rets("custom result", errCustomAssoc),
    43  
    44  		Args(struct{}{}, "x", "y").Rets(nil, errAssocUnsupported),
    45  	})
    46  }