package properties

import (
	"flag"
	"fmt"
	"testing"
)

// TestFlag verifies Properties.MustFlag without flag.FlagSet.Parse
func TestFlag(t *testing.T) {
	f := flag.NewFlagSet("src", flag.PanicOnError)
	gotS := f.String("s", "?", "string flag")
	gotI := f.Int("i", -1, "int flag")

	p := NewProperties()
	p.Set("s", "t")
	p.Set("i", "9")
	p.MustFlag(f)

	if want := "t"; *gotS != want {
		t.Errorf("Got string s=%q, want %q", *gotS, want)
	}
	if want := 9; *gotI != want {
		t.Errorf("Got int i=%d, want %d", *gotI, want)
	}
}

// TestFlagOverride verifies Properties.MustFlag with flag.FlagSet.Parse.
func TestFlagOverride(t *testing.T) {
	f := flag.NewFlagSet("src", flag.PanicOnError)
	gotA := f.Int("a", 1, "remain default")
	gotB := f.Int("b", 2, "customized")
	gotC := f.Int("c", 3, "overridden")

	f.Parse([]string{"-c", "4"})

	p := NewProperties()
	p.Set("b", "5")
	p.Set("c", "6")
	p.MustFlag(f)

	if want := 1; *gotA != want {
		t.Errorf("Got remain default a=%d, want %d", *gotA, want)
	}
	if want := 5; *gotB != want {
		t.Errorf("Got customized b=%d, want %d", *gotB, want)
	}
	if want := 4; *gotC != want {
		t.Errorf("Got overriden c=%d, want %d", *gotC, want)
	}
}

func ExampleProperties_MustFlag() {
	x := flag.Int("x", 0, "demo customize")
	y := flag.Int("y", 0, "demo override")

	// Demo alternative for flag.Parse():
	flag.CommandLine.Parse([]string{"-y", "10"})
	fmt.Printf("flagged as x=%d, y=%d\n", *x, *y)

	p := NewProperties()
	p.Set("x", "7")
	p.Set("y", "42") // note discard
	p.MustFlag(flag.CommandLine)
	fmt.Printf("configured to x=%d, y=%d\n", *x, *y)

	// Output:
	// flagged as x=0, y=10
	// configured to x=7, y=10
}
