package models_test

import (
	"reflect"
	"testing"

	"github.com/influxdata/influxdb/v2/models"
)

func TestTags_Merge(t *testing.T) {
	examples := []struct {
		Base   map[string]string
		Arg    map[string]string
		Result map[string]string
	}{
		{
			Base:   nil,
			Arg:    nil,
			Result: map[string]string{},
		},
		{
			Base:   nil,
			Arg:    map[string]string{"foo": "foo"},
			Result: map[string]string{"foo": "foo"},
		},
		{
			Base:   map[string]string{"foo": "foo"},
			Arg:    nil,
			Result: map[string]string{"foo": "foo"},
		},
		{
			Base:   map[string]string{"foo": "foo"},
			Arg:    map[string]string{"bar": "bar"},
			Result: map[string]string{"foo": "foo", "bar": "bar"},
		},
		{
			Base:   map[string]string{"foo": "foo", "bar": "bar"},
			Arg:    map[string]string{"zoo": "zoo"},
			Result: map[string]string{"foo": "foo", "bar": "bar", "zoo": "zoo"},
		},
		{
			Base:   map[string]string{"foo": "foo", "bar": "bar"},
			Arg:    map[string]string{"bar": "newbar"},
			Result: map[string]string{"foo": "foo", "bar": "newbar"},
		},
	}

	for i, example := range examples {
		i++
		result := models.StatisticTags(example.Base).Merge(example.Arg)
		if got, exp := result, example.Result; !reflect.DeepEqual(got, exp) {
			t.Errorf("[Example %d] got %#v, expected %#v", i, got, exp)
		}
	}
}
