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

     1  package xmap
     2  
     3  import (
     4  	"fmt"
     5  	"sort"
     6  	"testing"
     7  )
     8  
     9  func TestMap(t *testing.T) {
    10  	m := New()
    11  	testMap(t, m)
    12  	m2 := NewSafe()
    13  	testMap(t, m2)
    14  	m3 := M{}
    15  	testMap(t, m3)
    16  }
    17  
    18  func testMap(t *testing.T, m Valuable) {
    19  	m.SetValue("abc", "123")
    20  	m.SetValue("int", 123)
    21  	m.SetValue("x", M{"a": 123})
    22  	m.SetValue("/ary", []interface{}{1, 2, 3})
    23  	m.SetValue("/ary2", "1,2,3")
    24  	m.SetValue("/arm", []interface{}{M{}, M{}, M{}})
    25  	assert := func(v bool) {
    26  		if !v {
    27  			panic("error")
    28  		}
    29  	}
    30  	assert(m.Exist("abc"))
    31  	//
    32  	assert(nil != m.Raw())
    33  	assert(nil != m.Map("x"))
    34  	assert(nil != m.MapDef(nil, "x"))
    35  	assert(nil == m.MapDef(nil, "not"))
    36  	//
    37  	assert(m.Str("abc") == "123")
    38  	assert(m.StrDef("", "abc") == "123")
    39  	assert(m.StrDef("", "not") == "")
    40  	//
    41  	assert(m.Int("int") == 123)
    42  	assert(m.Int64("int") == 123)
    43  	assert(m.Uint64("int") == 123)
    44  	assert(m.Float64("int") == 123)
    45  	assert(m.Int("x/a") == 123)
    46  	assert(m.Int64("x/a") == 123)
    47  	assert(m.Uint64("x/a") == 123)
    48  	assert(m.Float64("x/a") == 123)
    49  	//
    50  	assert(m.IntDef(0, "int") == 123)
    51  	assert(m.Int64Def(0, "int") == 123)
    52  	assert(m.Uint64Def(0, "int") == 123)
    53  	assert(m.Float64Def(0, "int") == 123)
    54  	//
    55  	assert(m.IntDef(0, "not") == 0)
    56  	assert(m.Int64Def(0, "not") == 0)
    57  	assert(m.Uint64Def(0, "not") == 0)
    58  	assert(m.Float64Def(0, "not") == 0)
    59  	//
    60  	assert(len(m.ArrayDef(nil, "/ary")) == 3)
    61  	assert(len(m.ArrayMapDef(nil, "/arm")) == 3)
    62  	assert(len(m.ArrayIntDef(nil, "/ary")) == 3)
    63  	assert(len(m.ArrayInt64Def(nil, "/ary")) == 3)
    64  	assert(len(m.ArrayUint64Def(nil, "/ary")) == 3)
    65  	assert(len(m.ArrayFloat64Def(nil, "/ary")) == 3)
    66  	assert(len(m.ArrayStrDef(nil, "/ary")) == 3)
    67  	//
    68  	assert(len(m.ArrayDef(nil, "/not")) == 0)
    69  	assert(len(m.ArrayMapDef(nil, "/not")) == 0)
    70  	assert(len(m.ArrayIntDef(nil, "/not")) == 0)
    71  	assert(len(m.ArrayInt64Def(nil, "/not")) == 0)
    72  	assert(len(m.ArrayUint64Def(nil, "/v")) == 0)
    73  	assert(len(m.ArrayFloat64Def(nil, "/not")) == 0)
    74  	assert(len(m.ArrayStrDef(nil, "/not")) == 0)
    75  	//
    76  	//
    77  	if v, err := m.StrVal("int"); true {
    78  		assert(v == "123" && err == nil)
    79  	}
    80  	if v, err := m.IntVal("int"); true {
    81  		assert(v == 123 && err == nil)
    82  	}
    83  	if v, err := m.Int64Val("int"); true {
    84  		assert(v == 123 && err == nil)
    85  	}
    86  	if v, err := m.Uint64Val("int"); true {
    87  		assert(v == 123 && err == nil)
    88  	}
    89  	if v, err := m.Float64Val("int"); true {
    90  		assert(v == 123 && err == nil)
    91  	}
    92  	if v, err := m.MapVal("x"); true {
    93  		assert(v != nil && err == nil)
    94  	}
    95  	if v, err := m.ValueVal("x"); true {
    96  		assert(v != nil && err == nil)
    97  	}
    98  	//
    99  	if v, err := m.ArrayVal("ary"); true {
   100  		assert(len(v) == 3 && err == nil)
   101  	}
   102  	if v, err := m.ArrayStrVal("ary"); true {
   103  		assert(len(v) == 3 && err == nil)
   104  	}
   105  	if v, err := m.ArrayIntVal("ary"); true {
   106  		assert(len(v) == 3 && err == nil)
   107  	}
   108  	if v, err := m.ArrayInt64Val("ary"); true {
   109  		assert(len(v) == 3 && err == nil)
   110  	}
   111  	if v, err := m.ArrayUint64Val("ary"); true {
   112  		assert(len(v) == 3 && err == nil)
   113  	}
   114  	if v, err := m.ArrayFloat64Val("ary"); true {
   115  		assert(len(v) == 3 && err == nil)
   116  	}
   117  	if v, err := m.ArrayMapVal("arm"); true {
   118  		assert(len(v) == 3 && err == nil)
   119  	}
   120  	//
   121  	//test remove
   122  	m.SetValue("having", "123")
   123  	assert(m.Value("having") != nil)
   124  	m.Delete("having")
   125  	assert(m.Value("having") == nil)
   126  	//
   127  	m.SetValue("having", "123")
   128  	assert(m.Length() > 0)
   129  	m.Clear()
   130  	assert(m.Length() == 0)
   131  }
   132  
   133  func TestArrayMap(t *testing.T) {
   134  	var m map[string]interface{}
   135  	//test all type
   136  	m = map[string]interface{}{}
   137  	m["arr1"] = []map[string]interface{}{{}, {}}
   138  	m["arr2"] = []interface{}{M{}, M{}}
   139  	m["nil"] = nil
   140  	for key, val := range m {
   141  		_, err := ArrayMapVal(val)
   142  		if err != nil {
   143  			t.Error(key)
   144  			return
   145  		}
   146  	}
   147  	//test error
   148  	m = map[string]interface{}{}
   149  	m["int"] = 1
   150  	m["i1"] = []interface{}{"aaa"}
   151  	m["i2"] = []*testing.T{nil}
   152  	for key, val := range m {
   153  		_, err := ArrayMapVal(val)
   154  		if err == nil {
   155  			t.Error(key)
   156  			return
   157  		}
   158  	}
   159  }
   160  
   161  func TestPathValue(t *testing.T) {
   162  	//data
   163  	m1 := map[string]interface{}{
   164  		"s":   "str",
   165  		"i":   int64(16),
   166  		"f":   float64(16),
   167  		"ary": []interface{}{1, 3, 4},
   168  	}
   169  	m2 := map[string]interface{}{
   170  		"a":   "abc",
   171  		"m":   m1,
   172  		"ary": []interface{}{"1", "3", "4"},
   173  	}
   174  	m3 := map[string]interface{}{
   175  		"b":   "abcc",
   176  		"m":   m2,
   177  		"ary": []interface{}{m1, m2},
   178  	}
   179  	m4 := Wrap(M{
   180  		"test": 1,
   181  		"ms":   []interface{}{m1, m2, m3},
   182  		"m3":   m3,
   183  		"m4":   "{}",
   184  		"m5":   []byte("{}"),
   185  		"m6":   "[{}]",
   186  		"m7":   []byte("[{}]"),
   187  		"ary2": []int{1, 3, 4},
   188  		"me":   map[string]string{"a": "b"},
   189  	})
   190  	var v interface{}
   191  	var err error
   192  	v, err = m4.ValueVal("/path")
   193  	assertError(t, v, err)
   194  	v, err = m4.ValueVal("/test")
   195  	assertNotError(t, v, err)
   196  	v, err = m4.ValueVal("/ms")
   197  	assertNotError(t, v, err)
   198  	v, err = m4.ValueVal("/m3")
   199  	assertNotError(t, v, err)
   200  	v, err = m4.MapVal("/m4")
   201  	assertNotError(t, v, err)
   202  	v, err = m4.MapVal("/m5")
   203  	assertNotError(t, v, err)
   204  	v, err = m4.ArrayMapVal("/m6")
   205  	assertNotError(t, v, err)
   206  	v, err = m4.ArrayMapVal("/m7")
   207  	assertNotError(t, v, err)
   208  	//
   209  	v, err = m4.ValueVal("/m3/b")
   210  	assertNotError(t, v, err)
   211  	v, err = m4.ValueVal("/m3/b2")
   212  	assertError(t, v, err)
   213  	v, err = m4.ValueVal("/m3/ary")
   214  	assertNotError(t, v, err)
   215  	v, err = m4.ValueVal("/ms/1")
   216  	assertNotError(t, v, err)
   217  	v, err = m4.ValueVal("/ms/100")
   218  	assertError(t, v, err)
   219  	v, err = m4.ValueVal("/ms/a")
   220  	assertError(t, v, err)
   221  	v, err = m4.ValueVal("/ary2/100")
   222  	assertError(t, v, err)
   223  	v, err = m4.ValueVal("/ms/@len")
   224  	assertNotError(t, v, err)
   225  	v, err = m4.ValueVal("/ary2/@len")
   226  	assertError(t, v, err)
   227  	v, err = m4.ValueVal("/test/abc")
   228  	assertError(t, v, err)
   229  	v, err = m4.ValueVal("/me/a")
   230  	assertError(t, v, err)
   231  	v, err = m4.ValueVal("/mekkkk/a")
   232  	assertError(t, v, err)
   233  }
   234  
   235  func TestSetValue(t *testing.T) {
   236  	var v interface{}
   237  	var err error
   238  	m := Wrap(M{
   239  		"eary":  []string{},
   240  		"ary":   []interface{}{456},
   241  		"emap":  map[string]string{},
   242  		"map":   map[string]interface{}{},
   243  		"ntype": "kkkk",
   244  	})
   245  	m.SetValue("/abc", M{"a": 1})
   246  	v, err = m.ValueVal("/abc/a")
   247  	assertNotError(t, v, err)
   248  	err = m.SetValue("/ary/0", 123)
   249  	assertNotError(t, nil, err)
   250  
   251  	err = m.SetValue("/map/a", 123)
   252  	assertNotError(t, nil, err)
   253  	_, err = m.ValueVal("/map/a")
   254  	assertNotError(t, nil, err)
   255  	//
   256  	//error
   257  	err = m.SetValue("/abcd/abc", 123)
   258  	assertError(t, nil, err)
   259  	err = m.SetValue("/eary/1", 123)
   260  	assertError(t, nil, err)
   261  	err = m.SetValue("/ary/5", 123)
   262  	assertError(t, nil, err)
   263  	err = m.SetValue("/ary/a", 123)
   264  	assertError(t, nil, err)
   265  	err = m.SetValue("/emap/a", 123)
   266  	assertError(t, nil, err)
   267  	err = m.SetValue("/ntype/a", 123)
   268  	assertError(t, nil, err)
   269  	err = m.SetValue("", 123)
   270  	assertError(t, nil, err)
   271  	//
   272  	mv, err := m.MapVal("/abc")
   273  	assertNotError(t, mv, err)
   274  	v, err = mv.ValueVal("/a")
   275  	assertNotError(t, v, err)
   276  	//
   277  	b := &M{}
   278  	err = b.setPathValue("", 123)
   279  	assertError(t, nil, err)
   280  }
   281  
   282  func assertNotError(t *testing.T, v interface{}, err error) {
   283  	if err != nil {
   284  		panic(err)
   285  	}
   286  	fmt.Println(v)
   287  }
   288  
   289  func assertError(t *testing.T, v interface{}, err error) {
   290  	fmt.Println(err)
   291  	if err == nil {
   292  		panic("not error")
   293  	}
   294  }
   295  
   296  // func TestArray2(t *testing.T) {
   297  // 	fmt.Println([]int{1, 3, 5}[:3])
   298  // }
   299  
   300  // func TestNewMap(t *testing.T) {
   301  // 	fmt.Println(NewMap("map.json"))
   302  // 	fmt.Println(NewMap("map.jsn"))
   303  // 	fmt.Println(NewMaps("maps.json"))
   304  // 	fmt.Println(NewMaps("maps.jsn"))
   305  // }
   306  
   307  func TestValidFormat(t *testing.T) {
   308  	m := M(map[string]interface{}{
   309  		"ab1": 1,
   310  		"ab2": "xxx",
   311  		"map": map[string]interface{}{
   312  			"x1": 100,
   313  		},
   314  	})
   315  	var v1 int64
   316  	var v2 string
   317  	var v3 int
   318  	var v4 int
   319  	err := m.ValidFormat(`
   320  		ab1,R|I,R:0;
   321  		ab2,R|S,L:0;
   322  		/map/x1,R|I,R:0;
   323  		not|ab1,R|I,R:0;
   324  		`, &v1, &v2, &v3, &v4)
   325  	if v1 != 1 || v2 != "xxx" || v3 != 100 || v4 != 1 {
   326  		t.Error("error")
   327  		return
   328  	}
   329  	fmt.Println(v1, v2, v3)
   330  	if err != nil {
   331  		t.Error(err)
   332  		return
   333  	}
   334  	i := &impl{BaseValuable: m}
   335  	err = i.ValidFormat(`
   336  		ab1,R|I,R:0;
   337  		ab2,R|S,L:0;
   338  		/map/x1,R|I,R:0;
   339  		not|ab1,R|I,R:0;
   340  	`, &v1, &v2, &v3, &v4)
   341  	if err != nil || v1 != 1 || v2 != "xxx" || v3 != 100 || v4 != 1 {
   342  		t.Error("error")
   343  		return
   344  	}
   345  	i.Raw()
   346  }
   347  
   348  func TestSafeValidFormat(t *testing.T) {
   349  	m := WrapSafe(M(map[string]interface{}{
   350  		"ab1": 1,
   351  		"ab2": "xxx",
   352  		"map": map[string]interface{}{
   353  			"x1": 100,
   354  		},
   355  	}))
   356  	var v1 int64
   357  	var v2 string
   358  	var v3 int
   359  	var v4 int
   360  	err := m.ValidFormat(`
   361  		ab1,R|I,R:0;
   362  		ab2,R|S,L:0;
   363  		/map/x1,R|I,R:0;
   364  		not|ab1,R|I,R:0;
   365  		`, &v1, &v2, &v3, &v4)
   366  	if v1 != 1 || v2 != "xxx" || v3 != 100 || v4 != 1 {
   367  		t.Error("error")
   368  		return
   369  	}
   370  	fmt.Println(v1, v2, v3)
   371  	if err != nil {
   372  		t.Error(err)
   373  		return
   374  	}
   375  }
   376  
   377  func TestMSorter(t *testing.T) {
   378  	newall := func() []M {
   379  		v := WrapArray([]M{
   380  			{
   381  				"s": "a",
   382  				"i": 1,
   383  				"f": 1.0,
   384  			},
   385  			{
   386  				"s": "c",
   387  				"i": 3,
   388  				"f": 3.0,
   389  			},
   390  			{
   391  				"s": "b",
   392  				"i": 2,
   393  				"f": 2.0,
   394  			},
   395  		})
   396  		return v
   397  	}
   398  	sort.Sort(NewMSorter(newall(), 0, false, "i"))
   399  	sort.Sort(NewMSorter(newall(), 0, true, "i"))
   400  	sort.Sort(NewMSorter(newall(), 1, false, "f"))
   401  	sort.Sort(NewMSorter(newall(), 1, true, "f"))
   402  	sort.Sort(NewMSorter(newall(), 2, false, "s"))
   403  	sort.Sort(NewMSorter(newall(), 2, true, "s"))
   404  }
   405  
   406  func TestValuableSorter(t *testing.T) {
   407  	newall := func() []Valuable {
   408  		v := WrapSafeArray([]M{
   409  			{
   410  				"s": "a",
   411  				"i": 1,
   412  				"f": 1.0,
   413  			},
   414  			{
   415  				"s": "c",
   416  				"i": 3,
   417  				"f": 3.0,
   418  			},
   419  			{
   420  				"s": "b",
   421  				"i": 2,
   422  				"f": 2.0,
   423  			},
   424  		})
   425  		return v
   426  	}
   427  	sort.Sort(NewValuableSorter(newall(), 0, false, "i"))
   428  	sort.Sort(NewValuableSorter(newall(), 0, true, "i"))
   429  	sort.Sort(NewValuableSorter(newall(), 1, false, "f"))
   430  	sort.Sort(NewValuableSorter(newall(), 1, true, "f"))
   431  	sort.Sort(NewValuableSorter(newall(), 2, false, "s"))
   432  	sort.Sort(NewValuableSorter(newall(), 2, true, "s"))
   433  }
   434  
   435  func TestReplaceAll(t *testing.T) {
   436  	val := M{
   437  		"x1": 100,
   438  		"x2": M{
   439  			"a": 100,
   440  		},
   441  	}
   442  	if val.ReplaceAll("${x1}", true, true) != "100" {
   443  		t.Error("error")
   444  		return
   445  	}
   446  	val2, _ := Parse(baseMap{"a": 100})
   447  	if val2.ReplaceAll("${a}", true, true) != "100" {
   448  		t.Error("error")
   449  		return
   450  	}
   451  	if val2.ReplaceAll("${b}", true, true) != "" {
   452  		t.Error("error")
   453  		return
   454  	}
   455  	val3, _ := ParseSafe(`{"a":100}`)
   456  	if val3.ReplaceAll("${a}", true, true) != "100" {
   457  		t.Error("error")
   458  		return
   459  	}
   460  	if val3.ReplaceAll("${b}", true, true) != "" {
   461  		t.Error("error")
   462  		return
   463  	}
   464  }
   465  
   466  func TestEscapeValue(t *testing.T) {
   467  	val := M{
   468  		"x1/1": 100,
   469  		"x1/2": M{
   470  			"a": 100,
   471  		},
   472  	}
   473  	if val.IntDef(0, "/x1\\/1") != 100 {
   474  		t.Error("error")
   475  		return
   476  	}
   477  	if val.IntDef(0, "/x1\\/2/a") != 100 {
   478  		t.Error("error")
   479  		return
   480  	}
   481  }
   482  
   483  func TestValueEqual(t *testing.T) {
   484  	vals := M{
   485  		"int":    123,
   486  		"string": "123",
   487  	}
   488  	if !vals.ValueEqual("int", 123) {
   489  		t.Error("err")
   490  		return
   491  	}
   492  	if !vals.ValueEqual("nil", nil) {
   493  		t.Error("err")
   494  		return
   495  	}
   496  	if vals.ValueEqual("string", 123) {
   497  		t.Error("err")
   498  		return
   499  	}
   500  }