package router_test

import (
	"reflect"
	"testing"

	"github.com/xtls/xray-core/app/router"
)

func TestWeight(t *testing.T) {
	manager := router.NewWeightManager(
		[]*router.StrategyWeight{
			{
				Match: "x5",
				Value: 100,
			},
			{
				Match: "x8",
			},
			{
				Regexp: true,
				Match:  `\bx0+(\.\d+)?\b`,
				Value:  1,
			},
			{
				Regexp: true,
				Match:  `\bx\d+(\.\d+)?\b`,
			},
		},
		1, func(v, w float64) float64 {
			return v * w
		},
	)
	tags := []string{
		"node name, x5, and more",
		"node name, x8",
		"node name, x15",
		"node name, x0100, and more",
		"node name, x10.1",
		"node name, x00.1, and more",
	}
	// test weight
	expected := []float64{100, 8, 15, 100, 10.1, 1}
	actual := make([]float64, 0)
	for _, tag := range tags {
		actual = append(actual, manager.Get(tag))
	}
	if !reflect.DeepEqual(expected, actual) {
		t.Errorf("expected: %v, actual: %v", expected, actual)
	}
	// test scale
	expected2 := []float64{1000, 80, 150, 1000, 101, 10}
	actual2 := make([]float64, 0)
	for _, tag := range tags {
		actual2 = append(actual2, manager.Apply(tag, 10))
	}
	if !reflect.DeepEqual(expected2, actual2) {
		t.Errorf("expected2: %v, actual2: %v", expected2, actual2)
	}
}