diff --git a/list_test.go b/list_test.go index a1dbaf5..5494464 100644 --- a/list_test.go +++ b/list_test.go @@ -20,22 +20,25 @@ func TestListParser(t *testing.T) { } inputs := []inputType{ - /* 1 */ {`[]`, []any{}, nil}, - /* 2 */ {`[1,2,3]`, []any{int64(1), int64(2), int64(3)}, nil}, - /* 3 */ {`[1,2,"hello"]`, []any{int64(1), int64(2), "hello"}, nil}, - /* 4 */ {`[1+2, not true, "hello"]`, []any{int64(3), false, "hello"}, nil}, - /* 5 */ {`[1,2]+[3]`, []any{int64(1), int64(2), int64(3)}, nil}, - /* 6 */ {`[1,4,3,2]-[3]`, []any{int64(1), int64(4), int64(2)}, nil}, - /* 7 */ {`add([1,4,3,2])`, int64(10), nil}, - /* 8 */ {`add([1,[2,2],3,2])`, int64(10), nil}, - /* 9 */ {`mul([1,4,3.0,2])`, float64(24.0), nil}, - /* 10 */ {`add([1,"hello"])`, nil, errors.New(`add(): param nr 2 (2 in 1) has wrong type string, number expected`)}, - /* 11 */ {`[a=1,b=2,c=3] but a+b+c`, int64(6), nil}, - /* 12 */ {`[1,2,3] << 2+2`, []any{int64(1), int64(2), int64(3), int64(4)}, nil}, - /* 13 */ {`2-1 >> [2,3]`, []any{int64(1), int64(2), int64(3)}, nil}, - /* 14 */ {`[1,2,3].1`, int64(2), nil}, - /* 15 */ {`ls=[1,2,3] but ls.1`, int64(2), nil}, - /* 16 */ {`ls=[1,2,3] but ls.(-1)`, int64(3), nil}, + /* 1 */ {`[]`, []any{}, nil}, + /* 2 */ {`[1,2,3]`, []any{int64(1), int64(2), int64(3)}, nil}, + /* 3 */ {`[1,2,"hello"]`, []any{int64(1), int64(2), "hello"}, nil}, + /* 4 */ {`[1+2, not true, "hello"]`, []any{int64(3), false, "hello"}, nil}, + /* 5 */ {`[1,2]+[3]`, []any{int64(1), int64(2), int64(3)}, nil}, + /* 6 */ {`[1,4,3,2]-[3]`, []any{int64(1), int64(4), int64(2)}, nil}, + /* 7 */ {`add([1,4,3,2])`, int64(10), nil}, + /* 8 */ {`add([1,[2,2],3,2])`, int64(10), nil}, + /* 9 */ {`mul([1,4,3.0,2])`, float64(24.0), nil}, + /* 10 */ {`add([1,"hello"])`, nil, errors.New(`add(): param nr 2 (2 in 1) has wrong type string, number expected`)}, + /* 11 */ {`[a=1,b=2,c=3] but a+b+c`, int64(6), nil}, + /* 12 */ {`[1,2,3] << 2+2`, []any{int64(1), int64(2), int64(3), int64(4)}, nil}, + /* 13 */ {`2-1 >> [2,3]`, []any{int64(1), int64(2), int64(3)}, nil}, + /* 14 */ {`[1,2,3].1`, int64(2), nil}, + /* 15 */ {`ls=[1,2,3] but ls.1`, int64(2), nil}, + /* 16 */ {`ls=[1,2,3] but ls.(-1)`, int64(3), nil}, + /* 17 */ {`list=["one","two","three"]; list.10`, nil, errors.New(`[1:36] index 10 out of bounds`)}, + /* 18 */ {`["a", "b", "c"]`, newListA("a", "b", "c"), nil}, + /* 19 */ {`["a", "b", "c"]`, newList([]any{"a", "b", "c"}), nil}, // /* 8 */ {`[int(x)|x=csv("test.csv",1,all(),1)]`, []any{int64(10), int64(40), int64(20)}, nil}, // /* 9 */ {`sum(@[int(x)|x=csv("test.csv",1,all(),1)])`, []any{int64(10), int64(40), int64(20)}, nil}, diff --git a/operator-dot.go b/operator-dot.go index f094513..c4417ab 100644 --- a/operator-dot.go +++ b/operator-dot.go @@ -22,10 +22,11 @@ func verifyIndex(ctx ExprContext, indexTerm *term, maxValue int) (index int, err var indexValue any if indexValue, err = indexTerm.compute(ctx); err == nil { if v, err = indexTerm.toInt(indexValue, "index expression value must be integer"); err == nil { + if v < 0 && v >= -maxValue { + v = maxValue + v + } if v >= 0 && v < maxValue { index = v - } else if index >= -maxValue { - index = maxValue + v } else { err = indexTerm.Errorf("index %d out of bounds", v) }