@@ -420,6 +420,63 @@ func TestNameNamespace(t *testing.T) {
420
420
Equal (t , fe .StructNamespace (), "Namespace.Inner1.Inner2.String[1]" )
421
421
}
422
422
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
+
423
480
func TestAnonymous (t * testing.T ) {
424
481
validate := New ()
425
482
validate .RegisterTagNameFunc (func (fld reflect.StructField ) string {
0 commit comments