package feature

import (
	"fmt"
	"testing"
)

// TestSetFlag temporarily sets a feature flag to the given value until the
// returned function is called.
//
// Usage
// ```
// defer TestSetFlag(t, features.Flags, features.ExampleFlag, true)()
// ```
func TestSetFlag(t *testing.T, f *FlagSet, flag FlagName, value bool) func() {
	current := f.Enabled(flag)

	panicIfCalled := func(msg string) {
		panic(msg)
	}

	if err := f.Apply(fmt.Sprintf("%s=%v", flag, value), panicIfCalled); err != nil {
		// not reachable
		panic(err)
	}

	return func() {
		if err := f.Apply(fmt.Sprintf("%s=%v", flag, current), panicIfCalled); err != nil {
			// not reachable
			panic(err)
		}
	}
}