package server

import (
	"container/list"
	"net/http"
	"testing"
)

func TestNewMiddlewareLink(t *testing.T) {
	ml := NewMiddlewareLink()

	if ml == nil {
		t.Errorf("NewMiddlewareLink() = nil, want %T", &MiddlewareLink{list.New()})
	}
	if ml.Len() == 0 {
		t.Errorf("NewMiddlewareLink() returned list with length %d, want %d", 0, 1)
	}
}

func TestMiddlewareLink_Add(t *testing.T) {
	ml := NewMiddlewareLink()
	element := Done

	if ml.Len() != 1 {
		t.Errorf("Add() did not add element to the list, length = %d, want %d", ml.Len(), 1)
	}
	ml.Add(element)
	if ml.Len() != 1 {
		t.Error("Should not Add Done twice")
	}

	t1 := ml.ServeHTTP(nil, nil)

	if !t1 {
		t.Error("ServeHTTP() returned false, want true")
	}

	B := func(w http.ResponseWriter, r *http.Request, next func()) {

	}
	ml.Add(B)
	if ml.Len() != 2 {
		t.Error("Should has 2 middleware but got 1")
	}
	t2 := ml.ServeHTTP(nil, nil)
	if t2 {
		t.Error("ServeHTTP() returned true, want false")
	}
}

func TestNewRoute(t *testing.T) {
	// 创建一个测试用的http.Handler
	handleFn := http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
		w.WriteHeader(http.StatusOK)
	})

	// 调用被测试的函数
	route := NewRoute("GET", "/test", handleFn)

	// 验证生成的route是否符合预期
	if route.Method != "GET" {
		t.Errorf("Expected method to be GET, got %s", route.Method)
	}
	if route.Path != "/test" {
		t.Errorf("Expected path to be /test, got %s", route.Path)
	}
	if route.Handler == nil {
		t.Error("Expected handler to be set")
	}
	if route.matcher == nil {
		t.Error("Expected matcher to be set")
	}
	if route.middles == nil {
		t.Error("Expected middles to be set")
	}

	route2 := NewRoute("GET", "/test2/:id", handleFn)

	if route2.matcher.Params[0] != "id" {
		t.Errorf("Expected param name to be id, got %s", route2.matcher.Params[0])
	}

	if route2.matcher.Reg == nil {
		t.Error("Expected matcher.Reg to be set")
	}
}
