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

// t_helpers_test.go
package expr

import (
	"testing"
)

// TODO The new function param model does not allow this kind of test
// ------------------------------------------------------------------
// func subtract(ctx ExprContext, name string, args map[string]any) (result any, err error) {
// 	if len(args) != 2 {
// 		err = fmt.Errorf("%s(): requires exactly two arguments", name)
// 		return
// 	}
// 	x, xok := args[0].(int64)
// 	y, yok := args[1].(int64)
// 	if xok && yok {
// 		result = x - y
// 	} else {
// 		err = fmt.Errorf("expected integer (int64) arguments, got %T and %T values", x, y)
// 	}
// 	return
// }

// func TestEvalStringA(t *testing.T) {

// 	source := `a + b * subtract(4,2)`
// 	args := []Arg{
// 		{"a", uint8(1)},
// 		{"b", int8(2)},
// 		{"subtract", FuncTemplate2(subtract)},
// 		// force coverage
// 		{"a16", uint16(1)},
// 		{"b16", int16(2)},
// 		{"a32", uint32(1)},
// 		{"b32", int32(2)},
// 		{"a64", uint64(1)},
// 		{"b64", int64(2)},
// 		{"f32", float32(1.0)},
// 		{"f64", float64(1.0)},
// 	}

// 	wantResult := int64(5)
// 	gotResult, gotErr := EvalStringA(source, args...)
// 	if value, ok := gotResult.(int64); ok && value != wantResult {
// 		t.Errorf("Source %q got %v, want %v", source, gotResult, wantResult)
// 		t.Errorf("Error: %v", gotErr)
// 	}
// }

func TestEvalString(t *testing.T) {

	ctx := NewSimpleStore()
	ctx.SetVar("a", uint8(1))
	ctx.SetVar("b", int8(2))
	ctx.SetVar("f", 2.0)
	// force coverage
	ctx.SetVar("a16", uint16(1))
	ctx.SetVar("b16", int16(2))
	ctx.SetVar("a32", uint32(1))
	ctx.SetVar("b32", int32(2))
	ctx.SetVar("a64", uint64(1))
	ctx.SetVar("b64", int64(2))
	ctx.SetVar("f32", float32(1.0))
	ctx.SetVar("f64", float64(1.0))

	// force coverage
	ctx.GetFuncInfo("dummy")
	ctx.Call("dummy", map[string]any{})

	source := `a + b * f`

	wantResult := float64(5)
	gotResult, gotErr := EvalString(ctx, source)
	if value, ok := gotResult.(float64); ok && value != wantResult {
		t.Errorf("Source %q got %v, want %v", source, gotResult, wantResult)
		t.Errorf("Error: %v", gotErr)
	}
}