package router

import (
	"reflect"
	"testing"
)

func TestRouteRegexpPart(t *testing.T) {
	in := "/hello/:world"
	re := routeRegexp(in)

	pos := []string{
		"/hello/world",
		"/hello/1234",
		"/hello/bbc1",
	}
	for _, c := range pos {
		if !re.MatchString(c) {
			t.Errorf("%v must match %v", in, c)
		}
	}

	neg := []string{
		"/hello",
		"/hello/world/",
		"/sub/hello/123",
		"//hello/123",
		"/hello/123/hello/",
	}
	for _, c := range neg {
		if re.MatchString(c) {
			t.Errorf("%q must not match %q", in, c)
		}
	}
}

func TestRouteRegexpStar(t *testing.T) {
	in := "/hello/*world"
	re := routeRegexp(in)

	pos := []string{"/hello/world", "/hello/world/test"}
	for _, c := range pos {
		if !re.MatchString(c) {
			t.Errorf("%q must match %q", in, c)
		}
	}

	neg := []string{"/hello/", "/hello"}
	for _, c := range neg {
		if re.MatchString(c) {
			t.Errorf("%v must not match %v", in, c)
		}
	}
}

func TestRegexGroupsPart(t *testing.T) {
	re := routeRegexp("/foo/:bar/1/:baz")

	expect := map[string]string{"bar": "one", "baz": "two"}
	actual := regexGroups("/foo/one/1/two", re)

	if !reflect.DeepEqual(expect, actual) {
		t.Errorf("expected: %q, actual: %q", expect, actual)
	}
}

func TestRegexGroupsStar(t *testing.T) {
	re := routeRegexp("/foo/*bar")

	expect := map[string]string{"bar": "bar/baz/"}
	actual := regexGroups("/foo/bar/baz/", re)

	if !reflect.DeepEqual(expect, actual) {
		t.Errorf("expected: %q, actual: %q", expect, actual)
	}
}
