// Copyright (c) 2024 Celestino Amoroso (celestino.amoroso@gmail.com).
// All rights reserved.

// t_list_test.go
package expr

import (
	"testing"
)

func TestListParser(t *testing.T) {
	section := "List"

	inputs := []inputType{
		/*   1 */ {`[]`, newListA(), nil},
		/*   2 */ {`[1,2,3]`, newListA(int64(1), int64(2), int64(3)), nil},
		/*   3 */ {`[1,2,"hello"]`, newListA(int64(1), int64(2), "hello"), nil},
		/*   4 */ {`[1+2, not true, "hello"]`, newListA(int64(3), false, "hello"), nil},
		/*   5 */ {`[1,2]+[3]`, newListA(int64(1), int64(2), int64(3)), nil},
		/*   6 */ {`[1,4,3,2]-[3]`, newListA(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, `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`, newListA(int64(1), int64(2), int64(3), int64(4)), nil},
		/*  13 */ {`2-1 >> [2,3]`, newListA(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, `[1:34] index 10 out of bounds`},
		/*  18 */ {`["a", "b", "c"]`, newListA("a", "b", "c"), nil},
		/*  19 */ {`["a", "b", "c"]`, newList([]any{"a", "b", "c"}), nil},
		/*  20 */ {`#["a", "b", "c"]`, int64(3), nil},
		/*  21 */ {`"b" in ["a", "b", "c"]`, true, nil},
		/*  22 */ {`a=[1,2]; (a)<<3`, newListA(int64(1), int64(2), int64(3)), nil},
		/*  23 */ {`a=[1,2]; (a)<<3; a`, newListA(int64(1), int64(2)), nil},
		/*  24 */ {`["a","b","c","d"][1]`, "b", nil},
		/*  25 */ {`["a","b","c","d"][1,1]`, nil, `[1:19] one index only is allowed`},
		/*  26 */ {`[0,1,2,3,4][:]`, newListA(int64(0), int64(1), int64(2), int64(3), int64(4)), nil},
		/*  27 */ {`["a", "b", "c"] << ;`, nil, `[1:18] infix operator "<<" requires two non-nil operands, got 1`},
		/*  28 */ {`2 << 3;`, nil, `[1:4] left operand '2' [integer] and right operand '3' [integer] are not compatible with operator "<<"`},
		/*  29 */ {`but >> ["a", "b", "c"]`, nil, `[1:6] infix operator ">>" requires two non-nil operands, got 0`},
		/*  30 */ {`2 >> 3;`, nil, `[1:4] left operand '2' [integer] and right operand '3' [integer] are not compatible with operator ">>"`},
		/*  31 */ {`a=[1,2]; a<<3`, newListA(int64(1), int64(2), int64(3)), nil},
		/*  33 */ {`a=[1,2]; 5>>a`, newListA(int64(5), int64(1), int64(2)), nil},
		/*  34 */ {`L=[1,2]; L[0]=9; L`, newListA(int64(9), int64(2)), nil},
		/*  35 */ {`L=[1,2]; L[5]=9; L`, nil, `index 5 out of bounds (0, 1)`},
		/*  36 */ {`L=[1,2]; L[]=9; L`, nil, `[1:12] index/key specification expected, got [] [list]`},
		/*  37 */ {`L=[1,2]; L[nil]=9;`, nil, `[1:12] index/key is nil`},
		/*  38 */ {`[0,1,2,3,4][2:3]`, newListA(int64(2)), nil},
		/*  39 */ {`[0,1,2,3,4][3:-1]`, newListA(int64(3)), nil},
		/*  40 */ {`[0,1,2,3,4][-3:-1]`, newListA(int64(2), int64(3)), nil},
		/*  41 */ {`[0,1,2,3,4][0:]`, newListA(int64(0), int64(1), int64(2), int64(3), int64(4)), nil},
	}

	// t.Setenv("EXPR_PATH", ".")

	// runTestSuiteSpec(t, section, inputs, 1)
	runTestSuite(t, section, inputs)
}