package meter

import (
	"testing"
)

func TestNoopMeter(t *testing.T) {
	m := NewMeter(Path("/noop"))
	if "/noop" != m.Options().Path {
		t.Fatalf("invalid options parsing: %v", m.Options())
	}

	cnt := m.Counter("counter", "server", "noop")
	cnt.Inc()
}

func testEq(a, b []string) bool {
	if len(a) != len(b) {
		return false
	}
	for i := range a {
		if a[i] != b[i] {
			return false
		}
	}
	return true
}

func TestBuildLabels(t *testing.T) {
	type testData struct {
		src []string
		dst []string
	}

	data := []testData{
		{
			src: []string{"zerolabel", "value3", "firstlabel", "value2"},
			dst: []string{"firstlabel", "value2", "zerolabel", "value3"},
		},
	}

	for _, d := range data {
		if !testEq(d.dst, BuildLabels(d.src...)) {
			t.Fatalf("slices not properly sorted: %v %v", d.dst, d.src)
		}
	}
}

func TestBuildName(t *testing.T) {
	data := map[string][]string{
		`my_metric{firstlabel="value2",zerolabel="value3"}`: {
			"my_metric",
			"zerolabel", "value3", "firstlabel", "value2",
		},
		`my_metric{broker="broker2",register="mdns",server="tcp"}`: {
			"my_metric",
			"broker", "broker1", "broker", "broker2", "server", "http", "server", "tcp", "register", "mdns",
		},
		`my_metric{aaa="aaa"}`: {
			"my_metric",
			"aaa", "aaa",
		},
	}

	for e, d := range data {
		if x := BuildName(d[0], d[1:]...); x != e {
			t.Fatalf("expect: %s, result: %s", e, x)
		}
	}
}