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 }