package util

import (
	"testing"

	"github.com/stretchr/testify/require"
)

var tests = []struct {
	name     string
	expected bool
	resource string
}{
	{
		name:     "ResourceFormatNamespaceObjects",
		expected: true,
		resource: "native:object/RootNamespace/*",
	},
	{
		name:     "ResourceFormatNamespaceContainerObjects",
		expected: true,
		resource: "native:object/RootNamespace/BzQw5HH3feoxFDD5tCT87Y1726qzgLfxEE7wgtoRzB3R/*",
	},
	{
		name:     "ResourceFormatNamespaceContainerObject",
		expected: true,
		resource: "native:object/RootNamespace/BzQw5HH3feoxFDD5tCT87Y1726qzgLfxEE7wgtoRzB3R/AeZa5HH3feoxFDD5tCT87Y1726qzgLfxEE7wgtoRzB4E",
	},
	{
		name:     "ResourceFormatRootObjects",
		expected: true,
		resource: "native:object//*",
	},
	{
		name:     "ResourceFormatRootContainerObjects",
		expected: true,
		resource: "native:object//BzQw5HH3feoxFDD5tCT87Y1726qzgLfxEE7wgtoRzB3R/*",
	},
	{
		name:     "ResourceFormatRootContainerObject",
		expected: true,
		resource: "native:object//BzQw5HH3feoxFDD5tCT87Y1726qzgLfxEE7wgtoRzB3R/AeZa5HH3feoxFDD5tCT87Y1726qzgLfxEE7wgtoRzB4E",
	},
	{
		name:     "ResourceFormatAllObjects",
		expected: true,
		resource: "native:object/*",
	},
	{
		name:     "ResourceFormatNamespaceContainer",
		expected: true,
		resource: "native:container/RootNamespace/BzQw5HH3feoxFDD5tCT87Y1726qzgLfxEE7wgtoRzB3R",
	},
	{
		name:     "ResourceFormatNamespaceContainers",
		expected: true,
		resource: "native:container/RootNamespace/*",
	},
	{
		name:     "ResourceFormatRootContainers",
		expected: true,
		resource: "native:container//*",
	},
	{
		name:     "ResourceFormatAllContainers",
		expected: true,
		resource: "native:container/*",
	},
	{
		name:     "Invalid resource 1",
		expected: false,
		resource: "native:::container/*",
	},
	{
		name:     "Invalid resource 2",
		expected: false,
		resource: "native:container/RootNamespace/w5HH3feoxFDD5tCTtoRzB3R/Bz726qzgLfxEE7wgtoRzB3R/RootNamespace",
	},
}

func TestIsNativeResourceNameValid(t *testing.T) {
	for _, test := range tests {
		t.Run(test.name, func(t *testing.T) {
			require.Equal(t, test.expected, IsNativeResourceNameValid(test.resource))
		})
	}
}

func BenchmarkIsNativeResourceNameValid(b *testing.B) {
	for _, test := range tests {
		b.Run(test.name, func(b *testing.B) {
			for i := 0; i < b.N; i++ {
				_ = IsNativeResourceNameValid(test.resource)
			}
		})
	}
}