package config_validator

import (
	"fmt"
	"testing"

	"github.com/google/go-cmp/cmp"
)

func TestEmptyValidationErrors(t *testing.T) {
	if newValidationErrors("err").err() != nil {
		t.Errorf("Empty validation errors .err() should return nil")
	}
}

func TestSingleValidationErrors(t *testing.T) {
	errs := newValidationErrors("err")
	errs.addError("an", fmt.Errorf("error"))
	expectedError := "err `an`: error"
	if diff := cmp.Diff(errs.err().Error(), expectedError); diff != "" {
		t.Errorf("Output error does not match expected error: %s", diff)
	}
}

func TestMultipleValidationErrors(t *testing.T) {
	errs := newValidationErrors("err")
	errs.addError("an", fmt.Errorf("error"))
	errs.addError("another", fmt.Errorf("error"))
	expectedError := "err `an`: error\nerr `another`: error"
	if diff := cmp.Diff(errs.err().Error(), expectedError); diff != "" {
		t.Errorf("Output error does not match expected error: %s", diff)
	}
}

func TestNestedValidationErrors(t *testing.T) {
	innerErr := newValidationErrors("inner")
	innerErr.addError("an", fmt.Errorf("error"))
	errs := newValidationErrors("err")
	errs.addError("nested", innerErr.err())
	expectedError := "err `nested`:\n  inner `an`: error"
	if diff := cmp.Diff(errs.err().Error(), expectedError); diff != "" {
		t.Errorf("Output error does not match expected error: %s", diff)
	}
}

func TestMultipleNestedValidationErrors(t *testing.T) {
	innerErr := newValidationErrors("inner")
	innerErr.addError("an", fmt.Errorf("error"))
	errs := newValidationErrors("err")
	errs.addError("nested2", innerErr.err())
	errs.addError("nested1", innerErr.err())
	expectedError := "err `nested1`:\n  inner `an`: error\nerr `nested2`:\n  inner `an`: error"
	if diff := cmp.Diff(errs.err().Error(), expectedError); diff != "" {
		t.Errorf("Output error does not match expected error: %s", diff)
	}
}

func TestMultipleErrorsForLevel(t *testing.T) {
	errs := newValidationErrors("err")
	errs.addError("an", fmt.Errorf("error"))
	errs.addError("an", fmt.Errorf("error"))
	expectedError := "err `an`:\n  error\n  error"
	if diff := cmp.Diff(errs.err().Error(), expectedError); diff != "" {
		t.Errorf("Output error does not match expected error: %s", diff)
	}
}
