github.com/codingeasygo/util@v0.0.0-20231206062002-1ce2f004b7d9/attrvalid/attrvalid_test.go (about) 1 package attrvalid 2 3 import ( 4 "bytes" 5 "encoding/json" 6 "fmt" 7 "net/http" 8 "net/http/httptest" 9 "net/url" 10 "reflect" 11 "strings" 12 "testing" 13 14 "github.com/codingeasygo/util/converter" 15 ) 16 17 type TestInt int 18 type TestIntArray []int 19 type TestIntPtrArray []*int 20 21 func TestCompatibleType(t *testing.T) { 22 var iVal int 23 var iArray []int 24 var iPtrArray []*int 25 var i interface{} 26 if !CompatibleType(reflect.TypeOf(iVal)) { 27 t.Error("err") 28 return 29 } 30 if !CompatibleType(reflect.TypeOf(iArray)) { 31 t.Error("err") 32 return 33 } 34 if !CompatibleType(reflect.TypeOf(iPtrArray)) { 35 t.Error("err") 36 return 37 } 38 39 if !CompatibleType(reflect.TypeOf(TestInt(iVal))) { 40 t.Error("err") 41 return 42 } 43 if !CompatibleType(reflect.TypeOf(TestIntArray(iArray))) { 44 t.Error("err") 45 return 46 } 47 if !CompatibleType(reflect.TypeOf(TestIntPtrArray(iPtrArray))) { 48 t.Error("err") 49 return 50 } 51 if CompatibleType(reflect.TypeOf(i)) { 52 t.Error("err") 53 return 54 } 55 if CompatibleType(reflect.TypeOf(nil)) { 56 t.Error("err") 57 return 58 } 59 } 60 61 func TestM(t *testing.T) { 62 var a int 63 m := M(map[string]interface{}{ 64 "a": 1, 65 }) 66 err := m.ValidFormat(`a,r|i,r:0`, &a) 67 if err != nil || a != 1 { 68 t.Error(err) 69 return 70 } 71 72 } 73 74 func TestMS(t *testing.T) { 75 var a int 76 m := MS(map[string]string{ 77 "a": "1", 78 }) 79 err := m.ValidFormat(`a,r|i,r:0`, &a) 80 if err != nil || a != 1 { 81 t.Error(err) 82 return 83 } 84 85 } 86 87 func TestValidAttrTemple(t *testing.T) { 88 v, err := ValidAttrTemple("测试", "r|s", "l:~10", true, nil) 89 if err != nil { 90 t.Error(err.Error()) 91 return 92 } 93 fmt.Println(v) 94 _, err = ValidAttrTemple("测试测试测试测试", "r|s", "l:~10", true, nil) 95 if err == nil { 96 t.Error("not error") 97 return 98 } 99 // 100 v, err = ValidAttrTemple("男", "r|s", "o:男~女", true, nil) 101 if err != nil { 102 t.Error(err.Error()) 103 return 104 } 105 fmt.Println(v) 106 _, err = ValidAttrTemple("男ks", "r|s", "o:男~女", true, nil) 107 if err == nil { 108 t.Error("not error") 109 return 110 } 111 // 112 v, err = ValidAttrTemple("test@gmail.com", "r|s", "p:^.*\\@.*$", true, nil) 113 if err != nil { 114 t.Error(err.Error()) 115 return 116 } 117 fmt.Println(v) 118 _, err = ValidAttrTemple("ks", "r|s", "p:^.*\\@.*$", true, nil) 119 if err == nil { 120 t.Error("not error") 121 return 122 } 123 // 124 v, err = ValidAttrTemple("8", "o|i", "r:5~10", true, nil) 125 if err != nil { 126 t.Error(err.Error()) 127 return 128 } 129 fmt.Println(v) 130 v, err = ValidAttrTemple("8", "o|i", "r:5~", true, nil) 131 if err != nil { 132 t.Error(err.Error()) 133 return 134 } 135 fmt.Println(v) 136 _, err = ValidAttrTemple("12", "o|i", "r:5~10", true, nil) 137 if err == nil { 138 t.Error("not error") 139 return 140 } 141 // 142 v, err = ValidAttrTemple("8", "o|f", "r:5~10", true, nil) 143 if err != nil { 144 t.Error(err.Error()) 145 return 146 } 147 fmt.Println(v) 148 v, err = ValidAttrTemple("8", "o|f", "r:5~", true, nil) 149 if err != nil { 150 t.Error(err.Error()) 151 return 152 } 153 fmt.Println(v) 154 _, err = ValidAttrTemple("12", "o|f", "r:5~10", true, nil) 155 if err == nil { 156 t.Error("not error") 157 return 158 } 159 // 160 v, err = ValidAttrTemple("测", "o|s", "l:~8", true, nil) 161 if err != nil { 162 t.Error(err.Error()) 163 return 164 } 165 fmt.Println(v) 166 _, err = ValidAttrTemple("测", "o|s", "l:2~", true, nil) 167 if err != nil { 168 t.Error(err.Error()) 169 return 170 } 171 fmt.Println(v) 172 _, err = ValidAttrTemple("测度测度测度测度测度", "o|s", "l:~8", true, nil) 173 if err == nil { 174 t.Error("not error") 175 return 176 } 177 // 178 v, err = ValidAttrTemple("测", "o|s", "l:2~8", true, nil) 179 if err != nil { 180 t.Error(err.Error()) 181 return 182 } 183 fmt.Println(v) 184 _, err = ValidAttrTemple("a", "o|s", "l:2~8", true, nil) 185 if err == nil { 186 t.Error("not error") 187 return 188 } 189 _, err = ValidAttrTemple("a", "o|s", "n:", true, nil) 190 if err != nil { 191 t.Error("not error") 192 return 193 } 194 // 195 v, err = ValidAttrTemple("test@gmail.com", "o|s", "p:^.*\\@.*$", true, nil) 196 if err != nil { 197 t.Error(err.Error()) 198 return 199 } 200 fmt.Println(v) 201 _, err = ValidAttrTemple("ks", "o|s", "p:^.*\\@.*$", true, nil) 202 if err == nil { 203 t.Error("not error") 204 return 205 } 206 // 207 v, err = ValidAttrTemple("1", "o|i", "o:1~2~3~4~5", true, nil) 208 if err != nil { 209 t.Error(err.Error()) 210 return 211 } 212 fmt.Println(v) 213 _, err = ValidAttrTemple("11", "o|i", "o:1~2~3~4~5", true, nil) 214 if err == nil { 215 t.Error("not error") 216 return 217 } 218 _, err = ValidAttrTemple("11", "o|i", "n:", true, nil) 219 if err != nil { 220 t.Error("not error") 221 return 222 } 223 // 224 v, err = ValidAttrTemple("1.1", "o|f", "o:1.1~2.2~3.3~4~5", true, nil) 225 if err != nil { 226 t.Error(err.Error()) 227 return 228 } 229 fmt.Println(v) 230 _, err = ValidAttrTemple("11", "o|f", "o:1~2~3~4~5", true, nil) 231 if err == nil { 232 t.Error("not error") 233 return 234 } 235 _, err = ValidAttrTemple("11", "o|f", "n:", true, nil) 236 if err != nil { 237 t.Error("not error") 238 return 239 } 240 // 241 _, err = ValidAttrTemple("测", "o|s", "l:a", true, nil) 242 if err == nil { 243 t.Error("not error") 244 return 245 } 246 _, err = ValidAttrTemple("测", "o|s", "KK:a", true, nil) 247 if err == nil { 248 t.Error("not error") 249 return 250 } 251 _, err = ValidAttrTemple("test@gmail.com", "o|s", "p:*,..", true, nil) 252 if err == nil { 253 t.Error("not error") 254 return 255 } 256 _, err = ValidAttrTemple("测", "o|i", "r:8~9", true, nil) 257 if err == nil { 258 t.Error("not error") 259 return 260 } 261 _, err = ValidAttrTemple("测", "o|f", "r:8~9", true, nil) 262 if err == nil { 263 t.Error("not error") 264 return 265 } 266 _, err = ValidAttrTemple("测", "o|f", "o:8~9", true, nil) 267 if err == nil { 268 t.Error("not error") 269 return 270 } 271 _, err = ValidAttrTemple("测", "o|n", "r:8~9", true, nil) 272 if err == nil { 273 t.Error("not error") 274 return 275 } 276 _, err = ValidAttrTemple("5", "r|i", "r:~1", true, nil) 277 if err == nil { 278 t.Error("not error") 279 return 280 } 281 _, err = ValidAttrTemple("5", "r|i", "r:a~10", true, nil) 282 if err == nil { 283 t.Error("not error") 284 return 285 } 286 _, err = ValidAttrTemple("5", "r|i", "r:1~a", true, nil) 287 if err == nil { 288 t.Error("not error") 289 return 290 } 291 _, err = ValidAttrTemple("5", "r|f", "r:~1", true, nil) 292 if err == nil { 293 t.Error("not error") 294 return 295 } 296 _, err = ValidAttrTemple("5", "r|f", "r:a~10", true, nil) 297 if err == nil { 298 t.Error("not error") 299 return 300 } 301 _, err = ValidAttrTemple("5", "r|f", "r:1~a", true, nil) 302 if err == nil { 303 t.Error("not error") 304 return 305 } 306 _, err = ValidAttrTemple("5", "r|i", "m:1~a", true, nil) 307 if err == nil { 308 t.Error("not error") 309 return 310 } 311 _, err = ValidAttrTemple("5", "r|i", "o:1~a", true, nil) 312 if err == nil { 313 t.Error("not error") 314 return 315 } 316 _, err = ValidAttrTemple("5", "r|f", "o:1~a", true, nil) 317 if err == nil { 318 t.Error("not error") 319 return 320 } 321 _, err = ValidAttrTemple("5", "r|f", "m:1~k", true, nil) 322 if err == nil { 323 t.Error("not error") 324 return 325 } 326 _, err = ValidAttrTemple("5", "r|i", "o", true, nil) 327 if err == nil { 328 t.Error("not error") 329 return 330 } 331 _, err = ValidAttrTemple("5", "r", "o:1~10", true, nil) 332 if err == nil { 333 t.Error("not error") 334 return 335 } 336 _, err = ValidAttrTemple("", "r|i", "o:1~10", true, nil) 337 if err == nil { 338 t.Error("not error") 339 return 340 } 341 _, err = ValidAttrTemple("", "o|i", "o:1~10", true, nil) 342 if err != nil { 343 t.Error(err.Error()) 344 return 345 } 346 _, err = ValidAttrTemple("a", "o|s", "l:a~8", true, nil) 347 if err == nil { 348 t.Error("not error") 349 return 350 } 351 _, err = ValidAttrTemple("a", "o|s", "l:2~a", true, nil) 352 if err == nil { 353 t.Error("not error") 354 return 355 } 356 _, err = ValidAttrTemple(nil, "o|s", "l:0", true, nil) 357 if err != nil { 358 t.Error("not error") 359 return 360 } 361 _, err = ValidAttrTemple(nil, "r|s", "l:0", true, nil) 362 if err == nil { 363 t.Error("not error") 364 return 365 } 366 _, err = ValidAttrTemple(0, "o|i", "r:0", true, nil) 367 if err != nil { 368 t.Errorf("%v", err) 369 return 370 } 371 _, err = ValidAttrTemple(0, "o|f", "r:0", true, nil) 372 if err != nil { 373 t.Errorf("%v", err) 374 return 375 } 376 _, err = ValidAttrTemple("", "o|s", "r:0", true, nil) 377 if err != nil { 378 t.Errorf("%v", err) 379 return 380 } 381 } 382 383 type EnumIntTest int 384 385 func (e *EnumIntTest) EnumValid(v interface{}) (err error) { 386 val, err := converter.IntVal(v) 387 if err == nil && val != 1 && val != 2 { 388 err = fmt.Errorf("only supported 1,2") 389 } 390 return 391 } 392 393 type EnumIntArrayTest []int 394 395 func (e *EnumIntArrayTest) EnumValid(v interface{}) (err error) { 396 val, err := converter.IntVal(v) 397 if err == nil && val != 1 && val != 2 { 398 err = fmt.Errorf("only supported 1,2") 399 } 400 return 401 } 402 403 type EnumFloatTest float64 404 405 func (e *EnumFloatTest) EnumValid(v interface{}) (err error) { 406 val, err := converter.Float64Val(v) 407 if err == nil && val != 1 && val != 2 { 408 err = fmt.Errorf("only supported 1,2") 409 } 410 return 411 } 412 413 type EnumFloatArrayTest []int 414 415 func (e *EnumFloatArrayTest) EnumValid(v interface{}) (err error) { 416 val, err := converter.Float64Val(v) 417 if err == nil && val != 1 && val != 2 { 418 err = fmt.Errorf("only supported 1,2") 419 } 420 return 421 } 422 423 type EnumStringTest float64 424 425 func (e *EnumStringTest) EnumValid(v interface{}) (err error) { 426 val, err := converter.StringVal(v) 427 if err == nil && val != "1" && val != "2" { 428 err = fmt.Errorf("only supported 1,2") 429 } 430 return 431 } 432 433 type EnumStringArrayTest []int 434 435 func (e *EnumStringArrayTest) EnumValid(v interface{}) (err error) { 436 val, err := converter.StringVal(v) 437 if err == nil && val != "1" && val != "2" { 438 err = fmt.Errorf("only supported 1,2") 439 } 440 return 441 } 442 443 type DefineInt64Test int64 444 445 func TestValidAttrFormat(t *testing.T) { 446 mv := map[string]interface{}{} 447 mv["a"] = "abc" 448 mv["i"] = "10" 449 mv["i4"] = "1" 450 mv["f"] = "10.3" 451 mv["ef"] = "20.3" 452 mv["len"] = "11111111" 453 mv["ary"] = "1,2,3,4,5" 454 mv["ary2"] = "1,2,3,,4,5" 455 mv["ary3"] = []interface{}{1, 2, 3, 4, 5} 456 mv["ary4"] = "1,2" 457 var a string 458 var i int64 459 var k string 460 var ks []string 461 var f float64 462 var iv1 int 463 var iv1ary []int 464 var iv2 int16 465 var iv3 int32 466 var iv4 int64 467 var iv5 uint 468 var iv6 uint16 469 var iv7 uint32 470 var iv8 uint64 471 var iv9 float32 472 var iv10 float64 473 var iv10ary []float64 474 var iv11 string 475 var iv12 int64 476 var snot string 477 var iv1ary2 []int 478 var svary []string 479 var iv10ary2 []float64 480 var iv10ary3 []float64 481 var eint EnumIntTest 482 err := ValidAttrFormat(`//abc 483 a,r|s,l:~5;//abc 484 i,r|i,r:1~20; 485 i,o|i,r:1~20;//sfdsj 486 i,o|i,r:1~20;//sfdsj 487 f,r|f,r:1.5~20; 488 i,r|i,r:0; 489 i,r|i,r:0; 490 i,r|i,r:0; 491 i,r|i,r:0; 492 i,r|i,r:0; 493 i,r|i,r:0; 494 i,r|i,r:0; 495 i,r|i,r:0; 496 i,r|i,r:0; 497 i,r|i,r:0; 498 i,r|i,r:0; 499 i,r|i,r:0; 500 i,r|i,r:0; 501 i,r|s,l:0; 502 not,o|s,l:0; 503 ary,r|s,l:0; 504 ary,r|i,r:0; 505 ary,r|f,r:0; 506 ary3,r|f,r:0; 507 i,r|i,r:0; 508 `, M(mv), true, &a, &i, &k, &ks, &f, 509 &iv1, &iv1ary, &iv2, &iv3, &iv4, &iv5, 510 &iv6, &iv7, &iv8, &iv9, &iv10, &iv10ary, 511 &iv11, &iv12, &snot, &svary, 512 &iv1ary2, &iv10ary2, &iv10ary3, 513 &eint, 514 ) 515 if err != nil { 516 t.Error(err.Error()) 517 return 518 } 519 fmt.Println(k, ks, len(iv1ary2), len(iv10ary2)) 520 if k != "10" || ks[0] != "10" || iv1 != 10 || iv1ary2[0] != 1 || iv10 != 10 || iv10ary2[0] != 1 { 521 t.Error("error") 522 return 523 } 524 fmt.Println(len(svary), len(iv1ary2), len(iv10ary2)) 525 if len(svary) != 5 || len(iv1ary2) != 5 || len(iv10ary2) != 5 || len(iv10ary3) != 5 { 526 t.Error("error") 527 return 528 } 529 fmt.Println(a, i, k, f) 530 //string to int on ValidValue 531 err = ValidAttrFormat(` 532 i,r|s,l:0; 533 i,r|s,l:0; 534 i,r|s,l:0; 535 i,r|s,l:0; 536 i,r|s,l:0; 537 i,r|s,l:0; 538 i,r|s,l:0; 539 i,r|s,l:0; 540 i,r|s,l:0; 541 i,r|s,l:0; 542 i,r|s,l:0; 543 i,r|s,l:0; 544 i,r|s,l:0; 545 i,r|s,l:0; 546 `, M(mv), true, 547 &iv1, &iv1ary, &iv2, &iv3, &iv4, &iv5, 548 &iv6, &iv7, &iv8, &iv9, &iv10, &iv10ary, 549 &iv11, &iv12, 550 ) 551 if err != nil { 552 t.Error(err.Error()) 553 return 554 } 555 // 556 //test array 557 svary, iv1ary2, iv10ary2 = nil, nil, nil 558 err = ValidAttrFormat(` 559 ary2,r|s,l:0; 560 ary2,r|i,r:0; 561 ary2,r|f,r:0; 562 `, M(mv), true, &svary, &iv1ary2, &iv10ary2) 563 if err == nil { 564 t.Error("error") 565 return 566 } 567 svary, iv1ary2, iv10ary2 = nil, nil, nil 568 err = ValidAttrFormat(` 569 ary2,o|s,l:0; 570 ary2,o|i,r:0; 571 ary2,o|f,r:0; 572 `, M(mv), true, &svary, &iv1ary2, &iv10ary2) 573 if err != nil { 574 t.Error("error") 575 return 576 } 577 if len(svary) != 5 || len(iv1ary2) != 5 || len(iv10ary2) != 5 { 578 t.Error("error") 579 return 580 } 581 // 582 //test enum 583 var enumInt EnumIntTest 584 var enumIntArray EnumIntArrayTest 585 var enumFloat EnumFloatTest 586 var enumFloatArray EnumFloatArrayTest 587 var enumString EnumFloatTest 588 var enumStringArray EnumFloatArrayTest 589 err = ValidAttrFormat(` 590 i,r|i,e:; 591 `, M(mv), true, &enumInt) 592 if err == nil { 593 t.Error("error") 594 return 595 } 596 err = ValidAttrFormat(` 597 ary,r|i,e:0; 598 `, M(mv), true, &enumIntArray) 599 if err == nil { 600 t.Error("error") 601 return 602 } 603 err = ValidAttrFormat(` 604 i,r|i,e:; 605 `, M(mv), true, &i) 606 if err == nil { 607 t.Error("error") 608 return 609 } 610 err = ValidAttrFormat(` 611 i,r|f,e:; 612 `, M(mv), true, &f) 613 if err == nil { 614 t.Error("error") 615 return 616 } 617 err = ValidAttrFormat(` 618 i,r|s,e:; 619 `, M(mv), true, &a) 620 if err == nil { 621 t.Error("error") 622 return 623 } 624 err = ValidAttrFormat(` 625 i4,r|i,e:0; 626 ary4,r|i,e:0; 627 i4,r|f,e:0; 628 ary4,r|f,e:0; 629 i4,r|s,e:0; 630 ary4,r|s,e:0; 631 `, M(mv), true, &enumInt, &enumIntArray, &enumFloat, &enumFloatArray, &enumString, &enumStringArray) 632 if err != nil { 633 t.Error(err) 634 return 635 } 636 if enumInt != 1 || len(enumIntArray) != 2 || enumIntArray[0] != 1 || enumIntArray[1] != 2 || enumFloat != 1 || len(enumFloatArray) != 2 || enumString != 1 || len(enumStringArray) != 2 { 637 t.Error("error") 638 return 639 } 640 // 641 err = ValidAttrFormat(` 642 a,r|s l:~5; 643 `, M(mv), true, &a) 644 if err == nil { 645 t.Error("not error") 646 return 647 } 648 // 649 err = ValidAttrFormat(` 650 len,r|s,l:~5; 651 `, M(mv), true, &a) 652 if err == nil { 653 t.Error("not error") 654 return 655 } 656 // 657 var ea float32 658 err = ValidAttrFormat(` 659 a,r|s,l:~5; 660 `, M(mv), true, &ea) 661 if err == nil { 662 t.Error("not error") 663 return 664 } 665 fmt.Println(err.Error()) 666 // 667 err = ValidAttrFormat(``, M(mv), true, &a) 668 if err == nil { 669 t.Error("not error") 670 return 671 } 672 fmt.Println(err.Error()) 673 // 674 err = ValidAttrFormat(` 675 len,r|s,l:~5; 676 len,r|s,l:~5; 677 `, M(mv), true, &a) 678 if err == nil { 679 t.Error("not error") 680 return 681 } 682 fmt.Println(err.Error()) 683 err = ValidAttrFormat(` 684 len,r|s,l:~5,this is error message; 685 `, M(mv), true, &a) 686 if err == nil { 687 t.Error("not error") 688 return 689 } 690 fmt.Println(err.Error()) 691 } 692 693 func TestValidAttrFormatPointer(t *testing.T) { 694 mv := map[string]interface{}{} 695 mv["a"] = "abc" 696 mv["i"] = "10" 697 mv["f"] = "10.3" 698 mv["ef"] = "20.3" 699 mv["len"] = "11111111" 700 mv["ary"] = "1,2,3,4,5" 701 mv["ary2"] = "1,2,3,,4,5" 702 var a *string 703 var i *int64 704 var k *string 705 var ks []*string 706 var f *float64 707 var iv1 *int 708 var iv1ary []*int 709 var iv2 *int16 710 var iv3 *int32 711 var iv4 *int64 712 var iv5 *uint 713 var iv6 *uint16 714 var iv7 *uint32 715 var iv8 *uint64 716 var iv9 *float32 717 var iv10 *float64 718 var iv10ary []*float64 719 var iv11 *string 720 var iv12 *int64 721 var iv1ary2 []*int 722 var arystr []*string 723 var iv10ary2 []*float64 724 err := ValidAttrFormat(`//abc 725 a,r|s,l:~5;//abc 726 i,r|i,r:1~20; 727 i,o|i,r:1~20;//sfdsj 728 i,o|i,r:1~20;//sfdsj 729 f,r|f,r:1.5~20; 730 i,r|i,r:0; 731 i,r|i,r:0; 732 i,r|i,r:0; 733 i,r|i,r:0; 734 i,r|i,r:0; 735 i,r|i,r:0; 736 i,r|i,r:0; 737 i,r|i,r:0; 738 i,r|i,r:0; 739 i,r|i,r:0; 740 i,r|i,r:0; 741 i,r|i,r:0; 742 i,r|i,r:0; 743 i,r|s,l:0; 744 ary,r|s,l:0; 745 ary,r|i,r:0; 746 ary,r|f,r:0; 747 `, M(mv), true, &a, &i, &k, &ks, &f, 748 &iv1, &iv1ary, &iv2, &iv3, &iv4, &iv5, 749 &iv6, &iv7, &iv8, &iv9, &iv10, &iv10ary, 750 &iv11, &iv12, &arystr, &iv1ary2, &iv10ary2) 751 if err != nil { 752 t.Error(err.Error()) 753 return 754 } 755 fmt.Println(k, ks, len(iv1ary), len(iv10ary)) 756 if *k != "10" || *ks[0] != "10" || *iv1 != 10 || *iv1ary[0] != 10 || *iv10 != 10 || *iv10ary[0] != 10 { 757 t.Error("error") 758 return 759 } 760 fmt.Println(arystr, iv1ary, iv10ary) 761 if len(arystr) != 5 || len(iv1ary2) != 5 || len(iv10ary2) != 5 { 762 t.Errorf("error,%v,%v,%v", len(arystr), len(iv1ary), len(iv10ary)) 763 return 764 } 765 fmt.Println(a, i, k, f) 766 } 767 768 func TestValidAttrFormatError(t *testing.T) { 769 getter := ValueGetterF(func(key string) (v interface{}, err error) { 770 if key == "not" { 771 err = fmt.Errorf("not") 772 } else if key == "ary1" { 773 v = 1 774 } else if key == "ary2" { 775 v = []interface{}{"xxx"} 776 } 777 return 778 }) 779 var err error 780 // 781 var sval string 782 err = ValidAttrFormat(` 783 not,r|s,l:~5; 784 `, getter, true, &sval) 785 if err == nil { 786 t.Error("nil") 787 return 788 } 789 // 790 var iary []int 791 err = ValidAttrFormat(` 792 ary2,r|s,l:~5; 793 `, getter, true, &iary) 794 if err == nil { 795 t.Error("nil") 796 return 797 } 798 err = ValidAttrFormat(` 799 xxx,r|s,l:~5; 800 `, getter, true, &iary) 801 if err == nil { 802 t.Error("nil") 803 return 804 } 805 } 806 807 func TestEscape(t *testing.T) { 808 // 809 var a string 810 err := ValidAttrFormat(` 811 len,r|s,P:[^%N]*%N.*$; 812 `, ValueGetterF( 813 func(key string) (interface{}, error) { 814 return "abc,ddf", nil 815 }, 816 ), true, &a) 817 if err != nil { 818 t.Error(err.Error()) 819 return 820 } 821 } 822 823 func TestValidWeb(t *testing.T) { 824 var ( 825 a int 826 b string 827 err error 828 req *http.Request 829 ) 830 req = httptest.NewRequest("GET", "http://localhost/?a=1&b=xxx", nil) 831 err = QueryValidFormat(req, ` 832 a,r|i,r:0; 833 b,r|s,l:0; 834 `, &a, &b) 835 if err != nil || a != 1 || b != "xxx" { 836 t.Error(err) 837 return 838 } 839 req.ParseForm() 840 err = FormValidFormat(req, ` 841 a,r|i,r:0; 842 b,r|s,l:0; 843 `, &a, &b) 844 if err != nil || a != 1 || b != "xxx" { 845 t.Error(err) 846 return 847 } 848 // 849 req = httptest.NewRequest("POST", "http://localhost", bytes.NewBufferString("a=1&b=xxx")) 850 req.Header.Add("Content-Type", "application/x-www-form-urlencoded") 851 req.ParseForm() 852 err = PostFormValidFormat(req, ` 853 a,r|i,r:0; 854 b,r|s,l:0; 855 `, &a, &b) 856 if err != nil || a != 1 || b != "xxx" { 857 t.Error(err) 858 return 859 } 860 // 861 req = httptest.NewRequest("GET", "http://localhost", nil) 862 req.PostForm = url.Values{} 863 req.PostForm.Set("a", "1") 864 req.PostForm.Set("b", "xxx") 865 err = RequestValidFormat(req, ` 866 a,r|i,r:0; 867 b,r|s,l:0; 868 `, &a, &b) 869 if err != nil || a != 1 || b != "xxx" { 870 t.Error(err) 871 return 872 } 873 } 874 875 func TestValidNil(t *testing.T) { 876 m := M{ 877 "a": nil, 878 "b": []interface{}{}, 879 } 880 var aryptr1, aryptr2 []*int64 881 err := m.ValidFormat(` 882 a,o|i,r:0; 883 b,o|i,r:0; 884 `, &aryptr1, &aryptr2) 885 if err != nil { 886 t.Error(err) 887 return 888 } 889 err = m.ValidFormat(` 890 a,r|i,r:0; 891 b,r|i,r:0; 892 `, &aryptr1, &aryptr2) 893 if err == nil { 894 t.Error(err) 895 return 896 } 897 } 898 899 func TestValidNoArray2Array(t *testing.T) { 900 var data = `{"number":1000,"string":"1000"}` 901 var m = map[string]interface{}{} 902 var err = json.Unmarshal([]byte(data), &m) 903 if err != nil { 904 t.Error(err) 905 return 906 } 907 mval := M(m) 908 { 909 var nval0 []int 910 var nval1 []*int 911 var nval2 []int64 912 var nval3 []*int64 913 var nval4 []float64 914 var nval5 []*float64 915 err = ValidAttrFormat(` 916 number,O|I,R:-1; 917 number,O|I,R:-1; 918 number,O|I,R:-1; 919 number,O|I,R:-1; 920 number,O|I,R:-1; 921 number,O|I,R:-1; 922 `, mval, true, &nval0, &nval1, &nval2, &nval3, &nval4, &nval5) 923 if err != nil || 924 len(nval0) != 1 || nval0[0] != 1000 || 925 len(nval1) != 1 || *nval1[0] != 1000 || 926 len(nval2) != 1 || nval2[0] != 1000 || 927 len(nval3) != 1 || *nval3[0] != 1000 || 928 len(nval4) != 1 || nval4[0] != 1000 || 929 len(nval5) != 1 || *nval5[0] != 1000 { 930 t.Error(err) 931 return 932 } 933 } 934 { 935 var nval0 []int 936 var nval1 []*int 937 var nval2 []int64 938 var nval3 []*int64 939 var nval4 []float64 940 var nval5 []*float64 941 err = ValidAttrFormat(` 942 string,O|I,R:-1; 943 string,O|I,R:-1; 944 string,O|I,R:-1; 945 string,O|I,R:-1; 946 string,O|I,R:-1; 947 string,O|I,R:-1; 948 `, mval, true, &nval0, &nval1, &nval2, &nval3, &nval4, &nval5) 949 if err != nil || 950 len(nval0) != 1 || nval0[0] != 1000 || 951 len(nval1) != 1 || *nval1[0] != 1000 || 952 len(nval2) != 1 || nval2[0] != 1000 || 953 len(nval3) != 1 || *nval3[0] != 1000 || 954 len(nval4) != 1 || nval4[0] != 1000 || 955 len(nval5) != 1 || *nval5[0] != 1000 { 956 t.Error(err) 957 return 958 } 959 } 960 } 961 962 type testSubStruct struct { 963 _ string `xxx:"not exported"` 964 xint int `xxx:"not exported"` 965 Int int `json:"int"` 966 Float float64 `json:"float"` 967 String string `json:"string"` 968 Raw map[string]interface{} `json:"raw"` 969 Map M `json:"map"` 970 } 971 972 type testStruct struct { 973 Int int `json:"int"` 974 Float float64 `json:"float"` 975 String string `json:"string"` 976 Raw map[string]interface{} `json:"raw"` 977 Map M `json:"map"` 978 Sub1 testSubStruct `json:"sub1"` 979 Sub2 *testSubStruct `json:"sub2"` 980 } 981 982 type testStructPtr struct { 983 Int *int `json:"int"` 984 Float *float64 `json:"float"` 985 String *string `json:"string"` 986 } 987 988 func TestValidStruct(t *testing.T) { 989 value := testStruct{ 990 Int: 100, 991 Float: 200, 992 String: "300", 993 Raw: map[string]interface{}{"abc": 400}, 994 Map: M{"abc": 500}, 995 Sub1: testSubStruct{ 996 xint: 100, 997 Int: 100, 998 Float: 200, 999 String: "300", 1000 Raw: map[string]interface{}{"abc": 400}, 1001 Map: M{"abc": 500}, 1002 }, 1003 Sub2: &testSubStruct{ 1004 Int: 100, 1005 Float: 200, 1006 String: "300", 1007 Raw: map[string]interface{}{"abc": 400}, 1008 Map: M{"abc": 500}, 1009 }, 1010 } 1011 var err error 1012 var intValue int 1013 var floatValue float64 1014 var stringValue, abc1Value, abc2Value string 1015 // 1016 //test json tag 1017 err = ValidStructAttrFormat(` 1018 int,R|I,R:0; 1019 float,R|I,R:0; 1020 string,R|S,L:0; 1021 raw/abc,R|S,L:0; 1022 map/abc,R|S,L:0; 1023 `, &value, true, &intValue, &floatValue, &stringValue, &abc1Value, &abc2Value) 1024 if err != nil || intValue != 100 || floatValue != 200 || stringValue != "300" || abc1Value != "400" || abc2Value != "500" { 1025 t.Errorf("%v,%v,%v,%v,%v,%v", err, intValue, floatValue, stringValue, abc1Value, abc2Value) 1026 return 1027 } 1028 err = ValidStructAttrFormat(` 1029 sub1/int,R|I,R:0; 1030 sub1/float,R|I,R:0; 1031 sub1/string,R|S,L:0; 1032 sub1/raw/abc,R|S,L:0; 1033 sub1/map/abc,R|S,L:0; 1034 `, &value, true, &intValue, &floatValue, &stringValue, &abc1Value, &abc2Value) 1035 if err != nil || intValue != 100 || floatValue != 200 || stringValue != "300" || abc1Value != "400" || abc2Value != "500" { 1036 t.Errorf("%v,%v,%v,%v,%v,%v", err, intValue, floatValue, stringValue, abc1Value, abc2Value) 1037 return 1038 } 1039 err = ValidStructAttrFormat(` 1040 sub2/int,R|I,R:0; 1041 sub2/float,R|I,R:0; 1042 sub2/string,R|S,L:0; 1043 sub2/raw/abc,R|S,L:0; 1044 sub2/map/abc,R|S,L:0; 1045 `, &value, true, &intValue, &floatValue, &stringValue, &abc1Value, &abc2Value) 1046 if err != nil || intValue != 100 || floatValue != 200 || stringValue != "300" || abc1Value != "400" || abc2Value != "500" { 1047 t.Errorf("%v,%v,%v,%v,%v,%v", err, intValue, floatValue, stringValue, abc1Value, abc2Value) 1048 return 1049 } 1050 // 1051 //test field name 1052 err = ValidStructAttrFormat(` 1053 Int,R|I,R:0; 1054 Float,R|I,R:0; 1055 String,R|S,L:0; 1056 Raw/abc,R|S,L:0; 1057 Map/abc,R|S,L:0; 1058 `, &value, true, &intValue, &floatValue, &stringValue, &abc1Value, &abc2Value) 1059 if err != nil || intValue != 100 || floatValue != 200 || stringValue != "300" || abc1Value != "400" || abc2Value != "500" { 1060 t.Errorf("%v,%v,%v,%v,%v,%v", err, intValue, floatValue, stringValue, abc1Value, abc2Value) 1061 return 1062 } 1063 err = ValidStructAttrFormat(` 1064 Sub1/Int,R|I,R:0; 1065 Sub1/Float,R|I,R:0; 1066 Sub1/String,R|S,L:0; 1067 Sub1/Raw/abc,R|S,L:0; 1068 Sub1/Map/abc,R|S,L:0; 1069 `, &value, true, &intValue, &floatValue, &stringValue, &abc1Value, &abc2Value) 1070 if err != nil || intValue != 100 || floatValue != 200 || stringValue != "300" || abc1Value != "400" || abc2Value != "500" { 1071 t.Errorf("%v,%v,%v,%v,%v,%v", err, intValue, floatValue, stringValue, abc1Value, abc2Value) 1072 return 1073 } 1074 err = ValidStructAttrFormat(` 1075 Sub2/int,R|I,R:0; 1076 Sub2/float,R|I,R:0; 1077 Sub2/string,R|S,L:0; 1078 Sub2/raw/abc,R|S,L:0; 1079 Sub2/map/abc,R|S,L:0; 1080 `, &value, true, &intValue, &floatValue, &stringValue, &abc1Value, &abc2Value) 1081 if err != nil || intValue != 100 || floatValue != 200 || stringValue != "300" || abc1Value != "400" || abc2Value != "500" { 1082 t.Errorf("%v,%v,%v,%v,%v,%v", err, intValue, floatValue, stringValue, abc1Value, abc2Value) 1083 return 1084 } 1085 // 1086 //test new struct 1087 err = NewStruct(&value).ValidFormat(` 1088 int,R|I,R:0; 1089 float,R|I,R:0; 1090 string,R|S,L:0; 1091 raw/abc,R|S,L:0; 1092 map/abc,R|S,L:0; 1093 `, &intValue, &floatValue, &stringValue, &abc1Value, &abc2Value) 1094 if err != nil || intValue != 100 || floatValue != 200 || stringValue != "300" || abc1Value != "400" || abc2Value != "500" { 1095 t.Errorf("%v,%v,%v,%v,%v,%v", err, intValue, floatValue, stringValue, abc1Value, abc2Value) 1096 return 1097 } 1098 // 1099 //test struct ptr 1100 valuePtr := testStructPtr{ 1101 Int: converter.IntPtr(100), 1102 Float: converter.Float64Ptr(200), 1103 String: converter.StringPtr("300"), 1104 } 1105 err = NewStruct(&valuePtr).ValidFormat(` 1106 int,R|I,R:0; 1107 float,R|I,R:0; 1108 string,R|S,L:0; 1109 `, &intValue, &floatValue, &stringValue) 1110 if err != nil || intValue != 100 || floatValue != 200 || stringValue != "300" { 1111 t.Errorf("%v,%v,%v,%v,%v,%v", err, intValue, floatValue, stringValue, abc1Value, abc2Value) 1112 return 1113 } 1114 valuePtr2 := testStructPtr{} 1115 err = ValidFormat(`string,R|S,L:0;`, &valuePtr2, &intValue) 1116 if err == nil { 1117 t.Errorf("%v", err) 1118 return 1119 } 1120 err = ValidFormat(`string,R|S,L:0;`, &valuePtr2) 1121 if err == nil { 1122 t.Errorf("%v", err) 1123 return 1124 } 1125 // 1126 //test error 1127 func() { 1128 defer func() { 1129 recover() 1130 }() 1131 NewStruct(1) 1132 }() 1133 } 1134 1135 type xxx map[string]interface{} 1136 1137 func (x xxx) RawMap() map[string]interface{} { 1138 return x 1139 } 1140 1141 func TestValidFormat(t *testing.T) { 1142 var err error 1143 var intValue int 1144 // 1145 err = ValidFormat(`int,R|I,R:0`, M(map[string]interface{}{"int": 100}), &intValue) 1146 if err != nil || intValue != 100 { 1147 t.Error(err) 1148 return 1149 } 1150 req, _ := http.NewRequest("GET", "http://test/?int=100", nil) 1151 err = ValidFormat(`int,R|I,R:0`, req, &intValue) 1152 if err != nil || intValue != 100 { 1153 t.Error(err) 1154 return 1155 } 1156 err = ValidFormat(`int,R|I,R:0`, req.URL.Query(), &intValue) 1157 if err != nil || intValue != 100 { 1158 t.Error(err) 1159 return 1160 } 1161 err = ValidFormat(`int,R|I,R:0`, map[string]string{"int": "100"}, &intValue) 1162 if err != nil || intValue != 100 { 1163 t.Error(err) 1164 return 1165 } 1166 err = ValidFormat(`int,R|I,R:0`, map[string]interface{}{"int": "100"}, &intValue) 1167 if err != nil || intValue != 100 { 1168 t.Error(err) 1169 return 1170 } 1171 err = ValidFormat(`int,R|I,R:0`, xxx(map[string]interface{}{"int": 100}), &intValue) 1172 if err != nil || intValue != 100 { 1173 t.Error(err) 1174 return 1175 } 1176 err = ValidFormat(`int,R|I,R:0`, &testStruct{Int: 100}, &intValue) 1177 if err != nil || intValue != 100 { 1178 t.Error(err) 1179 return 1180 } 1181 } 1182 1183 func TestCheck(t *testing.T) { 1184 var err error 1185 err = ValidFormat(`int,R|I,R:0`, M(map[string]interface{}{"int": 100})) 1186 if err != nil { 1187 t.Error(err) 1188 return 1189 } 1190 err = ValidFormat(`int,R|I,R:1000`, M(map[string]interface{}{"int": 100})) 1191 if err == nil { 1192 t.Error(err) 1193 return 1194 } 1195 } 1196 1197 type Simple struct { 1198 A0 int64 `json:"a0" valid:"a0,r|i,r:0"` 1199 A1 *int64 `json:"a1" valid:"a1,r|i,r:0;"` 1200 AX []int64 `json:"ax" valid:"ax,r|i,r:0;"` 1201 XX string `json:"xx"` 1202 } 1203 1204 type SimpleArgs struct { 1205 A0 int64 `json:"a0" valid:"a0,r|i,r:0"` 1206 A1 *int64 `json:"a1" valid:"a1,r|i,r:0;"` 1207 AX []int64 `json:"ax" valid:"ax,r|i,r:0;"` 1208 XX struct { 1209 B0 int64 `json:"b0" valid:"b0,r|i,r:0"` 1210 B1 *int64 `json:"b1" valid:"b1,r|i,r:0;"` 1211 } `json:"xx" valid:"inline"` 1212 } 1213 1214 type Product struct { 1215 Title string `json:"title,omitempty" valid:"title,r|s,l:0;"` /* the product title */ 1216 TitleSub *string `json:"title_sub,omitempty" valid:"title_sub,o|s,l:0;"` /* the product sub title */ 1217 } 1218 1219 func TestValid(t *testing.T) { 1220 var err error 1221 errObject := struct { 1222 A0 int64 `json:"a0" valid:"a0,r|i,r:0"` 1223 A1 *int64 `json:"a1" valid:"a1,r|i,r:0;"` 1224 A2 *int64 `json:"a2" valid:"a2,r|i,r:0;"` 1225 A3 int64 `json:"a3" valid:"|i,r:0;"` 1226 AX []int64 `json:"ax" valid:"ax,r|i,r:0;"` 1227 AY []int64 `json:"ay" valid:"ay,r|i,r:0;"` 1228 XX string `json:"xx"` 1229 }{ 1230 A2: converter.Int64Ptr(0), 1231 AY: []int64{0, 1}, 1232 } 1233 err = Valid(&errObject, "#all", "") 1234 if err == nil { 1235 t.Error(err) 1236 return 1237 } 1238 ok0Object := struct { 1239 A0 int64 `json:"a0" valid:"a0,r|i,r:0"` 1240 A1 *int64 `json:"a1" valid:"a1,r|i,r:0;"` 1241 AX []int64 `json:"ax" valid:"ax,r|i,r:0;"` 1242 AY []*int64 `json:"ay" valid:"ay,r|i,r:0;"` 1243 S0 string `json:"s0" valid:"s0,r|s,l:0;"` 1244 S1 *string `json:"s1" valid:"s1,r|s,l:0;"` 1245 XX string `json:"xx"` 1246 }{ 1247 A0: 100, 1248 A1: converter.Int64Ptr(100), 1249 AX: []int64{1, 2, 3}, 1250 AY: []*int64{converter.Int64Ptr(1), converter.Int64Ptr(2), converter.Int64Ptr(3)}, 1251 S0: "abc", 1252 S1: converter.StringPtr("abc"), 1253 } 1254 err = Valid(&ok0Object, "#all", "") 1255 if err != nil { 1256 t.Error(err) 1257 return 1258 } 1259 ok1Object := struct { 1260 A0 int64 `json:"a0" valid:"a0,r|i,r:0"` 1261 A1 *int64 `json:"a1" valid:"a1,r|i,r:0;"` 1262 AX []int64 `json:"ax" valid:"ax,r|i,r:0;"` 1263 AY []*int64 `json:"ay" valid:"ay,r|i,r:0;"` 1264 S0 string `json:"s0" valid:"s0,r|s,l:0;"` 1265 S1 *string `json:"s1" valid:"s1,r|s,l:0;"` 1266 XX string `json:"xx"` 1267 }{ 1268 A0: 100, 1269 AX: []int64{1, 2, 3}, 1270 } 1271 err = Valid(&ok1Object, "#all", "a1,ay,s0,s1") 1272 if err != nil { 1273 t.Error(err) 1274 return 1275 } 1276 err = Valid(&ok1Object, "#all", "^a0,ax") 1277 if err != nil { 1278 t.Error(err) 1279 return 1280 } 1281 ok2Object := struct { 1282 A0 int64 `json:"a0" valid:"a0,r|i,r:0"` 1283 Simple `filter:"inline"` 1284 }{ 1285 A0: 100, 1286 Simple: Simple{ 1287 A0: 100, 1288 A1: converter.Int64Ptr(100), 1289 AX: []int64{100}, 1290 }, 1291 } 1292 err = Valid(&ok2Object, "#all", "") 1293 if err != nil { 1294 t.Error(err) 1295 return 1296 } 1297 ok2Object.A0 = 0 1298 err = Valid(&ok2Object, "#all", "a0") 1299 if err != nil { 1300 t.Error(err) 1301 return 1302 } 1303 ok2Object.A0 = 0 1304 err = Valid(&ok2Object, "#all", "") 1305 if err == nil { 1306 t.Error(err) 1307 return 1308 } 1309 ok2Object.A0 = -1 1310 err = Valid(&ok2Object, "#all", "a0") 1311 if err == nil { 1312 t.Error(err) 1313 return 1314 } 1315 ok3Object := struct { 1316 Title string `json:"title,omitempty" valid:"title,r|s,l:0;"` /* the product title */ 1317 TitleSub *string `json:"title_sub,omitempty" valid:"title_sub,r|s,l:0;"` /* the product sub title */ 1318 }{ 1319 Title: "abc", 1320 } 1321 err = Valid(&ok3Object, "#all", "title_sub") 1322 if err != nil { 1323 t.Error(err) 1324 return 1325 } 1326 ok4Object := struct { 1327 Title string `json:"title,omitempty" valid:"title,r|s,l:0;"` /* the product title */ 1328 TitleSub *string `json:"title_sub,omitempty" valid:"title_sub,r|s,l:0;"` /* the product sub title */ 1329 }{ 1330 Title: "abc", 1331 TitleSub: converter.StringPtr(""), 1332 } 1333 err = Valid(&ok4Object, "#all", "title_sub") 1334 if err != nil { 1335 t.Error(err) 1336 return 1337 } 1338 ok5Object := struct { 1339 Title string `json:"title,omitempty" valid:"title,r|s,l:0;"` /* the product title */ 1340 TitleSub *string `json:"title_sub,omitempty" valid:"title_sub,o|s,l:0;"` /* the product sub title */ 1341 }{ 1342 Title: "abc", 1343 TitleSub: converter.StringPtr(""), 1344 } 1345 err = Valid(&ok5Object, "#all", "") 1346 if err != nil { 1347 t.Error(err) 1348 return 1349 } 1350 ok6Object := struct { 1351 Title string `json:"title,omitempty" valid:"title,r|s,l:0;"` /* the product title */ 1352 TitleSub *string `json:"title_sub,omitempty" valid:"title_sub,o|s,l:0;"` /* the product sub title */ 1353 Value int `json:"value" valid:"value,r|i,r:0"` 1354 }{ 1355 Title: "abc", 1356 TitleSub: converter.StringPtr(""), 1357 } 1358 err = Valid(&ok6Object, "title,value|title_sub#all", "") 1359 if err != nil { 1360 t.Error(err) 1361 return 1362 } 1363 err6Object := struct { 1364 Title string `json:"title,omitempty" valid:"title,r|s,l:0;"` /* the product title */ 1365 TitleSub *string `json:"title_sub,omitempty" valid:"title_sub,r|s,l:0;"` /* the product sub title */ 1366 Value int `json:"value" valid:"value,r|i,r:0"` 1367 }{ 1368 Title: "abc", 1369 TitleSub: converter.StringPtr(""), 1370 } 1371 err = Valid(&err6Object, "title,value|title_sub#all", "") 1372 if err == nil { 1373 t.Error(err) 1374 return 1375 } 1376 } 1377 1378 func TestValidArgs(t *testing.T) { 1379 { 1380 simple := &Simple{} 1381 var b0, c0 string 1382 formats, args := ValidArgs(simple, "#all", `b0,r|s,l:0`, &b0, `c0,r|s,l:0;`, &c0) 1383 if len(formats) < 1 || strings.Count(formats, ";") != 5 || len(args) != 5 { 1384 t.Errorf("%v,%v,%v", formats, strings.Count(formats, ";"), len(args)) 1385 return 1386 } 1387 err := ValidAttrFormat(formats, ValueGetterF(func(key string) (interface{}, error) { 1388 return "1", nil 1389 }), true, args...) 1390 if err != nil { 1391 t.Error(err) 1392 return 1393 } 1394 } 1395 { 1396 simpleArgs := &SimpleArgs{} 1397 formats, args := ValidArgs(simpleArgs, "#all") 1398 if len(formats) < 1 || strings.Count(formats, ";") != 5 || len(args) != 5 { 1399 t.Errorf("%v,%v,%v", formats, strings.Count(formats, ";"), len(args)) 1400 return 1401 } 1402 } 1403 1404 } 1405 1406 type SetterTestObject struct { 1407 A0 int64 1408 } 1409 1410 func (s *SetterTestObject) Set(v interface{}) (err error) { 1411 s.A0 = v.(int64) 1412 return 1413 } 1414 1415 type SetterTestArray []SetterTestObject 1416 1417 func (s *SetterTestArray) Set(v interface{}) (err error) { 1418 value, err := converter.Int64Val(v) 1419 if err == nil { 1420 *s = append(*s, SetterTestObject{A0: value}) 1421 } 1422 return 1423 } 1424 1425 func TestSetter(t *testing.T) { 1426 var err error 1427 //setter 1428 var setter0 SetterTestObject 1429 var setter1 SetterTestArray 1430 err = ValidSetValue(&setter0, int64(0)) 1431 if err != nil { 1432 t.Error(err) 1433 return 1434 } 1435 err = ValidAttrFormat(`x,R|I,R:0;x,R|I,R:0;x,R|I,R:0;`, ValueGetterF(func(key string) (interface{}, error) { 1436 return "1", nil 1437 }), true, &setter0, &setter1, ValueSetterF(func(i interface{}) error { 1438 if v, err := converter.Int64Val(i); err != nil || v != 1 { 1439 return fmt.Errorf("error") 1440 } 1441 return nil 1442 })) 1443 if err != nil || setter0.A0 != 1 || len(setter1) != 1 || setter1[0].A0 != 1 { 1444 t.Error(err) 1445 return 1446 } 1447 //not supported 1448 simple := &Simple{} 1449 err = ValidAttrFormat(`x,R|I,R:0`, ValueGetterF(func(key string) (interface{}, error) { 1450 return "1", nil 1451 }), true, simple) 1452 if err == nil { 1453 t.Error(err) 1454 return 1455 } 1456 //set error 1457 err = ValidAttrFormat(`x,R|I,R:0;`, ValueGetterF(func(key string) (interface{}, error) { 1458 return "x", nil 1459 }), true, &setter0) 1460 if err == nil { 1461 t.Error(err) 1462 return 1463 } 1464 fmt.Println(err) 1465 //set error 1466 err = ValidAttrFormat(`x,R|I,R:0;`, ValueGetterF(func(key string) (interface{}, error) { 1467 return "x", nil 1468 }), true, &setter1) 1469 if err == nil { 1470 t.Error(err) 1471 return 1472 } 1473 fmt.Println(err) 1474 //set error 1475 err = ValidAttrFormat(`x,R|S,L:0;`, ValueGetterF(func(key string) (interface{}, error) { 1476 return "x", nil 1477 }), true, &setter1) 1478 if err == nil { 1479 t.Error(err) 1480 return 1481 } 1482 fmt.Println(err) 1483 } 1484 1485 type ScannerTestObject struct { 1486 A0 int64 1487 } 1488 1489 func (s *ScannerTestObject) Scan(v interface{}) (err error) { 1490 s.A0 = v.(int64) 1491 return 1492 } 1493 1494 type ScannerTestArray []ScannerTestObject 1495 1496 func (s *ScannerTestArray) Scan(v interface{}) (err error) { 1497 value, err := converter.Int64Val(v) 1498 if err == nil { 1499 *s = append(*s, ScannerTestObject{A0: value}) 1500 } 1501 return 1502 } 1503 1504 func TestScanner(t *testing.T) { 1505 var err error 1506 //setter 1507 var setter0 ScannerTestObject 1508 var setter1 ScannerTestArray 1509 err = ValidSetValue(&setter0, int64(0)) 1510 if err != nil { 1511 t.Error(err) 1512 return 1513 } 1514 err = ValidAttrFormat(`x,R|I,R:0;x,R|I,R:0;x,R|I,R:0;`, ValueGetterF(func(key string) (interface{}, error) { 1515 return "1", nil 1516 }), true, &setter0, &setter1, ValueSetterF(func(i interface{}) error { 1517 if v, err := converter.Int64Val(i); err != nil || v != 1 { 1518 return fmt.Errorf("error") 1519 } 1520 return nil 1521 })) 1522 if err != nil || setter0.A0 != 1 || len(setter1) != 1 || setter1[0].A0 != 1 { 1523 t.Error(err) 1524 return 1525 } 1526 //not supported 1527 simple := &Simple{} 1528 err = ValidAttrFormat(`x,R|I,R:0`, ValueGetterF(func(key string) (interface{}, error) { 1529 return "1", nil 1530 }), true, simple) 1531 if err == nil { 1532 t.Error(err) 1533 return 1534 } 1535 //set error 1536 err = ValidAttrFormat(`x,R|I,R:0;`, ValueGetterF(func(key string) (interface{}, error) { 1537 return "x", nil 1538 }), true, &setter0) 1539 if err == nil { 1540 t.Error(err) 1541 return 1542 } 1543 fmt.Println(err) 1544 //set error 1545 err = ValidAttrFormat(`x,R|I,R:0;`, ValueGetterF(func(key string) (interface{}, error) { 1546 return "x", nil 1547 }), true, &setter1) 1548 if err == nil { 1549 t.Error(err) 1550 return 1551 } 1552 fmt.Println(err) 1553 //set error 1554 err = ValidAttrFormat(`x,R|S,L:0;`, ValueGetterF(func(key string) (interface{}, error) { 1555 return "x", nil 1556 }), true, &setter1) 1557 if err == nil { 1558 t.Error(err) 1559 return 1560 } 1561 fmt.Println(err) 1562 } 1563 1564 type StringDef string 1565 type IntDef int64 1566 type FloatDef float64 1567 type StringDefArray []StringDef 1568 type IntDefArray []IntDef 1569 type FloatDefArray []FloatDef 1570 1571 func TestValidDef(t *testing.T) { 1572 getter := ValueGetterF(func(key string) (interface{}, error) { return "1", nil }) 1573 // 1574 var strVal StringDef 1575 var intVal IntDef 1576 var floatVal FloatDef 1577 err := ValidAttrFormat(` 1578 v,r|s,l:0; 1579 v,r|i,r:0; 1580 v,r|f,r:0; 1581 `, getter, true, &strVal, &intVal, &floatVal) 1582 if err != nil || strVal != "1" || intVal != 1 || floatVal != 1 { 1583 t.Error(err) 1584 return 1585 } 1586 var strArr StringDefArray 1587 var intArr IntDefArray 1588 var floatArr FloatDefArray 1589 err = ValidAttrFormat(` 1590 v,r|s,l:0; 1591 v,r|i,r:0; 1592 v,r|f,r:0; 1593 `, getter, true, &strArr, &intArr, &floatArr) 1594 if err != nil || len(strArr) < 1 || len(intArr) < 1 || len(floatArr) < 1 || strArr[0] != "1" || intArr[0] != 1 || floatArr[0] != 1 { 1595 t.Error(err) 1596 return 1597 } 1598 }