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 }