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

     1  package vals
     2  
     3  import (
     4  	"errors"
     5  	"testing"
     6  
     7  	"src.elv.sh/pkg/eval/errs"
     8  	"src.elv.sh/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 any) (any, error) {
    16  	return "custom result", errCustomAssoc
    17  }
    18  
    19  func TestAssoc(t *testing.T) {
    20  	tt.Test(t, Assoc,
    21  		// String
    22  		Args("0123", "0", "foo").Rets("foo123", nil),
    23  		Args("0123", "1..3", "bar").Rets("0bar3", nil),
    24  		Args("0123", "1..3", 12).Rets(nil, errReplacementMustBeString),
    25  		Args("0123", "x", "y").Rets(nil, errIndexMustBeInteger),
    26  
    27  		// List
    28  		Args(MakeList("0", "1", "2", "3"), "0", "foo").Rets(
    29  			eq(MakeList("foo", "1", "2", "3")), nil),
    30  		Args(MakeList("0", "1", "2", "3"), 0, "foo").Rets(
    31  			eq(MakeList("foo", "1", "2", "3")), nil),
    32  		Args(MakeList("0"), MakeList("0"), "1").Rets(nil, errIndexMustBeInteger),
    33  		Args(MakeList("0"), "1", "x").Rets(nil, errs.OutOfRange{
    34  			What: "index", ValidLow: "0", ValidHigh: "0", Actual: "1"}),
    35  		// TODO: Support list assoc with slice
    36  		Args(MakeList("0", "1", "2", "3"), "1..3", MakeList("foo")).Rets(
    37  			nil, errAssocWithSlice),
    38  
    39  		// Map
    40  		Args(MakeMap("k", "v", "k2", "v2"), "k", "newv").Rets(
    41  			eq(MakeMap("k", "newv", "k2", "v2")), nil),
    42  		Args(MakeMap("k", "v"), "k2", "v2").Rets(
    43  			eq(MakeMap("k", "v", "k2", "v2")), nil),
    44  
    45  		// Struct map
    46  		Args(testStructMap{"ls", 1.0}, "score-plus-ten", "x").Rets(
    47  			eq(MakeMap("name", "ls", "score", 1.0, "score-plus-ten", "x")), nil),
    48  
    49  		Args(customAssocer{}, "x", "y").Rets("custom result", errCustomAssoc),
    50  
    51  		Args(struct{}{}, "x", "y").Rets(nil, errAssocUnsupported),
    52  	)
    53  }