package expvarom
import (
	"expvar"
	"io"
	"net/http/httptest"
	"testing"
	"github.com/google/go-cmp/cmp"
)
var (
	testI1 = NewInt("testI1", "int test var")
	testI2 = expvar.NewInt("testI2")
	testF = NewFloat("testF", "float test var")
	testMI  = NewMap("testMI", "label", "int map test var")
	testMF  = NewMap("testMF", "label", "float map test var")
	testMXI = expvar.NewMap("testMXI")
	testMXF = expvar.NewMap("testMXF")
	//lint:ignore U1000 Intentionally unused, should not be exported.
	testMEmpty = expvar.NewMap("testMEmpty") //nolint
	testMOther = expvar.NewMap("testMOther")
	testS = expvar.NewString("testS")
	// Naming test cases.
	testN1 = expvar.NewInt("name/1z")
	testN2 = NewInt("name$2", "name with $")
	testN3 = expvar.NewInt("3name")
	testN4 = expvar.NewInt("nAme_4Z")
	testN5 = expvar.NewInt("ñame_5")
)
const expected string = `_ame_5 5
i3name 3
nAme_4Z 4
name_1z 1
# HELP name_2 name with $
name_2 2
# HELP testF float test var
testF 3.43434
# HELP testI1 int test var
testI1 1
testI2 2
# HELP testMF float map test var
testMF{label="key2.0"} 6.6
testMF{label="key2.1"} 6.61
testMF{label="key2.2-ñaca"} 6.62
testMF{label="key2.3-a\\b"} 6.63
testMF{label="key2.4-	"} 6.64
testMF{label="key2.5-a\nb"} 6.65
testMF{label="key2.6-a\"b"} 6.66
testMF{label="key2.7-\\u00f1aca-A\\t\\xff\\xfe\\xfdB"} 6.67
# HELP testMI int map test var
testMI{label="key1"} 5
testMXF{key="key4"} 8e-08
testMXI{key="key3"} 7
# Generated by expvarom
# EXPERIMENTAL - Format is not fully standard yet
# Ignored variables: ["cmdline" "memstats" "testS"]
# EOF
`
func TestHandler(t *testing.T) {
	testI1.Add(1)
	testI2.Add(2)
	testF.Add(3.43434)
	testMI.Add("key1", 5)
	// Test some strange keys in this map to check they're escaped properly.
	testMF.AddFloat("key2.0", 6.60)
	testMF.AddFloat("key2.1", 6.61)
	testMF.AddFloat("key2.2-ñaca", 6.62)
	testMF.AddFloat(`key2.3-a\b`, 6.63)
	testMF.AddFloat("key2.4-\t", 6.64)
	testMF.AddFloat("key2.5-a\nb", 6.65)
	testMF.AddFloat(`key2.6-a"b`, 6.66)
	testMF.AddFloat("key2.7-ñaca-A\t\xff\xfe\xfdB", 6.67) // Invalid utf8.
	testMXI.Add("key3", 7)
	testMXF.AddFloat("key4", 8e-8)
	testS.Set("lalala")
	testN1.Add(1)
	testN2.Add(2)
	testN3.Add(3)
	testN4.Add(4)
	testN5.Add(5)
	// Map with an unsupported type.
	testMOther.Set("keyX", &expvar.String{})
	req := httptest.NewRequest("get", "/metrics", nil)
	w := httptest.NewRecorder()
	MetricsHandler(w, req)
	resp := w.Result()
	body, _ := io.ReadAll(resp.Body)
	if diff := cmp.Diff(expected, string(body)); diff != "" {
		t.Errorf("MetricsHandler() mismatch (-want +got):\n%s", diff)
	}
}
func TestMapLabelAccident(t *testing.T) {
	defer func() {
		if r := recover(); r == nil {
			t.Errorf("NewMap did not panic as expected")
		}
	}()
	NewMap("name", "label with spaces", "description")
}