func AssertEqualIndex(t testing.TB, index int, expected, actual interface{}) {
	AssertEqualf(t, expected, actual, "AssertEqualIndex() failure.\nIndex: %d\n%# v", index, formatAsDiff(expected, actual))
}
AssertEqualIndex verifies that two objects are equals and calls FailNow() to
immediately cancel the test case.

It must be called from the main goroutine. Other goroutines must call
ExpectEqual* flavors.

It is meant to be used in loops where a list of intrant->expected is
processed so the assert failure message contains the index of the failing
expectation.

Equality is determined via reflect.DeepEqual().
package ut
import (
	"bytes"
	"fmt"
	"io"
	"path/filepath"
	"reflect"
	"runtime"
	"strings"
	"testing"
	"github.com/kr/pretty"
	"github.com/pmezard/go-difflib/difflib"
)
var newLine = []byte{'\n'}
var blacklistedItems = map[string]bool{
	filepath.Join("runtime", "asm_386.s"):   true,
	filepath.Join("runtime", "asm_amd64.s"): true,
	filepath.Join("runtime", "asm_arm.s"):   true,
	filepath.Join("runtime", "proc.c"):      true,
	filepath.Join("testing", "testing.go"):  true,
	filepath.Join("ut", "utiltest.go"):      true,
	"utiltest.go":                           true,
}
func truncatePath(file string) string {
	return filepath.Join(filepath.Base(filepath.Dir(file)), filepath.Base(file))
}
func isBlacklisted(file string) bool {
	_, ok := blacklistedItems[file]
	return ok
}
func Decorate(s string) string {
	type item struct {
		file string
		line int
	}
	items := []item{}
	for i := 1; i < 8 && len(items) < 3; i++ {
		_, file, line, ok := runtime.Caller(i)  
		if ok {
			file = truncatePath(file)
			if !isBlacklisted(file) {
				items = append(items, item{file, line})
			}
		}
	}
	for _, i := range items {
		s = fmt.Sprintf("%s:%d: %s", strings.Replace(i.file, "%", "%%", -1), i.line, s)
	}
	return s
}
func AssertEqual(t testing.TB, expected, actual interface{}) {
	AssertEqualf(t, expected, actual, "AssertEqual() failure.\n%# v", formatAsDiff(expected, actual))
}