package rbac

import (
	"testing"
)

func BenchmarkCan(b *testing.B) {
	r := New()
	r.DefineRole(Role{Name: "admin", ModuleGrants: map[string][]Permission{"*": {"*"}}})
	r.DefineRole(Role{Name: "viewer", ModuleGrants: map[string][]Permission{
		"system":   {"read"},
		"services": {"read"},
		"audit":    {"read"},
	}})
	r.DefineRole(Role{Name: "operator", ModuleGrants: map[string][]Permission{
		"system":   {"read", "root"},
		"services": {"read", "write"},
	}})

	r.AssignRole("alice", "admin")
	r.AssignRole("bob", "viewer")
	r.AssignRole("charlie", "viewer")
	r.AssignRole("charlie", "operator")

	// b.Loop automatically excludes the setup above from timing (no ResetTimer
	// needed) and keeps the calls from being optimised away.
	for b.Loop() {
		_ = r.Can("charlie", "services", "write")
		_ = r.Can("bob", "system", "root")
		_ = r.Can("alice", "audit", "write")
	}
}
