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 }