@@ -14975,3 +14975,221 @@ func TestRequiredIfWithArrays(t *testing.T) {
1497514975 Equal (t , err , nil ) // No error - Text has value
1497614976 })
1497714977}
14978+
14979+ type ValuerTypeWithPointerReceiver [T any ] struct {
14980+ Data T
14981+ }
14982+
14983+ func (t * ValuerTypeWithPointerReceiver [T ]) ValidatorValue () any {
14984+ return t .Data
14985+ }
14986+
14987+ type ValuerTypeWithValueReceiver [T any ] struct {
14988+ Data T
14989+ }
14990+
14991+ func (t ValuerTypeWithValueReceiver [T ]) ValidatorValue () any {
14992+ return t .Data
14993+ }
14994+
14995+ func TestValuerInterface (t * testing.T ) {
14996+ t .Run ("parent as Valuer (not called)" , func (t * testing.T ) {
14997+ errs := New ().Struct (& ValuerTypeWithPointerReceiver [SubTest ]{})
14998+ AssertError (t , errs ,
14999+ "ValuerTypeWithPointerReceiver[github.com/go-playground/validator/v10.SubTest].Data.Test" ,
15000+ "ValuerTypeWithPointerReceiver[github.com/go-playground/validator/v10.SubTest].Data.Test" ,
15001+ "Test" , "Test" , "required" )
15002+ })
15003+ t .Run ("pointer parent, pointer nested, pointer receiver (called)" , func (t * testing.T ) {
15004+ type Parent struct {
15005+ Nested * ValuerTypeWithPointerReceiver [SubTest ] `validate:"required"`
15006+ }
15007+
15008+ errs := New ().Struct (& Parent {})
15009+ AssertError (t , errs , "Parent.Nested" , "Parent.Nested" , "Nested" , "Nested" , "required" )
15010+
15011+ errs = New ().Struct (& Parent {
15012+ Nested : & ValuerTypeWithPointerReceiver [SubTest ]{},
15013+ })
15014+ AssertError (t , errs , "Parent.Nested.Test" , "Parent.Nested.Test" , "Test" , "Test" , "required" )
15015+
15016+ errs = New ().Struct (& Parent {
15017+ Nested : & ValuerTypeWithPointerReceiver [SubTest ]{
15018+ Data : SubTest {
15019+ Test : "Test" ,
15020+ },
15021+ },
15022+ })
15023+ if errs != nil {
15024+ t .Fatalf ("Expected no error, got: %v" , errs )
15025+ }
15026+ })
15027+ t .Run ("pointer parent, pointer nested, value receiver (called)" , func (t * testing.T ) {
15028+ type Parent struct {
15029+ Nested * ValuerTypeWithValueReceiver [SubTest ] `validate:"required"`
15030+ }
15031+
15032+ errs := New ().Struct (& Parent {})
15033+ AssertError (t , errs , "Parent.Nested" , "Parent.Nested" , "Nested" , "Nested" , "required" )
15034+
15035+ errs = New ().Struct (& Parent {
15036+ Nested : & ValuerTypeWithValueReceiver [SubTest ]{},
15037+ })
15038+ AssertError (t , errs , "Parent.Nested.Test" , "Parent.Nested.Test" , "Test" , "Test" , "required" )
15039+
15040+ errs = New ().Struct (& Parent {
15041+ Nested : & ValuerTypeWithValueReceiver [SubTest ]{
15042+ Data : SubTest {
15043+ Test : "Test" ,
15044+ },
15045+ },
15046+ })
15047+ if errs != nil {
15048+ t .Fatalf ("Expected no error, got: %v" , errs )
15049+ }
15050+ })
15051+ t .Run ("pointer parent, value nested, pointer receiver (not called)" , func (t * testing.T ) {
15052+ type Parent struct {
15053+ Nested ValuerTypeWithPointerReceiver [SubTest ] `validate:"required"`
15054+ }
15055+
15056+ errs := New ().Struct (& Parent {})
15057+ AssertError (t , errs , "Parent.Nested.Data.Test" , "Parent.Nested.Data.Test" , "Test" , "Test" , "required" )
15058+
15059+ errs = New ().Struct (& Parent {
15060+ Nested : ValuerTypeWithPointerReceiver [SubTest ]{},
15061+ })
15062+ AssertError (t , errs , "Parent.Nested.Data.Test" , "Parent.Nested.Data.Test" , "Test" , "Test" , "required" )
15063+
15064+ errs = New ().Struct (& Parent {
15065+ Nested : ValuerTypeWithPointerReceiver [SubTest ]{
15066+ Data : SubTest {
15067+ Test : "Test" ,
15068+ },
15069+ },
15070+ })
15071+ if errs != nil {
15072+ t .Fatalf ("Expected no error, got: %v" , errs )
15073+ }
15074+ })
15075+ t .Run ("pointer parent, value nested, value receiver (called)" , func (t * testing.T ) {
15076+ type Parent struct {
15077+ Nested ValuerTypeWithValueReceiver [SubTest ] `validate:"required"`
15078+ }
15079+
15080+ errs := New ().Struct (& Parent {})
15081+ AssertError (t , errs , "Parent.Nested.Test" , "Parent.Nested.Test" , "Test" , "Test" , "required" )
15082+
15083+ errs = New ().Struct (& Parent {
15084+ Nested : ValuerTypeWithValueReceiver [SubTest ]{},
15085+ })
15086+ AssertError (t , errs , "Parent.Nested.Test" , "Parent.Nested.Test" , "Test" , "Test" , "required" )
15087+
15088+ errs = New ().Struct (& Parent {
15089+ Nested : ValuerTypeWithValueReceiver [SubTest ]{
15090+ Data : SubTest {
15091+ Test : "Test" ,
15092+ },
15093+ },
15094+ })
15095+ if errs != nil {
15096+ t .Fatalf ("Expected no error, got: %v" , errs )
15097+ }
15098+ })
15099+ t .Run ("value parent, pointer nested, pointer receiver (called)" , func (t * testing.T ) {
15100+ type Parent struct {
15101+ Nested * ValuerTypeWithPointerReceiver [SubTest ] `validate:"required"`
15102+ }
15103+
15104+ errs := New ().Struct (Parent {})
15105+ AssertError (t , errs , "Parent.Nested" , "Parent.Nested" , "Nested" , "Nested" , "required" )
15106+
15107+ errs = New ().Struct (Parent {
15108+ Nested : & ValuerTypeWithPointerReceiver [SubTest ]{},
15109+ })
15110+ AssertError (t , errs , "Parent.Nested.Test" , "Parent.Nested.Test" , "Test" , "Test" , "required" )
15111+
15112+ errs = New ().Struct (Parent {
15113+ Nested : & ValuerTypeWithPointerReceiver [SubTest ]{
15114+ Data : SubTest {
15115+ Test : "Test" ,
15116+ },
15117+ },
15118+ })
15119+ if errs != nil {
15120+ t .Fatalf ("Expected no error, got: %v" , errs )
15121+ }
15122+ })
15123+ t .Run ("value parent, pointer nested, value receiver (called)" , func (t * testing.T ) {
15124+ type Parent struct {
15125+ Nested * ValuerTypeWithValueReceiver [SubTest ] `validate:"required"`
15126+ }
15127+
15128+ errs := New ().Struct (Parent {})
15129+ AssertError (t , errs , "Parent.Nested" , "Parent.Nested" , "Nested" , "Nested" , "required" )
15130+
15131+ errs = New ().Struct (Parent {
15132+ Nested : & ValuerTypeWithValueReceiver [SubTest ]{},
15133+ })
15134+ AssertError (t , errs , "Parent.Nested.Test" , "Parent.Nested.Test" , "Test" , "Test" , "required" )
15135+
15136+ errs = New ().Struct (Parent {
15137+ Nested : & ValuerTypeWithValueReceiver [SubTest ]{
15138+ Data : SubTest {
15139+ Test : "Test" ,
15140+ },
15141+ },
15142+ })
15143+ if errs != nil {
15144+ t .Fatalf ("Expected no error, got: %v" , errs )
15145+ }
15146+ })
15147+ t .Run ("value parent, value nested, pointer receiver (not called)" , func (t * testing.T ) {
15148+ type Parent struct {
15149+ Nested ValuerTypeWithPointerReceiver [SubTest ] `validate:"required"`
15150+ }
15151+
15152+ errs := New ().Struct (Parent {})
15153+ AssertError (t , errs , "Parent.Nested.Data.Test" , "Parent.Nested.Data.Test" , "Test" , "Test" , "required" )
15154+
15155+ errs = New ().Struct (Parent {
15156+ Nested : ValuerTypeWithPointerReceiver [SubTest ]{},
15157+ })
15158+ AssertError (t , errs , "Parent.Nested.Data.Test" , "Parent.Nested.Data.Test" , "Test" , "Test" , "required" )
15159+
15160+ errs = New ().Struct (Parent {
15161+ Nested : ValuerTypeWithPointerReceiver [SubTest ]{
15162+ Data : SubTest {
15163+ Test : "Test" ,
15164+ },
15165+ },
15166+ })
15167+ if errs != nil {
15168+ t .Fatalf ("Expected no error, got: %v" , errs )
15169+ }
15170+ })
15171+ t .Run ("value parent, value nested, value receiver (called)" , func (t * testing.T ) {
15172+ type Parent struct {
15173+ Nested ValuerTypeWithValueReceiver [SubTest ] `validate:"required"`
15174+ }
15175+
15176+ errs := New ().Struct (Parent {})
15177+ AssertError (t , errs , "Parent.Nested.Test" , "Parent.Nested.Test" , "Test" , "Test" , "required" )
15178+
15179+ errs = New ().Struct (Parent {
15180+ Nested : ValuerTypeWithValueReceiver [SubTest ]{},
15181+ })
15182+ AssertError (t , errs , "Parent.Nested.Test" , "Parent.Nested.Test" , "Test" , "Test" , "required" )
15183+
15184+ errs = New ().Struct (Parent {
15185+ Nested : ValuerTypeWithValueReceiver [SubTest ]{
15186+ Data : SubTest {
15187+ Test : "Test" ,
15188+ },
15189+ },
15190+ })
15191+ if errs != nil {
15192+ t .Fatalf ("Expected no error, got: %v" , errs )
15193+ }
15194+ })
15195+ }
0 commit comments