@@ -424,6 +424,56 @@ func TestValues_EmbeddedStructs(t *testing.T) {
424424 }
425425}
426426
427+ // OptionalEmbedded supports omitting all of its promoted fields.
428+ type OptionalEmbedded struct {
429+ Value string `url:"value"`
430+ }
431+
432+ func (v OptionalEmbedded ) IsZero () bool { return v .Value == "" }
433+
434+ func TestValues_EmbeddedOmitEmpty (t * testing.T ) {
435+ type Options struct {
436+ OptionalEmbedded `url:",omitempty"`
437+ }
438+ type privateScalar string
439+ type privateEmbedded struct {
440+ Value string `url:"value"`
441+ }
442+ tests := []struct {
443+ name string
444+ input interface {}
445+ want url.Values
446+ }{
447+ {"empty" , Options {}, url.Values {}},
448+ {"nonempty" , Options {OptionalEmbedded {Value : "present" }}, url.Values {"value" : {"present" }}},
449+ {"without option" , struct { OptionalEmbedded }{}, url.Values {"value" : {"" }}},
450+ {"named empty" , struct {
451+ OptionalEmbedded `url:"nested,omitempty"`
452+ }{}, url.Values {}},
453+ {"named nonempty" , struct {
454+ OptionalEmbedded `url:"nested,omitempty"`
455+ }{OptionalEmbedded {Value : "present" }}, url.Values {"nested[value]" : {"present" }}},
456+ {"nil pointer" , struct {
457+ * OptionalEmbedded `url:",omitempty"`
458+ }{}, url.Values {}},
459+ {"non-nil pointer" , struct {
460+ * OptionalEmbedded `url:",omitempty"`
461+ }{& OptionalEmbedded {}}, url.Values {"value" : {"" }}},
462+ {"empty unexported scalar" , struct {
463+ privateScalar `url:",omitempty"`
464+ }{}, url.Values {}},
465+ {"nil unexported pointer" , struct {
466+ * privateScalar `url:",omitempty"`
467+ }{}, url.Values {}},
468+ {"unexported embed" , struct {
469+ privateEmbedded `url:",omitempty"`
470+ }{privateEmbedded {Value : "present" }}, url.Values {"value" : {"present" }}},
471+ }
472+ for _ , tt := range tests {
473+ t .Run (tt .name , func (t * testing.T ) { testValue (t , tt .input , tt .want ) })
474+ }
475+ }
476+
427477func TestValues_InvalidInput (t * testing.T ) {
428478 _ , err := Values ("" )
429479 if err == nil {
0 commit comments