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