github.com/codingeasygo/util@v0.0.0-20231206062002-1ce2f004b7d9/xmap/map_test.go (about) 1 package xmap 2 3 import ( 4 "fmt" 5 "sort" 6 "testing" 7 ) 8 9 func TestMap(t *testing.T) { 10 m := New() 11 testMap(t, m) 12 m2 := NewSafe() 13 testMap(t, m2) 14 m3 := M{} 15 testMap(t, m3) 16 } 17 18 func testMap(t *testing.T, m Valuable) { 19 m.SetValue("abc", "123") 20 m.SetValue("int", 123) 21 m.SetValue("x", M{"a": 123}) 22 m.SetValue("/ary", []interface{}{1, 2, 3}) 23 m.SetValue("/ary2", "1,2,3") 24 m.SetValue("/arm", []interface{}{M{}, M{}, M{}}) 25 assert := func(v bool) { 26 if !v { 27 panic("error") 28 } 29 } 30 assert(m.Exist("abc")) 31 // 32 assert(nil != m.Raw()) 33 assert(nil != m.Map("x")) 34 assert(nil != m.MapDef(nil, "x")) 35 assert(nil == m.MapDef(nil, "not")) 36 // 37 assert(m.Str("abc") == "123") 38 assert(m.StrDef("", "abc") == "123") 39 assert(m.StrDef("", "not") == "") 40 // 41 assert(m.Int("int") == 123) 42 assert(m.Int64("int") == 123) 43 assert(m.Uint64("int") == 123) 44 assert(m.Float64("int") == 123) 45 assert(m.Int("x/a") == 123) 46 assert(m.Int64("x/a") == 123) 47 assert(m.Uint64("x/a") == 123) 48 assert(m.Float64("x/a") == 123) 49 // 50 assert(m.IntDef(0, "int") == 123) 51 assert(m.Int64Def(0, "int") == 123) 52 assert(m.Uint64Def(0, "int") == 123) 53 assert(m.Float64Def(0, "int") == 123) 54 // 55 assert(m.IntDef(0, "not") == 0) 56 assert(m.Int64Def(0, "not") == 0) 57 assert(m.Uint64Def(0, "not") == 0) 58 assert(m.Float64Def(0, "not") == 0) 59 // 60 assert(len(m.ArrayDef(nil, "/ary")) == 3) 61 assert(len(m.ArrayMapDef(nil, "/arm")) == 3) 62 assert(len(m.ArrayIntDef(nil, "/ary")) == 3) 63 assert(len(m.ArrayInt64Def(nil, "/ary")) == 3) 64 assert(len(m.ArrayUint64Def(nil, "/ary")) == 3) 65 assert(len(m.ArrayFloat64Def(nil, "/ary")) == 3) 66 assert(len(m.ArrayStrDef(nil, "/ary")) == 3) 67 // 68 assert(len(m.ArrayDef(nil, "/not")) == 0) 69 assert(len(m.ArrayMapDef(nil, "/not")) == 0) 70 assert(len(m.ArrayIntDef(nil, "/not")) == 0) 71 assert(len(m.ArrayInt64Def(nil, "/not")) == 0) 72 assert(len(m.ArrayUint64Def(nil, "/v")) == 0) 73 assert(len(m.ArrayFloat64Def(nil, "/not")) == 0) 74 assert(len(m.ArrayStrDef(nil, "/not")) == 0) 75 // 76 // 77 if v, err := m.StrVal("int"); true { 78 assert(v == "123" && err == nil) 79 } 80 if v, err := m.IntVal("int"); true { 81 assert(v == 123 && err == nil) 82 } 83 if v, err := m.Int64Val("int"); true { 84 assert(v == 123 && err == nil) 85 } 86 if v, err := m.Uint64Val("int"); true { 87 assert(v == 123 && err == nil) 88 } 89 if v, err := m.Float64Val("int"); true { 90 assert(v == 123 && err == nil) 91 } 92 if v, err := m.MapVal("x"); true { 93 assert(v != nil && err == nil) 94 } 95 if v, err := m.ValueVal("x"); true { 96 assert(v != nil && err == nil) 97 } 98 // 99 if v, err := m.ArrayVal("ary"); true { 100 assert(len(v) == 3 && err == nil) 101 } 102 if v, err := m.ArrayStrVal("ary"); true { 103 assert(len(v) == 3 && err == nil) 104 } 105 if v, err := m.ArrayIntVal("ary"); true { 106 assert(len(v) == 3 && err == nil) 107 } 108 if v, err := m.ArrayInt64Val("ary"); true { 109 assert(len(v) == 3 && err == nil) 110 } 111 if v, err := m.ArrayUint64Val("ary"); true { 112 assert(len(v) == 3 && err == nil) 113 } 114 if v, err := m.ArrayFloat64Val("ary"); true { 115 assert(len(v) == 3 && err == nil) 116 } 117 if v, err := m.ArrayMapVal("arm"); true { 118 assert(len(v) == 3 && err == nil) 119 } 120 // 121 //test remove 122 m.SetValue("having", "123") 123 assert(m.Value("having") != nil) 124 m.Delete("having") 125 assert(m.Value("having") == nil) 126 // 127 m.SetValue("having", "123") 128 assert(m.Length() > 0) 129 m.Clear() 130 assert(m.Length() == 0) 131 } 132 133 func TestArrayMap(t *testing.T) { 134 var m map[string]interface{} 135 //test all type 136 m = map[string]interface{}{} 137 m["arr1"] = []map[string]interface{}{{}, {}} 138 m["arr2"] = []interface{}{M{}, M{}} 139 m["nil"] = nil 140 for key, val := range m { 141 _, err := ArrayMapVal(val) 142 if err != nil { 143 t.Error(key) 144 return 145 } 146 } 147 //test error 148 m = map[string]interface{}{} 149 m["int"] = 1 150 m["i1"] = []interface{}{"aaa"} 151 m["i2"] = []*testing.T{nil} 152 for key, val := range m { 153 _, err := ArrayMapVal(val) 154 if err == nil { 155 t.Error(key) 156 return 157 } 158 } 159 } 160 161 func TestPathValue(t *testing.T) { 162 //data 163 m1 := map[string]interface{}{ 164 "s": "str", 165 "i": int64(16), 166 "f": float64(16), 167 "ary": []interface{}{1, 3, 4}, 168 } 169 m2 := map[string]interface{}{ 170 "a": "abc", 171 "m": m1, 172 "ary": []interface{}{"1", "3", "4"}, 173 } 174 m3 := map[string]interface{}{ 175 "b": "abcc", 176 "m": m2, 177 "ary": []interface{}{m1, m2}, 178 } 179 m4 := Wrap(M{ 180 "test": 1, 181 "ms": []interface{}{m1, m2, m3}, 182 "m3": m3, 183 "m4": "{}", 184 "m5": []byte("{}"), 185 "m6": "[{}]", 186 "m7": []byte("[{}]"), 187 "ary2": []int{1, 3, 4}, 188 "me": map[string]string{"a": "b"}, 189 }) 190 var v interface{} 191 var err error 192 v, err = m4.ValueVal("/path") 193 assertError(t, v, err) 194 v, err = m4.ValueVal("/test") 195 assertNotError(t, v, err) 196 v, err = m4.ValueVal("/ms") 197 assertNotError(t, v, err) 198 v, err = m4.ValueVal("/m3") 199 assertNotError(t, v, err) 200 v, err = m4.MapVal("/m4") 201 assertNotError(t, v, err) 202 v, err = m4.MapVal("/m5") 203 assertNotError(t, v, err) 204 v, err = m4.ArrayMapVal("/m6") 205 assertNotError(t, v, err) 206 v, err = m4.ArrayMapVal("/m7") 207 assertNotError(t, v, err) 208 // 209 v, err = m4.ValueVal("/m3/b") 210 assertNotError(t, v, err) 211 v, err = m4.ValueVal("/m3/b2") 212 assertError(t, v, err) 213 v, err = m4.ValueVal("/m3/ary") 214 assertNotError(t, v, err) 215 v, err = m4.ValueVal("/ms/1") 216 assertNotError(t, v, err) 217 v, err = m4.ValueVal("/ms/100") 218 assertError(t, v, err) 219 v, err = m4.ValueVal("/ms/a") 220 assertError(t, v, err) 221 v, err = m4.ValueVal("/ary2/100") 222 assertError(t, v, err) 223 v, err = m4.ValueVal("/ms/@len") 224 assertNotError(t, v, err) 225 v, err = m4.ValueVal("/ary2/@len") 226 assertError(t, v, err) 227 v, err = m4.ValueVal("/test/abc") 228 assertError(t, v, err) 229 v, err = m4.ValueVal("/me/a") 230 assertError(t, v, err) 231 v, err = m4.ValueVal("/mekkkk/a") 232 assertError(t, v, err) 233 } 234 235 func TestSetValue(t *testing.T) { 236 var v interface{} 237 var err error 238 m := Wrap(M{ 239 "eary": []string{}, 240 "ary": []interface{}{456}, 241 "emap": map[string]string{}, 242 "map": map[string]interface{}{}, 243 "ntype": "kkkk", 244 }) 245 m.SetValue("/abc", M{"a": 1}) 246 v, err = m.ValueVal("/abc/a") 247 assertNotError(t, v, err) 248 err = m.SetValue("/ary/0", 123) 249 assertNotError(t, nil, err) 250 251 err = m.SetValue("/map/a", 123) 252 assertNotError(t, nil, err) 253 _, err = m.ValueVal("/map/a") 254 assertNotError(t, nil, err) 255 // 256 //error 257 err = m.SetValue("/abcd/abc", 123) 258 assertError(t, nil, err) 259 err = m.SetValue("/eary/1", 123) 260 assertError(t, nil, err) 261 err = m.SetValue("/ary/5", 123) 262 assertError(t, nil, err) 263 err = m.SetValue("/ary/a", 123) 264 assertError(t, nil, err) 265 err = m.SetValue("/emap/a", 123) 266 assertError(t, nil, err) 267 err = m.SetValue("/ntype/a", 123) 268 assertError(t, nil, err) 269 err = m.SetValue("", 123) 270 assertError(t, nil, err) 271 // 272 mv, err := m.MapVal("/abc") 273 assertNotError(t, mv, err) 274 v, err = mv.ValueVal("/a") 275 assertNotError(t, v, err) 276 // 277 b := &M{} 278 err = b.setPathValue("", 123) 279 assertError(t, nil, err) 280 } 281 282 func assertNotError(t *testing.T, v interface{}, err error) { 283 if err != nil { 284 panic(err) 285 } 286 fmt.Println(v) 287 } 288 289 func assertError(t *testing.T, v interface{}, err error) { 290 fmt.Println(err) 291 if err == nil { 292 panic("not error") 293 } 294 } 295 296 // func TestArray2(t *testing.T) { 297 // fmt.Println([]int{1, 3, 5}[:3]) 298 // } 299 300 // func TestNewMap(t *testing.T) { 301 // fmt.Println(NewMap("map.json")) 302 // fmt.Println(NewMap("map.jsn")) 303 // fmt.Println(NewMaps("maps.json")) 304 // fmt.Println(NewMaps("maps.jsn")) 305 // } 306 307 func TestValidFormat(t *testing.T) { 308 m := M(map[string]interface{}{ 309 "ab1": 1, 310 "ab2": "xxx", 311 "map": map[string]interface{}{ 312 "x1": 100, 313 }, 314 }) 315 var v1 int64 316 var v2 string 317 var v3 int 318 var v4 int 319 err := m.ValidFormat(` 320 ab1,R|I,R:0; 321 ab2,R|S,L:0; 322 /map/x1,R|I,R:0; 323 not|ab1,R|I,R:0; 324 `, &v1, &v2, &v3, &v4) 325 if v1 != 1 || v2 != "xxx" || v3 != 100 || v4 != 1 { 326 t.Error("error") 327 return 328 } 329 fmt.Println(v1, v2, v3) 330 if err != nil { 331 t.Error(err) 332 return 333 } 334 i := &impl{BaseValuable: m} 335 err = i.ValidFormat(` 336 ab1,R|I,R:0; 337 ab2,R|S,L:0; 338 /map/x1,R|I,R:0; 339 not|ab1,R|I,R:0; 340 `, &v1, &v2, &v3, &v4) 341 if err != nil || v1 != 1 || v2 != "xxx" || v3 != 100 || v4 != 1 { 342 t.Error("error") 343 return 344 } 345 i.Raw() 346 } 347 348 func TestSafeValidFormat(t *testing.T) { 349 m := WrapSafe(M(map[string]interface{}{ 350 "ab1": 1, 351 "ab2": "xxx", 352 "map": map[string]interface{}{ 353 "x1": 100, 354 }, 355 })) 356 var v1 int64 357 var v2 string 358 var v3 int 359 var v4 int 360 err := m.ValidFormat(` 361 ab1,R|I,R:0; 362 ab2,R|S,L:0; 363 /map/x1,R|I,R:0; 364 not|ab1,R|I,R:0; 365 `, &v1, &v2, &v3, &v4) 366 if v1 != 1 || v2 != "xxx" || v3 != 100 || v4 != 1 { 367 t.Error("error") 368 return 369 } 370 fmt.Println(v1, v2, v3) 371 if err != nil { 372 t.Error(err) 373 return 374 } 375 } 376 377 func TestMSorter(t *testing.T) { 378 newall := func() []M { 379 v := WrapArray([]M{ 380 { 381 "s": "a", 382 "i": 1, 383 "f": 1.0, 384 }, 385 { 386 "s": "c", 387 "i": 3, 388 "f": 3.0, 389 }, 390 { 391 "s": "b", 392 "i": 2, 393 "f": 2.0, 394 }, 395 }) 396 return v 397 } 398 sort.Sort(NewMSorter(newall(), 0, false, "i")) 399 sort.Sort(NewMSorter(newall(), 0, true, "i")) 400 sort.Sort(NewMSorter(newall(), 1, false, "f")) 401 sort.Sort(NewMSorter(newall(), 1, true, "f")) 402 sort.Sort(NewMSorter(newall(), 2, false, "s")) 403 sort.Sort(NewMSorter(newall(), 2, true, "s")) 404 } 405 406 func TestValuableSorter(t *testing.T) { 407 newall := func() []Valuable { 408 v := WrapSafeArray([]M{ 409 { 410 "s": "a", 411 "i": 1, 412 "f": 1.0, 413 }, 414 { 415 "s": "c", 416 "i": 3, 417 "f": 3.0, 418 }, 419 { 420 "s": "b", 421 "i": 2, 422 "f": 2.0, 423 }, 424 }) 425 return v 426 } 427 sort.Sort(NewValuableSorter(newall(), 0, false, "i")) 428 sort.Sort(NewValuableSorter(newall(), 0, true, "i")) 429 sort.Sort(NewValuableSorter(newall(), 1, false, "f")) 430 sort.Sort(NewValuableSorter(newall(), 1, true, "f")) 431 sort.Sort(NewValuableSorter(newall(), 2, false, "s")) 432 sort.Sort(NewValuableSorter(newall(), 2, true, "s")) 433 } 434 435 func TestReplaceAll(t *testing.T) { 436 val := M{ 437 "x1": 100, 438 "x2": M{ 439 "a": 100, 440 }, 441 } 442 if val.ReplaceAll("${x1}", true, true) != "100" { 443 t.Error("error") 444 return 445 } 446 val2, _ := Parse(baseMap{"a": 100}) 447 if val2.ReplaceAll("${a}", true, true) != "100" { 448 t.Error("error") 449 return 450 } 451 if val2.ReplaceAll("${b}", true, true) != "" { 452 t.Error("error") 453 return 454 } 455 val3, _ := ParseSafe(`{"a":100}`) 456 if val3.ReplaceAll("${a}", true, true) != "100" { 457 t.Error("error") 458 return 459 } 460 if val3.ReplaceAll("${b}", true, true) != "" { 461 t.Error("error") 462 return 463 } 464 } 465 466 func TestEscapeValue(t *testing.T) { 467 val := M{ 468 "x1/1": 100, 469 "x1/2": M{ 470 "a": 100, 471 }, 472 } 473 if val.IntDef(0, "/x1\\/1") != 100 { 474 t.Error("error") 475 return 476 } 477 if val.IntDef(0, "/x1\\/2/a") != 100 { 478 t.Error("error") 479 return 480 } 481 } 482 483 func TestValueEqual(t *testing.T) { 484 vals := M{ 485 "int": 123, 486 "string": "123", 487 } 488 if !vals.ValueEqual("int", 123) { 489 t.Error("err") 490 return 491 } 492 if !vals.ValueEqual("nil", nil) { 493 t.Error("err") 494 return 495 } 496 if vals.ValueEqual("string", 123) { 497 t.Error("err") 498 return 499 } 500 }