// Copyright 2017 Frank Schroeder. All rights reserved.
// Use of this source code is governed by a BSD-style
// license that can be found in the LICENSE file.

// Package assert provides helper functions for testing.
package assert

import (
	"fmt"
	"path/filepath"
	"reflect"
	"regexp"
	"runtime"
	"strings"
	"testing"
)

// skip defines the default call depth
const skip = 2

// Equal asserts that got and want are equal as defined by
// reflect.DeepEqual. The test fails with msg if they are not equal.
func Equal(t *testing.T, got, want interface{}, msg ...string) {
	if x := equal(2, got, want, msg...); x != "" {
		fmt.Println(x)
		t.Fail()
	}
}

func equal(skip int, got, want interface{}, msg ...string) string {
	if !reflect.DeepEqual(got, want) {
		return fail(skip, "got %v want %v %s", got, want, strings.Join(msg, " "))
	}
	return ""
}

// Panic asserts that function fn() panics.
// It assumes that recover() either returns a string or
// an error and fails if the message does not match
// the regular expression in 'matches'.
func Panic(t *testing.T, fn func(), matches string) {
	if x := doesPanic(2, fn, matches); x != "" {
		fmt.Println(x)
		t.Fail()
	}
}

func doesPanic(skip int, fn func(), expr string) (err string) {
	defer func() {
		r := recover()
		if r == nil {
			err = fail(skip, "did not panic")
			return
		}
		var v string
		switch r.(type) {
		case error:
			v = r.(error).Error()
		case string:
			v = r.(string)
		}
		err = matches(skip, v, expr)
	}()
	fn()
	return ""
}

// Matches asserts that a value matches a given regular expression.
func Matches(t *testing.T, value, expr string) {
	if x := matches(2, value, expr); x != "" {
		fmt.Println(x)
		t.Fail()
	}
}

func matches(skip int, value, expr string) string {
	ok, err := regexp.MatchString(expr, value)
	if err != nil {
		return fail(skip, "invalid pattern %q. %s", expr, err)
	}
	if !ok {
		return fail(skip, "got %s which does not match %s", value, expr)
	}
	return ""
}

func fail(skip int, format string, args ...interface{}) string {
	_, file, line, _ := runtime.Caller(skip)
	return fmt.Sprintf("\t%s:%d: %s\n", filepath.Base(file), line, fmt.Sprintf(format, args...))
}
