Read this in other languages: English, 中文.
f1 := false
f2 := false
result := AsyncInvokeWithTimeout(time.Second*1, func() {
time.Sleep(time.Millisecond * 500)
f1 = true
}, func() {
time.Sleep(time.Millisecond * 500)
f2 = true
})
if !result {
t.FailNow()
}
if !f1 {
t.FailNow()
}
if !f2 {
t.FailNow()
}
f1 := false
f2 := false
result := AsyncInvokeWithTimeout(time.Second*1, func() {
time.Sleep(time.Millisecond * 1500)
f1 = true
}, func() {
time.Sleep(time.Millisecond * 500)
f2 = true
})
if result {
t.FailNow()
}
if f1 {
t.FailNow()
}
if !f2 {
t.FailNow()
}
f1 := false
f2 := false
fns := []func(){
func() {
time.Sleep(time.Millisecond * 500)
f1 = true
}, func() {
time.Sleep(time.Millisecond * 500)
f2 = true
},
}
result := AsyncInvokesWithTimeout(time.Second*1, fns)
if !result {
t.FailNow()
}
if !f1 {
t.FailNow()
}
if !f2 {
t.FailNow()
}
ctx, cancel := context.WithCancel(context.Background())
defer cancel()
t1 := time.Now()
go func() {
cancel()
}()
Sleep(ctx, 2*time.Second)
if time.Since(t1) > time.Second {
t.FailNow()
}
InitCbk()
var ok bool
var lastBreaked bool
for j := 0; j < 200; j++ {
i := j
//safego.Go(func() {
err := Impls[SIMPLE].Check("test") //30s 返回一次true尝试
fmt.Println(i, "Check:", ok)
if err == nil {
time.Sleep(time.Millisecond * 10)
Impls[SIMPLE].Failed("test")
if i > 105 && lastBreaked {
Impls[SIMPLE].Succeed("test")
lastBreaked = false
fmt.Println(i, "Succeed")
}
} else {
if lastBreaked {
time.Sleep(time.Second * 10)
} else {
lastBreaked = true
}
}
//})
}
checkSumPath, err := GenerateChecksumFile(context.Background(), testTempDirPath, testChecksumName)
if err != nil {
t.Error(err)
return
}
t.Log(checkSumPath)
checksumMd5Path, err := GenerateChecksumMd5File(context.Background(), checkSumPath)
if err != nil {
t.Error(err)
return
}
valid := IsChecksumFileValid(context.Background(), checkSumPath, checksumMd5Path)
if !valid {
t.Error(valid)
return
}
err = CompareChecksumFiles(context.Background(), testTempDirPath, checkSumPath)
if err != nil {
t.Error(err)
return
}
var str string
var err error
str, err = ValueToString(100.2)
if err != nil {
t.FailNow()
}
if val, err := StringToValue[float64](str); err != nil || val != 100.2 {
t.Error(val, err)
}
str, err = ValueToString(200)
if err != nil {
t.FailNow()
}
if val, err := StringToValue[int64](str); err != nil || val != 200 {
t.Error(val, err)
}
str, err = ValueToString(true)
if err != nil {
t.FailNow()
}
if val, err := StringToValue[bool](str); err != nil || val != true {
t.Error(val, err)
}
str, err = ValueToString("this is str")
if err != nil {
t.FailNow()
}
if val, err := StringToValue[string](str); err != nil || val != "this is str" {
t.Error(val, err)
}
st := testDataStruct{
Field1: "f1",
Field2: 1000,
Field3: 2,
}
str, err = ValueToString(st)
if err != nil {
t.FailNow()
}
if val, err := StringToValue[testDataStruct](str); err != nil || !reflect.DeepEqual(val, st) {
t.Error(val, err)
}
if val, err := StringToValue[*testDataStruct](str); err != nil || !reflect.DeepEqual(*val, st) {
t.Error(val, err)
}
mst := map[string]*testDataStruct{"one": &st}
str, err = ValueToString(mst)
if err != nil {
t.FailNow()
}
if val, err := StringToValue[map[string]*testDataStruct](str); err != nil || !reflect.DeepEqual(val, mst) {
t.Error(val, err)
}
slice := []string{"a", "b", "c"}
str, err = ValueToString(slice)
if err != nil {
t.FailNow()
}
if val, err := StringToValue[[]string](str); err != nil || !reflect.DeepEqual(val, slice) {
t.Error(val, err)
}
sample := &ConvSample{
Field1: "192.168.0.1",
Field2: "192.168.0.100",
Ts: 12345,
}
str, err = ValueToString(sample)
if err != nil {
t.FailNow()
}
if val, err := StringToValue[ConvSample](str); err != nil || val.Field1 != sample.Field1 || val.Field2 != sample.Field2 || val.Ts != sample.Ts {
t.Error(val, err)
}
dt, err := ReadCsvFileToDataTable(context.Background(), filepath.Join(testTempDirPath, testCsvFilePath), ',',
[]string{"id", "name", "age", "remark"}, "id", []string{"name"})
if err != nil {
t.Error(err)
}
if !reflect.DeepEqual(dt.Row("10").Data(), []string{"10", "name10", "10", "remark10"}) {
t.FailNow()
}
if !reflect.DeepEqual(dt.RowsBy("name", "name10")[0].Data(), []string{"10", "name10", "10", "remark10"}) {
t.FailNow()
}
records := ParseCsvRaw(context.Background(),
`id name age remark
0 name0 0 remark0
1 name1 1 remark1
2 name2 2 remark2
3 name3 3 remark3
4 name4 4 remark4
5 name5 5 remark5
6 name6 6 remark6
7 name7 7 remark7
8 name8 8 remark8
9 name9 9 remark9
10 name10 10 remark10
11 name11 11 remark11
12 name12 12 remark12
13 name13 13 remark13
14 name14 14 remark14
15 name15 15 remark15
16 name16 16 remark16
17 name17 17 remark17
18 name18 18 remark18
19 name19 19 remark19`)
dt := container.NewDataTable(records[0], "id", []string{"name"}, 20)
dt.PushAll(records[1:])
if !reflect.DeepEqual(dt.Row("10").Data(), []string{"10", "name10", "10", "remark10"}) {
t.FailNow()
}
if !reflect.DeepEqual(dt.RowsBy("name", "name10")[0].Data(), []string{"10", "name10", "10", "remark10"}) {
t.FailNow()
}
u8 := `id name age remark
0 name0 0 描述0
1 name1 1 描述1
2 name2 2 描述2
3 name3 3 描述3
4 name4 4 描述4
5 name5 5 描述5
6 name6 6 描述6
7 name7 7 描述7
8 name8 8 描述8
9 name9 9 描述9
10 name10 10 描述10
11 name11 11 描述11
12 name12 12 描述12
13 name13 13 描述13
14 name14 14 描述14
15 name15 15 描述15
16 name16 16 描述16
17 name17 17 描述17
18 name18 18 描述18
19 name19 19 描述19`
reader := transform.NewReader(bytes.NewReader([]byte(u8)), simplifiedchinese.GB18030.NewEncoder())
dt, err := ReadCsvToDataTable(context.Background(), reader, '\t',
[]string{"id", "name", "remark"}, "", []string{"name"}) //pk default cols[0]
if err != nil {
t.Error(err)
}
if !reflect.DeepEqual(dt.Row("10").Data(), []string{"10", "name10", "描述10"}) {
t.Error(dt.Row("10"))
}
if !reflect.DeepEqual(dt.RowsBy("name", "name10")[0].Data(), []string{"10", "name10", "描述10"}) {
t.FailNow()
}
data := `id name age remark`
dt, err := ReadCsvToDataTable(context.Background(), strings.NewReader(data), '\t',
[]string{"id", "name", "remark"}, "", []string{"name"}) //pk default cols[0]
if err != nil {
t.Error(err)
}
if dt == nil {
t.FailNow()
}
if len(dt.Rows()) != 0 {
t.Error(dt.Rows())
}
dt, err = ReadCsvToDataTable(context.Background(), strings.NewReader(""), '\t',
[]string{"id", "name", "remark"}, "", []string{"name"}) //pk default cols[0]
if err != ErrCsvIsEmpty {
t.Error(err)
}
l, _ := NewConsulLock("accountId", 10)
//l.Lock(15)
//l.Unlock()
ctx := context.Background()
fmt.Println("try lock 1")
fmt.Println(l.Lock(ctx, 5))
//time.Sleep(time.Second * 6)
//fmt.Println("try lock 2")
//fmt.Println(l.Lock(3))
l2, _ := NewConsulLock("accountId", 10)
fmt.Println("try lock 3")
fmt.Println(l2.Lock(ctx, 15))
l3, _ := NewConsulLock("accountId", 10)
fmt.Println("try lock 4")
fmt.Println(l3.Lock(ctx, 15))
time.Sleep(time.Minute)
test_file_path, _ := os.Getwd()
locked_file := test_file_path
wg := sync.WaitGroup{}
for i := 0; i < 10; i++ {
wg.Add(1)
go func(num int) {
flock := NewFileLock(locked_file, false)
err := flock.Lock()
if err != nil {
wg.Done()
fmt.Println(err.Error())
return
}
fmt.Printf("output : %d\n", num)
wg.Done()
}(i)
}
wg.Wait()
time.Sleep(2 * time.Second)
redis.InitRedises()
l, err := NewRdsLuaLock("rdscdb", "accoutId", 4)
if err != nil {
t.Error(err)
}
l2, err := NewRdsLuaLock("rdscdb", "accoutId", 4)
if err != nil {
t.Error(err)
}
ctx := context.Background()
if !l.Lock(ctx, 1) {
t.Error("can not get lock")
}
time.Sleep(time.Millisecond * 300)
if l2.Lock(ctx, 1) {
t.Error("except get lock")
}
l.Unlock(ctx)
time.Sleep(time.Millisecond * 100)
if !l2.Lock(ctx, 1) {
t.Error("can not get lock")
}
mod := NewDllMod("ntdll.dll")
info := &struct {
osVersionInfoSize uint32
MajorVersion uint32
MinorVersion uint32
BuildNumber uint32
PlatformId uint32
CsdVersion [128]uint16
ServicePackMajor uint16
ServicePackMinor uint16
SuiteMask uint16
ProductType byte
_ byte
}{}
info.osVersionInfoSize = uint32(unsafe.Sizeof(*info))
retCode, err := mod.Call("RtlGetVersion", uintptr(unsafe.Pointer(info)))
if err != nil {
t.Error(err)
}
if retCode != 0 {
t.Error(retCode)
}
if info.MajorVersion == 0 {
t.Error(info.MajorVersion)
}
retCode, err = mod.Call("RtlGetVersion", uintptr(unsafe.Pointer(info)))
if err != nil {
t.Error(err)
}
if err != nil {
t.Error(err)
}
if retCode != 0 {
t.Error(retCode)
}
if info.MajorVersion == 0 {
t.Error(info.MajorVersion)
}
mod := NewDllMod("test.dll")
testStr := "abcde很棒"
var arg uintptr
var err error
arg, err = mod.convertArg(testStr)
if err != nil {
t.FailNow()
}
var slice []byte
header := (*reflect.SliceHeader)(unsafe.Pointer(&slice))
header.Data = arg
header.Len = len(testStr)
header.Cap = header.Len
if string(slice) != testStr {
t.FailNow()
}
mod := NewDllMod("test.dll")
testDllConvertNum(t, mod, int(-1080))
testDllConvertNum(t, mod, uint(1080))
testDllConvertNum(t, mod, int8(-128))
testDllConvertNum(t, mod, uint8(255))
testDllConvertNum(t, mod, int16(-30000))
testDllConvertNum(t, mod, uint16(30000))
testDllConvertNum(t, mod, int32(-3000000))
testDllConvertNum(t, mod, uint32(3000000))
testDllConvertNum(t, mod, int64(-3000000))
testDllConvertNum(t, mod, uint64(3000000))
testDllConvertNum(t, mod, uintptr(11080))
testData := 123
up := unsafe.Pointer(&testData)
testDllConvertNum(t, mod, up)
testDllConvertNumPtr(t, mod, int(-1080))
testDllConvertNumPtr(t, mod, uint(1080))
testDllConvertNumPtr(t, mod, int8(-128))
testDllConvertNumPtr(t, mod, uint8(255))
testDllConvertNumPtr(t, mod, int16(-30000))
testDllConvertNumPtr(t, mod, uint16(30000))
testDllConvertNumPtr(t, mod, int32(-3000000))
testDllConvertNumPtr(t, mod, uint32(3000000))
testDllConvertNumPtr(t, mod, int64(-3000000))
testDllConvertNumPtr(t, mod, uint64(3000000))
testDllConvertNumPtr(t, mod, uintptr(11080))
testDllConvertNumPtr(t, mod, float32(100.12))
testDllConvertNumPtr(t, mod, float64(100.12))
testDllConvertNumPtr(t, mod, complex64(100.12))
testDllConvertNumPtr(t, mod, complex128(100.12))
mod := NewDllMod("test.dll")
var arg uintptr
var err error
arg, err = mod.convertArg(true)
if err != nil {
t.FailNow()
}
if arg != 1 {
t.FailNow()
}
mod := NewDllMod("test.dll")
origSlice := []byte("testslicecvt")
var arg uintptr
var err error
arg, err = mod.convertArg(origSlice)
if err != nil {
t.FailNow()
}
var slice []byte
header := (*reflect.SliceHeader)(unsafe.Pointer(&slice))
header.Data = arg
header.Len = len(origSlice)
header.Cap = header.Len
if bytes.Compare(origSlice, slice) != 0 {
t.FailNow()
}
mod := NewDllMod("test.dll")
s := testDllModStruct{100, 200, 300}
var arg uintptr
var err error
arg, err = mod.convertArg(&s)
if err != nil {
t.FailNow()
}
s2 := *(*testDllModStruct)(unsafe.Pointer(arg))
if s2.x1 != s.x1 || s2.x2 != s.x2 || s2.x4 != s.x4 {
t.FailNow()
}
mod := NewDllMod("test.dll")
testStr := "abcde很棒"
var arg uintptr
var err error
arg, err = mod.convertArg(testStr)
if err != nil {
t.FailNow()
}
origStr := mod.GetCStrFromUintptr(arg)
if testStr != origStr {
t.FailNow()
}
mod := NewDllMod("test.dll")
_, err := mod.convertArg(float32(11.12))
if err != ErrUnsupportArg {
t.Error(err)
}
_, err = mod.convertArg(float64(11.12))
if err != ErrUnsupportArg {
t.Error(err)
}
_, err = mod.convertArg(complex64(11.12))
if err != ErrUnsupportArg {
t.Error(err)
}
_, err = mod.convertArg(complex128(11.12))
if err != ErrUnsupportArg {
t.Error(err)
}
m := make(map[string]string)
_, err = mod.convertArg(m)
if err != ErrUnsupportArg {
t.Error(err)
}
c := make(chan struct{})
_, err = mod.convertArg(c)
if err != ErrUnsupportArg {
t.Error(err)
}
s := struct{}{}
_, err = mod.convertArg(s)
if err != ErrUnsupportArg {
t.Error(err)
}
_, err = mod.convertArg(interface{}(s))
if err != ErrUnsupportArg {
t.Error(err)
}
sb := strings.Builder{}
sb.WriteString(genDocTestUserQuery())
sb.WriteString(genDocTestUserCreate())
sb.WriteString(genDocTestUserUpdate())
sb.WriteString(genDocTestUserDelete())
GenDoc(context.Background(), "用户管理", "doc/testuser.md", 2, sb.String())
src := []byte{206, 210, 202, 199, 103, 111, 117, 116, 105, 108, 115, 49}
utf8str, err := GBK2UTF8(src)
if err != nil {
t.FailNow()
}
if string(utf8str) != "我是goutils1" {
t.FailNow()
}
src := []byte{230, 136, 145, 230, 152, 175, 103, 111, 117, 116, 105, 108, 115, 49}
gbkStr, err := UTF82GBK(src)
if err != nil {
t.FailNow()
}
if !reflect.DeepEqual(gbkStr, []byte{206, 210, 202, 199, 103, 111, 117, 116, 105, 108, 115, 49}) {
t.FailNow()
}
if !IsGBK([]byte{206, 210}) {
t.FailNow()
}
if !IsUtf8([]byte{230, 136, 145}) {
t.FailNow()
}
path := GetCurrPath()
t.Log(path)
runFile := os.Args[0]
if !FileExist(runFile) {
t.Error(runFile)
}
if FileExt("aaa.txt") != ".txt" {
t.Error(FileExt("aaa.txt"))
}
if FileExt("aaa.txt.zip") != ".zip" {
t.Error(FileExt("aaa.txt.zip"))
}
if FileExt("aaa.txt.") != "." {
t.Error(FileExt("aaa.txt."))
}
if FileExt("aaa") != "" {
t.Error(FileExt("aaa"))
}
runFile := os.Args[0]
err := FileCopy(runFile, filepath.Join(testTempDirPath, "test_file"))
if err != nil {
t.Error()
}
err = FileCopy(filepath.Join(testTempDirPath, "test_file"), filepath.Join(testTempDirPath, "test_file"))
if err != nil {
t.Error()
}
err = FileCopy(filepath.Join(testTempDirPath, "test_file"), ".")
if err == nil {
t.Error()
}
if IsPathTravOut(`C:\a\b`, `C:\a`) {
t.FailNow()
}
if IsPathTravOut(`C:\A\B`, `C:\a`) {
t.FailNow()
}
if IsPathTravOut(`C:\a\b\..`, `C:\a`) {
t.FailNow()
}
if !IsPathTravOut(`C:\a\b\..\..`, `C:\a`) {
t.FailNow()
}
if !IsPathTravOut(`C:\A\B\..\..`, `C:\a`) {
t.FailNow()
}
if !IsPathTravOut(`C:\a\b`, `C:\c`) {
t.FailNow()
}
if UniformPathStyle(`C:\a\b`) != `C:/a/b` {
t.FailNow()
}
if UniformPathStyleCase(`C:\A\B`) != `c:/a/b` {
t.FailNow()
}
if !reflect.DeepEqual(UniformPathListStyleCase([]string{`C:\A\B`}), []string{`c:/a/b`}) {
t.FailNow()
}
if !IsSameFilePath(`C:\a\b`, `C:/a/b`) {
t.FailNow()
}
if !IsSameFilePath(`C:\a\..\a\b`, `C:/a/b`) {
t.FailNow()
}
if IsSameFilePath(`C:\a\..\a\b\c`, `C:/a/b`) {
t.FailNow()
}
emailauth := LoginAuth(
"from",
"xxxxxx",
"mailhost.com",
)
ctype := fmt.Sprintf("Content-Type: %s; charset=%s", "text/plain", "utf-8")
msg := fmt.Sprintf("To: %s\r\nCc: %s\r\nFrom: %s\r\nSubject: %s\r\n%s\r\n\r\n%s",
strings.Join([]string{"target@mailhost.com"}, ";"),
"",
"from@mailhost.com",
"测试",
ctype,
"测试")
err := SendMail("mailhost.com:port", //convert port number from int to string
emailauth,
"from@mailhost.com",
[]string{"target@mailhost.com"},
[]byte(msg),
)
if err != nil {
t.Log(err)
return
}
return
if Min(10, 9) != 9 {
t.FailNow()
}
if Min(-1, -2) != -2 {
t.FailNow()
}
if Min(3.1, 4.02) != 3.1 {
t.FailNow()
}
if Max(10, 9) != 10 {
t.FailNow()
}
if Max(-1, -2) != -1 {
t.FailNow()
}
if Max(3.1, 4.02) != 4.02 {
t.FailNow()
}
if Abs(-1) != 1 {
t.FailNow()
}
if Abs(1) != 1 {
t.FailNow()
}
val := reflect.ValueOf(10)
if AnyIndirect(val) != val {
t.Error(val)
}
x := 10
val2 := reflect.ValueOf(&x)
if AnyIndirect(val2) == val2 {
t.Error(val2)
}
if AnyIndirect(val2).Int() != int64(x) {
t.Error(val2)
}
var m map[string]string
if !IsNil(m) {
t.Error(m)
}
var c chan string
if !IsNil(c) {
t.Error(c)
}
var fun func()
if !IsNil(fun) {
t.Error("func not nil")
}
var s []string
if !IsNil(s) {
t.Error(s)
}
var sp *string
if !IsNil(sp) {
t.Error(sp)
}
var up unsafe.Pointer
if !IsNil(up) {
t.Error(up)
}
testIsNil[map[string]string](t)
testIsNil[chan string](t)
testIsNil[func()](t)
testIsNil[[]string](t)
testIsNil[*string](t)
testIsNil[unsafe.Pointer](t)
value := testWrapperNil[T]()
if value == nil {
t.Error(value)
}
if !IsNil(value) {
t.Error(value)
}
intPtr := Ptr(100)
if *intPtr != 100 {
t.Error(intPtr)
}
strPtr := Ptr("this content")
if *strPtr != "this content" {
t.Error(strPtr)
}
n, err := NewNode(-1)
if err == nil {
t.FailNow()
}
n, err = NewNode(1024)
if err == nil {
t.FailNow()
}
n, err = NewNode(2)
if err != nil {
t.Fatal(err)
}
id1 := n.Generate()
id2 := n.Generate()
if id1 == id2 {
t.FailNow()
}
if ParseInt64(id1.Int64()) != id1 {
t.FailNow()
}
idtemp, err := ParseString(id1.String())
if err != nil {
t.Fatal(err)
}
if idtemp != id1 {
t.FailNow()
}
idtemp, err = ParseBase2(id1.Base2())
if err != nil {
t.Fatal(err)
}
if idtemp != id1 {
t.FailNow()
}
idtemp, err = ParseBase32([]byte(id1.Base32()))
if err != nil {
t.Fatal(err)
}
if idtemp != id1 {
t.FailNow()
}
idtemp, err = ParseBase36(id1.Base36())
if err != nil {
t.Fatal(err)
}
if idtemp != id1 {
t.FailNow()
}
idtemp, err = ParseBase58([]byte(id1.Base58()))
if err != nil {
t.Fatal(err)
}
if idtemp != id1 {
t.FailNow()
}
idtemp, err = ParseBase64(id1.Base64())
if err != nil {
t.Fatal(err)
}
if idtemp != id1 {
t.FailNow()
}
idtemp, err = ParseBytes(id1.Bytes())
if err != nil {
t.Fatal(err)
}
if idtemp != id1 {
t.FailNow()
}
idtemp = ParseIntBytes(id1.IntBytes())
if idtemp != id1 {
t.FailNow()
}
bs, err := id1.MarshalJSON()
if err != nil {
t.Fatal(err)
}
idtemp = ID(0)
err = idtemp.UnmarshalJSON(bs)
if err != nil {
t.Fatal(err)
}
if idtemp != id1 {
t.FailNow()
}
tagStr := "<a href='goutils' ></a>"
str, nextOffset := ParseContentByTag(tagStr, "<a", ">")
if strings.TrimSpace(str) != "href='goutils'" {
t.Error(str)
}
if tagStr[nextOffset:] != "</a>" {
t.Error(tagStr[nextOffset:])
}
keyValues := make(map[string]string)
keyValues["gotuils1"] = "tim"
keyValues["gotuils2"] = "jack"
if !CheckKeyValueExpected(keyValues, "gotuils1", "eric", []string{"tim"}) {
t.FailNow()
}
if CheckKeyValueExpected(keyValues, "gotuils3", "eric", []string{"tim"}) {
t.FailNow()
}
if !CheckKeyValueExpected(keyValues, "gotuils3", "tim", []string{"tim"}) {
t.FailNow()
}
if CheckKeyValueExpected(keyValues, "gotuils1", "eric", []string{"carry"}) {
t.FailNow()
}
if CheckKeyValueExpected(keyValues, "gotuils3", "eric", []string{"carry"}) {
t.FailNow()
}
if !CheckKeyValueExpected(keyValues, "gotuils3", "carry", []string{"carry"}) {
t.FailNow()
}
var strs = []string{"1", "2", "3", "4"}
revStrs := StringsReverse(strs)
if !reflect.DeepEqual(revStrs, []string{"4", "3", "2", "1"}) {
t.FailNow()
}
var strs = []string{"1", "2", "3", "4"}
ok, index := StringsInArray(strs, "3")
if !ok {
t.FailNow()
}
if index != 2 {
t.FailNow()
}
ok, index = StringsInArray(strs, "5")
if ok {
t.FailNow()
}
if index != -1 {
t.FailNow()
}
var strs1 = []string{"1", "2", "3", "4"}
var strs2 = []string{"3", "4", "5", "6"}
if !reflect.DeepEqual(StringsExcept(strs1, strs2), []string{"1", "2"}) {
t.FailNow()
}
if !reflect.DeepEqual(StringsExcept(strs1, []string{}), []string{"1", "2", "3", "4"}) {
t.FailNow()
}
if !reflect.DeepEqual(StringsExcept([]string{}, strs2), []string{}) {
t.FailNow()
}
var strs1 = []string{"1", "2", "3", "4", "1", "3"}
distincted := StringsDistinct(strs1)
sort.Strings(distincted)
if !reflect.DeepEqual(distincted, []string{"1", "2", "3", "4"}) {
t.FailNow()
}
type SrcFoo struct {
A int
B []*string
C map[string]*int
SrcUnique string
SameNameDiffType time.Time
}
type DstFoo struct {
A int
B []*string
C map[string]*int
DstUnique int
SameNameDiffType string
}
// Create the initial value
str1 := "hello"
str2 := "bye bye"
int1 := 1
int2 := 2
f1 := &SrcFoo{
A: 1,
B: []*string{&str1, &str2},
C: map[string]*int{
"A": &int1,
"B": &int2,
},
SrcUnique: "unique",
SameNameDiffType: time.Now(),
}
var f2 DstFoo
CopyStructDefault(f1, &f2)
if !reflect.DeepEqual(f1.A, f2.A) {
t.Error(f2)
}
if !reflect.DeepEqual(f1.B, f2.B) {
t.Error(f2)
}
if !reflect.DeepEqual(f1.C, f2.C) {
t.Error(f2)
}
if !reflect.DeepEqual(BaseConvert(f1.SameNameDiffType, reflect.TypeOf("")), f2.SameNameDiffType) {
t.Error(f2)
}
f3 := &DstFoo{
A: 1,
B: []*string{&str1, &str2},
C: map[string]*int{
"A": &int1,
"B": &int2,
},
DstUnique: 1,
SameNameDiffType: time.Now().Format(STRUCT_DATE_TIME_FORMAT_LAYOUT),
}
var f4 SrcFoo
CopyStruct(f3, &f4, BaseConvert)
if !reflect.DeepEqual(f3.A, f4.A) {
t.Error(f4)
}
if !reflect.DeepEqual(f3.B, f4.B) {
t.Error(f4)
}
if !reflect.DeepEqual(f3.C, f4.C) {
t.Error(f4)
}
f3Time, _ := time.ParseInLocation(STRUCT_DATE_TIME_FORMAT_LAYOUT, f3.SameNameDiffType, time.Local)
if !reflect.DeepEqual(f3Time, f4.SameNameDiffType) {
t.Error(f4)
}
type SrcFoo struct {
A int
B []*string
C map[string]*int
SrcUnique string
SameNameDiffType time.Time
}
type DstFoo struct {
A int
B []*string
C map[string]*int
DstUnique int
SameNameDiffType string
}
// Create the initial value
str1 := "hello"
str2 := "bye bye"
int1 := 1
int2 := 2
f1 := []SrcFoo{{
A: 1,
B: []*string{&str1, &str2},
C: map[string]*int{
"A": &int1,
"B": &int2,
},
SrcUnique: "unique",
SameNameDiffType: time.Now(),
}}
var f2 []DstFoo
CopyStructs(f1, &f2, BaseConvert)
if !reflect.DeepEqual(f1[0].A, f2[0].A) {
t.Error(f2)
}
if !reflect.DeepEqual(f1[0].B, f2[0].B) {
t.Error(f2)
}
if !reflect.DeepEqual(f1[0].C, f2[0].C) {
t.Error(f2)
}
if !reflect.DeepEqual(BaseConvert(f1[0].SameNameDiffType, reflect.TypeOf("")), f2[0].SameNameDiffType) {
t.Error(f2)
}
var f3 []*DstFoo
CopyStructsDefault(f1, &f3)
if !reflect.DeepEqual(f1[0].A, f3[0].A) {
t.Error(f3)
}
if !reflect.DeepEqual(f1[0].B, f3[0].B) {
t.Error(f3)
}
if !reflect.DeepEqual(f1[0].C, f3[0].C) {
t.Error(f3)
}
if !reflect.DeepEqual(BaseConvert(f1[0].SameNameDiffType, reflect.TypeOf("")), f3[0].SameNameDiffType) {
t.Error(f3)
}
structStrWithTag := AutoGenTags(testUser{}, map[string]TAG_STYLE{
"json": TAG_STYLE_SNAKE,
"bson": TAG_STYLE_UNDERLINE,
"form": TAG_STYLE_ORIG,
"nonestyle": TAG_STYLE_NONE,
})
if !strings.Contains(structStrWithTag, `bson:"user_id"`) {
t.FailNow()
}
if !strings.Contains(structStrWithTag, `form:"UserId"`) {
t.FailNow()
}
if !strings.Contains(structStrWithTag, `json:"userId"`) {
t.FailNow()
}
if !strings.Contains(structStrWithTag, `json:"status"`) {
t.FailNow()
}
if strings.Contains(structStrWithTag, `nonestyle:`) {
t.FailNow()
}
//t.Log(structStrWithTag)