package goemitter

import (
	"testing"
	"time"
)

func TestEventEmitter_Emit(t *testing.T) {
	emitter := &EventEmitter{
		callbacks:     make(map[string][]func(args ...interface{})),
		onceCallbacks: make(map[string][]func(args ...interface{})),
	}

	// 注册一个普通回调函数
	emitter.callbacks["testEvent"] = append(emitter.callbacks["testEvent"], func(data ...interface{}) {
		t.Log("普通回调函数被调用")
	})

	// 注册一个一次性回调函数
	emitter.onceCallbacks["testEvent"] = append(emitter.onceCallbacks["testEvent"], func(data ...interface{}) {
		t.Log("一次性回调函数被调用")
	})

	// 触发事件
	emitter.Emit("testEvent", "testData")

	// 等待一段时间，确保异步执行的回调函数完成
	time.Sleep(1 * time.Second)
	if len(emitter.onceCallbacks["testEvent"]) != 0 {
		t.Error("一次性回调函数没有被清除")
	}
}

func TestEventEmitter_Once(t *testing.T) {
	emitter := &EventEmitter{
		onceCallbacks: make(map[string][]func(args ...interface{})),
	}

	// 测试添加新事件和回调函数
	emitter.Once("event1", func(args ...interface{}) {})
	if len(emitter.onceCallbacks["event1"]) != 1 {
		t.Error("一次性回调函数添加失败")
	}

	// 测试添加已存在事件的回调函数
	emitter.Once("event1", func(args ...interface{}) {})
	if len(emitter.onceCallbacks["event1"]) != 2 {
		t.Error("一次性回调函数再次添加失败")
	}

	// 测试不存在的事件
	emitter.Once("event2", func(args ...interface{}) {})
	emitter.Emit("event1", "testData")

	// 等待一段时间，确保异步执行的回调函数完成
	time.Sleep(1 * time.Second)
	if len(emitter.onceCallbacks["event1"]) != 0 {
		t.Error("一次性回调函数没有被清除")
	}
}
