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

// t_context_test.go
package expr

import (
	"testing"

	"git.portale-stac.it/go-pkg/expr/types/list"
)

func TestCtrlSet(t *testing.T) {
	section := "Context"
	varName := "_test_var"
	varValue := "test-value"
	prevValue := "test-prev"

	ctx := NewSimpleStore()
	GlobalCtrlSet(ctx, varName, prevValue)
	if v := GlobalCtrlSet(ctx, varName, varValue); v != nil {
		if s, ok := v.(string); ok {
			if s != prevValue {
				t.Errorf(`%s -- CtrlSet(%q, %q) should have returned %q, got %q`, section, varName, varValue, varValue, s)
			}
		} else {
			t.Errorf(`%s -- CtrlSet(%q, %q) should have returned a string, got %v [%T]`, section, varName, varValue, v, v)
		}
	} else {
		t.Errorf(`%s -- CtrlSet(%q, %q) should have returned a value, got nil`, section, varName, varValue)
	}
}

func TestCtrlGet(t *testing.T) {
	section := "Context"
	varName := "_test_var"
	varValue := "test-value"

	ctx := NewSimpleStore()
	GlobalCtrlSet(ctx, varName, varValue)
	if v := GlobalCtrlGet(ctx, varName); v != nil {
		if s, ok := v.(string); ok {
			if s != "test-value" {
				t.Errorf(`%s -- CtrlGet(%q) should have returned %q, got %q`, section, varName, varValue, s)
			}
		} else {
			t.Errorf(`%s -- CtrlGet(%q) should have returned a string, got %v [%T]`, section, varName, v, v)
		}
	} else {
		t.Errorf(`%s -- CtrlGet(%q) should have returned a value, got nil`, section, varName)
	}
}

func TestCtrlGetNotDefined(t *testing.T) {
	section := "Context"
	varName := "_test_var"

	ctx := NewSimpleStore()
	if v := GlobalCtrlGet(ctx, varName); v != nil {
		t.Errorf(`%s -- CtrlGet(%q) should have returned nil, got %v`, section, varName, v)
	}
}

func TestCtrlEnable(t *testing.T) {
	section := "Context"
	varName := "test_var"
	varValue := true

	ctx := NewSimpleStore()
	GlobalCtrlSet(ctx, varName, varValue)
	if !CtrlEnable(ctx, varName) {
		t.Errorf(`%s -- CtrlEnable(ctx, %q) should have returned 'true', got 'false'`, section, varName)
	}

	if !CtrlDisable(ctx, varName) {
		t.Errorf(`%s -- CtrlEnable(ctx, %q) should have returned 'true', got 'false'`, section, varName)
	}

}

func TestList(t *testing.T) {
	section := "Context"

	inputs := []inputType{
		/*  1 */ {`$$(5)`, list.NewLinkedListA(5), nil},
		/*  2 */ {`$$($(..2))`, list.NewLinkedListA(0, 1), nil},
		/*  3 */ {`string(($$global).funcs.bool)`, `bool(value):boolean{}`, nil},
	}

	// runTestSuiteSpec(t, section, inputs, 3)
	RunTestSuite(t, section, inputs)

}
