github.com/gogf/gf/v2@v2.7.4/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/gogf/gf.
     6  
     7  package gmap_test
     8  
     9  import (
    10  	"testing"
    11  
    12  	"github.com/gogf/gf/v2/container/garray"
    13  	"github.com/gogf/gf/v2/container/gmap"
    14  	"github.com/gogf/gf/v2/frame/g"
    15  	"github.com/gogf/gf/v2/internal/json"
    16  	"github.com/gogf/gf/v2/test/gtest"
    17  	"github.com/gogf/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_Deadlock(t *testing.T) {
   131  	gtest.C(t, func(t *gtest.T) {
   132  		m := gmap.NewIntIntMapFrom(map[int]int{1: 1, 2: 2, 3: 3, 4: 4}, true)
   133  		m.Iterator(func(k int, _ int) bool {
   134  			if k%2 == 0 {
   135  				m.Remove(k)
   136  			}
   137  			return true
   138  		})
   139  		t.Assert(m.Map(), map[int]int{
   140  			1: 1,
   141  			3: 3,
   142  		})
   143  	})
   144  }
   145  
   146  func Test_IntIntMap_Iterator(t *testing.T) {
   147  	gtest.C(t, func(t *gtest.T) {
   148  		expect := map[int]int{1: 1, 2: 2}
   149  		m := gmap.NewIntIntMapFrom(expect)
   150  		m.Iterator(func(k int, v int) bool {
   151  			t.Assert(expect[k], v)
   152  			return true
   153  		})
   154  		// 断言返回值对遍历控制
   155  		i := 0
   156  		j := 0
   157  		m.Iterator(func(k int, v int) bool {
   158  			i++
   159  			return true
   160  		})
   161  		m.Iterator(func(k int, v int) bool {
   162  			j++
   163  			return false
   164  		})
   165  		t.Assert(i, 2)
   166  		t.Assert(j, 1)
   167  	})
   168  }
   169  
   170  func Test_IntIntMap_Lock(t *testing.T) {
   171  	gtest.C(t, func(t *gtest.T) {
   172  		expect := map[int]int{1: 1, 2: 2}
   173  		m := gmap.NewIntIntMapFrom(expect)
   174  		m.LockFunc(func(m map[int]int) {
   175  			t.Assert(m, expect)
   176  		})
   177  		m.RLockFunc(func(m map[int]int) {
   178  			t.Assert(m, expect)
   179  		})
   180  	})
   181  }
   182  
   183  func Test_IntIntMap_Clone(t *testing.T) {
   184  	gtest.C(t, func(t *gtest.T) {
   185  		// clone 方法是深克隆
   186  		m := gmap.NewIntIntMapFrom(map[int]int{1: 1, 2: 2})
   187  
   188  		m_clone := m.Clone()
   189  		m.Remove(1)
   190  		// 修改原 map,clone 后的 map 不影响
   191  		t.AssertIN(1, m_clone.Keys())
   192  
   193  		m_clone.Remove(2)
   194  		// 修改clone map,原 map 不影响
   195  		t.AssertIN(2, m.Keys())
   196  	})
   197  }
   198  
   199  func Test_IntIntMap_Merge(t *testing.T) {
   200  	gtest.C(t, func(t *gtest.T) {
   201  		m1 := gmap.NewIntIntMap()
   202  		m2 := gmap.NewIntIntMap()
   203  		m1.Set(1, 1)
   204  		m2.Set(2, 2)
   205  		m1.Merge(m2)
   206  		t.Assert(m1.Map(), map[int]int{1: 1, 2: 2})
   207  		m3 := gmap.NewIntIntMapFrom(nil)
   208  		m3.Merge(m2)
   209  		t.Assert(m3.Map(), m2.Map())
   210  	})
   211  }
   212  
   213  func Test_IntIntMap_Map(t *testing.T) {
   214  	gtest.C(t, func(t *gtest.T) {
   215  		m := gmap.NewIntIntMap()
   216  		m.Set(1, 0)
   217  		m.Set(2, 2)
   218  		t.Assert(m.Get(1), 0)
   219  		t.Assert(m.Get(2), 2)
   220  		data := m.Map()
   221  		t.Assert(data[1], 0)
   222  		t.Assert(data[2], 2)
   223  		data[3] = 3
   224  		t.Assert(m.Get(3), 3)
   225  		m.Set(4, 4)
   226  		t.Assert(data[4], 4)
   227  	})
   228  }
   229  
   230  func Test_IntIntMap_MapCopy(t *testing.T) {
   231  	gtest.C(t, func(t *gtest.T) {
   232  		m := gmap.NewIntIntMap()
   233  		m.Set(1, 0)
   234  		m.Set(2, 2)
   235  		t.Assert(m.Get(1), 0)
   236  		t.Assert(m.Get(2), 2)
   237  		data := m.MapCopy()
   238  		t.Assert(data[1], 0)
   239  		t.Assert(data[2], 2)
   240  		data[3] = 3
   241  		t.Assert(m.Get(3), 0)
   242  		m.Set(4, 4)
   243  		t.Assert(data[4], 0)
   244  	})
   245  }
   246  
   247  func Test_IntIntMap_FilterEmpty(t *testing.T) {
   248  	gtest.C(t, func(t *gtest.T) {
   249  		m := gmap.NewIntIntMap()
   250  		m.Set(1, 0)
   251  		m.Set(2, 2)
   252  		t.Assert(m.Size(), 2)
   253  		t.Assert(m.Get(1), 0)
   254  		t.Assert(m.Get(2), 2)
   255  		m.FilterEmpty()
   256  		t.Assert(m.Size(), 1)
   257  		t.Assert(m.Get(2), 2)
   258  	})
   259  }
   260  
   261  func Test_IntIntMap_Json(t *testing.T) {
   262  	// Marshal
   263  	gtest.C(t, func(t *gtest.T) {
   264  		data := g.MapIntInt{
   265  			1: 10,
   266  			2: 20,
   267  		}
   268  		m1 := gmap.NewIntIntMapFrom(data)
   269  		b1, err1 := json.Marshal(m1)
   270  		b2, err2 := json.Marshal(data)
   271  		t.Assert(err1, err2)
   272  		t.Assert(b1, b2)
   273  	})
   274  	// Unmarshal
   275  	gtest.C(t, func(t *gtest.T) {
   276  		data := g.MapIntInt{
   277  			1: 10,
   278  			2: 20,
   279  		}
   280  		b, err := json.Marshal(data)
   281  		t.AssertNil(err)
   282  
   283  		m := gmap.NewIntIntMap()
   284  		err = json.UnmarshalUseNumber(b, m)
   285  		t.AssertNil(err)
   286  		t.Assert(m.Get(1), data[1])
   287  		t.Assert(m.Get(2), data[2])
   288  	})
   289  }
   290  
   291  func Test_IntIntMap_Pop(t *testing.T) {
   292  	gtest.C(t, func(t *gtest.T) {
   293  		m := gmap.NewIntIntMapFrom(g.MapIntInt{
   294  			1: 11,
   295  			2: 22,
   296  		})
   297  		t.Assert(m.Size(), 2)
   298  
   299  		k1, v1 := m.Pop()
   300  		t.AssertIN(k1, g.Slice{1, 2})
   301  		t.AssertIN(v1, g.Slice{11, 22})
   302  		t.Assert(m.Size(), 1)
   303  		k2, v2 := m.Pop()
   304  		t.AssertIN(k2, g.Slice{1, 2})
   305  		t.AssertIN(v2, g.Slice{11, 22})
   306  		t.Assert(m.Size(), 0)
   307  
   308  		t.AssertNE(k1, k2)
   309  		t.AssertNE(v1, v2)
   310  
   311  		k3, v3 := m.Pop()
   312  		t.Assert(k3, 0)
   313  		t.Assert(v3, 0)
   314  	})
   315  }
   316  
   317  func Test_IntIntMap_Pops(t *testing.T) {
   318  	gtest.C(t, func(t *gtest.T) {
   319  		m := gmap.NewIntIntMapFrom(g.MapIntInt{
   320  			1: 11,
   321  			2: 22,
   322  			3: 33,
   323  		})
   324  		t.Assert(m.Size(), 3)
   325  
   326  		kArray := garray.New()
   327  		vArray := garray.New()
   328  		for k, v := range m.Pops(1) {
   329  			t.AssertIN(k, g.Slice{1, 2, 3})
   330  			t.AssertIN(v, g.Slice{11, 22, 33})
   331  			kArray.Append(k)
   332  			vArray.Append(v)
   333  		}
   334  		t.Assert(m.Size(), 2)
   335  		for k, v := range m.Pops(2) {
   336  			t.AssertIN(k, g.Slice{1, 2, 3})
   337  			t.AssertIN(v, g.Slice{11, 22, 33})
   338  			kArray.Append(k)
   339  			vArray.Append(v)
   340  		}
   341  		t.Assert(m.Size(), 0)
   342  
   343  		t.Assert(kArray.Unique().Len(), 3)
   344  		t.Assert(vArray.Unique().Len(), 3)
   345  
   346  		v := m.Pops(1)
   347  		t.AssertNil(v)
   348  		v = m.Pops(-1)
   349  		t.AssertNil(v)
   350  	})
   351  }
   352  
   353  func TestIntIntMap_UnmarshalValue(t *testing.T) {
   354  	type V struct {
   355  		Name string
   356  		Map  *gmap.IntIntMap
   357  	}
   358  	// JSON
   359  	gtest.C(t, func(t *gtest.T) {
   360  		var v *V
   361  		err := gconv.Struct(map[string]interface{}{
   362  			"name": "john",
   363  			"map":  []byte(`{"1":1,"2":2}`),
   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  	// Map
   372  	gtest.C(t, func(t *gtest.T) {
   373  		var v *V
   374  		err := gconv.Struct(map[string]interface{}{
   375  			"name": "john",
   376  			"map": g.MapIntAny{
   377  				1: 1,
   378  				2: 2,
   379  			},
   380  		}, &v)
   381  		t.AssertNil(err)
   382  		t.Assert(v.Name, "john")
   383  		t.Assert(v.Map.Size(), 2)
   384  		t.Assert(v.Map.Get(1), "1")
   385  		t.Assert(v.Map.Get(2), "2")
   386  	})
   387  }
   388  
   389  func Test_IntIntMap_DeepCopy(t *testing.T) {
   390  	gtest.C(t, func(t *gtest.T) {
   391  		m := gmap.NewIntIntMapFrom(g.MapIntInt{
   392  			1: 1,
   393  			2: 2,
   394  		})
   395  		t.Assert(m.Size(), 2)
   396  
   397  		n := m.DeepCopy().(*gmap.IntIntMap)
   398  		n.Set(1, 2)
   399  		t.AssertNE(m.Get(1), n.Get(1))
   400  	})
   401  }
   402  
   403  func Test_IntIntMap_IsSubOf(t *testing.T) {
   404  	gtest.C(t, func(t *gtest.T) {
   405  		m1 := gmap.NewIntAnyMapFrom(g.MapIntAny{
   406  			1: 1,
   407  			2: 2,
   408  		})
   409  		m2 := gmap.NewIntAnyMapFrom(g.MapIntAny{
   410  			2: 2,
   411  		})
   412  		t.Assert(m1.IsSubOf(m2), false)
   413  		t.Assert(m2.IsSubOf(m1), true)
   414  		t.Assert(m2.IsSubOf(m2), true)
   415  	})
   416  }
   417  
   418  func Test_IntIntMap_Diff(t *testing.T) {
   419  	gtest.C(t, func(t *gtest.T) {
   420  		m1 := gmap.NewIntIntMapFrom(g.MapIntInt{
   421  			0: 0,
   422  			1: 1,
   423  			2: 2,
   424  			3: 3,
   425  		})
   426  		m2 := gmap.NewIntIntMapFrom(g.MapIntInt{
   427  			0: 0,
   428  			2: 2,
   429  			3: 31,
   430  			4: 4,
   431  		})
   432  		addedKeys, removedKeys, updatedKeys := m1.Diff(m2)
   433  		t.Assert(addedKeys, []int{4})
   434  		t.Assert(removedKeys, []int{1})
   435  		t.Assert(updatedKeys, []int{3})
   436  	})
   437  }