package templ

import (
	"strings"
	"testing"
)

type urlTest struct {
	url             string
	expectSanitized bool
}

var urlTests = []urlTest{
	{"//example.com", false},
	{"/", false},
	{"/index", false},
	{"http://example.com", false},
	{"https://example.com", false},
	{"mailto:test@example.com", false},
	{"tel:+1234567890", false},
	{"ftp://example.com", false},
	{"ftps://example.com", false},
	{"irc://example.com", true},
	{"bitcoin://example.com", true},
}

func testURL(t *testing.T, url string, expectSanitized bool) {
	u := URL(url)
	wasSanitized := u == FailedSanitizationURL
	if expectSanitized != wasSanitized {
		t.Errorf("expected sanitized=%v, got %v", expectSanitized, wasSanitized)
	}
}

func TestURL(t *testing.T) {
	for _, test := range urlTests {
		t.Run(test.url, func(t *testing.T) {
			testURL(t, test.url, test.expectSanitized)
		})
		test.url = strings.ToUpper(test.url)
		t.Run(strings.ToUpper(test.url), func(t *testing.T) {
			testURL(t, test.url, test.expectSanitized)
		})
	}
}

func BenchmarkURL(b *testing.B) {
	for i := 0; i < b.N; i++ {
		for _, test := range urlTests {
			u := URL(test.url)
			wasSanitized := u == FailedSanitizationURL
			if test.expectSanitized != wasSanitized {
				b.Errorf("expected sanitized=%v, got %v", test.expectSanitized, wasSanitized)
			}
		}
	}
}
