// Copyright (c) 2024 Celestino Amoroso (celestino.amoroso@gmail.com). // All rights reserved. // expr_test.go package expr import ( "fmt" "strings" "testing" ) func TestExpr(t *testing.T) { type inputType struct { source string wantResult any wantErr error } inputs := []inputType{ /* 1 */ {`0?{}`, nil, nil}, /* 2 */ {`fact=func(n){(n)?{1}::{n*fact(n-1)}}; fact(5)`, int64(120), nil}, /* 3 */ {`f=openFile("test-file.txt"); line=readFile(f); closeFile(f); line`, "uno", nil}, /* 4 */ {`mynot=func(v){int(v)?{true}::{false}}; mynot(0)`, true, nil}, } succeeded := 0 failed := 0 inputs1 := []inputType{ /* 1 */ {` ds={ "init":func(end){@end=end; @current=0 but true}, "current":func(){current}, "next":func(){ ((next=current+1) <= end) ? [true] {@current=next but current} :: {nil} } }; it=$(ds,3); it++; it++ `, int64(1), nil}, } for i, input := range inputs1 { var expr Expr var gotResult any var gotErr error ctx := NewSimpleFuncStore() // ImportMathFuncs(ctx) // ImportImportFunc(ctx) ImportOsFuncs(ctx) parser := NewParser(ctx) logTest(t, i+1, input.source, input.wantResult, input.wantErr) r := strings.NewReader(input.source) scanner := NewScanner(r, DefaultTranslations()) good := true if expr, gotErr = parser.Parse(scanner); gotErr == nil { gotResult, gotErr = expr.Eval(ctx) } if gotResult != input.wantResult { t.Errorf("%d: %q -> result = %v [%T], want %v [%T]", i+1, input.source, gotResult, gotResult, input.wantResult, input.wantResult) good = false } if gotErr != input.wantErr { if input.wantErr == nil || gotErr == nil || (gotErr.Error() != input.wantErr.Error()) { t.Errorf("%d: %q -> err = <%v>, want <%v>", i+1, input.source, gotErr, input.wantErr) good = false } } if good { succeeded++ } else { failed++ } } t.Log(fmt.Sprintf("test count: %d, succeeded count: %d, failed count: %d", len(inputs), succeeded, failed)) }