初始化项目
This commit is contained in:
68
agent-common/assert/MyAssert.go
Normal file
68
agent-common/assert/MyAssert.go
Normal file
@@ -0,0 +1,68 @@
|
||||
package assert
|
||||
|
||||
import (
|
||||
"fmt"
|
||||
"reflect"
|
||||
"strings"
|
||||
)
|
||||
|
||||
var Asserter = NewAssert()
|
||||
|
||||
// Assert utility class
|
||||
type Assert struct{}
|
||||
|
||||
// NewAssert returns a new instance of Assert
|
||||
func NewAssert() *Assert {
|
||||
return &Assert{}
|
||||
}
|
||||
|
||||
// NotEmpty checks if the given value is not empty
|
||||
func (a *Assert) NotEmpty(value interface{}, message string) {
|
||||
if isEmptyValue(reflect.ValueOf(value)) {
|
||||
panic(fmt.Sprintf("Assertion failed: %s", message))
|
||||
}
|
||||
}
|
||||
|
||||
// NotBlank checks if the given string is not blank
|
||||
func (a *Assert) NotBlank(str string, message string) {
|
||||
if str == "" || len(strings.TrimSpace(str)) == 0 {
|
||||
panic(fmt.Sprintf("Assertion failed: %s", message))
|
||||
}
|
||||
}
|
||||
|
||||
// Equals checks if two values are equal
|
||||
func (a *Assert) Equals(expected, actual interface{}, message string) {
|
||||
if !reflect.DeepEqual(expected, actual) {
|
||||
panic(fmt.Sprintf("Assertion failed: %s. Expected '%v' but got '%v'", message, expected, actual))
|
||||
}
|
||||
}
|
||||
|
||||
// Nil checks if the given value is nil
|
||||
func (a *Assert) Nil(value interface{}, message string) {
|
||||
if value != nil {
|
||||
panic(fmt.Sprintf("Assertion failed: %s", message))
|
||||
}
|
||||
}
|
||||
|
||||
// NotNil checks if the given value is not nil
|
||||
func (a *Assert) NotNil(value interface{}, message string) {
|
||||
if value == nil {
|
||||
panic(fmt.Sprintf("Assertion failed: %s", message))
|
||||
}
|
||||
}
|
||||
|
||||
func isEmptyValue(v reflect.Value) bool {
|
||||
switch v.Kind() {
|
||||
case reflect.Array, reflect.Slice, reflect.String:
|
||||
return v.Len() == 0
|
||||
case reflect.Map:
|
||||
return v.IsNil() || v.Len() == 0
|
||||
case reflect.Ptr:
|
||||
if v.IsNil() {
|
||||
return true
|
||||
}
|
||||
return isEmptyValue(v.Elem())
|
||||
default:
|
||||
return false
|
||||
}
|
||||
}
|
||||
90
agent-common/assert/assert.go
Normal file
90
agent-common/assert/assert.go
Normal file
@@ -0,0 +1,90 @@
|
||||
// Copyright 2013-2022 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...))
|
||||
}
|
||||
55
agent-common/assert/assert_test.go
Normal file
55
agent-common/assert/assert_test.go
Normal file
@@ -0,0 +1,55 @@
|
||||
// Copyright 2013-2022 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
|
||||
|
||||
import "testing"
|
||||
|
||||
func TestEqualEquals(t *testing.T) {
|
||||
if got, want := equal(2, "a", "a"), ""; got != want {
|
||||
t.Fatalf("got %q want %q", got, want)
|
||||
}
|
||||
}
|
||||
|
||||
func TestEqualFails(t *testing.T) {
|
||||
if got, want := equal(2, "a", "b"), "\tassert_test.go:16: got a want b \n"; got != want {
|
||||
t.Fatalf("got %q want %q", got, want)
|
||||
}
|
||||
}
|
||||
|
||||
func TestPanicPanics(t *testing.T) {
|
||||
if got, want := doesPanic(2, func() { panic("foo") }, ""), ""; got != want {
|
||||
t.Fatalf("got %q want %q", got, want)
|
||||
}
|
||||
}
|
||||
|
||||
func TestPanicPanicsAndMatches(t *testing.T) {
|
||||
if got, want := doesPanic(2, func() { panic("foo") }, "foo"), ""; got != want {
|
||||
t.Fatalf("got %q want %q", got, want)
|
||||
}
|
||||
}
|
||||
|
||||
func TestPanicPanicsAndDoesNotMatch(t *testing.T) {
|
||||
if got, want := doesPanic(2, func() { panic("foo") }, "bar"), "\tassert.go:62: got foo which does not match bar\n"; got != want {
|
||||
t.Fatalf("got %q want %q", got, want)
|
||||
}
|
||||
}
|
||||
|
||||
func TestPanicPanicsAndDoesNotPanic(t *testing.T) {
|
||||
if got, want := doesPanic(2, func() {}, "bar"), "\tassert.go:65: did not panic\n"; got != want {
|
||||
t.Fatalf("got %q want %q", got, want)
|
||||
}
|
||||
}
|
||||
|
||||
func TestMatchesMatches(t *testing.T) {
|
||||
if got, want := matches(2, "aaa", "a"), ""; got != want {
|
||||
t.Fatalf("got %q want %q", got, want)
|
||||
}
|
||||
}
|
||||
|
||||
func TestMatchesDoesNotMatch(t *testing.T) {
|
||||
if got, want := matches(2, "aaa", "b"), "\tassert_test.go:52: got aaa which does not match b\n"; got != want {
|
||||
t.Fatalf("got %q want %q", got, want)
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user