package utils

import (
	"testing"

	. "github.com/onsi/gomega"
)

func TestFlattenMap(t *testing.T) {
	g := NewGomegaWithT(t)
	cases := []struct {
		name   string
		source map[string]interface{}
		expect map[string]interface{}
	}{{
		name:   "empty source",
		source: map[string]interface{}{},
		expect: map[string]interface{}{},
	}, {
		name: "noop",
		source: map[string]interface{}{
			"k1": "v",
		},
		expect: map[string]interface{}{
			"k1": "v",
		},
	}, {
		name: "naive",
		source: map[string]interface{}{
			"k1": map[string]interface{}{
				"k2": "v",
			},
		},
		expect: map[string]interface{}{
			"k1.k2": "v",
		},
	}, {
		name: "complex",
		source: map[string]interface{}{
			"k0": 1,
			"k1": map[string]interface{}{
				"list":  []int{1, 2, 3, 4},
				"int":   5,
				"str":   "hello",
				"float": 5.5,
				"nil":   nil,
				"nest": map[string]interface{}{
					"nest": map[string]interface{}{
						"value": 0,
					},
				},
			},
		},
		expect: map[string]interface{}{
			"k0":                 1,
			"k1.list":            []int{1, 2, 3, 4},
			"k1.int":             5,
			"k1.str":             "hello",
			"k1.float":           5.5,
			"k1.nil":             nil,
			"k1.nest.nest.value": 0,
		},
	}}
	for i := range cases {
		c := cases[i]
		t.Log(c.name)
		g.Expect(FlattenMap(c.source)).To(Equal(c.expect))
	}
}
