github.com/wangyougui/gf/v2@v2.6.5/container/gmap/gmap_z_unit_hash_str_int_test.go (about)

     1  // Copyright GoFrame Author(https://goframe.org). All Rights Reserved.
     2  //
     3  // This Source Code Form is subject to the terms of the MIT License.
     4  // If a copy of the MIT was not distributed with gm file,
     5  // You can obtain one at https://github.com/wangyougui/gf.
     6  
     7  package gmap_test
     8  
     9  import (
    10  	"testing"
    11  
    12  	"github.com/wangyougui/gf/v2/container/garray"
    13  	"github.com/wangyougui/gf/v2/container/gmap"
    14  	"github.com/wangyougui/gf/v2/frame/g"
    15  	"github.com/wangyougui/gf/v2/internal/json"
    16  	"github.com/wangyougui/gf/v2/test/gtest"
    17  	"github.com/wangyougui/gf/v2/util/gconv"
    18  )
    19  
    20  func Test_StrIntMap_Var(t *testing.T) {
    21  	gtest.C(t, func(t *gtest.T) {
    22  		var m gmap.StrIntMap
    23  		m.Set("a", 1)
    24  
    25  		t.Assert(m.Get("a"), 1)
    26  		t.Assert(m.Size(), 1)
    27  		t.Assert(m.IsEmpty(), false)
    28  
    29  		t.Assert(m.GetOrSet("b", 2), 2)
    30  		t.Assert(m.SetIfNotExist("b", 2), false)
    31  
    32  		t.Assert(m.SetIfNotExist("c", 3), true)
    33  
    34  		t.Assert(m.Remove("b"), 2)
    35  		t.Assert(m.Contains("b"), false)
    36  
    37  		t.AssertIN("c", m.Keys())
    38  		t.AssertIN("a", m.Keys())
    39  		t.AssertIN(3, m.Values())
    40  		t.AssertIN(1, m.Values())
    41  
    42  		m_f := gmap.NewStrIntMap()
    43  		m_f.Set("1", 2)
    44  		m_f.Flip()
    45  		t.Assert(m_f.Map(), map[string]int{"2": 1})
    46  
    47  		m.Clear()
    48  		t.Assert(m.Size(), 0)
    49  		t.Assert(m.IsEmpty(), true)
    50  	})
    51  }
    52  
    53  func Test_StrIntMap_Basic(t *testing.T) {
    54  	gtest.C(t, func(t *gtest.T) {
    55  		m := gmap.NewStrIntMap()
    56  		m.Set("a", 1)
    57  
    58  		t.Assert(m.Get("a"), 1)
    59  		t.Assert(m.Size(), 1)
    60  		t.Assert(m.IsEmpty(), false)
    61  
    62  		t.Assert(m.GetOrSet("b", 2), 2)
    63  		t.Assert(m.SetIfNotExist("b", 2), false)
    64  
    65  		t.Assert(m.SetIfNotExist("c", 3), true)
    66  
    67  		t.Assert(m.Remove("b"), 2)
    68  		t.Assert(m.Contains("b"), false)
    69  
    70  		t.AssertIN("c", m.Keys())
    71  		t.AssertIN("a", m.Keys())
    72  		t.AssertIN(3, m.Values())
    73  		t.AssertIN(1, m.Values())
    74  
    75  		m_f := gmap.NewStrIntMap()
    76  		m_f.Set("1", 2)
    77  		m_f.Flip()
    78  		t.Assert(m_f.Map(), map[string]int{"2": 1})
    79  
    80  		m.Clear()
    81  		t.Assert(m.Size(), 0)
    82  		t.Assert(m.IsEmpty(), true)
    83  
    84  		m2 := gmap.NewStrIntMapFrom(map[string]int{"a": 1, "b": 2})
    85  		t.Assert(m2.Map(), map[string]int{"a": 1, "b": 2})
    86  	})
    87  }
    88  
    89  func Test_StrIntMap_Set_Fun(t *testing.T) {
    90  	gtest.C(t, func(t *gtest.T) {
    91  		m := gmap.NewStrIntMap()
    92  
    93  		m.GetOrSetFunc("a", getInt)
    94  		m.GetOrSetFuncLock("b", getInt)
    95  		t.Assert(m.Get("a"), 123)
    96  		t.Assert(m.Get("b"), 123)
    97  		t.Assert(m.SetIfNotExistFunc("a", getInt), false)
    98  		t.Assert(m.SetIfNotExistFunc("c", getInt), true)
    99  
   100  		t.Assert(m.SetIfNotExistFuncLock("b", getInt), false)
   101  		t.Assert(m.SetIfNotExistFuncLock("d", getInt), true)
   102  	})
   103  
   104  	gtest.C(t, func(t *gtest.T) {
   105  		m := gmap.NewStrIntMapFrom(nil)
   106  		t.Assert(m.GetOrSetFuncLock("a", getInt), 123)
   107  	})
   108  }
   109  
   110  func Test_StrIntMap_Batch(t *testing.T) {
   111  	gtest.C(t, func(t *gtest.T) {
   112  		m := gmap.NewStrIntMap()
   113  
   114  		m.Sets(map[string]int{"a": 1, "b": 2, "c": 3})
   115  		t.Assert(m.Map(), map[string]int{"a": 1, "b": 2, "c": 3})
   116  		m.Removes([]string{"a", "b"})
   117  		t.Assert(m.Map(), map[string]int{"c": 3})
   118  	})
   119  }
   120  
   121  func Test_StrIntMap_Iterator(t *testing.T) {
   122  	gtest.C(t, func(t *gtest.T) {
   123  		expect := map[string]int{"a": 1, "b": 2}
   124  		m := gmap.NewStrIntMapFrom(expect)
   125  		m.Iterator(func(k string, v int) bool {
   126  			t.Assert(expect[k], v)
   127  			return true
   128  		})
   129  		// 断言返回值对遍历控制
   130  		i := 0
   131  		j := 0
   132  		m.Iterator(func(k string, v int) bool {
   133  			i++
   134  			return true
   135  		})
   136  		m.Iterator(func(k string, v int) bool {
   137  			j++
   138  			return false
   139  		})
   140  		t.Assert(i, 2)
   141  		t.Assert(j, 1)
   142  	})
   143  }
   144  
   145  func Test_StrIntMap_Lock(t *testing.T) {
   146  	gtest.C(t, func(t *gtest.T) {
   147  		expect := map[string]int{"a": 1, "b": 2}
   148  
   149  		m := gmap.NewStrIntMapFrom(expect)
   150  		m.LockFunc(func(m map[string]int) {
   151  			t.Assert(m, expect)
   152  		})
   153  		m.RLockFunc(func(m map[string]int) {
   154  			t.Assert(m, expect)
   155  		})
   156  	})
   157  }
   158  
   159  func Test_StrIntMap_Clone(t *testing.T) {
   160  	gtest.C(t, func(t *gtest.T) {
   161  		// clone 方法是深克隆
   162  		m := gmap.NewStrIntMapFrom(map[string]int{"a": 1, "b": 2, "c": 3})
   163  
   164  		m_clone := m.Clone()
   165  		m.Remove("a")
   166  		// 修改原 map,clone 后的 map 不影响
   167  		t.AssertIN("a", m_clone.Keys())
   168  
   169  		m_clone.Remove("b")
   170  		// 修改clone map,原 map 不影响
   171  		t.AssertIN("b", m.Keys())
   172  	})
   173  }
   174  
   175  func Test_StrIntMap_Merge(t *testing.T) {
   176  	gtest.C(t, func(t *gtest.T) {
   177  		m1 := gmap.NewStrIntMap()
   178  		m2 := gmap.NewStrIntMap()
   179  		m1.Set("a", 1)
   180  		m2.Set("b", 2)
   181  		m1.Merge(m2)
   182  		t.Assert(m1.Map(), map[string]int{"a": 1, "b": 2})
   183  		m3 := gmap.NewStrIntMapFrom(nil)
   184  		m3.Merge(m2)
   185  		t.Assert(m3.Map(), m2.Map())
   186  	})
   187  }
   188  
   189  func Test_StrIntMap_Map(t *testing.T) {
   190  	gtest.C(t, func(t *gtest.T) {
   191  		m := gmap.NewStrIntMap()
   192  		m.Set("1", 1)
   193  		m.Set("2", 2)
   194  		t.Assert(m.Get("1"), 1)
   195  		t.Assert(m.Get("2"), 2)
   196  		data := m.Map()
   197  		t.Assert(data["1"], 1)
   198  		t.Assert(data["2"], 2)
   199  		data["3"] = 3
   200  		t.Assert(m.Get("3"), 3)
   201  		m.Set("4", 4)
   202  		t.Assert(data["4"], 4)
   203  	})
   204  }
   205  
   206  func Test_StrIntMap_MapCopy(t *testing.T) {
   207  	gtest.C(t, func(t *gtest.T) {
   208  		m := gmap.NewStrIntMap()
   209  		m.Set("1", 1)
   210  		m.Set("2", 2)
   211  		t.Assert(m.Get("1"), 1)
   212  		t.Assert(m.Get("2"), 2)
   213  		data := m.MapCopy()
   214  		t.Assert(data["1"], 1)
   215  		t.Assert(data["2"], 2)
   216  		data["3"] = 3
   217  		t.Assert(m.Get("3"), 0)
   218  		m.Set("4", 4)
   219  		t.Assert(data["4"], 0)
   220  	})
   221  }
   222  
   223  func Test_StrIntMap_FilterEmpty(t *testing.T) {
   224  	gtest.C(t, func(t *gtest.T) {
   225  		m := gmap.NewStrIntMap()
   226  		m.Set("1", 0)
   227  		m.Set("2", 2)
   228  		t.Assert(m.Size(), 2)
   229  		t.Assert(m.Get("1"), 0)
   230  		t.Assert(m.Get("2"), 2)
   231  		m.FilterEmpty()
   232  		t.Assert(m.Size(), 1)
   233  		t.Assert(m.Get("2"), 2)
   234  	})
   235  }
   236  
   237  func Test_StrIntMap_Json(t *testing.T) {
   238  	// Marshal
   239  	gtest.C(t, func(t *gtest.T) {
   240  		data := g.MapStrInt{
   241  			"k1": 1,
   242  			"k2": 2,
   243  		}
   244  		m1 := gmap.NewStrIntMapFrom(data)
   245  		b1, err1 := json.Marshal(m1)
   246  		b2, err2 := json.Marshal(data)
   247  		t.Assert(err1, err2)
   248  		t.Assert(b1, b2)
   249  	})
   250  	// Unmarshal
   251  	gtest.C(t, func(t *gtest.T) {
   252  		data := g.MapStrInt{
   253  			"k1": 1,
   254  			"k2": 2,
   255  		}
   256  		b, err := json.Marshal(data)
   257  		t.AssertNil(err)
   258  
   259  		m := gmap.NewStrIntMap()
   260  		err = json.UnmarshalUseNumber(b, m)
   261  		t.AssertNil(err)
   262  		t.Assert(m.Get("k1"), data["k1"])
   263  		t.Assert(m.Get("k2"), data["k2"])
   264  	})
   265  	gtest.C(t, func(t *gtest.T) {
   266  		data := g.MapStrInt{
   267  			"k1": 1,
   268  			"k2": 2,
   269  		}
   270  		b, err := json.Marshal(data)
   271  		t.AssertNil(err)
   272  
   273  		var m gmap.StrIntMap
   274  		err = json.UnmarshalUseNumber(b, &m)
   275  		t.AssertNil(err)
   276  		t.Assert(m.Get("k1"), data["k1"])
   277  		t.Assert(m.Get("k2"), data["k2"])
   278  	})
   279  }
   280  
   281  func Test_StrIntMap_Pop(t *testing.T) {
   282  	gtest.C(t, func(t *gtest.T) {
   283  		m := gmap.NewStrIntMapFrom(g.MapStrInt{
   284  			"k1": 11,
   285  			"k2": 22,
   286  		})
   287  		t.Assert(m.Size(), 2)
   288  
   289  		k1, v1 := m.Pop()
   290  		t.AssertIN(k1, g.Slice{"k1", "k2"})
   291  		t.AssertIN(v1, g.Slice{11, 22})
   292  		t.Assert(m.Size(), 1)
   293  		k2, v2 := m.Pop()
   294  		t.AssertIN(k2, g.Slice{"k1", "k2"})
   295  		t.AssertIN(v2, g.Slice{11, 22})
   296  		t.Assert(m.Size(), 0)
   297  
   298  		t.AssertNE(k1, k2)
   299  		t.AssertNE(v1, v2)
   300  
   301  		k3, v3 := m.Pop()
   302  		t.Assert(k3, "")
   303  		t.Assert(v3, 0)
   304  	})
   305  }
   306  
   307  func Test_StrIntMap_Pops(t *testing.T) {
   308  	gtest.C(t, func(t *gtest.T) {
   309  		m := gmap.NewStrIntMapFrom(g.MapStrInt{
   310  			"k1": 11,
   311  			"k2": 22,
   312  			"k3": 33,
   313  		})
   314  		t.Assert(m.Size(), 3)
   315  
   316  		kArray := garray.New()
   317  		vArray := garray.New()
   318  		for k, v := range m.Pops(1) {
   319  			t.AssertIN(k, g.Slice{"k1", "k2", "k3"})
   320  			t.AssertIN(v, g.Slice{11, 22, 33})
   321  			kArray.Append(k)
   322  			vArray.Append(v)
   323  		}
   324  		t.Assert(m.Size(), 2)
   325  		for k, v := range m.Pops(2) {
   326  			t.AssertIN(k, g.Slice{"k1", "k2", "k3"})
   327  			t.AssertIN(v, g.Slice{11, 22, 33})
   328  			kArray.Append(k)
   329  			vArray.Append(v)
   330  		}
   331  		t.Assert(m.Size(), 0)
   332  
   333  		t.Assert(kArray.Unique().Len(), 3)
   334  		t.Assert(vArray.Unique().Len(), 3)
   335  
   336  		v := m.Pops(1)
   337  		t.AssertNil(v)
   338  		v = m.Pops(-1)
   339  		t.AssertNil(v)
   340  	})
   341  }
   342  
   343  func TestStrIntMap_UnmarshalValue(t *testing.T) {
   344  	type V struct {
   345  		Name string
   346  		Map  *gmap.StrIntMap
   347  	}
   348  	// JSON
   349  	gtest.C(t, func(t *gtest.T) {
   350  		var v *V
   351  		err := gconv.Struct(map[string]interface{}{
   352  			"name": "john",
   353  			"map":  []byte(`{"k1":1,"k2":2}`),
   354  		}, &v)
   355  		t.AssertNil(err)
   356  		t.Assert(v.Name, "john")
   357  		t.Assert(v.Map.Size(), 2)
   358  		t.Assert(v.Map.Get("k1"), 1)
   359  		t.Assert(v.Map.Get("k2"), 2)
   360  	})
   361  	// Map
   362  	gtest.C(t, func(t *gtest.T) {
   363  		var v *V
   364  		err := gconv.Struct(map[string]interface{}{
   365  			"name": "john",
   366  			"map": g.Map{
   367  				"k1": 1,
   368  				"k2": 2,
   369  			},
   370  		}, &v)
   371  		t.AssertNil(err)
   372  		t.Assert(v.Name, "john")
   373  		t.Assert(v.Map.Size(), 2)
   374  		t.Assert(v.Map.Get("k1"), 1)
   375  		t.Assert(v.Map.Get("k2"), 2)
   376  	})
   377  }
   378  
   379  func Test_StrIntMap_DeepCopy(t *testing.T) {
   380  	gtest.C(t, func(t *gtest.T) {
   381  		m := gmap.NewStrIntMapFrom(g.MapStrInt{
   382  			"key1": 1,
   383  			"key2": 2,
   384  		})
   385  		t.Assert(m.Size(), 2)
   386  
   387  		n := m.DeepCopy().(*gmap.StrIntMap)
   388  		n.Set("key1", 2)
   389  		t.AssertNE(m.Get("key1"), n.Get("key1"))
   390  	})
   391  }
   392  
   393  func Test_StrIntMap_IsSubOf(t *testing.T) {
   394  	gtest.C(t, func(t *gtest.T) {
   395  		m1 := gmap.NewStrIntMapFrom(g.MapStrInt{
   396  			"k1": 1,
   397  			"k2": 2,
   398  		})
   399  		m2 := gmap.NewStrIntMapFrom(g.MapStrInt{
   400  			"k2": 2,
   401  		})
   402  		t.Assert(m1.IsSubOf(m2), false)
   403  		t.Assert(m2.IsSubOf(m1), true)
   404  		t.Assert(m2.IsSubOf(m2), true)
   405  	})
   406  }
   407  
   408  func Test_StrIntMap_Diff(t *testing.T) {
   409  	gtest.C(t, func(t *gtest.T) {
   410  		m1 := gmap.NewStrIntMapFrom(g.MapStrInt{
   411  			"0": 0,
   412  			"1": 1,
   413  			"2": 2,
   414  			"3": 3,
   415  		})
   416  		m2 := gmap.NewStrIntMapFrom(g.MapStrInt{
   417  			"0": 0,
   418  			"2": 2,
   419  			"3": 31,
   420  			"4": 4,
   421  		})
   422  		addedKeys, removedKeys, updatedKeys := m1.Diff(m2)
   423  		t.Assert(addedKeys, []string{"4"})
   424  		t.Assert(removedKeys, []string{"1"})
   425  		t.Assert(updatedKeys, []string{"3"})
   426  	})
   427  }