Compare commits
	
		
			No commits in common. "c39970fa7e96dec174db154ce81b81c8f6ee2f5b" and "91fdc1926e65e9abf11efbe339d207bde5003a11" have entirely different histories.
		
	
	
		
			c39970fa7e
			...
			91fdc1926e
		
	
		
| @ -27,7 +27,6 @@ func TestDictParser(t *testing.T) { | |||||||
| 		/*  4 */ {`{1:"one",2:"two",3:"three"}.2`, "three", nil}, | 		/*  4 */ {`{1:"one",2:"two",3:"three"}.2`, "three", nil}, | ||||||
| 		/*  5 */ {`#{1:"one",2:"two",3:"three"}`, int64(3), nil}, | 		/*  5 */ {`#{1:"one",2:"two",3:"three"}`, int64(3), nil}, | ||||||
| 		/*  6 */ {`{1:"one"} + {2:"two"}`, map[any]any{1: "one", 2: "two"}, nil}, | 		/*  6 */ {`{1:"one"} + {2:"two"}`, map[any]any{1: "one", 2: "two"}, nil}, | ||||||
| 		/*  7 */ {`2 in {1:"one", 2:"two"}`, true, nil}, |  | ||||||
| 	} | 	} | ||||||
| 
 | 
 | ||||||
| 	succeeded := 0 | 	succeeded := 0 | ||||||
|  | |||||||
| @ -40,7 +40,6 @@ func TestListParser(t *testing.T) { | |||||||
| 		/*  18 */ {`["a", "b", "c"]`, newListA("a", "b", "c"), nil}, | 		/*  18 */ {`["a", "b", "c"]`, newListA("a", "b", "c"), nil}, | ||||||
| 		/*  19 */ {`["a", "b", "c"]`, newList([]any{"a", "b", "c"}), nil}, | 		/*  19 */ {`["a", "b", "c"]`, newList([]any{"a", "b", "c"}), nil}, | ||||||
| 		/*  20 */ {`#["a", "b", "c"]`, int64(3), nil}, | 		/*  20 */ {`#["a", "b", "c"]`, int64(3), nil}, | ||||||
| 		/*  21 */ {`"b" in ["a", "b", "c"]`, true, nil}, |  | ||||||
| 
 | 
 | ||||||
| 		// /*  8 */ {`[int(x)|x=csv("test.csv",1,all(),1)]`, []any{int64(10), int64(40), int64(20)}, 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},
 | 		// /*  9 */ {`sum(@[int(x)|x=csv("test.csv",1,all(),1)])`, []any{int64(10), int64(40), int64(20)}, nil},
 | ||||||
| @ -59,8 +58,8 @@ func TestListParser(t *testing.T) { | |||||||
| 		var gotErr error | 		var gotErr error | ||||||
| 
 | 
 | ||||||
| 		ctx := NewSimpleFuncStore() | 		ctx := NewSimpleFuncStore() | ||||||
| 		// ctx.SetVar("var1", int64(123))
 | 		ctx.SetVar("var1", int64(123)) | ||||||
| 		// ctx.SetVar("var2", "abc")
 | 		ctx.SetVar("var2", "abc") | ||||||
| 		ImportMathFuncs(ctx) | 		ImportMathFuncs(ctx) | ||||||
| 		parser := NewParser(ctx) | 		parser := NewParser(ctx) | ||||||
| 
 | 
 | ||||||
|  | |||||||
| @ -6,7 +6,6 @@ package expr | |||||||
| 
 | 
 | ||||||
| import ( | import ( | ||||||
| 	"fmt" | 	"fmt" | ||||||
| 	"reflect" |  | ||||||
| 	"strings" | 	"strings" | ||||||
| ) | ) | ||||||
| 
 | 
 | ||||||
| @ -62,16 +61,6 @@ func newList(listAny []any) (list *ListType) { | |||||||
| 	return | 	return | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| func (list *ListType) indexDeepCmp(target any) (index int) { |  | ||||||
| 	index = -1 |  | ||||||
| 	for i, item := range *list { |  | ||||||
| 		if reflect.DeepEqual(item, target) { |  | ||||||
| 			index = i |  | ||||||
| 			break |  | ||||||
| 		} |  | ||||||
| 	} |  | ||||||
| 	return |  | ||||||
| } |  | ||||||
| 
 | 
 | ||||||
| // -------- list term
 | // -------- list term
 | ||||||
| func newListTermA(args ...*term) *term { | func newListTermA(args ...*term) *term { | ||||||
|  | |||||||
| @ -4,8 +4,6 @@ | |||||||
| // operand-fraction.go
 | // operand-fraction.go
 | ||||||
| package expr | package expr | ||||||
| 
 | 
 | ||||||
| //https://www.youmath.it/lezioni/algebra-elementare/lezioni-di-algebra-e-aritmetica-per-scuole-medie/553-dalle-frazioni-a-numeri-decimali.html
 |  | ||||||
| 
 |  | ||||||
| import ( | import ( | ||||||
| 	"errors" | 	"errors" | ||||||
| 	"fmt" | 	"fmt" | ||||||
|  | |||||||
| @ -1,46 +0,0 @@ | |||||||
| // Copyright (c) 2024 Celestino Amoroso (celestino.amoroso@gmail.com).
 |  | ||||||
| // All rights reserved.
 |  | ||||||
| 
 |  | ||||||
| // operator-in.go
 |  | ||||||
| package expr |  | ||||||
| 
 |  | ||||||
| //-------- in term
 |  | ||||||
| 
 |  | ||||||
| func newInTerm(tk *Token) (inst *term) { |  | ||||||
| 	return &term{ |  | ||||||
| 		tk:       *tk, |  | ||||||
| 		children: make([]*term, 0, 2), |  | ||||||
| 		position: posInfix, |  | ||||||
| 		priority: priRelational, |  | ||||||
| 		evalFunc: evalIn, |  | ||||||
| 	} |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| func hasKey(d map[any]any, target any) (ok bool) { |  | ||||||
| 	_, ok = d[target] |  | ||||||
| 	return |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| func evalIn(ctx ExprContext, self *term) (v any, err error) { |  | ||||||
| 	var leftValue, rightValue any |  | ||||||
| 
 |  | ||||||
| 	if leftValue, rightValue, err = self.evalInfix(ctx); err != nil { |  | ||||||
| 		return |  | ||||||
| 	} |  | ||||||
| 
 |  | ||||||
| 	if IsList(rightValue) { |  | ||||||
| 		list, _ := rightValue.(*ListType) |  | ||||||
| 		v = list.indexDeepCmp(leftValue) >= 0 |  | ||||||
| 	} else if IsDict(rightValue) { |  | ||||||
| 		d, _ := rightValue.(map[any]any) |  | ||||||
| 		v = hasKey(d, leftValue) |  | ||||||
| 	} else { |  | ||||||
| 		err = self.errIncompatibleTypes(leftValue, rightValue) |  | ||||||
| 	} |  | ||||||
| 	return |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| // init
 |  | ||||||
| func init() { |  | ||||||
| 	registerTermConstructor(SymKwIn, newInTerm) |  | ||||||
| } |  | ||||||
| @ -99,7 +99,6 @@ const ( | |||||||
| 	SymKwBut | 	SymKwBut | ||||||
| 	SymKwFunc | 	SymKwFunc | ||||||
| 	SymKwBuiltin | 	SymKwBuiltin | ||||||
| 	SymKwIn |  | ||||||
| 	SymKwInclude | 	SymKwInclude | ||||||
| 	SymKwNil | 	SymKwNil | ||||||
| ) | ) | ||||||
| @ -113,7 +112,6 @@ func init() { | |||||||
| 		"BUILTIN": SymKwBuiltin, | 		"BUILTIN": SymKwBuiltin, | ||||||
| 		"BUT":     SymKwBut, | 		"BUT":     SymKwBut, | ||||||
| 		"FUNC":    SymKwFunc, | 		"FUNC":    SymKwFunc, | ||||||
| 		"IN":      SymKwIn, |  | ||||||
| 		"INCLUDE": SymKwInclude, | 		"INCLUDE": SymKwInclude, | ||||||
| 		"NOT":     SymKwNot, | 		"NOT":     SymKwNot, | ||||||
| 		"OR":      SymKwOr, | 		"OR":      SymKwOr, | ||||||
|  | |||||||
| @ -31,7 +31,6 @@ func TestGetRoom(t *testing.T) { | |||||||
| 		t.Errorf("err: got <%v>, want <nil>", gotErr) | 		t.Errorf("err: got <%v>, want <nil>", gotErr) | ||||||
| 	} | 	} | ||||||
| } | } | ||||||
| 
 |  | ||||||
| func TestGetChildrenCount(t *testing.T) { | func TestGetChildrenCount(t *testing.T) { | ||||||
| 	tk1 := NewValueToken(0, 0, SymInteger, "100", 100) | 	tk1 := NewValueToken(0, 0, SymInteger, "100", 100) | ||||||
| 
 | 
 | ||||||
|  | |||||||
							
								
								
									
										139
									
								
								utils_test.go
									
									
									
									
									
								
							
							
						
						
									
										139
									
								
								utils_test.go
									
									
									
									
									
								
							| @ -1,139 +0,0 @@ | |||||||
| // Copyright (c) 2024 Celestino Amoroso (celestino.amoroso@gmail.com).
 |  | ||||||
| // All rights reserved.
 |  | ||||||
| 
 |  | ||||||
| // utils_test.go
 |  | ||||||
| package expr |  | ||||||
| 
 |  | ||||||
| import ( |  | ||||||
| 	"errors" |  | ||||||
| 	"testing" |  | ||||||
| ) |  | ||||||
| 
 |  | ||||||
| func TestIsString(t *testing.T) { |  | ||||||
| 	count := 0 |  | ||||||
| 	succeeded := 0 |  | ||||||
| 	failed := 0 |  | ||||||
| 
 |  | ||||||
| 	count++ |  | ||||||
| 	if !IsBool(true) { |  | ||||||
| 		t.Errorf("%d: IsBool(true) -> result = false, want true", count) |  | ||||||
| 		failed++ |  | ||||||
| 	} else { |  | ||||||
| 		succeeded++ |  | ||||||
| 	} |  | ||||||
| 
 |  | ||||||
| 	count++ |  | ||||||
| 	if !IsString("abc") { |  | ||||||
| 		t.Errorf("%d: IsString(\"abc\") -> result = false, want true", count) |  | ||||||
| 		failed++ |  | ||||||
| 	} else { |  | ||||||
| 		succeeded++ |  | ||||||
| 	} |  | ||||||
| 
 |  | ||||||
| 	count++ |  | ||||||
| 	if !IsInteger(int64(123)) { |  | ||||||
| 		t.Errorf("%d: IsInteger(123) -> result = false, want true", count) |  | ||||||
| 		failed++ |  | ||||||
| 	} else { |  | ||||||
| 		succeeded++ |  | ||||||
| 	} |  | ||||||
| 
 |  | ||||||
| 	count++ |  | ||||||
| 	if !IsFloat(1.23) { |  | ||||||
| 		t.Errorf("%d: IsFloat(1.23) -> result = false, want true", count) |  | ||||||
| 		failed++ |  | ||||||
| 	} else { |  | ||||||
| 		succeeded++ |  | ||||||
| 	} |  | ||||||
| 
 |  | ||||||
| 	count++ |  | ||||||
| 	if !IsFloat(numAsFloat(123)) { |  | ||||||
| 		t.Errorf("%d: IsFloat(numAsFloat(123)) -> result = false, want true", count) |  | ||||||
| 		failed++ |  | ||||||
| 	} else { |  | ||||||
| 		succeeded++ |  | ||||||
| 	} |  | ||||||
| 
 |  | ||||||
| 	count++ |  | ||||||
| 	b, ok := toBool(true) |  | ||||||
| 	if !(ok && b) { |  | ||||||
| 		t.Errorf("%d: toBool(true) b=%v, ok=%v -> result = false, want true", count, b, ok) |  | ||||||
| 		failed++ |  | ||||||
| 	} else { |  | ||||||
| 		succeeded++ |  | ||||||
| 	} |  | ||||||
| 
 |  | ||||||
| 	count++ |  | ||||||
| 	b, ok = toBool("abc") |  | ||||||
| 	if !(ok && b) { |  | ||||||
| 		t.Errorf("%d: toBool(\"abc\") b=%v, ok=%v -> result = false, want true", count, b, ok) |  | ||||||
| 		failed++ |  | ||||||
| 	} else { |  | ||||||
| 		succeeded++ |  | ||||||
| 	} |  | ||||||
| 
 |  | ||||||
| 	t.Logf("test count: %d, succeeded count: %d, failed count: %d", count, succeeded, failed) |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| func TestToIntOk(t *testing.T) { |  | ||||||
| 	source := int64(64) |  | ||||||
| 	wantValue := int(64) |  | ||||||
| 	wantErr := error(nil) |  | ||||||
| 
 |  | ||||||
| 	gotValue, gotErr := toInt(source, "test") |  | ||||||
| 
 |  | ||||||
| 	if gotErr != nil || gotValue != wantValue { |  | ||||||
| 		t.Errorf("toInt(%v, \"test\") gotValue=%v, gotErr=%v -> wantValue=%v, wantErr=%v", |  | ||||||
| 			source, gotValue, gotErr, wantValue, wantErr) |  | ||||||
| 	} |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| func TestToIntErr(t *testing.T) { |  | ||||||
| 	source := uint64(64) |  | ||||||
| 	wantValue := 0 |  | ||||||
| 	wantErr := errors.New(`test expected integer, got uint64 (64)`) |  | ||||||
| 
 |  | ||||||
| 	gotValue, gotErr := toInt(source, "test") |  | ||||||
| 
 |  | ||||||
| 	if gotErr.Error() != wantErr.Error() || gotValue != wantValue { |  | ||||||
| 		t.Errorf("toInt(%v, \"test\") gotValue=%v, gotErr=%v -> wantValue=%v, wantErr=%v", |  | ||||||
| 			source, gotValue, gotErr, wantValue, wantErr) |  | ||||||
| 	} |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| func TestAnyInteger(t *testing.T) { |  | ||||||
| 	type inputType struct { |  | ||||||
| 		source    any |  | ||||||
| 		wantValue int64 |  | ||||||
| 		wantOk    bool |  | ||||||
| 	} |  | ||||||
| 	section := "utils.anyInteger" |  | ||||||
| 
 |  | ||||||
| 	inputs := []inputType{ |  | ||||||
| 		/*  1 */ {int8(-8), int64(-8), true}, |  | ||||||
| 		/*  2 */ {int16(-16), int64(-16), true}, |  | ||||||
| 		/*  3 */ {int32(-32), int64(-32), true}, |  | ||||||
| 		/*  4 */ {int64(-64), int64(-64), true}, |  | ||||||
| 		/*  5 */ {uint8(8), int64(8), true}, |  | ||||||
| 		/*  6 */ {uint16(16), int64(16), true}, |  | ||||||
| 		/*  7 */ {uint32(32), int64(32), true}, |  | ||||||
| 		/*  8 */ {uint64(64), int64(64), true}, |  | ||||||
| 		/*  9 */ {int(-1), int64(-1), true}, |  | ||||||
| 		/* 10 */ {true, 0, false}, |  | ||||||
| 	} |  | ||||||
| 
 |  | ||||||
| 	succeeded := 0 |  | ||||||
| 	failed := 0 |  | ||||||
| 
 |  | ||||||
| 	for i, input := range inputs { |  | ||||||
| 		gotValue, gotOk := anyInteger(input.source) |  | ||||||
| 		if gotOk != input.wantOk || gotValue != input.wantValue { |  | ||||||
| 			t.Errorf("%d: anyInteger(%v) -> gotOk = %t, wantOk = %t; gotValue = %v, wantValue = %v", |  | ||||||
| 				i+1, input.source, gotOk, input.wantOk, gotValue, input.wantValue) |  | ||||||
| 			failed++ |  | ||||||
| 		} else { |  | ||||||
| 			succeeded++ |  | ||||||
| 		} |  | ||||||
| 	} |  | ||||||
| 	t.Logf("%s -- test count: %d, succeeded: %d, failed: %d", section, len(inputs), succeeded, failed) |  | ||||||
| } |  | ||||||
		Loading…
	
		Reference in New Issue
	
	Block a user