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 }