package assertions

import (
	"fmt"
	"strings"
	"testing"

	"github.com/smartystreets/assertions/internal/unit"
)

/**************************************************************************/

func TestAssertionsFixture(t *testing.T) {
	unit.Run(new(AssertionsFixture), t)
}

type AssertionsFixture struct {
	*unit.Fixture
}

func (this *AssertionsFixture) Setup() {
	serializer = this
}

func (self *AssertionsFixture) serialize(expected, actual interface{}, message string) string {
	return fmt.Sprintf("%v|%v|%s", expected, actual, message)
}

func (self *AssertionsFixture) serializeDetailed(expected, actual interface{}, message string) string {
	return fmt.Sprintf("%v|%v|%s", expected, actual, message)
}

func (this *AssertionsFixture) pass(result string) {
	this.Assert(result == success, result)
}

func (this *AssertionsFixture) fail(actual string, expected string) {
	actual = format(actual)
	expected = format(expected)

	if actual != expected {
		if actual == "" {
			actual = "(empty)"
		}
		this.Errorf("Expected: %s\nActual:   %s\n", expected, actual)
	}
}
func format(message string) string {
	message = strings.Replace(message, "\n", " ", -1)
	for strings.Contains(message, "  ") {
		message = strings.Replace(message, "  ", " ", -1)
	}
	message = strings.Replace(message, "\x1b[32m", "", -1)
	message = strings.Replace(message, "\x1b[31m", "", -1)
	message = strings.Replace(message, "\x1b[0m", "", -1)
	return message
}

/**************************************************************************/

type Thing1 struct {
	a string
}
type Thing2 struct {
	a string
}

type ThingInterface interface {
	Hi()
}

type ThingImplementation struct{}

func (self *ThingImplementation) Hi() {}

type IntAlias int
type StringAlias string
type StringSliceAlias []string
type StringStringMapAlias map[string]string

/**************************************************************************/

type ThingWithEqualMethod struct {
	a string
}

func (this ThingWithEqualMethod) Equal(that ThingWithEqualMethod) bool {
	return this.a == that.a
}
