github.com/bingoohuang/gg@v0.0.0-20240325092523-45da7dee9335/pkg/cast/cast_test.go (about) 1 // Copyright © 2014 Steve Francia <spf@spf13.com>. 2 // 3 // Use of this source code is governed by an MIT-style 4 // license that can be found in the LICENSE file. 5 6 package cast 7 8 import ( 9 "errors" 10 "fmt" 11 "html/template" 12 "testing" 13 "time" 14 15 "github.com/stretchr/testify/assert" 16 ) 17 18 type MyString string 19 20 func TestConvertableString(t *testing.T) { 21 value := ToInt(MyString("100")) 22 assert.Equal(t, 100, value) 23 } 24 25 func TestToUintE(t *testing.T) { 26 tests := []struct { 27 input interface{} 28 expect uint 29 iserr bool 30 }{ 31 {int(8), 8, false}, 32 {int8(8), 8, false}, 33 {int16(8), 8, false}, 34 {int32(8), 8, false}, 35 {int64(8), 8, false}, 36 {uint(8), 8, false}, 37 {uint8(8), 8, false}, 38 {uint16(8), 8, false}, 39 {uint32(8), 8, false}, 40 {uint64(8), 8, false}, 41 {float32(8.31), 8, false}, 42 {float64(8.31), 8, false}, 43 {true, 1, false}, 44 {false, 0, false}, 45 {"8", 8, false}, 46 {nil, 0, false}, 47 // errors 48 {int(-8), 0, true}, 49 {int8(-8), 0, true}, 50 {int16(-8), 0, true}, 51 {int32(-8), 0, true}, 52 {int64(-8), 0, true}, 53 {float32(-8.31), 0, true}, 54 {float64(-8.31), 0, true}, 55 {"-8", 0, true}, 56 {"test", 0, true}, 57 {testing.T{}, 0, true}, 58 } 59 60 for i, test := range tests { 61 errmsg := fmt.Sprintf("i = %d", i) // assert helper message 62 63 v, err := ToUintE(test.input) 64 if test.iserr { 65 assert.Error(t, err, errmsg) 66 continue 67 } 68 69 assert.NoError(t, err, errmsg) 70 assert.Equal(t, test.expect, v, errmsg) 71 72 // Non-E test: 73 v = ToUint(test.input) 74 assert.Equal(t, test.expect, v, errmsg) 75 } 76 } 77 78 func TestToUint64E(t *testing.T) { 79 tests := []struct { 80 input interface{} 81 expect uint64 82 iserr bool 83 }{ 84 {int(8), 8, false}, 85 {int8(8), 8, false}, 86 {int16(8), 8, false}, 87 {int32(8), 8, false}, 88 {int64(8), 8, false}, 89 {uint(8), 8, false}, 90 {uint8(8), 8, false}, 91 {uint16(8), 8, false}, 92 {uint32(8), 8, false}, 93 {uint64(8), 8, false}, 94 {float32(8.31), 8, false}, 95 {float64(8.31), 8, false}, 96 {true, 1, false}, 97 {false, 0, false}, 98 {"8", 8, false}, 99 {nil, 0, false}, 100 // errors 101 {int(-8), 0, true}, 102 {int8(-8), 0, true}, 103 {int16(-8), 0, true}, 104 {int32(-8), 0, true}, 105 {int64(-8), 0, true}, 106 {float32(-8.31), 0, true}, 107 {float64(-8.31), 0, true}, 108 {"-8", 0, true}, 109 {"test", 0, true}, 110 {testing.T{}, 0, true}, 111 } 112 113 for i, test := range tests { 114 errmsg := fmt.Sprintf("i = %d", i) // assert helper message 115 116 v, err := ToUint64E(test.input) 117 if test.iserr { 118 assert.Error(t, err, errmsg) 119 continue 120 } 121 122 assert.NoError(t, err, errmsg) 123 assert.Equal(t, test.expect, v, errmsg) 124 125 // Non-E test: 126 v = ToUint64(test.input) 127 assert.Equal(t, test.expect, v, errmsg) 128 } 129 } 130 131 func TestToUint32E(t *testing.T) { 132 tests := []struct { 133 input interface{} 134 expect uint32 135 iserr bool 136 }{ 137 {int(8), 8, false}, 138 {int8(8), 8, false}, 139 {int16(8), 8, false}, 140 {int32(8), 8, false}, 141 {int64(8), 8, false}, 142 {uint(8), 8, false}, 143 {uint8(8), 8, false}, 144 {uint16(8), 8, false}, 145 {uint32(8), 8, false}, 146 {uint64(8), 8, false}, 147 {float32(8.31), 8, false}, 148 {float64(8.31), 8, false}, 149 {true, 1, false}, 150 {false, 0, false}, 151 {"8", 8, false}, 152 {nil, 0, false}, 153 {int(-8), 0, true}, 154 {int8(-8), 0, true}, 155 {int16(-8), 0, true}, 156 {int32(-8), 0, true}, 157 {int64(-8), 0, true}, 158 {float32(-8.31), 0, true}, 159 {float64(-8.31), 0, true}, 160 {"-8", 0, true}, 161 // errors 162 {"test", 0, true}, 163 {testing.T{}, 0, true}, 164 } 165 166 for i, test := range tests { 167 errmsg := fmt.Sprintf("i = %d", i) // assert helper message 168 169 v, err := ToUint32E(test.input) 170 if test.iserr { 171 assert.Error(t, err, errmsg) 172 continue 173 } 174 175 assert.NoError(t, err, errmsg) 176 assert.Equal(t, test.expect, v, errmsg) 177 178 // Non-E test: 179 v = ToUint32(test.input) 180 assert.Equal(t, test.expect, v, errmsg) 181 } 182 } 183 184 func TestToUint16E(t *testing.T) { 185 tests := []struct { 186 input interface{} 187 expect uint16 188 iserr bool 189 }{ 190 {int(8), 8, false}, 191 {int8(8), 8, false}, 192 {int16(8), 8, false}, 193 {int32(8), 8, false}, 194 {int64(8), 8, false}, 195 {uint(8), 8, false}, 196 {uint8(8), 8, false}, 197 {uint16(8), 8, false}, 198 {uint32(8), 8, false}, 199 {uint64(8), 8, false}, 200 {float32(8.31), 8, false}, 201 {float64(8.31), 8, false}, 202 {true, 1, false}, 203 {false, 0, false}, 204 {"8", 8, false}, 205 {nil, 0, false}, 206 // errors 207 {int(-8), 0, true}, 208 {int8(-8), 0, true}, 209 {int16(-8), 0, true}, 210 {int32(-8), 0, true}, 211 {int64(-8), 0, true}, 212 {float32(-8.31), 0, true}, 213 {float64(-8.31), 0, true}, 214 {"-8", 0, true}, 215 {"test", 0, true}, 216 {testing.T{}, 0, true}, 217 } 218 219 for i, test := range tests { 220 errmsg := fmt.Sprintf("i = %d", i) // assert helper message 221 222 v, err := ToUint16E(test.input) 223 if test.iserr { 224 assert.Error(t, err, errmsg) 225 continue 226 } 227 228 assert.NoError(t, err, errmsg) 229 assert.Equal(t, test.expect, v, errmsg) 230 231 // Non-E test 232 v = ToUint16(test.input) 233 assert.Equal(t, test.expect, v, errmsg) 234 } 235 } 236 237 func TestToUint8E(t *testing.T) { 238 tests := []struct { 239 input interface{} 240 expect uint8 241 iserr bool 242 }{ 243 {int(8), 8, false}, 244 {int8(8), 8, false}, 245 {int16(8), 8, false}, 246 {int32(8), 8, false}, 247 {int64(8), 8, false}, 248 {uint(8), 8, false}, 249 {uint8(8), 8, false}, 250 {uint16(8), 8, false}, 251 {uint32(8), 8, false}, 252 {uint64(8), 8, false}, 253 {float32(8.31), 8, false}, 254 {float64(8.31), 8, false}, 255 {true, 1, false}, 256 {false, 0, false}, 257 {"8", 8, false}, 258 {nil, 0, false}, 259 // errors 260 {int(-8), 0, true}, 261 {int8(-8), 0, true}, 262 {int16(-8), 0, true}, 263 {int32(-8), 0, true}, 264 {int64(-8), 0, true}, 265 {float32(-8.31), 0, true}, 266 {float64(-8.31), 0, true}, 267 {"-8", 0, true}, 268 {"test", 0, true}, 269 {testing.T{}, 0, true}, 270 } 271 272 for i, test := range tests { 273 errmsg := fmt.Sprintf("i = %d", i) // assert helper message 274 275 v, err := ToUint8E(test.input) 276 if test.iserr { 277 assert.Error(t, err, errmsg) 278 continue 279 } 280 281 assert.NoError(t, err, errmsg) 282 assert.Equal(t, test.expect, v, errmsg) 283 284 // Non-E test 285 v = ToUint8(test.input) 286 assert.Equal(t, test.expect, v, errmsg) 287 } 288 } 289 290 func TestToIntE(t *testing.T) { 291 tests := []struct { 292 input interface{} 293 expect int 294 iserr bool 295 }{ 296 {int(8), 8, false}, 297 {int8(8), 8, false}, 298 {int16(8), 8, false}, 299 {int32(8), 8, false}, 300 {int64(8), 8, false}, 301 {uint(8), 8, false}, 302 {uint8(8), 8, false}, 303 {uint16(8), 8, false}, 304 {uint32(8), 8, false}, 305 {uint64(8), 8, false}, 306 {float32(8.31), 8, false}, 307 {float64(8.31), 8, false}, 308 {true, 1, false}, 309 {false, 0, false}, 310 {"8", 8, false}, 311 {nil, 0, false}, 312 // errors 313 {"test", 0, true}, 314 {testing.T{}, 0, true}, 315 } 316 317 for i, test := range tests { 318 errmsg := fmt.Sprintf("i = %d", i) // assert helper message 319 320 v, err := ToIntE(test.input) 321 if test.iserr { 322 assert.Error(t, err, errmsg) 323 continue 324 } 325 326 assert.NoError(t, err, errmsg) 327 assert.Equal(t, test.expect, v, errmsg) 328 329 // Non-E test 330 v = ToInt(test.input) 331 assert.Equal(t, test.expect, v, errmsg) 332 } 333 } 334 335 func TestToInt64E(t *testing.T) { 336 tests := []struct { 337 input interface{} 338 expect int64 339 iserr bool 340 }{ 341 {int(8), 8, false}, 342 {int8(8), 8, false}, 343 {int16(8), 8, false}, 344 {int32(8), 8, false}, 345 {int64(8), 8, false}, 346 {uint(8), 8, false}, 347 {uint8(8), 8, false}, 348 {uint16(8), 8, false}, 349 {uint32(8), 8, false}, 350 {uint64(8), 8, false}, 351 {float32(8.31), 8, false}, 352 {float64(8.31), 8, false}, 353 {true, 1, false}, 354 {false, 0, false}, 355 {"8", 8, false}, 356 {nil, 0, false}, 357 // errors 358 {"test", 0, true}, 359 {testing.T{}, 0, true}, 360 } 361 362 for i, test := range tests { 363 errmsg := fmt.Sprintf("i = %d", i) // assert helper message 364 365 v, err := ToInt64E(test.input) 366 if test.iserr { 367 assert.Error(t, err, errmsg) 368 continue 369 } 370 371 assert.NoError(t, err, errmsg) 372 assert.Equal(t, test.expect, v, errmsg) 373 374 // Non-E test 375 v = ToInt64(test.input) 376 assert.Equal(t, test.expect, v, errmsg) 377 } 378 } 379 380 func TestToInt32E(t *testing.T) { 381 tests := []struct { 382 input interface{} 383 expect int32 384 iserr bool 385 }{ 386 {int(8), 8, false}, 387 {int8(8), 8, false}, 388 {int16(8), 8, false}, 389 {int32(8), 8, false}, 390 {int64(8), 8, false}, 391 {uint(8), 8, false}, 392 {uint8(8), 8, false}, 393 {uint16(8), 8, false}, 394 {uint32(8), 8, false}, 395 {uint64(8), 8, false}, 396 {float32(8.31), 8, false}, 397 {float64(8.31), 8, false}, 398 {true, 1, false}, 399 {false, 0, false}, 400 {"8", 8, false}, 401 {nil, 0, false}, 402 // errors 403 {"test", 0, true}, 404 {testing.T{}, 0, true}, 405 } 406 407 for i, test := range tests { 408 errmsg := fmt.Sprintf("i = %d", i) // assert helper message 409 410 v, err := ToInt32E(test.input) 411 if test.iserr { 412 assert.Error(t, err, errmsg) 413 continue 414 } 415 416 assert.NoError(t, err, errmsg) 417 assert.Equal(t, test.expect, v, errmsg) 418 419 // Non-E test 420 v = ToInt32(test.input) 421 assert.Equal(t, test.expect, v, errmsg) 422 } 423 } 424 425 func TestToInt16E(t *testing.T) { 426 tests := []struct { 427 input interface{} 428 expect int16 429 iserr bool 430 }{ 431 {int(8), 8, false}, 432 {int8(8), 8, false}, 433 {int16(8), 8, false}, 434 {int32(8), 8, false}, 435 {int64(8), 8, false}, 436 {uint(8), 8, false}, 437 {uint8(8), 8, false}, 438 {uint16(8), 8, false}, 439 {uint32(8), 8, false}, 440 {uint64(8), 8, false}, 441 {float32(8.31), 8, false}, 442 {float64(8.31), 8, false}, 443 {true, 1, false}, 444 {false, 0, false}, 445 {"8", 8, false}, 446 {nil, 0, false}, 447 // errors 448 {"test", 0, true}, 449 {testing.T{}, 0, true}, 450 } 451 452 for i, test := range tests { 453 errmsg := fmt.Sprintf("i = %d", i) // assert helper message 454 455 v, err := ToInt16E(test.input) 456 if test.iserr { 457 assert.Error(t, err, errmsg) 458 continue 459 } 460 461 assert.NoError(t, err, errmsg) 462 assert.Equal(t, test.expect, v, errmsg) 463 464 // Non-E test 465 v = ToInt16(test.input) 466 assert.Equal(t, test.expect, v, errmsg) 467 } 468 } 469 470 func TestToInt8E(t *testing.T) { 471 tests := []struct { 472 input interface{} 473 expect int8 474 iserr bool 475 }{ 476 {int(8), 8, false}, 477 {int8(8), 8, false}, 478 {int16(8), 8, false}, 479 {int32(8), 8, false}, 480 {int64(8), 8, false}, 481 {uint(8), 8, false}, 482 {uint8(8), 8, false}, 483 {uint16(8), 8, false}, 484 {uint32(8), 8, false}, 485 {uint64(8), 8, false}, 486 {float32(8.31), 8, false}, 487 {float64(8.31), 8, false}, 488 {true, 1, false}, 489 {false, 0, false}, 490 {"8", 8, false}, 491 {nil, 0, false}, 492 // errors 493 {"test", 0, true}, 494 {testing.T{}, 0, true}, 495 } 496 497 for i, test := range tests { 498 errmsg := fmt.Sprintf("i = %d", i) // assert helper message 499 500 v, err := ToInt8E(test.input) 501 if test.iserr { 502 assert.Error(t, err, errmsg) 503 continue 504 } 505 506 assert.NoError(t, err, errmsg) 507 assert.Equal(t, test.expect, v, errmsg) 508 509 // Non-E test 510 v = ToInt8(test.input) 511 assert.Equal(t, test.expect, v, errmsg) 512 } 513 } 514 515 func TestToFloat64E(t *testing.T) { 516 tests := []struct { 517 input interface{} 518 expect float64 519 iserr bool 520 }{ 521 {int(8), 8, false}, 522 {int8(8), 8, false}, 523 {int16(8), 8, false}, 524 {int32(8), 8, false}, 525 {int64(8), 8, false}, 526 {uint(8), 8, false}, 527 {uint8(8), 8, false}, 528 {uint16(8), 8, false}, 529 {uint32(8), 8, false}, 530 {uint64(8), 8, false}, 531 {float32(8), 8, false}, 532 {float64(8.31), 8.31, false}, 533 {"8", 8, false}, 534 {true, 1, false}, 535 {false, 0, false}, 536 // errors 537 {"test", 0, true}, 538 {testing.T{}, 0, true}, 539 } 540 541 for i, test := range tests { 542 errmsg := fmt.Sprintf("i = %d", i) // assert helper message 543 544 v, err := ToFloat64E(test.input) 545 if test.iserr { 546 assert.Error(t, err, errmsg) 547 continue 548 } 549 550 assert.NoError(t, err, errmsg) 551 assert.Equal(t, test.expect, v, errmsg) 552 553 // Non-E test 554 v = ToFloat64(test.input) 555 assert.Equal(t, test.expect, v, errmsg) 556 } 557 } 558 559 func TestToFloat32E(t *testing.T) { 560 tests := []struct { 561 input interface{} 562 expect float32 563 iserr bool 564 }{ 565 {int(8), 8, false}, 566 {int8(8), 8, false}, 567 {int16(8), 8, false}, 568 {int32(8), 8, false}, 569 {int64(8), 8, false}, 570 {uint(8), 8, false}, 571 {uint8(8), 8, false}, 572 {uint16(8), 8, false}, 573 {uint32(8), 8, false}, 574 {uint64(8), 8, false}, 575 {float32(8.31), 8.31, false}, 576 {float64(8.31), 8.31, false}, 577 {"8", 8, false}, 578 {true, 1, false}, 579 {false, 0, false}, 580 // errors 581 {"test", 0, true}, 582 {testing.T{}, 0, true}, 583 } 584 585 for i, test := range tests { 586 errmsg := fmt.Sprintf("i = %d", i) // assert helper message 587 588 v, err := ToFloat32E(test.input) 589 if test.iserr { 590 assert.Error(t, err, errmsg) 591 continue 592 } 593 594 assert.NoError(t, err, errmsg) 595 assert.Equal(t, test.expect, v, errmsg) 596 597 // Non-E test 598 v = ToFloat32(test.input) 599 assert.Equal(t, test.expect, v, errmsg) 600 } 601 } 602 603 func TestToStringE(t *testing.T) { 604 type Key struct { 605 k string 606 } 607 key := &Key{"foo"} 608 609 tests := []struct { 610 input interface{} 611 expect string 612 iserr bool 613 }{ 614 {int(8), "8", false}, 615 {int8(8), "8", false}, 616 {int16(8), "8", false}, 617 {int32(8), "8", false}, 618 {int64(8), "8", false}, 619 {uint(8), "8", false}, 620 {uint8(8), "8", false}, 621 {uint16(8), "8", false}, 622 {uint32(8), "8", false}, 623 {uint64(8), "8", false}, 624 {float32(8.31), "8.31", false}, 625 {float64(8.31), "8.31", false}, 626 {true, "true", false}, 627 {false, "false", false}, 628 {nil, "", false}, 629 {[]byte("one time"), "one time", false}, 630 {"one more time", "one more time", false}, 631 {template.HTML("one time"), "one time", false}, 632 {template.URL("http://somehost.foo"), "http://somehost.foo", false}, 633 {template.JS("(1+2)"), "(1+2)", false}, 634 {template.CSS("a"), "a", false}, 635 {template.HTMLAttr("a"), "a", false}, 636 // errors 637 {testing.T{}, "", true}, 638 {key, "", true}, 639 } 640 641 for i, test := range tests { 642 errmsg := fmt.Sprintf("i = %d", i) // assert helper message 643 644 v, err := ToStringE(test.input) 645 if test.iserr { 646 assert.Error(t, err, errmsg) 647 continue 648 } 649 650 assert.NoError(t, err, errmsg) 651 assert.Equal(t, test.expect, v, errmsg) 652 653 // Non-E test 654 v = ToString(test.input) 655 assert.Equal(t, test.expect, v, errmsg) 656 } 657 } 658 659 type foo struct { 660 val string 661 } 662 663 func (x foo) String() string { 664 return x.val 665 } 666 667 func TestStringerToString(t *testing.T) { 668 var x foo 669 x.val = "bar" 670 assert.Equal(t, "bar", ToString(x)) 671 } 672 673 type fu struct { 674 val string 675 } 676 677 func (x fu) Error() string { 678 return x.val 679 } 680 681 func TestErrorToString(t *testing.T) { 682 var x fu 683 x.val = "bar" 684 assert.Equal(t, "bar", ToString(x)) 685 } 686 687 func TestStringMapStringSliceE(t *testing.T) { 688 // ToStringMapString inputs/outputs 689 stringMapString := map[string]string{"key 1": "value 1", "key 2": "value 2", "key 3": "value 3"} 690 stringMapInterface := map[string]interface{}{"key 1": "value 1", "key 2": "value 2", "key 3": "value 3"} 691 interfaceMapString := map[interface{}]string{"key 1": "value 1", "key 2": "value 2", "key 3": "value 3"} 692 interfaceMapInterface := map[interface{}]interface{}{"key 1": "value 1", "key 2": "value 2", "key 3": "value 3"} 693 694 // ToStringMapStringSlice inputs/outputs 695 stringMapStringSlice := map[string][]string{"key 1": {"value 1", "value 2", "value 3"}, "key 2": {"value 1", "value 2", "value 3"}, "key 3": {"value 1", "value 2", "value 3"}} 696 stringMapInterfaceSlice := map[string][]interface{}{"key 1": {"value 1", "value 2", "value 3"}, "key 2": {"value 1", "value 2", "value 3"}, "key 3": {"value 1", "value 2", "value 3"}} 697 stringMapInterfaceInterfaceSlice := map[string]interface{}{"key 1": []interface{}{"value 1", "value 2", "value 3"}, "key 2": []interface{}{"value 1", "value 2", "value 3"}, "key 3": []interface{}{"value 1", "value 2", "value 3"}} 698 stringMapStringSingleSliceFieldsResult := map[string][]string{"key 1": {"value", "1"}, "key 2": {"value", "2"}, "key 3": {"value", "3"}} 699 interfaceMapStringSlice := map[interface{}][]string{"key 1": {"value 1", "value 2", "value 3"}, "key 2": {"value 1", "value 2", "value 3"}, "key 3": {"value 1", "value 2", "value 3"}} 700 interfaceMapInterfaceSlice := map[interface{}][]interface{}{"key 1": {"value 1", "value 2", "value 3"}, "key 2": {"value 1", "value 2", "value 3"}, "key 3": {"value 1", "value 2", "value 3"}} 701 702 stringMapStringSliceMultiple := map[string][]string{"key 1": {"value 1", "value 2", "value 3"}, "key 2": {"value 1", "value 2", "value 3"}, "key 3": {"value 1", "value 2", "value 3"}} 703 stringMapStringSliceSingle := map[string][]string{"key 1": {"value 1"}, "key 2": {"value 2"}, "key 3": {"value 3"}} 704 705 stringMapInterface1 := map[string]interface{}{"key 1": []string{"value 1"}, "key 2": []string{"value 2"}} 706 stringMapInterfaceResult1 := map[string][]string{"key 1": {"value 1"}, "key 2": {"value 2"}} 707 708 jsonStringMapString := `{"key 1": "value 1", "key 2": "value 2"}` 709 jsonStringMapStringArray := `{"key 1": ["value 1"], "key 2": ["value 2", "value 3"]}` 710 jsonStringMapStringArrayResult := map[string][]string{"key 1": {"value 1"}, "key 2": {"value 2", "value 3"}} 711 712 type Key struct { 713 k string 714 } 715 716 tests := []struct { 717 input interface{} 718 expect map[string][]string 719 iserr bool 720 }{ 721 {stringMapStringSlice, stringMapStringSlice, false}, 722 {stringMapInterfaceSlice, stringMapStringSlice, false}, 723 {stringMapInterfaceInterfaceSlice, stringMapStringSlice, false}, 724 {stringMapStringSliceMultiple, stringMapStringSlice, false}, 725 {stringMapStringSliceMultiple, stringMapStringSlice, false}, 726 {stringMapString, stringMapStringSliceSingle, false}, 727 {stringMapInterface, stringMapStringSliceSingle, false}, 728 {stringMapInterface1, stringMapInterfaceResult1, false}, 729 {interfaceMapStringSlice, stringMapStringSlice, false}, 730 {interfaceMapInterfaceSlice, stringMapStringSlice, false}, 731 {interfaceMapString, stringMapStringSingleSliceFieldsResult, false}, 732 {interfaceMapInterface, stringMapStringSingleSliceFieldsResult, false}, 733 {jsonStringMapStringArray, jsonStringMapStringArrayResult, false}, 734 735 // errors 736 {nil, nil, true}, 737 {testing.T{}, nil, true}, 738 {map[interface{}]interface{}{"foo": testing.T{}}, nil, true}, 739 {map[interface{}]interface{}{Key{"foo"}: "bar"}, nil, true}, // ToStringE(Key{"foo"}) should fail 740 {jsonStringMapString, nil, true}, 741 {"", nil, true}, 742 } 743 744 for i, test := range tests { 745 errmsg := fmt.Sprintf("i = %d", i) // assert helper message 746 747 v, err := ToStringMapStringSliceE(test.input) 748 if test.iserr { 749 assert.Error(t, err, errmsg) 750 continue 751 } 752 753 assert.NoError(t, err, errmsg) 754 assert.Equal(t, test.expect, v, errmsg) 755 756 // Non-E test 757 v = ToStringMapStringSlice(test.input) 758 assert.Equal(t, test.expect, v, errmsg) 759 } 760 } 761 762 func TestToStringMapE(t *testing.T) { 763 tests := []struct { 764 input interface{} 765 expect map[string]interface{} 766 iserr bool 767 }{ 768 {map[interface{}]interface{}{"tag": "tags", "group": "groups"}, map[string]interface{}{"tag": "tags", "group": "groups"}, false}, 769 {map[string]interface{}{"tag": "tags", "group": "groups"}, map[string]interface{}{"tag": "tags", "group": "groups"}, false}, 770 {`{"tag": "tags", "group": "groups"}`, map[string]interface{}{"tag": "tags", "group": "groups"}, false}, 771 {`{"tag": "tags", "group": true}`, map[string]interface{}{"tag": "tags", "group": true}, false}, 772 773 // errors 774 {nil, nil, true}, 775 {testing.T{}, nil, true}, 776 {"", nil, true}, 777 } 778 779 for i, test := range tests { 780 errmsg := fmt.Sprintf("i = %d", i) // assert helper message 781 782 v, err := ToStringMapE(test.input) 783 if test.iserr { 784 assert.Error(t, err, errmsg) 785 continue 786 } 787 788 assert.NoError(t, err, errmsg) 789 assert.Equal(t, test.expect, v, errmsg) 790 791 // Non-E test 792 v = ToStringMap(test.input) 793 assert.Equal(t, test.expect, v, errmsg) 794 } 795 } 796 797 func TestToStringMapBoolE(t *testing.T) { 798 tests := []struct { 799 input interface{} 800 expect map[string]bool 801 iserr bool 802 }{ 803 {map[interface{}]interface{}{"v1": true, "v2": false}, map[string]bool{"v1": true, "v2": false}, false}, 804 {map[string]interface{}{"v1": true, "v2": false}, map[string]bool{"v1": true, "v2": false}, false}, 805 {map[string]bool{"v1": true, "v2": false}, map[string]bool{"v1": true, "v2": false}, false}, 806 {`{"v1": true, "v2": false}`, map[string]bool{"v1": true, "v2": false}, false}, 807 808 // errors 809 {nil, nil, true}, 810 {testing.T{}, nil, true}, 811 {"", nil, true}, 812 } 813 814 for i, test := range tests { 815 errmsg := fmt.Sprintf("i = %d", i) // assert helper message 816 817 v, err := ToStringMapBoolE(test.input) 818 if test.iserr { 819 assert.Error(t, err, errmsg) 820 continue 821 } 822 823 assert.NoError(t, err, errmsg) 824 assert.Equal(t, test.expect, v, errmsg) 825 826 // Non-E test 827 v = ToStringMapBool(test.input) 828 assert.Equal(t, test.expect, v, errmsg) 829 } 830 } 831 832 func TestToStringMapIntE(t *testing.T) { 833 tests := []struct { 834 input interface{} 835 expect map[string]int 836 iserr bool 837 }{ 838 {map[interface{}]interface{}{"v1": 1, "v2": 222}, map[string]int{"v1": 1, "v2": 222}, false}, 839 {map[string]interface{}{"v1": 342, "v2": 5141}, map[string]int{"v1": 342, "v2": 5141}, false}, 840 {map[string]int{"v1": 33, "v2": 88}, map[string]int{"v1": 33, "v2": 88}, false}, 841 {map[string]int32{"v1": int32(33), "v2": int32(88)}, map[string]int{"v1": 33, "v2": 88}, false}, 842 {map[string]uint16{"v1": uint16(33), "v2": uint16(88)}, map[string]int{"v1": 33, "v2": 88}, false}, 843 {map[string]float64{"v1": float64(8.22), "v2": float64(43.32)}, map[string]int{"v1": 8, "v2": 43}, false}, 844 {`{"v1": 67, "v2": 56}`, map[string]int{"v1": 67, "v2": 56}, false}, 845 846 // errors 847 {nil, nil, true}, 848 {testing.T{}, nil, true}, 849 {"", nil, true}, 850 } 851 852 for i, test := range tests { 853 errmsg := fmt.Sprintf("i = %d", i) // assert helper message 854 855 v, err := ToStringMapIntE(test.input) 856 if test.iserr { 857 assert.Error(t, err, errmsg) 858 continue 859 } 860 861 assert.NoError(t, err, errmsg) 862 assert.Equal(t, test.expect, v, errmsg) 863 864 // Non-E test 865 v = ToStringMapInt(test.input) 866 assert.Equal(t, test.expect, v, errmsg) 867 } 868 } 869 870 func TestToStringMapInt64E(t *testing.T) { 871 tests := []struct { 872 input interface{} 873 expect map[string]int64 874 iserr bool 875 }{ 876 {map[interface{}]interface{}{"v1": int32(8), "v2": int32(888)}, map[string]int64{"v1": int64(8), "v2": int64(888)}, false}, 877 {map[string]interface{}{"v1": int64(45), "v2": int64(67)}, map[string]int64{"v1": 45, "v2": 67}, false}, 878 {map[string]int64{"v1": 33, "v2": 88}, map[string]int64{"v1": 33, "v2": 88}, false}, 879 {map[string]int{"v1": 33, "v2": 88}, map[string]int64{"v1": 33, "v2": 88}, false}, 880 {map[string]int32{"v1": int32(33), "v2": int32(88)}, map[string]int64{"v1": 33, "v2": 88}, false}, 881 {map[string]uint16{"v1": uint16(33), "v2": uint16(88)}, map[string]int64{"v1": 33, "v2": 88}, false}, 882 {map[string]float64{"v1": float64(8.22), "v2": float64(43.32)}, map[string]int64{"v1": 8, "v2": 43}, false}, 883 {`{"v1": 67, "v2": 56}`, map[string]int64{"v1": 67, "v2": 56}, false}, 884 885 // errors 886 {nil, nil, true}, 887 {testing.T{}, nil, true}, 888 {"", nil, true}, 889 } 890 891 for i, test := range tests { 892 errmsg := fmt.Sprintf("i = %d", i) // assert helper message 893 894 v, err := ToStringMapInt64E(test.input) 895 if test.iserr { 896 assert.Error(t, err, errmsg) 897 continue 898 } 899 900 assert.NoError(t, err, errmsg) 901 assert.Equal(t, test.expect, v, errmsg) 902 903 // Non-E test 904 v = ToStringMapInt64(test.input) 905 assert.Equal(t, test.expect, v, errmsg) 906 } 907 } 908 909 func TestToStringMapStringE(t *testing.T) { 910 stringMapString := map[string]string{"key 1": "value 1", "key 2": "value 2", "key 3": "value 3"} 911 stringMapInterface := map[string]interface{}{"key 1": "value 1", "key 2": "value 2", "key 3": "value 3"} 912 interfaceMapString := map[interface{}]string{"key 1": "value 1", "key 2": "value 2", "key 3": "value 3"} 913 interfaceMapInterface := map[interface{}]interface{}{"key 1": "value 1", "key 2": "value 2", "key 3": "value 3"} 914 jsonString := `{"key 1": "value 1", "key 2": "value 2", "key 3": "value 3"}` 915 invalidJsonString := `{"key 1": "value 1", "key 2": "value 2", "key 3": "value 3"` 916 emptyString := "" 917 918 tests := []struct { 919 input interface{} 920 expect map[string]string 921 iserr bool 922 }{ 923 {stringMapString, stringMapString, false}, 924 {stringMapInterface, stringMapString, false}, 925 {interfaceMapString, stringMapString, false}, 926 {interfaceMapInterface, stringMapString, false}, 927 {jsonString, stringMapString, false}, 928 929 // errors 930 {nil, nil, true}, 931 {testing.T{}, nil, true}, 932 {invalidJsonString, nil, true}, 933 {emptyString, nil, true}, 934 } 935 936 for i, test := range tests { 937 errmsg := fmt.Sprintf("i = %d", i) // assert helper message 938 939 v, err := ToStringMapStringE(test.input) 940 if test.iserr { 941 assert.Error(t, err, errmsg) 942 continue 943 } 944 945 assert.NoError(t, err, errmsg) 946 assert.Equal(t, test.expect, v, errmsg) 947 948 // Non-E test 949 v = ToStringMapString(test.input) 950 assert.Equal(t, test.expect, v, errmsg) 951 } 952 } 953 954 func TestToBoolSliceE(t *testing.T) { 955 tests := []struct { 956 input interface{} 957 expect []bool 958 iserr bool 959 }{ 960 {[]bool{true, false, true}, []bool{true, false, true}, false}, 961 {[]interface{}{true, false, true}, []bool{true, false, true}, false}, 962 {[]int{1, 0, 1}, []bool{true, false, true}, false}, 963 {[]string{"true", "false", "true"}, []bool{true, false, true}, false}, 964 // errors 965 {nil, nil, true}, 966 {testing.T{}, nil, true}, 967 {[]string{"foo", "bar"}, nil, true}, 968 } 969 970 for i, test := range tests { 971 errmsg := fmt.Sprintf("i = %d", i) // assert helper message 972 973 v, err := ToBoolSliceE(test.input) 974 if test.iserr { 975 assert.Error(t, err, errmsg) 976 continue 977 } 978 979 assert.NoError(t, err, errmsg) 980 assert.Equal(t, test.expect, v, errmsg) 981 982 // Non-E test 983 v = ToBoolSlice(test.input) 984 assert.Equal(t, test.expect, v, errmsg) 985 } 986 } 987 988 func TestToIntSliceE(t *testing.T) { 989 tests := []struct { 990 input interface{} 991 expect []int 992 iserr bool 993 }{ 994 {[]int{1, 3}, []int{1, 3}, false}, 995 {[]interface{}{1.2, 3.2}, []int{1, 3}, false}, 996 {[]string{"2", "3"}, []int{2, 3}, false}, 997 {[2]string{"2", "3"}, []int{2, 3}, false}, 998 // errors 999 {nil, nil, true}, 1000 {testing.T{}, nil, true}, 1001 {[]string{"foo", "bar"}, nil, true}, 1002 } 1003 1004 for i, test := range tests { 1005 errmsg := fmt.Sprintf("i = %d", i) // assert helper message 1006 1007 v, err := ToIntSliceE(test.input) 1008 if test.iserr { 1009 assert.Error(t, err, errmsg) 1010 continue 1011 } 1012 1013 assert.NoError(t, err, errmsg) 1014 assert.Equal(t, test.expect, v, errmsg) 1015 1016 // Non-E test 1017 v = ToIntSlice(test.input) 1018 assert.Equal(t, test.expect, v, errmsg) 1019 } 1020 } 1021 1022 func TestToSliceE(t *testing.T) { 1023 tests := []struct { 1024 input interface{} 1025 expect []interface{} 1026 iserr bool 1027 }{ 1028 {[]interface{}{1, 3}, []interface{}{1, 3}, false}, 1029 {[]map[string]interface{}{{"k1": 1}, {"k2": 2}}, []interface{}{map[string]interface{}{"k1": 1}, map[string]interface{}{"k2": 2}}, false}, 1030 // errors 1031 {nil, nil, true}, 1032 {testing.T{}, nil, true}, 1033 } 1034 1035 for i, test := range tests { 1036 errmsg := fmt.Sprintf("i = %d", i) // assert helper message 1037 1038 v, err := ToSliceE(test.input) 1039 if test.iserr { 1040 assert.Error(t, err, errmsg) 1041 continue 1042 } 1043 1044 assert.NoError(t, err, errmsg) 1045 assert.Equal(t, test.expect, v, errmsg) 1046 1047 // Non-E test 1048 v = ToSlice(test.input) 1049 assert.Equal(t, test.expect, v, errmsg) 1050 } 1051 } 1052 1053 func TestToStringSliceE(t *testing.T) { 1054 tests := []struct { 1055 input interface{} 1056 expect []string 1057 iserr bool 1058 }{ 1059 {[]int{1, 2}, []string{"1", "2"}, false}, 1060 {[]int8{int8(1), int8(2)}, []string{"1", "2"}, false}, 1061 {[]int32{int32(1), int32(2)}, []string{"1", "2"}, false}, 1062 {[]int64{int64(1), int64(2)}, []string{"1", "2"}, false}, 1063 {[]float32{float32(1.01), float32(2.01)}, []string{"1.01", "2.01"}, false}, 1064 {[]float64{float64(1.01), float64(2.01)}, []string{"1.01", "2.01"}, false}, 1065 {[]string{"a", "b"}, []string{"a", "b"}, false}, 1066 {[]interface{}{1, 3}, []string{"1", "3"}, false}, 1067 {interface{}(1), []string{"1"}, false}, 1068 {[]error{errors.New("a"), errors.New("b")}, []string{"a", "b"}, false}, 1069 // errors 1070 {nil, nil, true}, 1071 {testing.T{}, nil, true}, 1072 } 1073 1074 for i, test := range tests { 1075 errmsg := fmt.Sprintf("i = %d", i) // assert helper message 1076 1077 v, err := ToStringSliceE(test.input) 1078 if test.iserr { 1079 assert.Error(t, err, errmsg) 1080 continue 1081 } 1082 1083 assert.NoError(t, err, errmsg) 1084 assert.Equal(t, test.expect, v, errmsg) 1085 1086 // Non-E test 1087 v = ToStringSlice(test.input) 1088 assert.Equal(t, test.expect, v, errmsg) 1089 } 1090 } 1091 1092 func TestToDurationSliceE(t *testing.T) { 1093 tests := []struct { 1094 input interface{} 1095 expect []time.Duration 1096 iserr bool 1097 }{ 1098 {[]string{"1s", "1m"}, []time.Duration{time.Second, time.Minute}, false}, 1099 {[]int{1, 2}, []time.Duration{1, 2}, false}, 1100 {[]interface{}{1, 3}, []time.Duration{1, 3}, false}, 1101 {[]time.Duration{1, 3}, []time.Duration{1, 3}, false}, 1102 1103 // errors 1104 {nil, nil, true}, 1105 {testing.T{}, nil, true}, 1106 {[]string{"invalid"}, nil, true}, 1107 } 1108 1109 for i, test := range tests { 1110 errmsg := fmt.Sprintf("i = %d", i) // assert helper message 1111 1112 v, err := ToDurationSliceE(test.input) 1113 if test.iserr { 1114 assert.Error(t, err, errmsg) 1115 continue 1116 } 1117 1118 assert.NoError(t, err, errmsg) 1119 assert.Equal(t, test.expect, v, errmsg) 1120 1121 // Non-E test 1122 v = ToDurationSlice(test.input) 1123 assert.Equal(t, test.expect, v, errmsg) 1124 } 1125 } 1126 1127 func TestToBoolE(t *testing.T) { 1128 tests := []struct { 1129 input interface{} 1130 expect bool 1131 iserr bool 1132 }{ 1133 {0, false, false}, 1134 {nil, false, false}, 1135 {"false", false, false}, 1136 {"FALSE", false, false}, 1137 {"False", false, false}, 1138 {"f", false, false}, 1139 {"F", false, false}, 1140 {false, false, false}, 1141 1142 {"true", true, false}, 1143 {"TRUE", true, false}, 1144 {"True", true, false}, 1145 {"t", true, false}, 1146 {"T", true, false}, 1147 {1, true, false}, 1148 {true, true, false}, 1149 {-1, true, false}, 1150 1151 // errors 1152 {"test", false, true}, 1153 {testing.T{}, false, true}, 1154 } 1155 1156 for i, test := range tests { 1157 errmsg := fmt.Sprintf("i = %d", i) // assert helper message 1158 1159 v, err := ToBoolE(test.input) 1160 if test.iserr { 1161 assert.Error(t, err, errmsg) 1162 continue 1163 } 1164 1165 assert.NoError(t, err, errmsg) 1166 assert.Equal(t, test.expect, v, errmsg) 1167 1168 // Non-E test 1169 v = ToBool(test.input) 1170 assert.Equal(t, test.expect, v, errmsg) 1171 } 1172 } 1173 1174 func BenchmarkTooBool(b *testing.B) { 1175 for i := 0; i < b.N; i++ { 1176 if !ToBool(true) { 1177 b.Fatal("ToBool returned false") 1178 } 1179 } 1180 } 1181 1182 func TestIndirectPointers(t *testing.T) { 1183 x := 13 1184 y := &x 1185 z := &y 1186 1187 assert.Equal(t, ToInt(y), 13) 1188 assert.Equal(t, ToInt(z), 13) 1189 } 1190 1191 func TestToTimeEE(t *testing.T) { 1192 tests := []struct { 1193 input interface{} 1194 expect time.Time 1195 iserr bool 1196 }{ 1197 {"2009-11-10 23:00:00 +0000 UTC", time.Date(2009, 11, 10, 23, 0, 0, 0, time.UTC), false}, // Time.String() 1198 {"Tue Nov 10 23:00:00 2009", time.Date(2009, 11, 10, 23, 0, 0, 0, time.UTC), false}, // ANSIC 1199 {"Tue Nov 10 23:00:00 UTC 2009", time.Date(2009, 11, 10, 23, 0, 0, 0, time.UTC), false}, // UnixDate 1200 {"Tue Nov 10 23:00:00 +0000 2009", time.Date(2009, 11, 10, 23, 0, 0, 0, time.UTC), false}, // RubyDate 1201 {"10 Nov 09 23:00 UTC", time.Date(2009, 11, 10, 23, 0, 0, 0, time.UTC), false}, // RFC822 1202 {"10 Nov 09 23:00 +0000", time.Date(2009, 11, 10, 23, 0, 0, 0, time.UTC), false}, // RFC822Z 1203 {"Tuesday, 10-Nov-09 23:00:00 UTC", time.Date(2009, 11, 10, 23, 0, 0, 0, time.UTC), false}, // RFC850 1204 {"Tue, 10 Nov 2009 23:00:00 UTC", time.Date(2009, 11, 10, 23, 0, 0, 0, time.UTC), false}, // RFC1123 1205 {"Tue, 10 Nov 2009 23:00:00 +0000", time.Date(2009, 11, 10, 23, 0, 0, 0, time.UTC), false}, // RFC1123Z 1206 {"2009-11-10T23:00:00Z", time.Date(2009, 11, 10, 23, 0, 0, 0, time.UTC), false}, // RFC3339 1207 {"2018-10-21T23:21:29+0200", time.Date(2018, 10, 21, 21, 21, 29, 0, time.UTC), false}, // RFC3339 without timezone hh:mm colon 1208 {"2009-11-10T23:00:00Z", time.Date(2009, 11, 10, 23, 0, 0, 0, time.UTC), false}, // RFC3339Nano 1209 {"11:00PM", time.Date(0, 1, 1, 23, 0, 0, 0, time.UTC), false}, // Kitchen 1210 {"Nov 10 23:00:00", time.Date(0, 11, 10, 23, 0, 0, 0, time.UTC), false}, // Stamp 1211 {"Nov 10 23:00:00.000", time.Date(0, 11, 10, 23, 0, 0, 0, time.UTC), false}, // StampMilli 1212 {"Nov 10 23:00:00.000000", time.Date(0, 11, 10, 23, 0, 0, 0, time.UTC), false}, // StampMicro 1213 {"Nov 10 23:00:00.000000000", time.Date(0, 11, 10, 23, 0, 0, 0, time.UTC), false}, // StampNano 1214 {"2016-03-06 15:28:01-00:00", time.Date(2016, 3, 6, 15, 28, 1, 0, time.UTC), false}, // RFC3339 without T 1215 {"2016-03-06 15:28:01-0000", time.Date(2016, 3, 6, 15, 28, 1, 0, time.UTC), false}, // RFC3339 without T or timezone hh:mm colon 1216 {"2016-03-06 15:28:01", time.Date(2016, 3, 6, 15, 28, 1, 0, time.UTC), false}, 1217 {"2016-03-06 15:28:01 -0000", time.Date(2016, 3, 6, 15, 28, 1, 0, time.UTC), false}, 1218 {"2016-03-06 15:28:01 -00:00", time.Date(2016, 3, 6, 15, 28, 1, 0, time.UTC), false}, 1219 {"2006-01-02", time.Date(2006, 1, 2, 0, 0, 0, 0, time.UTC), false}, 1220 {"02 Jan 2006", time.Date(2006, 1, 2, 0, 0, 0, 0, time.UTC), false}, 1221 {1472574600, time.Date(2016, 8, 30, 16, 30, 0, 0, time.UTC), false}, 1222 {int(1482597504), time.Date(2016, 12, 24, 16, 38, 24, 0, time.UTC), false}, 1223 {int64(1234567890), time.Date(2009, 2, 13, 23, 31, 30, 0, time.UTC), false}, 1224 {int32(1234567890), time.Date(2009, 2, 13, 23, 31, 30, 0, time.UTC), false}, 1225 {uint(1482597504), time.Date(2016, 12, 24, 16, 38, 24, 0, time.UTC), false}, 1226 {uint64(1234567890), time.Date(2009, 2, 13, 23, 31, 30, 0, time.UTC), false}, 1227 {uint32(1234567890), time.Date(2009, 2, 13, 23, 31, 30, 0, time.UTC), false}, 1228 {time.Date(2009, 2, 13, 23, 31, 30, 0, time.UTC), time.Date(2009, 2, 13, 23, 31, 30, 0, time.UTC), false}, 1229 // errors 1230 {"2006", time.Time{}, true}, 1231 {testing.T{}, time.Time{}, true}, 1232 } 1233 1234 for i, test := range tests { 1235 errmsg := fmt.Sprintf("i = %d", i) // assert helper message 1236 1237 v, err := ToTimeE(test.input) 1238 if test.iserr { 1239 assert.Error(t, err, errmsg) 1240 continue 1241 } 1242 1243 assert.NoError(t, err, errmsg) 1244 assert.Equal(t, test.expect, v.UTC(), errmsg) 1245 1246 // Non-E test 1247 v = ToTime(test.input) 1248 assert.Equal(t, test.expect, v.UTC(), errmsg) 1249 } 1250 } 1251 1252 func TestToDurationE(t *testing.T) { 1253 var td time.Duration = 5 1254 1255 tests := []struct { 1256 input interface{} 1257 expect time.Duration 1258 iserr bool 1259 }{ 1260 {time.Duration(5), td, false}, 1261 {int(5), td, false}, 1262 {int64(5), td, false}, 1263 {int32(5), td, false}, 1264 {int16(5), td, false}, 1265 {int8(5), td, false}, 1266 {uint(5), td, false}, 1267 {uint64(5), td, false}, 1268 {uint32(5), td, false}, 1269 {uint16(5), td, false}, 1270 {uint8(5), td, false}, 1271 {float64(5), td, false}, 1272 {float32(5), td, false}, 1273 {string("5"), td, false}, 1274 {string("5ns"), td, false}, 1275 {string("5us"), time.Microsecond * td, false}, 1276 {string("5µs"), time.Microsecond * td, false}, 1277 {string("5ms"), time.Millisecond * td, false}, 1278 {string("5s"), time.Second * td, false}, 1279 {string("5m"), time.Minute * td, false}, 1280 {string("5h"), time.Hour * td, false}, 1281 // errors 1282 {"test", 0, true}, 1283 {testing.T{}, 0, true}, 1284 } 1285 1286 for i, test := range tests { 1287 errmsg := fmt.Sprintf("i = %d", i) // assert helper message 1288 1289 v, err := ToDurationE(test.input) 1290 if test.iserr { 1291 assert.Error(t, err, errmsg) 1292 continue 1293 } 1294 1295 assert.NoError(t, err, errmsg) 1296 assert.Equal(t, test.expect, v, errmsg) 1297 1298 // Non-E test 1299 v = ToDuration(test.input) 1300 assert.Equal(t, test.expect, v, errmsg) 1301 } 1302 }