package interceptor

import (
	"fmt"
	"path/filepath"
	"runtime"
	"testing"

	"github.com/mattn/anko/env"
)

func TestAnkointerceptor_ExecRequire(t *testing.T) {
	// 创建测试环境
	e := env.NewEnv()

	// 创建拦截器实例
	interceptor := NewAnkointerceptor(e)
	_, file, _, _ := runtime.Caller(0)
	scriptPath := filepath.Join(filepath.Dir(file), "testdata/test_caller.ank")
	v, _ := interceptor.Exec(scriptPath)
	if v != "Hello, tom from test script" {
		t.Errorf("Not equal")
	}

}

func TestAnkointerceptor_loadlib(t *testing.T) {
	e := env.NewEnv()
	interceptor := NewAnkointerceptor(e)
	_, file, _, _ := runtime.Caller(0)
	scriptPath := filepath.Join(filepath.Dir(file), "testdata/test_loadso.ank")
	v, _ := interceptor.Exec(scriptPath)
	if v != "Hello, world!" {
		t.Errorf("Loadso test failed")
	}
}

func TestAnkointerceptor_RegistModule(t *testing.T) {
	e := env.NewEnv()
	interceptor := NewAnkointerceptor(e)
	_, file, _, _ := runtime.Caller(0)
	scriptPath := filepath.Join(filepath.Dir(file), "testdata/test_injectmodule.ank")
	m := make(map[string]interface{})
	m["Hi"] = func() string {
		return "Hello, world!"
	}
	interceptor.RegistModule("inject", m)
	v, _ := interceptor.Exec(scriptPath)
	if v != "Hello, world!" {
		t.Errorf("Inject module test failed")
	}
}

type TestStruct struct {
	Name string
}

func (t *TestStruct) Hi() string {
	return fmt.Sprintf("Hello, %s!", t.Name)
}

func TestAnkointerceptor_RegistStructAsModule(t *testing.T) {
	e := env.NewEnv()
	interceptor := NewAnkointerceptor(e)
	_, file, _, _ := runtime.Caller(0)
	scriptPath := filepath.Join(filepath.Dir(file), "testdata/test_injectmodule.ank")

	interceptor.RegistStructAsModule("inject", &TestStruct{"world"})
	v, _ := interceptor.Exec(scriptPath)
	if v != "Hello, world!" {
		t.Errorf("Inject module test failed")
	}

}
