package check_test

import (
	"fmt"
	"reflect"
	"testing"
)

//Expect return a checker
func Expect(t *testing.T) Checker {
	return Checker{T: t}
}

// Checker test checking helper
type Checker struct {
	*testing.T
}

//NotErr check for error
func (t Checker) NotErr(err error) {
	msg := fmt.Sprintf("Checking for error: %v", err)
	if err != nil {
		t.fail(msg)
	}
	t.pass(msg)
}
func (t Checker) Err(err error) {
	msg := fmt.Sprintf("Checking for error: %v", err)
	if err == nil {
		t.fail(msg)
	}
	t.pass(msg)
}

//Eq check if equal
func (t Checker) Eq(a, b interface{}) {
	msg := fmt.Sprintf("Expect '%v' got '%v'", a, b)
	if !reflect.DeepEqual(a, b) {
		t.fail(msg)
	}
	t.pass(msg)
}

//Diff check if different
func (t Checker) Diff(a, b interface{}) {
	msg := fmt.Sprintf("Expect NOT '%v' got '%v'", a, b)
	if reflect.DeepEqual(a, b) {
		t.fail(msg)
	}
	t.pass(msg)
}
func (t Checker) fail(msg string) {
	t.Fatalf("\033[31m[FAIL] %s\033[0m", msg)
}
func (t Checker) pass(msg string) {
	t.Logf("\033[32m[PASS]\033[m %s", msg)
}
