github.com/wangyougui/gf/v2@v2.6.5/util/gvalid/gvalid_z_unit_feature_rule_test.go (about)

     1  // Copyright GoFrame Author(https://goframe.org). All Rights Reserved.
     2  //
     3  // This Source Code Form is subject to the terms of the MIT License.
     4  // If a copy of the MIT was not distributed with this file,
     5  // You can obtain one at https://github.com/wangyougui/gf.
     6  
     7  package gvalid_test
     8  
     9  import (
    10  	"testing"
    11  	"time"
    12  
    13  	"github.com/wangyougui/gf/v2/errors/gcode"
    14  	"github.com/wangyougui/gf/v2/errors/gerror"
    15  	"github.com/wangyougui/gf/v2/frame/g"
    16  	"github.com/wangyougui/gf/v2/os/gctx"
    17  	"github.com/wangyougui/gf/v2/os/gtime"
    18  	"github.com/wangyougui/gf/v2/test/gtest"
    19  	"github.com/wangyougui/gf/v2/util/gtag"
    20  )
    21  
    22  var (
    23  	ctx = gctx.New()
    24  )
    25  
    26  func Test_Check(t *testing.T) {
    27  	gtest.C(t, func(t *gtest.T) {
    28  		rule := "abc:6,16"
    29  		val1 := 0
    30  		val2 := 7
    31  		val3 := 20
    32  		err1 := g.Validator().Data(val1).Rules(rule).Run(ctx)
    33  		err2 := g.Validator().Data(val2).Rules(rule).Run(ctx)
    34  		err3 := g.Validator().Data(val3).Rules(rule).Run(ctx)
    35  		t.Assert(err1, "InvalidRules: abc:6,16")
    36  		t.Assert(err2, "InvalidRules: abc:6,16")
    37  		t.Assert(err3, "InvalidRules: abc:6,16")
    38  	})
    39  }
    40  
    41  func Test_Array(t *testing.T) {
    42  	gtest.C(t, func(t *gtest.T) {
    43  		err := g.Validator().Data("1").Rules("array").Run(ctx)
    44  		t.Assert(err, "The value `1` is not of valid array type")
    45  	})
    46  	gtest.C(t, func(t *gtest.T) {
    47  		err := g.Validator().Data("").Rules("array").Run(ctx)
    48  		t.Assert(err, "The value `` is not of valid array type")
    49  	})
    50  	gtest.C(t, func(t *gtest.T) {
    51  		err := g.Validator().Data("[1,2,3]").Rules("array").Run(ctx)
    52  		t.Assert(err, "")
    53  	})
    54  	gtest.C(t, func(t *gtest.T) {
    55  		err := g.Validator().Data("[]").Rules("array").Run(ctx)
    56  		t.Assert(err, "")
    57  	})
    58  	gtest.C(t, func(t *gtest.T) {
    59  		err := g.Validator().Data([]int{1, 2, 3}).Rules("array").Run(ctx)
    60  		t.Assert(err, "")
    61  	})
    62  	gtest.C(t, func(t *gtest.T) {
    63  		err := g.Validator().Data([]int{}).Rules("array").Run(ctx)
    64  		t.Assert(err, "")
    65  	})
    66  }
    67  
    68  func Test_Required(t *testing.T) {
    69  	if m := g.Validator().Data("1").Rules("required").Run(ctx); m != nil {
    70  		t.Error(m)
    71  	}
    72  	if m := g.Validator().Data("").Rules("required").Run(ctx); m == nil {
    73  		t.Error(m)
    74  	}
    75  	if m := g.Validator().Data("").Assoc(map[string]interface{}{"id": 1, "age": 19}).Rules("required-if: id,1,age,18").Run(ctx); m == nil {
    76  		t.Error("Required校验失败")
    77  	}
    78  	if m := g.Validator().Data("").Assoc(map[string]interface{}{"id": 2, "age": 19}).Rules("required-if: id,1,age,18").Run(ctx); m != nil {
    79  		t.Error("Required校验失败")
    80  	}
    81  }
    82  
    83  func Test_RequiredIf(t *testing.T) {
    84  	gtest.C(t, func(t *gtest.T) {
    85  		rule := "required-if:id,1,age,18"
    86  		t.AssertNE(g.Validator().Data("").Assoc(g.Map{"id": 1}).Rules(rule).Run(ctx), nil)
    87  		t.Assert(g.Validator().Data("").Assoc(g.Map{"id": 0}).Rules(rule).Run(ctx), nil)
    88  		t.AssertNE(g.Validator().Data("").Assoc(g.Map{"age": 18}).Rules(rule).Run(ctx), nil)
    89  		t.Assert(g.Validator().Data("").Assoc(g.Map{"age": 20}).Rules(rule).Run(ctx), nil)
    90  	})
    91  }
    92  
    93  func Test_RequiredUnless(t *testing.T) {
    94  	gtest.C(t, func(t *gtest.T) {
    95  		rule := "required-unless:id,1,age,18"
    96  		t.Assert(g.Validator().Data("").Assoc(g.Map{"id": 1}).Rules(rule).Run(ctx), nil)
    97  		t.AssertNE(g.Validator().Data("").Assoc(g.Map{"id": 0}).Rules(rule).Run(ctx), nil)
    98  		t.Assert(g.Validator().Data("").Assoc(g.Map{"age": 18}).Rules(rule).Run(ctx), nil)
    99  		t.AssertNE(g.Validator().Data("").Assoc(g.Map{"age": 20}).Rules(rule).Run(ctx), nil)
   100  	})
   101  }
   102  
   103  func Test_RequiredWith(t *testing.T) {
   104  	gtest.C(t, func(t *gtest.T) {
   105  		rule := "required-with:id,name"
   106  		val1 := ""
   107  		params1 := g.Map{
   108  			"age": 18,
   109  		}
   110  		params2 := g.Map{
   111  			"id": 100,
   112  		}
   113  		params3 := g.Map{
   114  			"id":   100,
   115  			"name": "john",
   116  		}
   117  		err1 := g.Validator().Data(val1).Assoc(params1).Rules(rule).Run(ctx)
   118  		err2 := g.Validator().Data(val1).Assoc(params2).Rules(rule).Run(ctx)
   119  		err3 := g.Validator().Data(val1).Assoc(params3).Rules(rule).Run(ctx)
   120  		t.Assert(err1, nil)
   121  		t.AssertNE(err2, nil)
   122  		t.AssertNE(err3, nil)
   123  	})
   124  	// time.Time
   125  	gtest.C(t, func(t *gtest.T) {
   126  		rule := "required-with:id,time"
   127  		val1 := ""
   128  		params1 := g.Map{
   129  			"age": 18,
   130  		}
   131  		params2 := g.Map{
   132  			"id": 100,
   133  		}
   134  		params3 := g.Map{
   135  			"time": time.Time{},
   136  		}
   137  		err1 := g.Validator().Data(val1).Assoc(params1).Rules(rule).Run(ctx)
   138  		err2 := g.Validator().Data(val1).Assoc(params2).Rules(rule).Run(ctx)
   139  		err3 := g.Validator().Data(val1).Assoc(params3).Rules(rule).Run(ctx)
   140  		t.Assert(err1, nil)
   141  		t.AssertNE(err2, nil)
   142  		t.Assert(err3, nil)
   143  	})
   144  	gtest.C(t, func(t *gtest.T) {
   145  		rule := "required-with:id,time"
   146  		val1 := ""
   147  		params1 := g.Map{
   148  			"age": 18,
   149  		}
   150  		params2 := g.Map{
   151  			"id": 100,
   152  		}
   153  		params3 := g.Map{
   154  			"time": time.Now(),
   155  		}
   156  		err1 := g.Validator().Data(val1).Assoc(params1).Rules(rule).Run(ctx)
   157  		err2 := g.Validator().Data(val1).Assoc(params2).Rules(rule).Run(ctx)
   158  		err3 := g.Validator().Data(val1).Assoc(params3).Rules(rule).Run(ctx)
   159  		t.Assert(err1, nil)
   160  		t.AssertNE(err2, nil)
   161  		t.AssertNE(err3, nil)
   162  	})
   163  	// gtime.Time
   164  	gtest.C(t, func(t *gtest.T) {
   165  		type UserApiSearch struct {
   166  			Uid       int64       `json:"uid"`
   167  			Nickname  string      `json:"nickname" v:"required-with:Uid"`
   168  			StartTime *gtime.Time `json:"start_time" v:"required-with:EndTime"`
   169  			EndTime   *gtime.Time `json:"end_time" v:"required-with:StartTime"`
   170  		}
   171  		data := UserApiSearch{
   172  			StartTime: nil,
   173  			EndTime:   nil,
   174  		}
   175  		t.Assert(g.Validator().Data(data).Run(ctx), nil)
   176  	})
   177  	gtest.C(t, func(t *gtest.T) {
   178  		type UserApiSearch struct {
   179  			Uid       int64       `json:"uid"`
   180  			Nickname  string      `json:"nickname" v:"required-with:Uid"`
   181  			StartTime *gtime.Time `json:"start_time" v:"required-with:EndTime"`
   182  			EndTime   *gtime.Time `json:"end_time" v:"required-with:StartTime"`
   183  		}
   184  		data := UserApiSearch{
   185  			StartTime: nil,
   186  			EndTime:   gtime.Now(),
   187  		}
   188  		t.AssertNE(g.Validator().Data(data).Run(ctx), nil)
   189  	})
   190  }
   191  
   192  func Test_RequiredWithAll(t *testing.T) {
   193  	gtest.C(t, func(t *gtest.T) {
   194  		rule := "required-with-all:id,name"
   195  		val1 := ""
   196  		params1 := g.Map{
   197  			"age": 18,
   198  		}
   199  		params2 := g.Map{
   200  			"id": 100,
   201  		}
   202  		params3 := g.Map{
   203  			"id":   100,
   204  			"name": "john",
   205  		}
   206  		err1 := g.Validator().Data(val1).Assoc(params1).Rules(rule).Run(ctx)
   207  		err2 := g.Validator().Data(val1).Assoc(params2).Rules(rule).Run(ctx)
   208  		err3 := g.Validator().Data(val1).Assoc(params3).Rules(rule).Run(ctx)
   209  		t.Assert(err1, nil)
   210  		t.Assert(err2, nil)
   211  		t.AssertNE(err3, nil)
   212  	})
   213  }
   214  
   215  func Test_RequiredWithOut(t *testing.T) {
   216  	gtest.C(t, func(t *gtest.T) {
   217  		rule := "required-without:id,name"
   218  		val1 := ""
   219  		params1 := g.Map{
   220  			"age": 18,
   221  		}
   222  		params2 := g.Map{
   223  			"id": 100,
   224  		}
   225  		params3 := g.Map{
   226  			"id":   100,
   227  			"name": "john",
   228  		}
   229  		err1 := g.Validator().Data(val1).Assoc(params1).Rules(rule).Run(ctx)
   230  		err2 := g.Validator().Data(val1).Assoc(params2).Rules(rule).Run(ctx)
   231  		err3 := g.Validator().Data(val1).Assoc(params3).Rules(rule).Run(ctx)
   232  		t.AssertNE(err1, nil)
   233  		t.AssertNE(err2, nil)
   234  		t.Assert(err3, nil)
   235  	})
   236  }
   237  
   238  func Test_RequiredWithOutAll(t *testing.T) {
   239  	gtest.C(t, func(t *gtest.T) {
   240  		rule := "required-without-all:id,name"
   241  		val1 := ""
   242  		params1 := g.Map{
   243  			"age": 18,
   244  		}
   245  		params2 := g.Map{
   246  			"id": 100,
   247  		}
   248  		params3 := g.Map{
   249  			"id":   100,
   250  			"name": "john",
   251  		}
   252  		err1 := g.Validator().Data(val1).Assoc(params1).Rules(rule).Run(ctx)
   253  		err2 := g.Validator().Data(val1).Assoc(params2).Rules(rule).Run(ctx)
   254  		err3 := g.Validator().Data(val1).Assoc(params3).Rules(rule).Run(ctx)
   255  		t.AssertNE(err1, nil)
   256  		t.Assert(err2, nil)
   257  		t.Assert(err3, nil)
   258  	})
   259  }
   260  
   261  func Test_Date(t *testing.T) {
   262  	gtest.C(t, func(t *gtest.T) {
   263  		rule := "date"
   264  		val1 := "2010"
   265  		val2 := "201011"
   266  		val3 := "20101101"
   267  		val4 := "2010-11-01"
   268  		val5 := "2010.11.01"
   269  		val6 := "2010/11/01"
   270  		val7 := "2010=11=01"
   271  		val8 := "123"
   272  		err1 := g.Validator().Data(val1).Rules(rule).Run(ctx)
   273  		err2 := g.Validator().Data(val2).Rules(rule).Run(ctx)
   274  		err3 := g.Validator().Data(val3).Rules(rule).Run(ctx)
   275  		err4 := g.Validator().Data(val4).Rules(rule).Run(ctx)
   276  		err5 := g.Validator().Data(val5).Rules(rule).Run(ctx)
   277  		err6 := g.Validator().Data(val6).Rules(rule).Run(ctx)
   278  		err7 := g.Validator().Data(val7).Rules(rule).Run(ctx)
   279  		err8 := g.Validator().Data(val8).Rules(rule).Run(ctx)
   280  		t.AssertNE(err1, nil)
   281  		t.AssertNE(err2, nil)
   282  		t.Assert(err3, nil)
   283  		t.Assert(err4, nil)
   284  		t.Assert(err5, nil)
   285  		t.Assert(err6, nil)
   286  		t.AssertNE(err7, nil)
   287  		t.AssertNE(err8, nil)
   288  	})
   289  }
   290  
   291  func Test_Datetime(t *testing.T) {
   292  	gtest.C(t, func(t *gtest.T) {
   293  		m := g.MapStrBool{
   294  			"2010":                false,
   295  			"2010.11":             false,
   296  			"2010-11-01":          false,
   297  			"2010-11-01 12:00":    false,
   298  			"2010-11-01 12:00:00": true,
   299  			"2010.11.01 12:00:00": false,
   300  		}
   301  		for k, v := range m {
   302  			err := g.Validator().Rules(`datetime`).Data(k).Run(ctx)
   303  			if v {
   304  				t.AssertNil(err)
   305  			} else {
   306  				t.AssertNE(err, nil)
   307  			}
   308  		}
   309  	})
   310  }
   311  
   312  func Test_DateFormat(t *testing.T) {
   313  	gtest.C(t, func(t *gtest.T) {
   314  		m := g.MapStrStr{
   315  			"2010":                 "date-format:Y",
   316  			"201011":               "date-format:Ym",
   317  			"2010.11":              "date-format:Y.m",
   318  			"201011-01":            "date-format:Ym-d",
   319  			"2010~11~01":           "date-format:Y~m~d",
   320  			"2010-11~01":           "date-format:Y-m~d",
   321  			"2023-09-10T19:46:31Z": "date-format:2006-01-02\\T15:04:05Z07:00", // RFC3339
   322  		}
   323  		for k, v := range m {
   324  			err := g.Validator().Data(k).Rules(v).Run(ctx)
   325  			t.AssertNil(err)
   326  		}
   327  	})
   328  	gtest.C(t, func(t *gtest.T) {
   329  		errM := g.MapStrStr{
   330  			"2010-11~01": "date-format:Y~m~d",
   331  		}
   332  		for k, v := range errM {
   333  			err := g.Validator().Data(k).Rules(v).Run(ctx)
   334  			t.AssertNE(err, nil)
   335  		}
   336  	})
   337  	gtest.C(t, func(t *gtest.T) {
   338  		t1 := gtime.Now()
   339  		t2 := time.Time{}
   340  		err1 := g.Validator().Data(t1).Rules("date-format:Y").Run(ctx)
   341  		err2 := g.Validator().Data(t2).Rules("date-format:Y").Run(ctx)
   342  		t.Assert(err1, nil)
   343  		t.AssertNE(err2, nil)
   344  	})
   345  }
   346  
   347  func Test_Email(t *testing.T) {
   348  	gtest.C(t, func(t *gtest.T) {
   349  		rule := "email"
   350  		value1 := "m@johngcn"
   351  		value2 := "m@www@johngcn"
   352  		value3 := "m-m_m@mail.johng.cn"
   353  		value4 := "m.m-m@johng.cn"
   354  		err1 := g.Validator().Data(value1).Rules(rule).Run(ctx)
   355  		err2 := g.Validator().Data(value2).Rules(rule).Run(ctx)
   356  		err3 := g.Validator().Data(value3).Rules(rule).Run(ctx)
   357  		err4 := g.Validator().Data(value4).Rules(rule).Run(ctx)
   358  		t.AssertNE(err1, nil)
   359  		t.AssertNE(err2, nil)
   360  		t.Assert(err3, nil)
   361  		t.Assert(err4, nil)
   362  	})
   363  }
   364  
   365  func Test_Phone(t *testing.T) {
   366  	gtest.C(t, func(t *gtest.T) {
   367  		err1 := g.Validator().Data("1361990897").Rules("phone").Run(ctx)
   368  		err2 := g.Validator().Data("13619908979").Rules("phone").Run(ctx)
   369  		err3 := g.Validator().Data("16719908979").Rules("phone").Run(ctx)
   370  		err4 := g.Validator().Data("19719908989").Rules("phone").Run(ctx)
   371  		t.AssertNE(err1.String(), nil)
   372  		t.Assert(err2, nil)
   373  		t.Assert(err3, nil)
   374  		t.Assert(err4, nil)
   375  	})
   376  }
   377  
   378  func Test_PhoneLoose(t *testing.T) {
   379  	gtest.C(t, func(t *gtest.T) {
   380  		err1 := g.Validator().Data("13333333333").Rules("phone-loose").Run(ctx)
   381  		err2 := g.Validator().Data("15555555555").Rules("phone-loose").Run(ctx)
   382  		err3 := g.Validator().Data("16666666666").Rules("phone-loose").Run(ctx)
   383  		err4 := g.Validator().Data("23333333333").Rules("phone-loose").Run(ctx)
   384  		err5 := g.Validator().Data("1333333333").Rules("phone-loose").Run(ctx)
   385  		err6 := g.Validator().Data("10333333333").Rules("phone-loose").Run(ctx)
   386  		t.Assert(err1, nil)
   387  		t.Assert(err2, nil)
   388  		t.Assert(err3, nil)
   389  		t.AssertNE(err4, nil)
   390  		t.AssertNE(err5, nil)
   391  		t.AssertNE(err6, nil)
   392  	})
   393  }
   394  
   395  func Test_Telephone(t *testing.T) {
   396  	gtest.C(t, func(t *gtest.T) {
   397  		rule := "telephone"
   398  		val1 := "869265"
   399  		val2 := "028-869265"
   400  		val3 := "86292651"
   401  		val4 := "028-8692651"
   402  		val5 := "0830-8692651"
   403  		err1 := g.Validator().Data(val1).Rules(rule).Run(ctx)
   404  		err2 := g.Validator().Data(val2).Rules(rule).Run(ctx)
   405  		err3 := g.Validator().Data(val3).Rules(rule).Run(ctx)
   406  		err4 := g.Validator().Data(val4).Rules(rule).Run(ctx)
   407  		err5 := g.Validator().Data(val5).Rules(rule).Run(ctx)
   408  		t.AssertNE(err1, nil)
   409  		t.AssertNE(err2, nil)
   410  		t.Assert(err3, nil)
   411  		t.Assert(err4, nil)
   412  		t.Assert(err5, nil)
   413  	})
   414  }
   415  
   416  func Test_Passport(t *testing.T) {
   417  	gtest.C(t, func(t *gtest.T) {
   418  		rule := "passport"
   419  		val1 := "123456"
   420  		val2 := "a12345-6"
   421  		val3 := "aaaaa"
   422  		val4 := "aaaaaa"
   423  		val5 := "a123_456"
   424  		err1 := g.Validator().Data(val1).Rules(rule).Run(ctx)
   425  		err2 := g.Validator().Data(val2).Rules(rule).Run(ctx)
   426  		err3 := g.Validator().Data(val3).Rules(rule).Run(ctx)
   427  		err4 := g.Validator().Data(val4).Rules(rule).Run(ctx)
   428  		err5 := g.Validator().Data(val5).Rules(rule).Run(ctx)
   429  		t.AssertNE(err1, nil)
   430  		t.AssertNE(err2, nil)
   431  		t.AssertNE(err3, nil)
   432  		t.Assert(err4, nil)
   433  		t.Assert(err5, nil)
   434  	})
   435  }
   436  
   437  func Test_Password(t *testing.T) {
   438  	gtest.C(t, func(t *gtest.T) {
   439  		rule := "password"
   440  		val1 := "12345"
   441  		val2 := "aaaaa"
   442  		val3 := "a12345-6"
   443  		val4 := ">,/;'[09-"
   444  		val5 := "a123_456"
   445  		err1 := g.Validator().Data(val1).Rules(rule).Run(ctx)
   446  		err2 := g.Validator().Data(val2).Rules(rule).Run(ctx)
   447  		err3 := g.Validator().Data(val3).Rules(rule).Run(ctx)
   448  		err4 := g.Validator().Data(val4).Rules(rule).Run(ctx)
   449  		err5 := g.Validator().Data(val5).Rules(rule).Run(ctx)
   450  		t.AssertNE(err1, nil)
   451  		t.AssertNE(err2, nil)
   452  		t.Assert(err3, nil)
   453  		t.Assert(err4, nil)
   454  		t.Assert(err5, nil)
   455  	})
   456  }
   457  
   458  func Test_Password2(t *testing.T) {
   459  	gtest.C(t, func(t *gtest.T) {
   460  		rule := "password2"
   461  		val1 := "12345"
   462  		val2 := "Naaaa"
   463  		val3 := "a12345-6"
   464  		val4 := ">,/;'[09-"
   465  		val5 := "a123_456"
   466  		val6 := "Nant1986"
   467  		val7 := "Nant1986!"
   468  		err1 := g.Validator().Data(val1).Rules(rule).Run(ctx)
   469  		err2 := g.Validator().Data(val2).Rules(rule).Run(ctx)
   470  		err3 := g.Validator().Data(val3).Rules(rule).Run(ctx)
   471  		err4 := g.Validator().Data(val4).Rules(rule).Run(ctx)
   472  		err5 := g.Validator().Data(val5).Rules(rule).Run(ctx)
   473  		err6 := g.Validator().Data(val6).Rules(rule).Run(ctx)
   474  		err7 := g.Validator().Data(val7).Rules(rule).Run(ctx)
   475  		t.AssertNE(err1, nil)
   476  		t.AssertNE(err2, nil)
   477  		t.AssertNE(err3, nil)
   478  		t.AssertNE(err4, nil)
   479  		t.AssertNE(err5, nil)
   480  		t.Assert(err6, nil)
   481  		t.Assert(err7, nil)
   482  	})
   483  }
   484  
   485  func Test_Password3(t *testing.T) {
   486  	gtest.C(t, func(t *gtest.T) {
   487  		rule := "password3"
   488  		val1 := "12345"
   489  		val2 := "Naaaa"
   490  		val3 := "a12345-6"
   491  		val4 := ">,/;'[09-"
   492  		val5 := "a123_456"
   493  		val6 := "Nant1986"
   494  		val7 := "Nant1986!"
   495  		err1 := g.Validator().Data(val1).Rules(rule).Run(ctx)
   496  		err2 := g.Validator().Data(val2).Rules(rule).Run(ctx)
   497  		err3 := g.Validator().Data(val3).Rules(rule).Run(ctx)
   498  		err4 := g.Validator().Data(val4).Rules(rule).Run(ctx)
   499  		err5 := g.Validator().Data(val5).Rules(rule).Run(ctx)
   500  		err6 := g.Validator().Data(val6).Rules(rule).Run(ctx)
   501  		err7 := g.Validator().Data(val7).Rules(rule).Run(ctx)
   502  		t.AssertNE(err1, nil)
   503  		t.AssertNE(err2, nil)
   504  		t.AssertNE(err3, nil)
   505  		t.AssertNE(err4, nil)
   506  		t.AssertNE(err5, nil)
   507  		t.AssertNE(err6, nil)
   508  		t.Assert(err7, nil)
   509  	})
   510  }
   511  
   512  func Test_Postcode(t *testing.T) {
   513  	gtest.C(t, func(t *gtest.T) {
   514  		rule := "postcode"
   515  		val1 := "12345"
   516  		val2 := "610036"
   517  		err1 := g.Validator().Data(val1).Rules(rule).Run(ctx)
   518  		err2 := g.Validator().Data(val2).Rules(rule).Run(ctx)
   519  		t.AssertNE(err1, nil)
   520  		t.Assert(err2, nil)
   521  	})
   522  }
   523  
   524  func Test_ResidentId(t *testing.T) {
   525  	gtest.C(t, func(t *gtest.T) {
   526  		rule := "resident-id"
   527  		val1 := "11111111111111"
   528  		val2 := "1111111111111111"
   529  		val3 := "311128500121201"
   530  		val4 := "510521198607185367"
   531  		val5 := "51052119860718536x"
   532  		err1 := g.Validator().Data(val1).Rules(rule).Run(ctx)
   533  		err2 := g.Validator().Data(val2).Rules(rule).Run(ctx)
   534  		err3 := g.Validator().Data(val3).Rules(rule).Run(ctx)
   535  		err4 := g.Validator().Data(val4).Rules(rule).Run(ctx)
   536  		err5 := g.Validator().Data(val5).Rules(rule).Run(ctx)
   537  		t.AssertNE(err1, nil)
   538  		t.AssertNE(err2, nil)
   539  		t.AssertNE(err3, nil)
   540  		t.AssertNE(err4, nil)
   541  		t.Assert(err5, nil)
   542  	})
   543  }
   544  
   545  func Test_BankCard(t *testing.T) {
   546  	gtest.C(t, func(t *gtest.T) {
   547  		rule := "bank-card"
   548  		val1 := "6230514630000424470"
   549  		val2 := "6230514630000424473"
   550  		err1 := g.Validator().Data(val1).Rules(rule).Run(ctx)
   551  		err2 := g.Validator().Data(val2).Rules(rule).Run(ctx)
   552  		t.AssertNE(err1, nil)
   553  		t.Assert(err2, nil)
   554  	})
   555  }
   556  
   557  func Test_QQ(t *testing.T) {
   558  	gtest.C(t, func(t *gtest.T) {
   559  		rule := "qq"
   560  		val1 := "100"
   561  		val2 := "1"
   562  		val3 := "10000"
   563  		val4 := "38996181"
   564  		val5 := "389961817"
   565  		err1 := g.Validator().Data(val1).Rules(rule).Run(ctx)
   566  		err2 := g.Validator().Data(val2).Rules(rule).Run(ctx)
   567  		err3 := g.Validator().Data(val3).Rules(rule).Run(ctx)
   568  		err4 := g.Validator().Data(val4).Rules(rule).Run(ctx)
   569  		err5 := g.Validator().Data(val5).Rules(rule).Run(ctx)
   570  		t.AssertNE(err1, nil)
   571  		t.AssertNE(err2, nil)
   572  		t.Assert(err3, nil)
   573  		t.Assert(err4, nil)
   574  		t.Assert(err5, nil)
   575  	})
   576  }
   577  
   578  func Test_Ip(t *testing.T) {
   579  	if m := g.Validator().Data("10.0.0.1").Rules("ip").Run(ctx); m != nil {
   580  		t.Error(m)
   581  	}
   582  	if m := g.Validator().Data("10.0.0.1").Rules("ipv4").Run(ctx); m != nil {
   583  		t.Error(m)
   584  	}
   585  	if m := g.Validator().Data("0.0.0.0").Rules("ipv4").Run(ctx); m != nil {
   586  		t.Error(m)
   587  	}
   588  	if m := g.Validator().Data("1920.0.0.0").Rules("ipv4").Run(ctx); m == nil {
   589  		t.Error("ipv4校验失败")
   590  	}
   591  	if m := g.Validator().Data("1920.0.0.0").Rules("ip").Run(ctx); m == nil {
   592  		t.Error("ipv4校验失败")
   593  	}
   594  	if m := g.Validator().Data("fe80::5484:7aff:fefe:9799").Rules("ipv6").Run(ctx); m != nil {
   595  		t.Error(m)
   596  	}
   597  	if m := g.Validator().Data("fe80::5484:7aff:fefe:9799123").Rules("ipv6").Run(ctx); m == nil {
   598  		t.Error(m)
   599  	}
   600  	if m := g.Validator().Data("fe80::5484:7aff:fefe:9799").Rules("ip").Run(ctx); m != nil {
   601  		t.Error(m)
   602  	}
   603  	if m := g.Validator().Data("fe80::5484:7aff:fefe:9799123").Rules("ip").Run(ctx); m == nil {
   604  		t.Error(m)
   605  	}
   606  }
   607  
   608  func Test_IPv4(t *testing.T) {
   609  	gtest.C(t, func(t *gtest.T) {
   610  		rule := "ipv4"
   611  		val1 := "0.0.0"
   612  		val2 := "0.0.0.0"
   613  		val3 := "1.1.1.1"
   614  		val4 := "255.255.255.0"
   615  		val5 := "127.0.0.1"
   616  		err1 := g.Validator().Data(val1).Rules(rule).Run(ctx)
   617  		err2 := g.Validator().Data(val2).Rules(rule).Run(ctx)
   618  		err3 := g.Validator().Data(val3).Rules(rule).Run(ctx)
   619  		err4 := g.Validator().Data(val4).Rules(rule).Run(ctx)
   620  		err5 := g.Validator().Data(val5).Rules(rule).Run(ctx)
   621  		t.AssertNE(err1, nil)
   622  		t.Assert(err2, nil)
   623  		t.Assert(err3, nil)
   624  		t.Assert(err4, nil)
   625  		t.Assert(err5, nil)
   626  	})
   627  }
   628  
   629  func Test_IPv6(t *testing.T) {
   630  	gtest.C(t, func(t *gtest.T) {
   631  		rule := "ipv6"
   632  		val1 := "192.168.1.1"
   633  		val2 := "CDCD:910A:2222:5498:8475:1111:3900:2020"
   634  		val3 := "1030::C9B4:FF12:48AA:1A2B"
   635  		val4 := "2000:0:0:0:0:0:0:1"
   636  		val5 := "0000:0000:0000:0000:0000:ffff:c0a8:5909"
   637  		err1 := g.Validator().Data(val1).Rules(rule).Run(ctx)
   638  		err2 := g.Validator().Data(val2).Rules(rule).Run(ctx)
   639  		err3 := g.Validator().Data(val3).Rules(rule).Run(ctx)
   640  		err4 := g.Validator().Data(val4).Rules(rule).Run(ctx)
   641  		err5 := g.Validator().Data(val5).Rules(rule).Run(ctx)
   642  		t.AssertNE(err1, nil)
   643  		t.Assert(err2, nil)
   644  		t.Assert(err3, nil)
   645  		t.Assert(err4, nil)
   646  		t.Assert(err5, nil)
   647  	})
   648  }
   649  
   650  func Test_MAC(t *testing.T) {
   651  	gtest.C(t, func(t *gtest.T) {
   652  		rule := "mac"
   653  		val1 := "192.168.1.1"
   654  		val2 := "44-45-53-54-00-00"
   655  		val3 := "01:00:5e:00:00:00"
   656  		err1 := g.Validator().Data(val1).Rules(rule).Run(ctx)
   657  		err2 := g.Validator().Data(val2).Rules(rule).Run(ctx)
   658  		err3 := g.Validator().Data(val3).Rules(rule).Run(ctx)
   659  		t.AssertNE(err1, nil)
   660  		t.Assert(err2, nil)
   661  		t.Assert(err3, nil)
   662  	})
   663  }
   664  
   665  func Test_URL(t *testing.T) {
   666  	gtest.C(t, func(t *gtest.T) {
   667  		rule := "url"
   668  		val1 := "127.0.0.1"
   669  		val2 := "https://www.baidu.com"
   670  		val3 := "http://127.0.0.1"
   671  		val4 := "file:///tmp/test.txt"
   672  		err1 := g.Validator().Data(val1).Rules(rule).Run(ctx)
   673  		err2 := g.Validator().Data(val2).Rules(rule).Run(ctx)
   674  		err3 := g.Validator().Data(val3).Rules(rule).Run(ctx)
   675  		err4 := g.Validator().Data(val4).Rules(rule).Run(ctx)
   676  		t.AssertNE(err1, nil)
   677  		t.Assert(err2, nil)
   678  		t.Assert(err3, nil)
   679  		t.Assert(err4, nil)
   680  	})
   681  }
   682  
   683  func Test_Domain(t *testing.T) {
   684  	gtest.C(t, func(t *gtest.T) {
   685  		m := g.MapStrBool{
   686  			"localhost":     false,
   687  			"baidu.com":     true,
   688  			"www.baidu.com": true,
   689  			"jn.np":         true,
   690  			"www.jn.np":     true,
   691  			"w.www.jn.np":   true,
   692  			"127.0.0.1":     false,
   693  			"www.360.com":   true,
   694  			"www.360":       false,
   695  			"360":           false,
   696  			"my-gf":         false,
   697  			"my-gf.com":     true,
   698  			"my-gf.360.com": true,
   699  		}
   700  		var err error
   701  		for k, v := range m {
   702  			err = g.Validator().Data(k).Rules("domain").Run(ctx)
   703  			if v {
   704  				// fmt.Println(k)
   705  				t.AssertNil(err)
   706  			} else {
   707  				// fmt.Println(k)
   708  				t.AssertNE(err, nil)
   709  			}
   710  		}
   711  	})
   712  }
   713  
   714  func Test_Length(t *testing.T) {
   715  	rule := "length:6,16"
   716  	if m := g.Validator().Data("123456").Rules(rule).Run(ctx); m != nil {
   717  		t.Error(m)
   718  	}
   719  	if m := g.Validator().Data("12345").Rules(rule).Run(ctx); m == nil {
   720  		t.Error("长度校验失败")
   721  	}
   722  }
   723  
   724  func Test_MinLength(t *testing.T) {
   725  	rule := "min-length:6"
   726  	msgs := map[string]string{
   727  		"min-length": "地址长度至少为{min}位",
   728  	}
   729  	if m := g.Validator().Data("123456").Rules(rule).Run(ctx); m != nil {
   730  		t.Error(m)
   731  	}
   732  	if m := g.Validator().Data("12345").Rules(rule).Run(ctx); m == nil {
   733  		t.Error("长度校验失败")
   734  	}
   735  	if m := g.Validator().Data("12345").Rules(rule).Messages(msgs).Run(ctx); m == nil {
   736  		t.Error("长度校验失败")
   737  	}
   738  
   739  	rule2 := "min-length:abc"
   740  	if m := g.Validator().Data("123456").Rules(rule2).Run(ctx); m == nil {
   741  		t.Error("长度校验失败")
   742  	}
   743  }
   744  
   745  func Test_MaxLength(t *testing.T) {
   746  	rule := "max-length:6"
   747  	msgs := map[string]string{
   748  		"max-length": "地址长度至大为{max}位",
   749  	}
   750  	if m := g.Validator().Data("12345").Rules(rule).Run(ctx); m != nil {
   751  		t.Error(m)
   752  	}
   753  	if m := g.Validator().Data("1234567").Rules(rule).Run(ctx); m == nil {
   754  		t.Error("长度校验失败")
   755  	}
   756  	if m := g.Validator().Data("1234567").Rules(rule).Messages(msgs).Run(ctx); m == nil {
   757  		t.Error("长度校验失败")
   758  	}
   759  
   760  	rule2 := "max-length:abc"
   761  	if m := g.Validator().Data("123456").Rules(rule2).Run(ctx); m == nil {
   762  		t.Error("长度校验失败")
   763  	}
   764  }
   765  
   766  func Test_Size(t *testing.T) {
   767  	rule := "size:5"
   768  	if m := g.Validator().Data("12345").Rules(rule).Run(ctx); m != nil {
   769  		t.Error(m)
   770  	}
   771  	if m := g.Validator().Data("123456").Rules(rule).Run(ctx); m == nil {
   772  		t.Error("长度校验失败")
   773  	}
   774  }
   775  
   776  func Test_Between(t *testing.T) {
   777  	rule := "between:6.01, 10.01"
   778  	if m := g.Validator().Data(10).Rules(rule).Run(ctx); m != nil {
   779  		t.Error(m)
   780  	}
   781  	if m := g.Validator().Data(10.02).Rules(rule).Run(ctx); m == nil {
   782  		t.Error("大小范围校验失败")
   783  	}
   784  	if m := g.Validator().Data("a").Rules(rule).Run(ctx); m == nil {
   785  		t.Error("大小范围校验失败")
   786  	}
   787  }
   788  
   789  func Test_Min(t *testing.T) {
   790  	gtest.C(t, func(t *gtest.T) {
   791  		rule := "min:100"
   792  		val1 := "1"
   793  		val2 := "99"
   794  		val3 := "100"
   795  		val4 := "1000"
   796  		val5 := "a"
   797  		err1 := g.Validator().Data(val1).Rules(rule).Run(ctx)
   798  		err2 := g.Validator().Data(val2).Rules(rule).Run(ctx)
   799  		err3 := g.Validator().Data(val3).Rules(rule).Run(ctx)
   800  		err4 := g.Validator().Data(val4).Rules(rule).Run(ctx)
   801  		err5 := g.Validator().Data(val5).Rules(rule).Run(ctx)
   802  		t.AssertNE(err1, nil)
   803  		t.AssertNE(err2, nil)
   804  		t.Assert(err3, nil)
   805  		t.Assert(err4, nil)
   806  		t.AssertNE(err5, nil)
   807  
   808  		rule2 := "min:a"
   809  		err6 := g.Validator().Data(val1).Rules(rule2).Run(ctx)
   810  		t.AssertNE(err6, nil)
   811  	})
   812  }
   813  
   814  func Test_Max(t *testing.T) {
   815  	gtest.C(t, func(t *gtest.T) {
   816  		rule := "max:100"
   817  		val1 := "1"
   818  		val2 := "99"
   819  		val3 := "100"
   820  		val4 := "1000"
   821  		val5 := "a"
   822  		err1 := g.Validator().Data(val1).Rules(rule).Run(ctx)
   823  		err2 := g.Validator().Data(val2).Rules(rule).Run(ctx)
   824  		err3 := g.Validator().Data(val3).Rules(rule).Run(ctx)
   825  		err4 := g.Validator().Data(val4).Rules(rule).Run(ctx)
   826  		err5 := g.Validator().Data(val5).Rules(rule).Run(ctx)
   827  		t.Assert(err1, nil)
   828  		t.Assert(err2, nil)
   829  		t.Assert(err3, nil)
   830  		t.AssertNE(err4, nil)
   831  		t.AssertNE(err5, nil)
   832  
   833  		rule2 := "max:a"
   834  		err6 := g.Validator().Data(val1).Rules(rule2).Run(ctx)
   835  		t.AssertNE(err6, nil)
   836  	})
   837  }
   838  
   839  func Test_Json(t *testing.T) {
   840  	gtest.C(t, func(t *gtest.T) {
   841  		rule := "json"
   842  		val1 := ""
   843  		val2 := "."
   844  		val3 := "{}"
   845  		val4 := "[]"
   846  		val5 := "[1,2,3,4]"
   847  		val6 := `{"list":[1,2,3,4]}`
   848  		err1 := g.Validator().Data(val1).Rules(rule).Run(ctx)
   849  		err2 := g.Validator().Data(val2).Rules(rule).Run(ctx)
   850  		err3 := g.Validator().Data(val3).Rules(rule).Run(ctx)
   851  		err4 := g.Validator().Data(val4).Rules(rule).Run(ctx)
   852  		err5 := g.Validator().Data(val5).Rules(rule).Run(ctx)
   853  		err6 := g.Validator().Data(val6).Rules(rule).Run(ctx)
   854  		t.AssertNE(err1, nil)
   855  		t.AssertNE(err2, nil)
   856  		t.Assert(err3, nil)
   857  		t.Assert(err4, nil)
   858  		t.Assert(err5, nil)
   859  		t.Assert(err6, nil)
   860  	})
   861  }
   862  
   863  func Test_Integer(t *testing.T) {
   864  	gtest.C(t, func(t *gtest.T) {
   865  		rule := "integer"
   866  		val1 := ""
   867  		val2 := "1.0"
   868  		val3 := "001"
   869  		val4 := "1"
   870  		val5 := "100"
   871  		val6 := `999999999`
   872  		err1 := g.Validator().Data(val1).Rules(rule).Run(ctx)
   873  		err2 := g.Validator().Data(val2).Rules(rule).Run(ctx)
   874  		err3 := g.Validator().Data(val3).Rules(rule).Run(ctx)
   875  		err4 := g.Validator().Data(val4).Rules(rule).Run(ctx)
   876  		err5 := g.Validator().Data(val5).Rules(rule).Run(ctx)
   877  		err6 := g.Validator().Data(val6).Rules(rule).Run(ctx)
   878  		t.AssertNE(err1, nil)
   879  		t.AssertNE(err2, nil)
   880  		t.Assert(err3, nil)
   881  		t.Assert(err4, nil)
   882  		t.Assert(err5, nil)
   883  		t.Assert(err6, nil)
   884  	})
   885  }
   886  
   887  func Test_Float(t *testing.T) {
   888  	gtest.C(t, func(t *gtest.T) {
   889  		rule := "float"
   890  		val1 := ""
   891  		val2 := "a"
   892  		val3 := "1"
   893  		val4 := "1.0"
   894  		val5 := "1.1"
   895  		val6 := `0.1`
   896  		err1 := g.Validator().Data(val1).Rules(rule).Run(ctx)
   897  		err2 := g.Validator().Data(val2).Rules(rule).Run(ctx)
   898  		err3 := g.Validator().Data(val3).Rules(rule).Run(ctx)
   899  		err4 := g.Validator().Data(val4).Rules(rule).Run(ctx)
   900  		err5 := g.Validator().Data(val5).Rules(rule).Run(ctx)
   901  		err6 := g.Validator().Data(val6).Rules(rule).Run(ctx)
   902  		t.AssertNE(err1, nil)
   903  		t.AssertNE(err2, nil)
   904  		t.Assert(err3, nil)
   905  		t.Assert(err4, nil)
   906  		t.Assert(err5, nil)
   907  		t.Assert(err6, nil)
   908  	})
   909  }
   910  
   911  func Test_Boolean(t *testing.T) {
   912  	gtest.C(t, func(t *gtest.T) {
   913  		rule := "boolean"
   914  		val1 := "a"
   915  		val2 := "-"
   916  		val3 := ""
   917  		val4 := "1"
   918  		val5 := "true"
   919  		val6 := `off`
   920  		err1 := g.Validator().Data(val1).Rules(rule).Run(ctx)
   921  		err2 := g.Validator().Data(val2).Rules(rule).Run(ctx)
   922  		err3 := g.Validator().Data(val3).Rules(rule).Run(ctx)
   923  		err4 := g.Validator().Data(val4).Rules(rule).Run(ctx)
   924  		err5 := g.Validator().Data(val5).Rules(rule).Run(ctx)
   925  		err6 := g.Validator().Data(val6).Rules(rule).Run(ctx)
   926  		t.AssertNE(err1, nil)
   927  		t.AssertNE(err2, nil)
   928  		t.Assert(err3, nil)
   929  		t.Assert(err4, nil)
   930  		t.Assert(err5, nil)
   931  		t.Assert(err6, nil)
   932  	})
   933  }
   934  
   935  func Test_Same(t *testing.T) {
   936  	gtest.C(t, func(t *gtest.T) {
   937  		rule := "same:id"
   938  		val1 := "100"
   939  		params1 := g.Map{
   940  			"age": 18,
   941  		}
   942  		params2 := g.Map{
   943  			"id": 100,
   944  		}
   945  		params3 := g.Map{
   946  			"id":   100,
   947  			"name": "john",
   948  		}
   949  		err1 := g.Validator().Data(val1).Assoc(params1).Rules(rule).Run(ctx)
   950  		err2 := g.Validator().Data(val1).Assoc(params2).Rules(rule).Run(ctx)
   951  		err3 := g.Validator().Data(val1).Assoc(params3).Rules(rule).Run(ctx)
   952  		t.AssertNE(err1, nil)
   953  		t.Assert(err2, nil)
   954  		t.Assert(err3, nil)
   955  	})
   956  }
   957  
   958  func Test_Different(t *testing.T) {
   959  	gtest.C(t, func(t *gtest.T) {
   960  		rule := "different:id"
   961  		val1 := "100"
   962  		params1 := g.Map{
   963  			"age": 18,
   964  		}
   965  		params2 := g.Map{
   966  			"id": 100,
   967  		}
   968  		params3 := g.Map{
   969  			"id":   100,
   970  			"name": "john",
   971  		}
   972  		err1 := g.Validator().Data(val1).Assoc(params1).Rules(rule).Run(ctx)
   973  		err2 := g.Validator().Data(val1).Assoc(params2).Rules(rule).Run(ctx)
   974  		err3 := g.Validator().Data(val1).Assoc(params3).Rules(rule).Run(ctx)
   975  		t.Assert(err1, nil)
   976  		t.AssertNE(err2, nil)
   977  		t.AssertNE(err3, nil)
   978  	})
   979  }
   980  
   981  func Test_EQ(t *testing.T) {
   982  	gtest.C(t, func(t *gtest.T) {
   983  		rule := "eq:id"
   984  		val1 := "100"
   985  		params1 := g.Map{
   986  			"age": 18,
   987  		}
   988  		params2 := g.Map{
   989  			"id": 100,
   990  		}
   991  		params3 := g.Map{
   992  			"id":   100,
   993  			"name": "john",
   994  		}
   995  		err1 := g.Validator().Data(val1).Assoc(params1).Rules(rule).Run(ctx)
   996  		err2 := g.Validator().Data(val1).Assoc(params2).Rules(rule).Run(ctx)
   997  		err3 := g.Validator().Data(val1).Assoc(params3).Rules(rule).Run(ctx)
   998  		t.AssertNE(err1, nil)
   999  		t.Assert(err2, nil)
  1000  		t.Assert(err3, nil)
  1001  	})
  1002  }
  1003  
  1004  func Test_Not_EQ(t *testing.T) {
  1005  	gtest.C(t, func(t *gtest.T) {
  1006  		rule := "not-eq:id"
  1007  		val1 := "100"
  1008  		params1 := g.Map{
  1009  			"age": 18,
  1010  		}
  1011  		params2 := g.Map{
  1012  			"id": 100,
  1013  		}
  1014  		params3 := g.Map{
  1015  			"id":   100,
  1016  			"name": "john",
  1017  		}
  1018  		err1 := g.Validator().Data(val1).Assoc(params1).Rules(rule).Run(ctx)
  1019  		err2 := g.Validator().Data(val1).Assoc(params2).Rules(rule).Run(ctx)
  1020  		err3 := g.Validator().Data(val1).Assoc(params3).Rules(rule).Run(ctx)
  1021  		t.Assert(err1, nil)
  1022  		t.AssertNE(err2, nil)
  1023  		t.AssertNE(err3, nil)
  1024  	})
  1025  }
  1026  
  1027  func Test_In(t *testing.T) {
  1028  	gtest.C(t, func(t *gtest.T) {
  1029  		rule := "in:100,200"
  1030  		val1 := ""
  1031  		val2 := "1"
  1032  		val3 := "100"
  1033  		val4 := "200"
  1034  		err1 := g.Validator().Data(val1).Rules(rule).Run(ctx)
  1035  		err2 := g.Validator().Data(val2).Rules(rule).Run(ctx)
  1036  		err3 := g.Validator().Data(val3).Rules(rule).Run(ctx)
  1037  		err4 := g.Validator().Data(val4).Rules(rule).Run(ctx)
  1038  		t.AssertNE(err1, nil)
  1039  		t.AssertNE(err2, nil)
  1040  		t.Assert(err3, nil)
  1041  		t.Assert(err4, nil)
  1042  	})
  1043  }
  1044  
  1045  func Test_NotIn(t *testing.T) {
  1046  	gtest.C(t, func(t *gtest.T) {
  1047  		rule := "not-in:100"
  1048  		val1 := ""
  1049  		val2 := "1"
  1050  		val3 := "100"
  1051  		val4 := "200"
  1052  		err1 := g.Validator().Data(val1).Rules(rule).Run(ctx)
  1053  		err2 := g.Validator().Data(val2).Rules(rule).Run(ctx)
  1054  		err3 := g.Validator().Data(val3).Rules(rule).Run(ctx)
  1055  		err4 := g.Validator().Data(val4).Rules(rule).Run(ctx)
  1056  		t.Assert(err1, nil)
  1057  		t.Assert(err2, nil)
  1058  		t.AssertNE(err3, nil)
  1059  		t.Assert(err4, nil)
  1060  	})
  1061  	gtest.C(t, func(t *gtest.T) {
  1062  		rule := "not-in:100,200"
  1063  		val1 := ""
  1064  		val2 := "1"
  1065  		val3 := "100"
  1066  		val4 := "200"
  1067  		err1 := g.Validator().Data(val1).Rules(rule).Run(ctx)
  1068  		err2 := g.Validator().Data(val2).Rules(rule).Run(ctx)
  1069  		err3 := g.Validator().Data(val3).Rules(rule).Run(ctx)
  1070  		err4 := g.Validator().Data(val4).Rules(rule).Run(ctx)
  1071  		t.Assert(err1, nil)
  1072  		t.Assert(err2, nil)
  1073  		t.AssertNE(err3, nil)
  1074  		t.AssertNE(err4, nil)
  1075  	})
  1076  }
  1077  
  1078  func Test_Regex1(t *testing.T) {
  1079  	rule := `regex:\d{6}|\D{6}|length:6,16`
  1080  	if m := g.Validator().Data("123456").Rules(rule).Run(ctx); m != nil {
  1081  		t.Error(m)
  1082  	}
  1083  	if m := g.Validator().Data("abcde6").Rules(rule).Run(ctx); m == nil {
  1084  		t.Error("校验失败")
  1085  	}
  1086  }
  1087  
  1088  func Test_Regex2(t *testing.T) {
  1089  	gtest.C(t, func(t *gtest.T) {
  1090  		rule := `required|min-length:6|regex:^data:image\/(jpeg|png);base64,`
  1091  		str1 := ""
  1092  		str2 := "data"
  1093  		str3 := "data:image/jpeg;base64,/9jrbattq22r"
  1094  		err1 := g.Validator().Data(str1).Rules(rule).Run(ctx)
  1095  		err2 := g.Validator().Data(str2).Rules(rule).Run(ctx)
  1096  		err3 := g.Validator().Data(str3).Rules(rule).Run(ctx)
  1097  		t.AssertNE(err1, nil)
  1098  		t.AssertNE(err2, nil)
  1099  		t.Assert(err3, nil)
  1100  
  1101  		t.AssertNE(err1.Map()["required"], nil)
  1102  		t.AssertNE(err2.Map()["min-length"], nil)
  1103  	})
  1104  }
  1105  
  1106  func Test_Not_Regex(t *testing.T) {
  1107  	rule := `not-regex:\d{6}|\D{6}|length:6,16`
  1108  	gtest.C(t, func(t *gtest.T) {
  1109  		err := g.Validator().Data("123456").Rules(rule).Run(ctx)
  1110  		t.Assert(err, "The value `123456` should not be in regex of: \\d{6}|\\D{6}")
  1111  	})
  1112  	gtest.C(t, func(t *gtest.T) {
  1113  		err := g.Validator().Data("abcde6").Rules(rule).Run(ctx)
  1114  		t.AssertNil(err)
  1115  	})
  1116  }
  1117  
  1118  // issue: https://github.com/wangyougui/gf/issues/1077
  1119  func Test_InternalError_String(t *testing.T) {
  1120  	gtest.C(t, func(t *gtest.T) {
  1121  		type a struct {
  1122  			Name string `v:"hh"`
  1123  		}
  1124  		aa := a{Name: "2"}
  1125  		err := g.Validator().Data(&aa).Run(ctx)
  1126  
  1127  		t.Assert(err.String(), "InvalidRules: hh")
  1128  		t.Assert(err.Strings(), g.Slice{"InvalidRules: hh"})
  1129  		t.Assert(err.FirstError(), "InvalidRules: hh")
  1130  		t.Assert(gerror.Current(err), "InvalidRules: hh")
  1131  	})
  1132  }
  1133  
  1134  func Test_Code(t *testing.T) {
  1135  	gtest.C(t, func(t *gtest.T) {
  1136  		err := g.Validator().Rules("required").Data("").Run(ctx)
  1137  		t.AssertNE(err, nil)
  1138  		t.Assert(gerror.Code(err), gcode.CodeValidationFailed)
  1139  	})
  1140  
  1141  	gtest.C(t, func(t *gtest.T) {
  1142  		err := g.Validator().Rules("none-exist-rule").Data("").Run(ctx)
  1143  		t.AssertNE(err, nil)
  1144  		t.Assert(gerror.Code(err), gcode.CodeInternalError)
  1145  	})
  1146  }
  1147  
  1148  func Test_Bail(t *testing.T) {
  1149  	// check value with no bail
  1150  	gtest.C(t, func(t *gtest.T) {
  1151  		err := g.Validator().
  1152  			Rules("required|min:1|between:1,100").
  1153  			Messages("|min number is 1|size is between 1 and 100").
  1154  			Data(-1).Run(ctx)
  1155  		t.AssertNE(err, nil)
  1156  		t.Assert(err.Error(), "min number is 1; size is between 1 and 100")
  1157  	})
  1158  
  1159  	// check value with bail
  1160  	gtest.C(t, func(t *gtest.T) {
  1161  		err := g.Validator().
  1162  			Rules("bail|required|min:1|between:1,100").
  1163  			Messages("||min number is 1|size is between 1 and 100").
  1164  			Data(-1).Run(ctx)
  1165  		t.AssertNE(err, nil)
  1166  		t.Assert(err.Error(), "min number is 1")
  1167  	})
  1168  
  1169  	// struct with no bail
  1170  	gtest.C(t, func(t *gtest.T) {
  1171  		type Params struct {
  1172  			Page int `v:"required|min:1"`
  1173  			Size int `v:"required|min:1|between:1,100 # |min number is 1|size is between 1 and 100"`
  1174  		}
  1175  		obj := &Params{
  1176  			Page: 1,
  1177  			Size: -1,
  1178  		}
  1179  		err := g.Validator().Data(obj).Run(ctx)
  1180  		t.AssertNE(err, nil)
  1181  		t.Assert(err.Error(), "min number is 1; size is between 1 and 100")
  1182  	})
  1183  	// struct with bail
  1184  	gtest.C(t, func(t *gtest.T) {
  1185  		type Params struct {
  1186  			Page int `v:"required|min:1"`
  1187  			Size int `v:"bail|required|min:1|between:1,100 # ||min number is 1|size is between 1 and 100"`
  1188  		}
  1189  		obj := &Params{
  1190  			Page: 1,
  1191  			Size: -1,
  1192  		}
  1193  		err := g.Validator().Data(obj).Run(ctx)
  1194  		t.AssertNE(err, nil)
  1195  		t.Assert(err.Error(), "min number is 1")
  1196  	})
  1197  }
  1198  
  1199  func Test_After(t *testing.T) {
  1200  	gtest.C(t, func(t *gtest.T) {
  1201  		type Params struct {
  1202  			T1 string `v:"after:T2"`
  1203  			T2 string
  1204  		}
  1205  		obj := &Params{
  1206  			T1: "2022-09-02",
  1207  			T2: "2022-09-01",
  1208  		}
  1209  		err := g.Validator().Data(obj).Run(ctx)
  1210  		t.AssertNil(err)
  1211  	})
  1212  	gtest.C(t, func(t *gtest.T) {
  1213  		type Params struct {
  1214  			T1 string `v:"after:T2"`
  1215  			T2 string
  1216  		}
  1217  		obj := &Params{
  1218  			T1: "2022-09-01",
  1219  			T2: "2022-09-02",
  1220  		}
  1221  		err := g.Validator().Data(obj).Run(ctx)
  1222  		t.Assert(err, "The T1 value `2022-09-01` must be after field T2 value `2022-09-02`")
  1223  	})
  1224  	gtest.C(t, func(t *gtest.T) {
  1225  		type Params struct {
  1226  			T1 *gtime.Time `v:"after:T2"`
  1227  			T2 *gtime.Time
  1228  		}
  1229  		obj := &Params{
  1230  			T1: gtime.New("2022-09-02"),
  1231  			T2: gtime.New("2022-09-01"),
  1232  		}
  1233  		err := g.Validator().Data(obj).Run(ctx)
  1234  		t.AssertNil(err)
  1235  	})
  1236  	gtest.C(t, func(t *gtest.T) {
  1237  		type Params struct {
  1238  			T1 *gtime.Time `v:"after:T2"`
  1239  			T2 *gtime.Time
  1240  		}
  1241  		obj := &Params{
  1242  			T1: gtime.New("2022-09-01"),
  1243  			T2: gtime.New("2022-09-02"),
  1244  		}
  1245  		err := g.Validator().Data(obj).Run(ctx)
  1246  		t.Assert(err, "The T1 value `2022-09-01 00:00:00` must be after field T2 value `2022-09-02 00:00:00`")
  1247  	})
  1248  }
  1249  
  1250  func Test_After_Equal(t *testing.T) {
  1251  	gtest.C(t, func(t *gtest.T) {
  1252  		type Params struct {
  1253  			T1 string `v:"after-equal:T2"`
  1254  			T2 string
  1255  		}
  1256  		obj := &Params{
  1257  			T1: "2022-09-02",
  1258  			T2: "2022-09-01",
  1259  		}
  1260  		err := g.Validator().Data(obj).Run(ctx)
  1261  		t.AssertNil(err)
  1262  	})
  1263  	gtest.C(t, func(t *gtest.T) {
  1264  		type Params struct {
  1265  			T1 string `v:"after-equal:T2"`
  1266  			T2 string
  1267  		}
  1268  		obj := &Params{
  1269  			T1: "2022-09-01",
  1270  			T2: "2022-09-02",
  1271  		}
  1272  		err := g.Validator().Data(obj).Run(ctx)
  1273  		t.Assert(err, "The T1 value `2022-09-01` must be after or equal to field T2 value `2022-09-02`")
  1274  	})
  1275  	gtest.C(t, func(t *gtest.T) {
  1276  		type Params struct {
  1277  			T1 *gtime.Time `v:"after-equal:T2"`
  1278  			T2 *gtime.Time
  1279  		}
  1280  		obj := &Params{
  1281  			T1: gtime.New("2022-09-02"),
  1282  			T2: gtime.New("2022-09-01"),
  1283  		}
  1284  		err := g.Validator().Data(obj).Run(ctx)
  1285  		t.AssertNil(err)
  1286  	})
  1287  	gtest.C(t, func(t *gtest.T) {
  1288  		type Params struct {
  1289  			T1 *gtime.Time `v:"after-equal:T2"`
  1290  			T2 *gtime.Time
  1291  		}
  1292  		obj := &Params{
  1293  			T1: gtime.New("2022-09-01"),
  1294  			T2: gtime.New("2022-09-01"),
  1295  		}
  1296  		err := g.Validator().Data(obj).Run(ctx)
  1297  		t.AssertNil(err)
  1298  	})
  1299  	gtest.C(t, func(t *gtest.T) {
  1300  		type Params struct {
  1301  			T1 *gtime.Time `v:"after-equal:T2"`
  1302  			T2 *gtime.Time
  1303  		}
  1304  		obj := &Params{
  1305  			T1: gtime.New("2022-09-01"),
  1306  			T2: gtime.New("2022-09-02"),
  1307  		}
  1308  		err := g.Validator().Data(obj).Run(ctx)
  1309  		t.Assert(err, "The T1 value `2022-09-01 00:00:00` must be after or equal to field T2 value `2022-09-02 00:00:00`")
  1310  	})
  1311  }
  1312  
  1313  func Test_Before(t *testing.T) {
  1314  	gtest.C(t, func(t *gtest.T) {
  1315  		type Params struct {
  1316  			T1 string `v:"before:T2"`
  1317  			T2 string
  1318  		}
  1319  		obj := &Params{
  1320  			T1: "2022-09-01",
  1321  			T2: "2022-09-02",
  1322  		}
  1323  		err := g.Validator().Data(obj).Run(ctx)
  1324  		t.AssertNil(err)
  1325  	})
  1326  	gtest.C(t, func(t *gtest.T) {
  1327  		type Params struct {
  1328  			T1 string `v:"before:T2"`
  1329  			T2 string
  1330  		}
  1331  		obj := &Params{
  1332  			T1: "2022-09-02",
  1333  			T2: "2022-09-01",
  1334  		}
  1335  		err := g.Validator().Data(obj).Run(ctx)
  1336  		t.Assert(err, "The T1 value `2022-09-02` must be before field T2 value `2022-09-01`")
  1337  	})
  1338  	gtest.C(t, func(t *gtest.T) {
  1339  		type Params struct {
  1340  			T1 *gtime.Time `v:"before:T2"`
  1341  			T2 *gtime.Time
  1342  		}
  1343  		obj := &Params{
  1344  			T1: gtime.New("2022-09-01"),
  1345  			T2: gtime.New("2022-09-02"),
  1346  		}
  1347  		err := g.Validator().Data(obj).Run(ctx)
  1348  		t.AssertNil(err)
  1349  	})
  1350  	gtest.C(t, func(t *gtest.T) {
  1351  		type Params struct {
  1352  			T1 *gtime.Time `v:"before:T2"`
  1353  			T2 *gtime.Time
  1354  		}
  1355  		obj := &Params{
  1356  			T1: gtime.New("2022-09-02"),
  1357  			T2: gtime.New("2022-09-01"),
  1358  		}
  1359  		err := g.Validator().Data(obj).Run(ctx)
  1360  		t.Assert(err, "The T1 value `2022-09-02 00:00:00` must be before field T2 value `2022-09-01 00:00:00`")
  1361  	})
  1362  }
  1363  
  1364  func Test_Before_Equal(t *testing.T) {
  1365  	gtest.C(t, func(t *gtest.T) {
  1366  		type Params struct {
  1367  			T1 string `v:"before-equal:T2"`
  1368  			T2 string
  1369  		}
  1370  		obj := &Params{
  1371  			T1: "2022-09-01",
  1372  			T2: "2022-09-02",
  1373  		}
  1374  		err := g.Validator().Data(obj).Run(ctx)
  1375  		t.AssertNil(err)
  1376  	})
  1377  	gtest.C(t, func(t *gtest.T) {
  1378  		type Params struct {
  1379  			T1 string `v:"before-equal:T2"`
  1380  			T2 string
  1381  		}
  1382  		obj := &Params{
  1383  			T1: "2022-09-02",
  1384  			T2: "2022-09-01",
  1385  		}
  1386  		err := g.Validator().Data(obj).Run(ctx)
  1387  		t.Assert(err, "The T1 value `2022-09-02` must be before or equal to field T2")
  1388  	})
  1389  	gtest.C(t, func(t *gtest.T) {
  1390  		type Params struct {
  1391  			T1 *gtime.Time `v:"before-equal:T2"`
  1392  			T2 *gtime.Time
  1393  		}
  1394  		obj := &Params{
  1395  			T1: gtime.New("2022-09-01"),
  1396  			T2: gtime.New("2022-09-02"),
  1397  		}
  1398  		err := g.Validator().Data(obj).Run(ctx)
  1399  		t.AssertNil(err)
  1400  	})
  1401  	gtest.C(t, func(t *gtest.T) {
  1402  		type Params struct {
  1403  			T1 *gtime.Time `v:"before-equal:T2"`
  1404  			T2 *gtime.Time
  1405  		}
  1406  		obj := &Params{
  1407  			T1: gtime.New("2022-09-01"),
  1408  			T2: gtime.New("2022-09-01"),
  1409  		}
  1410  		err := g.Validator().Data(obj).Run(ctx)
  1411  		t.AssertNil(err)
  1412  	})
  1413  	gtest.C(t, func(t *gtest.T) {
  1414  		type Params struct {
  1415  			T1 *gtime.Time `v:"before-equal:T2"`
  1416  			T2 *gtime.Time
  1417  		}
  1418  		obj := &Params{
  1419  			T1: gtime.New("2022-09-02"),
  1420  			T2: gtime.New("2022-09-01"),
  1421  		}
  1422  		err := g.Validator().Data(obj).Run(ctx)
  1423  		t.Assert(err, "The T1 value `2022-09-02 00:00:00` must be before or equal to field T2")
  1424  	})
  1425  }
  1426  
  1427  func Test_GT(t *testing.T) {
  1428  	gtest.C(t, func(t *gtest.T) {
  1429  		type Params struct {
  1430  			V1 string `v:"gt:V2"`
  1431  			V2 string
  1432  		}
  1433  		obj := &Params{
  1434  			V1: "1.2",
  1435  			V2: "1.1",
  1436  		}
  1437  		err := g.Validator().Data(obj).Run(ctx)
  1438  		t.AssertNil(err)
  1439  	})
  1440  	gtest.C(t, func(t *gtest.T) {
  1441  		type Params struct {
  1442  			V1 string `v:"gt:V2"`
  1443  			V2 string
  1444  		}
  1445  		obj := &Params{
  1446  			V1: "1.1",
  1447  			V2: "1.2",
  1448  		}
  1449  		err := g.Validator().Data(obj).Run(ctx)
  1450  		t.Assert(err, "The V1 value `1.1` must be greater than field V2 value `1.2`")
  1451  	})
  1452  }
  1453  
  1454  func Test_GTE(t *testing.T) {
  1455  	gtest.C(t, func(t *gtest.T) {
  1456  		type Params struct {
  1457  			V1 string `v:"gte:V2"`
  1458  			V2 string
  1459  		}
  1460  		obj := &Params{
  1461  			V1: "1.2",
  1462  			V2: "1.1",
  1463  		}
  1464  		err := g.Validator().Data(obj).Run(ctx)
  1465  		t.AssertNil(err)
  1466  	})
  1467  	gtest.C(t, func(t *gtest.T) {
  1468  		type Params struct {
  1469  			V1 string `v:"gte:V2"`
  1470  			V2 string
  1471  		}
  1472  		obj := &Params{
  1473  			V1: "1.1",
  1474  			V2: "1.2",
  1475  		}
  1476  		err := g.Validator().Data(obj).Run(ctx)
  1477  		t.Assert(err, "The V1 value `1.1` must be greater than or equal to field V2 value `1.2`")
  1478  	})
  1479  	gtest.C(t, func(t *gtest.T) {
  1480  		type Params struct {
  1481  			V1 string `v:"gte:V2"`
  1482  			V2 string
  1483  		}
  1484  		obj := &Params{
  1485  			V1: "1.1",
  1486  			V2: "1.1",
  1487  		}
  1488  		err := g.Validator().Data(obj).Run(ctx)
  1489  		t.AssertNil(err)
  1490  	})
  1491  }
  1492  
  1493  func Test_LT(t *testing.T) {
  1494  	gtest.C(t, func(t *gtest.T) {
  1495  		type Params struct {
  1496  			V1 string `v:"lt:V2"`
  1497  			V2 string
  1498  		}
  1499  		obj := &Params{
  1500  			V1: "1.1",
  1501  			V2: "1.2",
  1502  		}
  1503  		err := g.Validator().Data(obj).Run(ctx)
  1504  		t.AssertNil(err)
  1505  	})
  1506  	gtest.C(t, func(t *gtest.T) {
  1507  		type Params struct {
  1508  			V1 string `v:"lt:V2"`
  1509  			V2 string
  1510  		}
  1511  		obj := &Params{
  1512  			V1: "1.2",
  1513  			V2: "1.1",
  1514  		}
  1515  		err := g.Validator().Data(obj).Run(ctx)
  1516  		t.Assert(err, "The V1 value `1.2` must be lesser than field V2 value `1.1`")
  1517  	})
  1518  }
  1519  
  1520  func Test_LTE(t *testing.T) {
  1521  	gtest.C(t, func(t *gtest.T) {
  1522  		type Params struct {
  1523  			V1 string `v:"lte:V2"`
  1524  			V2 string
  1525  		}
  1526  		obj := &Params{
  1527  			V1: "1.1",
  1528  			V2: "1.2",
  1529  		}
  1530  		err := g.Validator().Data(obj).Run(ctx)
  1531  		t.AssertNil(err)
  1532  	})
  1533  	gtest.C(t, func(t *gtest.T) {
  1534  		type Params struct {
  1535  			V1 string `v:"lte:V2"`
  1536  			V2 string
  1537  		}
  1538  		obj := &Params{
  1539  			V1: "1.2",
  1540  			V2: "1.1",
  1541  		}
  1542  		err := g.Validator().Data(obj).Run(ctx)
  1543  		t.Assert(err, "The V1 value `1.2` must be lesser than or equal to field V2 value `1.1`")
  1544  	})
  1545  	gtest.C(t, func(t *gtest.T) {
  1546  		type Params struct {
  1547  			V1 string `v:"lte:V2"`
  1548  			V2 string
  1549  		}
  1550  		obj := &Params{
  1551  			V1: "1.1",
  1552  			V2: "1.1",
  1553  		}
  1554  		err := g.Validator().Data(obj).Run(ctx)
  1555  		t.AssertNil(err)
  1556  	})
  1557  }
  1558  
  1559  func Test_Enums(t *testing.T) {
  1560  	gtest.C(t, func(t *gtest.T) {
  1561  		type EnumsTest string
  1562  		const (
  1563  			EnumsTestA EnumsTest = "a"
  1564  			EnumsTestB EnumsTest = "b"
  1565  		)
  1566  		type Params struct {
  1567  			Id    int
  1568  			Enums EnumsTest `v:"enums"`
  1569  		}
  1570  
  1571  		oldEnumsJson, err := gtag.GetGlobalEnums()
  1572  		t.AssertNil(err)
  1573  		defer t.AssertNil(gtag.SetGlobalEnums(oldEnumsJson))
  1574  
  1575  		err = gtag.SetGlobalEnums(`{"github.com/wangyougui/gf/v2/util/gvalid_test.EnumsTest": ["a","b"]}`)
  1576  		t.AssertNil(err)
  1577  
  1578  		err = g.Validator().Data(&Params{
  1579  			Id:    1,
  1580  			Enums: EnumsTestB,
  1581  		}).Run(ctx)
  1582  		t.AssertNil(err)
  1583  
  1584  		err = g.Validator().Data(&Params{
  1585  			Id:    1,
  1586  			Enums: "c",
  1587  		}).Run(ctx)
  1588  		t.Assert(err, "The Enums value `c` should be in enums of: [\"a\",\"b\"]")
  1589  	})
  1590  }