@@ -420,6 +420,63 @@ func TestNameNamespace(t *testing.T) {
420420 Equal (t , fe .StructNamespace (), "Namespace.Inner1.Inner2.String[1]" )
421421}
422422
423+ func TestEmbeddingAndNamespace (t * testing.T ) {
424+ type Embedded struct {
425+ EmbeddedString string `validate:"required" json:"JSONString"`
426+ }
427+
428+ type OuterWithoutSkipTag struct {
429+ Embedded
430+ }
431+
432+ type OuterWithSkipTag struct {
433+ Embedded `validate:"skipns"`
434+ }
435+
436+ validate := New ()
437+ validate .RegisterTagNameFunc (func (fld reflect.StructField ) string {
438+ name := strings .SplitN (fld .Tag .Get ("json" ), "," , 2 )[0 ]
439+
440+ if name == "-" {
441+ return ""
442+ }
443+
444+ return name
445+ })
446+
447+ // Without skip tag
448+ ts1 := & OuterWithoutSkipTag {
449+ Embedded {EmbeddedString : "ok" },
450+ }
451+
452+ errs := validate .Struct (ts1 )
453+ Equal (t , errs , nil )
454+
455+ ts1 .EmbeddedString = ""
456+
457+ errs = validate .Struct (ts1 )
458+ NotEqual (t , errs , nil )
459+ ve := errs .(ValidationErrors )
460+ Equal (t , len (ve ), 1 )
461+ AssertError (t , errs , "OuterWithoutSkipTag.Embedded.JSONString" , "OuterWithoutSkipTag.Embedded.EmbeddedString" , "JSONString" , "EmbeddedString" , "required" )
462+
463+ // Without skip tag
464+ ts2 := & OuterWithSkipTag {
465+ Embedded {EmbeddedString : "ok" },
466+ }
467+
468+ errs = validate .Struct (ts2 )
469+ Equal (t , errs , nil )
470+
471+ ts2 .EmbeddedString = ""
472+
473+ errs = validate .Struct (ts2 )
474+ NotEqual (t , errs , nil )
475+ ve = errs .(ValidationErrors )
476+ Equal (t , len (ve ), 1 )
477+ AssertError (t , errs , "OuterWithSkipTag.JSONString" , "OuterWithSkipTag.Embedded.EmbeddedString" , "JSONString" , "EmbeddedString" , "required" )
478+ }
479+
423480func TestAnonymous (t * testing.T ) {
424481 validate := New ()
425482 validate .RegisterTagNameFunc (func (fld reflect.StructField ) string {
0 commit comments