// Package  utils add by blacknc <blacknc@163.com> at 2024/04/15 17:32:56
package utils

import (
	"fmt"
	"testing"
)

func TestPathTrie_Search(t *testing.T) {
	tree := NewPathTrie()
	paths := [][2]string{
		{"GET", "/user/{userid}"},
		{"GET", "/user/{userid}/age/{age}"},
		{"get", "/order/{id}/{price}"},

		{"POST", "/user/{userid}"},
		{"POST", "/user/{userid}/age/{age}"},
		{"post", "/order/{id}/{price}"},
	}
	for _, path := range paths {
		tree.Insert(path[0], path[1], nil)
	}

	type args struct {
		method string
		path   string
	}
	tests := []struct {
		name string
		args args
		want bool
	}{
		{
			name: "OK1",
			args: args{
				method: "GET",
				path:   "/user/123/age/abc",
			},
			want: true,
		},
		{
			name: "OK2",
			args: args{
				method: "GET",
				path:   "/user/123",
			},
			want: true,
		},
		{
			name: "OK3",
			args: args{
				method: "GET",
				path:   "/order/123/4.5",
			},
			want: true,
		},
		{
			name: "Failed1",
			args: args{
				method: "GET",
				path:   "/order1/123/4.5",
			},
			want: false,
		},

		{
			name: "OK_POST-USER-AGE",
			args: args{
				method: "POST",
				path:   "/user/123/age/abc",
			},
			want: true,
		},
		{
			name: "OK_POST_USER",
			args: args{
				method: "POST",
				path:   "/user/123",
			},
			want: true,
		},
		{
			name: "OK_POST_ORDER",
			args: args{
				method: "POST",
				path:   "/order/123/4.5",
			},
			want: true,
		},
		{
			name: "Failed_POST_ORDER",
			args: args{
				method: "POST",
				path:   "/order1/123/4.5",
			},
			want: false,
		},
	}
	for _, tt := range tests {
		t.Run(tt.name, func(t *testing.T) {
			got, got1, got2 := tree.Search(tt.args.method, tt.args.path)
			if got != tt.want {
				t.Errorf("PathTrie.Search() got = %v, want %v", got, tt.want)
			}
			fmt.Println(got, got1, got2)
		})
	}
}

func TestPathTrie_Insert(t *testing.T) {
	tree := NewPathTrie()
	type args struct {
		method string
		path   string
		data   any
	}
	tests := []struct {
		name    string
		args    args
		wantErr bool
	}{
		{
			name: "OK1",
			args: args{
				method: "POST",
				path:   "/abc/{year1}/{a123}",
				data:   nil,
			},
			wantErr: false,
		},
		{
			name: "OK1",
			args: args{
				method: "POST",
				path:   "/abc/{year}/dump_ZVwjbxx",
				data:   nil,
			},
			wantErr: true,
		},
		{
			name: "OK1",
			args: args{
				method: "GET",
				path:   "/user/{userid}",
				data:   nil,
			},
			wantErr: false,
		},
		{
			name: "OK-on conflict",
			args: args{
				method: "GET",
				path:   "/user/123",
				data:   nil,
			},
			wantErr: false,
		},
		{
			name: "OK2",
			args: args{
				method: "GET",
				path:   "/user/{userid}/age/{age}",
				data:   nil,
			},
			wantErr: false,
		},
		{
			name: "Failed1",
			args: args{
				method: "GET",
				path:   "/user/{userid1}/age/{age}",
				data:   nil,
			},
			wantErr: true,
		},
		{
			name: "OK_POST-USER",
			args: args{
				method: "POST",
				path:   "/user/{userid1}/age/{age}",
				data:   nil,
			},
			wantErr: false,
		},
		{
			name: "OK3",
			args: args{
				method: "GET",
				path:   "/user1/{userid}/age/{age}",
				data:   nil,
			},
			wantErr: false,
		},
		{
			name: "Failed-Invalid Parameters",
			args: args{
				method: "GET",
				path:   "/user1/{userid",
				data:   nil,
			},
			wantErr: true,
		},
		{
			name: "OK4",
			args: args{
				method: "GET",
				path:   "/order/info",
				data:   nil,
			},
			wantErr: false,
		},
		{
			name: "Failed2",
			args: args{
				method: "GET",
				path:   "/order/info",
				data:   nil,
			},
			wantErr: true,
		},
		{
			name: "OK_POST_ORDER",
			args: args{
				method: "POST",
				path:   "/order/info",
				data:   nil,
			},
			wantErr: false,
		},
	}
	for _, tt := range tests {
		t.Run(tt.name, func(t *testing.T) {
			if err := tree.Insert(tt.args.method, tt.args.path, tt.args.data); (err != nil) != tt.wantErr {
				t.Errorf("PathTrie.Insert() error = %v, wantErr %v", err, tt.wantErr)
			} else {
				fmt.Println(err)
			}
		})
	}
}
