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  }