package prometheus

import (
	"fmt"
	"strconv"
	"testing"

	"github.com/prometheus/client_golang/prometheus"
)

func intToFloatString(in int) string {
	return strconv.FormatFloat(float64(in), 'f', -1, 64)
}

func TestHistogram(t *testing.T) {
	expect := `# HELP test_request_test_metrics test
# TYPE test_request_test_metrics histogram
test_request_test_metrics_bucket{code="test",kind="test",operation="test",reason="test",le="0.05"} %s
test_request_test_metrics_bucket{code="test",kind="test",operation="test",reason="test",le="0.1"} %s
test_request_test_metrics_bucket{code="test",kind="test",operation="test",reason="test",le="0.25"} %s
test_request_test_metrics_bucket{code="test",kind="test",operation="test",reason="test",le="0.5"} %s
test_request_test_metrics_bucket{code="test",kind="test",operation="test",reason="test",le="1"} %s
test_request_test_metrics_bucket{code="test",kind="test",operation="test",reason="test",le="+Inf"} %s
test_request_test_metrics_sum{code="test",kind="test",operation="test",reason="test"} %s
test_request_test_metrics_count{code="test",kind="test",operation="test",reason="test"} %s
`

	histogramVec := prometheus.NewHistogramVec(prometheus.HistogramOpts{
		Namespace: "test",
		Name:      "test_metrics",
		Subsystem: "request",
		Help:      "test",
		Buckets:   []float64{0.05, 0.1, 0.250, 0.5, 1},
	}, []string{"kind", "operation", "code", "reason"})

	histogram := NewHistogram(histogramVec)
	histogram.With("test", "test", "test", "test").Observe(0.5)

	reg := prometheus.NewRegistry()
	reg.MustRegister(histogramVec)

	result, err := gatherLatest(reg)
	if err != nil {
		t.Fatal(err)
	}

	if result != fmt.Sprintf(expect,
		intToFloatString(0),
		intToFloatString(0),
		intToFloatString(0),
		intToFloatString(1),
		intToFloatString(1),
		intToFloatString(1),
		"0.5",
		intToFloatString(1)) {
		t.Fatal("metrics error")
	}

	histogram.With("test", "test", "test", "test").Observe(0.1)
	result, err = gatherLatest(reg)

	if err != nil {
		t.Fatal(err)
	}
	if result != fmt.Sprintf(expect,
		intToFloatString(0),
		intToFloatString(1),
		intToFloatString(1),
		intToFloatString(2),
		intToFloatString(2),
		intToFloatString(2),
		"0.6",
		intToFloatString(2),
	) {
		t.Fatal("metrics error")
	}
}