Skip to content

Commit

Permalink
feat: 添加地本地化的支持
Browse files Browse the repository at this point in the history
  • Loading branch information
caixw committed Aug 11, 2022
1 parent def8bbc commit 8b8195a
Show file tree
Hide file tree
Showing 8 changed files with 211 additions and 110 deletions.
2 changes: 1 addition & 1 deletion .github/workflows/go.yml
Original file line number Diff line number Diff line change
Expand Up @@ -10,7 +10,7 @@ jobs:
strategy:
matrix:
os: [ubuntu-latest, macOS-latest, windows-latest]
go: ['1.17.x', '1.18.x']
go: ['1.17.x', '1.19.x']

steps:

Expand Down
6 changes: 3 additions & 3 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -23,11 +23,11 @@ _testmain.go
*.test
*.prof

# vim
*.swp

# osx
.DS_Store

# ide
.vscode
.idea
.vs
*.swp
108 changes: 89 additions & 19 deletions assert.go
Original file line number Diff line number Diff line change
Expand Up @@ -2,25 +2,95 @@

// Package assert 是对 testing 包的一些简单包装
//
// func TestAssert(t *testing.T) {
// var v interface{} = 5
// func TestAssert(t *testing.T) {
// var v interface{} = 5
//
// a := assert.New(t, false)
// a.True(v==5, "v的值[%v]不等于5", v).
// Equal(5, v, "v的值[%v]不等于5", v).
// Nil(v).
// TB().Log("success")
// a := assert.New(t, false)
// a.True(v==5, "v的值[%v]不等于5", v).
// Equal(5, v, "v的值[%v]不等于5", v).
// Nil(v).
// TB().Log("success")
// }
//
// // 以函数链的形式调用 Assertion 对象的方法
// a.True(false).Equal(5,6)
// }
//
// // 也可以对 testing.B 使用
// func Benchmark1(b *testing.B) {
// a := assert.New(b)
// a.True(false)
// for(i:=0; i<b.N; i++) {
// // do something
// }
// }
// // 也可以对 testing.B 使用
// func Benchmark1(b *testing.B) {
// a := assert.New(b)
// a.True(false)
// for(i:=0; i<b.N; i++) {
// // do something
// }
// }
package assert

import (
"fmt"
"sort"
"strings"
)

var failureSprint FailureSprintFunc = DefaultFailureSprint

// Failure 在断言出错时输出的错误信息
type Failure struct {
Action string // 操作名称,比如 Equal,NotEqual 等方法名称。
Values map[string]interface{} // 断言出错是返回的一些额外参数
User string // 断言出错时用户反馈的额外信息
}

// FailureSprintFunc 将 Failure 转换成文本的函数
//
// 可以使用此方法实现对错误信息的本地化。
type FailureSprintFunc func(*Failure) string

// SetFailureSprintFunc 设置一个全局的转换方法
//
// [New] 方法在默认情况下继承由此方法设置的值。
func SetFailureSprintFunc(f FailureSprintFunc) { failureSprint = f }

// DefaultFailureSprint 默认的 FailureSprintFunc 实现
func DefaultFailureSprint(f *Failure) string {
s := strings.Builder{}
s.WriteString(f.Action)
s.WriteString(" 断言失败!")

if len(f.Values) > 0 {
keys := make([]string, 0, len(f.Values))
for k := range f.Values {
keys = append(keys, k)
}
sort.Strings(keys)

s.WriteString("反馈以下参数:\n")
for _, k := range keys {
s.WriteString(k)
s.WriteByte('=')
s.WriteString(fmt.Sprint(f.Values[k]))
s.WriteByte('\n')
}
}

if f.User != "" {
s.WriteString("用户反馈信息:")
s.WriteString(f.User)
}

return s.String()
}

func NewFailure(action string, user []interface{}, kv map[string]interface{}) *Failure {
var u string
if len(user) > 0 {
switch v := user[0].(type) {
case string:
u = fmt.Sprintf(v, user[1:]...)
default:
u = fmt.Sprint(user...)
}
}

return &Failure{
Action: action,
User: u,
Values: kv,
}
}
42 changes: 42 additions & 0 deletions assert_test.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,42 @@
// SPDX-License-Identifier: MIT

package assert

import "testing"

func TestDefaultFailureSprint(t *testing.T) {
f := NewFailure("A", nil, nil)
if f.Action != "A" || f.User != "" || len(f.Values) != 0 {
t.Error("err1")
}
if s := DefaultFailureSprint(f); s != "A 断言失败!" {
t.Error("err2")
}

// 带 user
f = NewFailure("AB", []interface{}{1, 2}, nil)
if f.Action != "AB" || f.User != "1 2" || len(f.Values) != 0 {
t.Error("err3")
}
if s := DefaultFailureSprint(f); s != "AB 断言失败!用户反馈信息:1 2" {
t.Error("err4", s)
}

// 带 values
f = NewFailure("AB", nil, map[string]interface{}{"k1": "v1", "k2": 2})
if f.Action != "AB" || f.User != "" || len(f.Values) != 2 {
t.Error("err5")
}
if s := DefaultFailureSprint(f); s != "AB 断言失败!反馈以下参数:\nk1=v1\nk2=2\n" {
t.Error("err6", s)
}

// 带 user,values
f = NewFailure("AB", []interface{}{1, 2}, map[string]interface{}{"k1": "v1", "k2": 2})
if f.Action != "AB" || f.User == "" || len(f.Values) != 2 {
t.Error("err7")
}
if s := DefaultFailureSprint(f); s != "AB 断言失败!反馈以下参数:\nk1=v1\nk2=2\n用户反馈信息:1 2" {
t.Error("err8", s)
}
}
Loading

0 comments on commit 8b8195a

Please sign in to comment.