//go:build legacytests
// +build legacytests

package tests

import (
	"testing"

	. "github.com/smartystreets/goconvey/convey"
)

// TestMain 测试入口点
func TestMain(m *testing.M) {
	// 运行测试
	m.Run()
}

// TestSetup 测试基础设置
func TestSetup(t *testing.T) {
	Convey("测试基础设置", t, func() {
		Convey("当初始化测试环境时", func() {
			// 初始化测试环境
			testEnv := &TestEnvironment{
				Name:    "test-env",
				Version: "1.0.0",
			}

			Convey("那么测试环境应该被正确创建", func() {
				So(testEnv.Name, ShouldEqual, "test-env")
				So(testEnv.Version, ShouldEqual, "1.0.0")
			})
		})
	})
}

// TestEnvironment 测试环境结构
type TestEnvironment struct {
	Name    string
	Version string
	Config  map[string]interface{}
}

// NewTestEnvironment 创建新的测试环境
func NewTestEnvironment(name string) *TestEnvironment {
	return &TestEnvironment{
		Name:   name,
		Config: make(map[string]interface{}),
	}
}

// WithConfig 设置配置
func (e *TestEnvironment) WithConfig(key string, value interface{}) *TestEnvironment {
	e.Config[key] = value
	return e
}

// GetConfig 获取配置
func (e *TestEnvironment) GetConfig(key string) interface{} {
	return e.Config[key]
}

// Setup 设置测试环境
func (e *TestEnvironment) Setup() *TestEnvironment {
	// 初始化测试环境
	e.Config["initialized"] = true
	return e
}

// Cleanup 清理测试环境
func (e *TestEnvironment) Cleanup() {
	// 清理测试环境
	e.Config = make(map[string]interface{})
}

// TestEnvironmentManagement 测试环境管理
func TestEnvironmentManagement(t *testing.T) {
	Convey("测试环境管理", t, func() {
		var env *TestEnvironment

		Convey("当创建新测试环境时", func() {
			env = NewTestEnvironment("test-app")

			Convey("那么环境应该有正确的名称", func() {
				So(env.Name, ShouldEqual, "test-app")
				So(env.Version, ShouldBeEmpty)
				So(env.Config, ShouldNotBeNil)
			})
		})

		Convey("当设置配置时", func() {
			env.WithConfig("debug", true)
			env.WithConfig("port", 8080)

			Convey("那么配置应该被正确设置", func() {
				So(env.GetConfig("debug"), ShouldEqual, true)
				So(env.GetConfig("port"), ShouldEqual, 8080)
			})
		})

		Convey("当初始化环境时", func() {
			env.Setup()

			Convey("那么环境应该被标记为已初始化", func() {
				So(env.GetConfig("initialized"), ShouldEqual, true)
			})
		})

		Reset(func() {
			if env != nil {
				env.Cleanup()
			}
		})
	})
}

// TestConveyBasicUsage 测试 Convey 基础用法
func TestConveyBasicUsage(t *testing.T) {
	Convey("Convey 基础用法测试", t, func() {
		Convey("数字操作", func() {
			num := 42

			Convey("应该能够进行基本比较", func() {
				So(num, ShouldEqual, 42)
				So(num, ShouldBeGreaterThan, 0)
				So(num, ShouldBeLessThan, 100)
			})
		})

		Convey("字符串操作", func() {
			str := "hello world"

			Convey("应该能够进行字符串比较", func() {
				So(str, ShouldEqual, "hello world")
				So(str, ShouldContainSubstring, "hello")
				So(str, ShouldStartWith, "hello")
				So(str, ShouldEndWith, "world")
			})
		})

		Convey("切片操作", func() {
			slice := []int{1, 2, 3, 4, 5}

			Convey("应该能够进行切片操作", func() {
				So(slice, ShouldHaveLength, 5)
				So(slice, ShouldContain, 3)
				So(slice, ShouldNotContain, 6)
			})
		})

		Convey("Map 操作", func() {
			m := map[string]interface{}{
				"name":  "test",
				"value": 123,
			}

			Convey("应该能够进行 Map 操作", func() {
				So(m, ShouldContainKey, "name")
				So(m, ShouldContainKey, "value")
				So(m["name"], ShouldEqual, "test")
				So(m["value"], ShouldEqual, 123)
			})
		})
	})
}
