@@ -14293,3 +14293,221 @@ func TestValidateFn(t *testing.T) {
1429314293 Equal (t , fe .Tag (), "validateFn" )
1429414294 })
1429514295}
14296+
14297+ type ValidatorValuerTypeWithPointerReceiver [T any ] struct {
14298+ Data T
14299+ }
14300+
14301+ func (t * ValidatorValuerTypeWithPointerReceiver [T ]) ValidatorValue () any {
14302+ return t .Data
14303+ }
14304+
14305+ type ValidatorValuerTypeWithValueReceiver [T any ] struct {
14306+ Data T
14307+ }
14308+
14309+ func (t ValidatorValuerTypeWithValueReceiver [T ]) ValidatorValue () any {
14310+ return t .Data
14311+ }
14312+
14313+ func TestValidatorValuerInterface (t * testing.T ) {
14314+ t .Run ("parent as ValidatorValuer (not called)" , func (t * testing.T ) {
14315+ errs := New ().Struct (& ValidatorValuerTypeWithPointerReceiver [SubTest ]{})
14316+ AssertError (t , errs ,
14317+ "ValidatorValuerTypeWithPointerReceiver[github.com/go-playground/validator/v10.SubTest].Data.Test" ,
14318+ "ValidatorValuerTypeWithPointerReceiver[github.com/go-playground/validator/v10.SubTest].Data.Test" ,
14319+ "Test" , "Test" , "required" )
14320+ })
14321+ t .Run ("pointer parent, pointer nested, pointer receiver (called)" , func (t * testing.T ) {
14322+ type Parent struct {
14323+ Nested * ValidatorValuerTypeWithPointerReceiver [SubTest ] `validate:"required"`
14324+ }
14325+
14326+ errs := New ().Struct (& Parent {})
14327+ AssertError (t , errs , "Parent.Nested" , "Parent.Nested" , "Nested" , "Nested" , "required" )
14328+
14329+ errs = New ().Struct (& Parent {
14330+ Nested : & ValidatorValuerTypeWithPointerReceiver [SubTest ]{},
14331+ })
14332+ AssertError (t , errs , "Parent.Nested.Test" , "Parent.Nested.Test" , "Test" , "Test" , "required" )
14333+
14334+ errs = New ().Struct (& Parent {
14335+ Nested : & ValidatorValuerTypeWithPointerReceiver [SubTest ]{
14336+ Data : SubTest {
14337+ Test : "Test" ,
14338+ },
14339+ },
14340+ })
14341+ if errs != nil {
14342+ t .Fatalf ("Expected no error, got: %v" , errs )
14343+ }
14344+ })
14345+ t .Run ("pointer parent, pointer nested, value receiver (called)" , func (t * testing.T ) {
14346+ type Parent struct {
14347+ Nested * ValidatorValuerTypeWithValueReceiver [SubTest ] `validate:"required"`
14348+ }
14349+
14350+ errs := New ().Struct (& Parent {})
14351+ AssertError (t , errs , "Parent.Nested" , "Parent.Nested" , "Nested" , "Nested" , "required" )
14352+
14353+ errs = New ().Struct (& Parent {
14354+ Nested : & ValidatorValuerTypeWithValueReceiver [SubTest ]{},
14355+ })
14356+ AssertError (t , errs , "Parent.Nested.Test" , "Parent.Nested.Test" , "Test" , "Test" , "required" )
14357+
14358+ errs = New ().Struct (& Parent {
14359+ Nested : & ValidatorValuerTypeWithValueReceiver [SubTest ]{
14360+ Data : SubTest {
14361+ Test : "Test" ,
14362+ },
14363+ },
14364+ })
14365+ if errs != nil {
14366+ t .Fatalf ("Expected no error, got: %v" , errs )
14367+ }
14368+ })
14369+ t .Run ("pointer parent, value nested, pointer receiver (not called)" , func (t * testing.T ) {
14370+ type Parent struct {
14371+ Nested ValidatorValuerTypeWithPointerReceiver [SubTest ] `validate:"required"`
14372+ }
14373+
14374+ errs := New ().Struct (& Parent {})
14375+ AssertError (t , errs , "Parent.Nested.Data.Test" , "Parent.Nested.Data.Test" , "Test" , "Test" , "required" )
14376+
14377+ errs = New ().Struct (& Parent {
14378+ Nested : ValidatorValuerTypeWithPointerReceiver [SubTest ]{},
14379+ })
14380+ AssertError (t , errs , "Parent.Nested.Data.Test" , "Parent.Nested.Data.Test" , "Test" , "Test" , "required" )
14381+
14382+ errs = New ().Struct (& Parent {
14383+ Nested : ValidatorValuerTypeWithPointerReceiver [SubTest ]{
14384+ Data : SubTest {
14385+ Test : "Test" ,
14386+ },
14387+ },
14388+ })
14389+ if errs != nil {
14390+ t .Fatalf ("Expected no error, got: %v" , errs )
14391+ }
14392+ })
14393+ t .Run ("pointer parent, value nested, value receiver (called)" , func (t * testing.T ) {
14394+ type Parent struct {
14395+ Nested ValidatorValuerTypeWithValueReceiver [SubTest ] `validate:"required"`
14396+ }
14397+
14398+ errs := New ().Struct (& Parent {})
14399+ AssertError (t , errs , "Parent.Nested.Test" , "Parent.Nested.Test" , "Test" , "Test" , "required" )
14400+
14401+ errs = New ().Struct (& Parent {
14402+ Nested : ValidatorValuerTypeWithValueReceiver [SubTest ]{},
14403+ })
14404+ AssertError (t , errs , "Parent.Nested.Test" , "Parent.Nested.Test" , "Test" , "Test" , "required" )
14405+
14406+ errs = New ().Struct (& Parent {
14407+ Nested : ValidatorValuerTypeWithValueReceiver [SubTest ]{
14408+ Data : SubTest {
14409+ Test : "Test" ,
14410+ },
14411+ },
14412+ })
14413+ if errs != nil {
14414+ t .Fatalf ("Expected no error, got: %v" , errs )
14415+ }
14416+ })
14417+ t .Run ("value parent, pointer nested, pointer receiver (called)" , func (t * testing.T ) {
14418+ type Parent struct {
14419+ Nested * ValidatorValuerTypeWithPointerReceiver [SubTest ] `validate:"required"`
14420+ }
14421+
14422+ errs := New ().Struct (Parent {})
14423+ AssertError (t , errs , "Parent.Nested" , "Parent.Nested" , "Nested" , "Nested" , "required" )
14424+
14425+ errs = New ().Struct (Parent {
14426+ Nested : & ValidatorValuerTypeWithPointerReceiver [SubTest ]{},
14427+ })
14428+ AssertError (t , errs , "Parent.Nested.Test" , "Parent.Nested.Test" , "Test" , "Test" , "required" )
14429+
14430+ errs = New ().Struct (Parent {
14431+ Nested : & ValidatorValuerTypeWithPointerReceiver [SubTest ]{
14432+ Data : SubTest {
14433+ Test : "Test" ,
14434+ },
14435+ },
14436+ })
14437+ if errs != nil {
14438+ t .Fatalf ("Expected no error, got: %v" , errs )
14439+ }
14440+ })
14441+ t .Run ("value parent, pointer nested, value receiver (called)" , func (t * testing.T ) {
14442+ type Parent struct {
14443+ Nested * ValidatorValuerTypeWithValueReceiver [SubTest ] `validate:"required"`
14444+ }
14445+
14446+ errs := New ().Struct (Parent {})
14447+ AssertError (t , errs , "Parent.Nested" , "Parent.Nested" , "Nested" , "Nested" , "required" )
14448+
14449+ errs = New ().Struct (Parent {
14450+ Nested : & ValidatorValuerTypeWithValueReceiver [SubTest ]{},
14451+ })
14452+ AssertError (t , errs , "Parent.Nested.Test" , "Parent.Nested.Test" , "Test" , "Test" , "required" )
14453+
14454+ errs = New ().Struct (Parent {
14455+ Nested : & ValidatorValuerTypeWithValueReceiver [SubTest ]{
14456+ Data : SubTest {
14457+ Test : "Test" ,
14458+ },
14459+ },
14460+ })
14461+ if errs != nil {
14462+ t .Fatalf ("Expected no error, got: %v" , errs )
14463+ }
14464+ })
14465+ t .Run ("value parent, value nested, pointer receiver (not called)" , func (t * testing.T ) {
14466+ type Parent struct {
14467+ Nested ValidatorValuerTypeWithPointerReceiver [SubTest ] `validate:"required"`
14468+ }
14469+
14470+ errs := New ().Struct (Parent {})
14471+ AssertError (t , errs , "Parent.Nested.Data.Test" , "Parent.Nested.Data.Test" , "Test" , "Test" , "required" )
14472+
14473+ errs = New ().Struct (Parent {
14474+ Nested : ValidatorValuerTypeWithPointerReceiver [SubTest ]{},
14475+ })
14476+ AssertError (t , errs , "Parent.Nested.Data.Test" , "Parent.Nested.Data.Test" , "Test" , "Test" , "required" )
14477+
14478+ errs = New ().Struct (Parent {
14479+ Nested : ValidatorValuerTypeWithPointerReceiver [SubTest ]{
14480+ Data : SubTest {
14481+ Test : "Test" ,
14482+ },
14483+ },
14484+ })
14485+ if errs != nil {
14486+ t .Fatalf ("Expected no error, got: %v" , errs )
14487+ }
14488+ })
14489+ t .Run ("value parent, value nested, value receiver (called)" , func (t * testing.T ) {
14490+ type Parent struct {
14491+ Nested ValidatorValuerTypeWithValueReceiver [SubTest ] `validate:"required"`
14492+ }
14493+
14494+ errs := New ().Struct (Parent {})
14495+ AssertError (t , errs , "Parent.Nested.Test" , "Parent.Nested.Test" , "Test" , "Test" , "required" )
14496+
14497+ errs = New ().Struct (Parent {
14498+ Nested : ValidatorValuerTypeWithValueReceiver [SubTest ]{},
14499+ })
14500+ AssertError (t , errs , "Parent.Nested.Test" , "Parent.Nested.Test" , "Test" , "Test" , "required" )
14501+
14502+ errs = New ().Struct (Parent {
14503+ Nested : ValidatorValuerTypeWithValueReceiver [SubTest ]{
14504+ Data : SubTest {
14505+ Test : "Test" ,
14506+ },
14507+ },
14508+ })
14509+ if errs != nil {
14510+ t .Fatalf ("Expected no error, got: %v" , errs )
14511+ }
14512+ })
14513+ }
0 commit comments