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