github.com/codingeasygo/util@v0.0.0-20231206062002-1ce2f004b7d9/converter/converter_test.go (about)

     1  package converter
     2  
     3  import (
     4  	"bytes"
     5  	"fmt"
     6  	"strings"
     7  	"testing"
     8  	"time"
     9  )
    10  
    11  type XTIME time.Time
    12  
    13  func TestNumber(t *testing.T) {
    14  	type MyInt int
    15  	var m map[string]interface{}
    16  	//test all type
    17  	m = map[string]interface{}{}
    18  	m["abc"] = "123"
    19  	m["abc2"] = int(1)
    20  	m["myint"] = MyInt(1)
    21  	m["float32"] = float32(1)
    22  	m["float64"] = float64(1)
    23  	m["int"] = int(1)
    24  	m["int8"] = int8(1)
    25  	m["int16"] = int16(1)
    26  	m["int32"] = int32(1)
    27  	m["int64"] = int64(1)
    28  	m["uint"] = uint(1)
    29  	m["uint8"] = uint8(1)
    30  	m["uint16"] = uint16(1)
    31  	m["uint32"] = uint32(1)
    32  	m["uint64"] = uint64(1)
    33  	m["time"] = time.Now()
    34  	m["time1"] = time.Time{}
    35  	m["time2"] = XTIME(time.Now())
    36  	m["time3"] = XTIME(time.Time{})
    37  	for key, val := range m {
    38  		intA, err := IntVal(val)
    39  		if err != nil {
    40  			t.Error(key, err)
    41  			return
    42  		}
    43  		intB := Int(val)
    44  		if intA != intB {
    45  			t.Errorf("%v  %v  %v", key, intA, intB)
    46  			return
    47  		}
    48  		int64A, err := Int64Val(val)
    49  		if err != nil {
    50  			t.Error(key)
    51  			return
    52  		}
    53  		int64B := Int64(val)
    54  		if int64A != int64B {
    55  			t.Errorf("%v  %v  %v", key, int64A, int64B)
    56  			return
    57  		}
    58  		uint64A, err := Uint64Val(val)
    59  		if err != nil {
    60  			t.Error(key)
    61  			return
    62  		}
    63  		uint64B := Uint64(val)
    64  		if uint64A != uint64B {
    65  			t.Errorf("%v  %v  %v", key, uint64A, uint64B)
    66  			return
    67  		}
    68  		float64A, err := Float64Val(val)
    69  		if err != nil {
    70  			t.Error(key)
    71  			return
    72  		}
    73  		float64B := Float64(val)
    74  		if float64A != float64B {
    75  			t.Errorf("%v  %v  %v", key, float64A, float64B)
    76  			return
    77  		}
    78  	}
    79  	//test error
    80  	m = map[string]interface{}{}
    81  	m["nil"] = nil
    82  	m["abd"] = "a123"
    83  	m["str1"] = []byte("akkkk")
    84  	for key, val := range m {
    85  		_, err := IntVal(val)
    86  		if err == nil {
    87  			t.Error(key)
    88  			return
    89  		}
    90  		_, err = Int64Val(val)
    91  		if err == nil {
    92  			t.Error(key)
    93  			return
    94  		}
    95  		_, err = Uint64Val(val)
    96  		if err == nil {
    97  			t.Error(key)
    98  			return
    99  		}
   100  		_, err = Float64Val(val)
   101  		if err == nil {
   102  			t.Error(key)
   103  			return
   104  		}
   105  	}
   106  }
   107  
   108  func TestString(t *testing.T) {
   109  	var m map[string]interface{}
   110  	//test all type
   111  	m = map[string]interface{}{}
   112  	type myString string
   113  	var sbyte = []byte("akkkk")
   114  	var sstr = "a123"
   115  	m["abd"] = "a123"
   116  	m["my_str"] = myString("jdldklal")
   117  	m["str1"] = []byte("akkkk")
   118  	m["str2"] = &sbyte
   119  	m["str3"] = &sstr
   120  	m["other"] = 111
   121  	m["arr1"] = []int{1}
   122  	m["arr1"] = []interface{}{nil, nil}
   123  	for key, val := range m {
   124  		strA, err := StringVal(val)
   125  		if err != nil {
   126  			t.Error(key)
   127  			return
   128  		}
   129  		strB := String(val)
   130  		if strA != strB {
   131  			t.Errorf("%v  %v  %v", key, strA, strB)
   132  			return
   133  		}
   134  	}
   135  	//test error
   136  	m = map[string]interface{}{}
   137  	m["nil"] = nil
   138  	for key, val := range m {
   139  		_, err := StringVal(val)
   140  		if err == nil {
   141  			t.Error(key)
   142  			return
   143  		}
   144  	}
   145  }
   146  
   147  func TestArray(t *testing.T) {
   148  	var i0, i1 = 1, 2
   149  	var s0 = "1,2,3"
   150  	var m map[string]interface{}
   151  	//test all type
   152  	m = map[string]interface{}{}
   153  	m["str1"] = []byte("123")
   154  	m["str2"] = "1,2,3"
   155  	m["str3"] = &s0
   156  	m["arr1"] = []int{1, 1}
   157  	m["arr2"] = []interface{}{1, 1}
   158  	m["arr3"] = []*int{&i0, &i1}
   159  	m["arr4"] = []interface{}{&i0, &i1}
   160  	for key, val := range m {
   161  		_, err := ArrayVal(val)
   162  		if err != nil {
   163  			t.Error(key, err)
   164  			return
   165  		}
   166  		_, err = ArrayStringVal(val)
   167  		if err != nil {
   168  			t.Error(key, err)
   169  			return
   170  		}
   171  		_, err = ArrayIntVal(val)
   172  		if err != nil {
   173  			t.Error(key, err)
   174  			return
   175  		}
   176  		_, err = ArrayInt64Val(val)
   177  		if err != nil {
   178  			t.Error(key, err)
   179  			return
   180  		}
   181  		_, err = ArrayUint64Val(val)
   182  		if err != nil {
   183  			t.Error(key, err)
   184  			return
   185  		}
   186  		_, err = ArrayFloat64Val(val)
   187  		if err != nil {
   188  			t.Error(key, err)
   189  			return
   190  		}
   191  	}
   192  	//test error
   193  	var snil *string
   194  	var serr string = "xx"
   195  	m = map[string]interface{}{}
   196  	m["nil"] = nil
   197  	m["int"] = 1
   198  	m["str1"] = "xx"
   199  	m["str2"] = snil
   200  	m["str3"] = &serr
   201  	m["i1"] = []interface{}{"aaa"}
   202  	m["i2"] = []*testing.T{nil}
   203  	// m["nil"] = []interface{}{"1", snil}
   204  	for key, val := range m {
   205  		_, err := ArrayIntVal(val)
   206  		if err == nil {
   207  			t.Error(key)
   208  			return
   209  		}
   210  		_, err = ArrayInt64Val(val)
   211  		if err == nil {
   212  			t.Error(key)
   213  			return
   214  		}
   215  		_, err = ArrayUint64Val(val)
   216  		if err == nil {
   217  			t.Error(key)
   218  			return
   219  		}
   220  		_, err = ArrayFloat64Val(val)
   221  		if err == nil {
   222  			t.Error(key)
   223  			return
   224  		}
   225  	}
   226  	_, err := ArrayStringVal(nil)
   227  	if err == nil {
   228  		t.Error("xx")
   229  		return
   230  	}
   231  	_, err = ArrayStringVal(snil)
   232  	if err == nil {
   233  		t.Error("xx")
   234  		return
   235  	}
   236  	_, err = ArrayStringVal(t)
   237  	if err == nil {
   238  		t.Error("xx")
   239  		return
   240  	}
   241  	_, err = ArrayStringVal([]interface{}{nil})
   242  	if err == nil {
   243  		t.Error("xx")
   244  		return
   245  	}
   246  	_, err = ArrayStringVal([]*testing.T{nil})
   247  	if err == nil {
   248  		t.Error("xx")
   249  		return
   250  	}
   251  	_, err = ArrayValAll(t, true)
   252  	if err != nil {
   253  		t.Error("xx")
   254  		return
   255  	}
   256  	_, err = ArrayVal(nil)
   257  	if err == nil {
   258  		t.Error("xx")
   259  		return
   260  	}
   261  	_, err = ArrayVal(snil)
   262  	if err == nil {
   263  		t.Error("xx")
   264  		return
   265  	}
   266  	_, err = ArrayVal(t)
   267  	if err == nil {
   268  		t.Error("xx")
   269  		return
   270  	}
   271  }
   272  
   273  func TestArrayHaving(t *testing.T) {
   274  	iary := []int{1, 2, 3, 4, 5, 6}
   275  	if !ArrayHaving(iary, 2) {
   276  		t.Error("value exis in array.")
   277  		return
   278  	}
   279  	if ArrayHaving(iary, 8) {
   280  		t.Error("value not exis in array.")
   281  		return
   282  	}
   283  	//
   284  	fary := []float32{1.0, 2.0, 3.0, 4.0, 5.0}
   285  	if !ArrayHaving(fary, float32(1.0)) {
   286  		t.Error("value exis in array.")
   287  		return
   288  	}
   289  	if ArrayHaving(fary, float32(8.0)) {
   290  		t.Error("value not exis in array.")
   291  		return
   292  	}
   293  	//
   294  	sary := []string{"a", "b", "c", "d", "e", "f"}
   295  	if !ArrayHaving(sary, "c") {
   296  		t.Error("value exis in array.")
   297  		return
   298  	}
   299  	if ArrayHaving(sary, "g") {
   300  		t.Error("value not exis in array.")
   301  		return
   302  	}
   303  	ab := ""
   304  	if ArrayHaving(ab, 8) {
   305  		t.Error("value exis in array.")
   306  		return
   307  	}
   308  }
   309  
   310  func TestJSON(t *testing.T) {
   311  	v1 := JSON("v")
   312  	if v1 != "\"v\"" {
   313  		t.Error(v1)
   314  		return
   315  	}
   316  	v2 := JSON(TestJSON)
   317  	if !strings.Contains(v2, "unsupported") {
   318  		t.Error(v2)
   319  		return
   320  	}
   321  }
   322  
   323  func TestXML(t *testing.T) {
   324  	v1 := XML("v")
   325  	if v1 != "<string>v</string>" {
   326  		t.Error(v1)
   327  		return
   328  	}
   329  	v2 := XML(TestJSON)
   330  	if !strings.Contains(v2, "unsupported") {
   331  		t.Error(v2)
   332  		return
   333  	}
   334  }
   335  
   336  type xmlObj struct {
   337  }
   338  
   339  func TestUnmarshal(t *testing.T) {
   340  	var err error
   341  	_, err = UnmarshalJSON(bytes.NewBufferString("{}"), &map[string]interface{}{})
   342  	if err != nil {
   343  		t.Error(err)
   344  		return
   345  	}
   346  	_, err = UnmarshalXML(bytes.NewBufferString("<xml></xml>"), &xmlObj{})
   347  	if err != nil {
   348  		t.Error(err)
   349  		return
   350  	}
   351  }
   352  
   353  func TestPtr(t *testing.T) {
   354  	Int8Ptr(1)
   355  	Uint8Ptr(1)
   356  	Int16Ptr(1)
   357  	Uint16Ptr(1)
   358  	Int32Ptr(1)
   359  	Uint32Ptr(1)
   360  	IntPtr(1)
   361  	UintPtr(1)
   362  	Int64Ptr(1)
   363  	Uint64Ptr(1)
   364  	Float32Ptr(1)
   365  	Float64Ptr(1)
   366  	StringPtr("ss")
   367  }
   368  
   369  func TestJoin(t *testing.T) {
   370  	if Join([]int{}, ",") != "" {
   371  		t.Error("error")
   372  		return
   373  	}
   374  	if Join([]int{1, 2, 3}, ",") != "1,2,3" {
   375  		t.Error("error")
   376  		return
   377  	}
   378  	if Join([]*int{IntPtr(1), IntPtr(2), IntPtr(3)}, ",") != "1,2,3" {
   379  		t.Error("error")
   380  		return
   381  	}
   382  	if Join([]*string{StringPtr("1"), StringPtr("2"), StringPtr("3")}, ",") != "1,2,3" {
   383  		t.Error("error")
   384  		return
   385  	}
   386  	func() {
   387  		defer func() {
   388  			recover()
   389  		}()
   390  		Join("xx", ",")
   391  	}()
   392  }
   393  
   394  func TestJoinSafe(t *testing.T) {
   395  	if JoinSafe([]int{}, ",", JoinPolicyDefault) != "" {
   396  		t.Error("error")
   397  		return
   398  	}
   399  	if JoinSafe([]int{1, 2, 3}, ",", JoinPolicyDefault) != "1,2,3" {
   400  		t.Error("error")
   401  		return
   402  	}
   403  	if JoinSafe([]*int{IntPtr(1), IntPtr(2), IntPtr(3)}, ",", JoinPolicyDefault) != "1,2,3" {
   404  		t.Error("error")
   405  		return
   406  	}
   407  	if JoinSafe([]*int{IntPtr(1), IntPtr(2), nil, IntPtr(3)}, ",", JoinPolicyDefault) != "1,2,3" {
   408  		t.Error("error")
   409  		return
   410  	}
   411  	if JoinSafe([]*int{IntPtr(1), IntPtr(2), nil, IntPtr(3)}, ",", JoinPolicyDefault) != "1,2,3" {
   412  		t.Error("error")
   413  		return
   414  	}
   415  	if JoinSafe([]*int{IntPtr(1), IntPtr(2), nil, IntPtr(3)}, ",", JoinPolicyNilString) != "1,2,<nil>,3" {
   416  		t.Error(JoinSafe([]*int{IntPtr(1), IntPtr(2), nil, IntPtr(3)}, ",", JoinPolicyNilString))
   417  		return
   418  	}
   419  	if JoinSafe([]*string{StringPtr("1"), StringPtr("2"), StringPtr("3")}, ",", JoinPolicyDefault) != "1,2,3" {
   420  		t.Error("error")
   421  		return
   422  	}
   423  	if JoinSafe([]*string{StringPtr("1"), StringPtr("2"), nil, StringPtr("3")}, ",", JoinPolicyDefault) != "1,2,3" {
   424  		t.Error("error")
   425  		return
   426  	}
   427  	if JoinSafe([]*string{StringPtr("1"), StringPtr("2"), nil, StringPtr("3")}, ",", JoinPolicyNilString) != "1,2,<nil>,3" {
   428  		t.Error("error")
   429  		return
   430  	}
   431  	if JoinSafe("xx", ",", JoinPolicyDefault) != "" {
   432  		t.Error("error")
   433  		return
   434  	}
   435  	if JoinSafe("xx", ",", JoinPolicyNotSliceString) != "xx" {
   436  		t.Error("error")
   437  		return
   438  	}
   439  }
   440  
   441  func TestIndirectString(t *testing.T) {
   442  	var x *int
   443  	fmt.Println(IndirectString(x))
   444  	fmt.Println(IndirectString(nil))
   445  	fmt.Println(IndirectString(1))
   446  }