github.com/night-codes/go-json@v0.9.15/test/cover/cover_string_test.go (about)

     1  package json_test
     2  
     3  import (
     4  	"bytes"
     5  	"fmt"
     6  	"testing"
     7  
     8  	"github.com/night-codes/go-json"
     9  )
    10  
    11  func TestCoverString(t *testing.T) {
    12  	type structString struct {
    13  		A string `json:"a"`
    14  	}
    15  	type structStringOmitEmpty struct {
    16  		A string `json:"a,omitempty"`
    17  	}
    18  	type structStringString struct {
    19  		A string `json:"a,string"`
    20  	}
    21  	type structStringStringOmitEmpty struct {
    22  		A string `json:"a,string,omitempty"`
    23  	}
    24  
    25  	type structStringPtr struct {
    26  		A *string `json:"a"`
    27  	}
    28  	type structStringPtrOmitEmpty struct {
    29  		A *string `json:"a,omitempty"`
    30  	}
    31  	type structStringPtrString struct {
    32  		A *string `json:"a,string"`
    33  	}
    34  	type structStringPtrStringOmitEmpty struct {
    35  		A *string `json:"a,string,omitempty"`
    36  	}
    37  
    38  	tests := []struct {
    39  		name string
    40  		data interface{}
    41  	}{
    42  		{
    43  			name: "PtrHeadStringComplicated",
    44  			data: &struct {
    45  				X *struct {
    46  					A string
    47  					B []string
    48  				}
    49  			}{X: &struct {
    50  				A string
    51  				B []string
    52  			}{A: "hello", B: []string{"a", "b"}}},
    53  		},
    54  		{
    55  			name: "String",
    56  			data: string("a"),
    57  		},
    58  		{
    59  			name: "StringPtr",
    60  			data: stringptr("a"),
    61  		},
    62  		{
    63  			name: "StringPtr3",
    64  			data: stringptr3("a"),
    65  		},
    66  		{
    67  			name: "StringPtrNil",
    68  			data: (*string)(nil),
    69  		},
    70  		{
    71  			name: "StringPtr3Nil",
    72  			data: (***string)(nil),
    73  		},
    74  
    75  		// HeadStringZero
    76  		{
    77  			name: "HeadStringZero",
    78  			data: struct {
    79  				A string `json:"a"`
    80  			}{},
    81  		},
    82  		{
    83  			name: "HeadStringZeroOmitEmpty",
    84  			data: struct {
    85  				A string `json:"a,omitempty"`
    86  			}{},
    87  		},
    88  		{
    89  			name: "HeadStringZeroString",
    90  			data: struct {
    91  				A string `json:"a,string"`
    92  			}{},
    93  		},
    94  		{
    95  			name: "HeadStringZeroStringOmitEmpty",
    96  			data: struct {
    97  				A string `json:"a,string,omitempty"`
    98  			}{},
    99  		},
   100  
   101  		// HeadString
   102  		{
   103  			name: "HeadString",
   104  			data: struct {
   105  				A string `json:"a"`
   106  			}{A: "foo"},
   107  		},
   108  		{
   109  			name: "HeadStringOmitEmpty",
   110  			data: struct {
   111  				A string `json:"a,omitempty"`
   112  			}{A: "foo"},
   113  		},
   114  		{
   115  			name: "HeadStringString",
   116  			data: struct {
   117  				A string `json:"a,string"`
   118  			}{A: "foo"},
   119  		},
   120  		{
   121  			name: "HeadStringStringOmitEmpty",
   122  			data: struct {
   123  				A string `json:"a,string,omitempty"`
   124  			}{A: "foo"},
   125  		},
   126  
   127  		// HeadStringPtr
   128  		{
   129  			name: "HeadStringPtr",
   130  			data: struct {
   131  				A *string `json:"a"`
   132  			}{A: stringptr("foo")},
   133  		},
   134  		{
   135  			name: "HeadStringPtrOmitEmpty",
   136  			data: struct {
   137  				A *string `json:"a,omitempty"`
   138  			}{A: stringptr("foo")},
   139  		},
   140  		{
   141  			name: "HeadStringPtrString",
   142  			data: struct {
   143  				A *string `json:"a,string"`
   144  			}{A: stringptr("foo")},
   145  		},
   146  		{
   147  			name: "HeadStringPtrStringOmitEmpty",
   148  			data: struct {
   149  				A *string `json:"a,string,omitempty"`
   150  			}{A: stringptr("foo")},
   151  		},
   152  
   153  		// HeadStringPtrNil
   154  		{
   155  			name: "HeadStringPtrNil",
   156  			data: struct {
   157  				A *string `json:"a"`
   158  			}{A: nil},
   159  		},
   160  		{
   161  			name: "HeadStringPtrNilOmitEmpty",
   162  			data: struct {
   163  				A *string `json:"a,omitempty"`
   164  			}{A: nil},
   165  		},
   166  		{
   167  			name: "HeadStringPtrNilString",
   168  			data: struct {
   169  				A *string `json:"a,string"`
   170  			}{A: nil},
   171  		},
   172  		{
   173  			name: "HeadStringPtrNilStringOmitEmpty",
   174  			data: struct {
   175  				A *string `json:"a,string,omitempty"`
   176  			}{A: nil},
   177  		},
   178  
   179  		// PtrHeadStringZero
   180  		{
   181  			name: "PtrHeadStringZero",
   182  			data: &struct {
   183  				A string `json:"a"`
   184  			}{},
   185  		},
   186  		{
   187  			name: "PtrHeadStringZeroOmitEmpty",
   188  			data: &struct {
   189  				A string `json:"a,omitempty"`
   190  			}{},
   191  		},
   192  		{
   193  			name: "PtrHeadStringZeroString",
   194  			data: &struct {
   195  				A string `json:"a,string"`
   196  			}{},
   197  		},
   198  		{
   199  			name: "PtrHeadStringZeroStringOmitEmpty",
   200  			data: &struct {
   201  				A string `json:"a,string,omitempty"`
   202  			}{},
   203  		},
   204  
   205  		// PtrHeadString
   206  		{
   207  			name: "PtrHeadString",
   208  			data: &struct {
   209  				A string `json:"a"`
   210  			}{A: "foo"},
   211  		},
   212  		{
   213  			name: "PtrHeadStringOmitEmpty",
   214  			data: &struct {
   215  				A string `json:"a,omitempty"`
   216  			}{A: "foo"},
   217  		},
   218  		{
   219  			name: "PtrHeadStringString",
   220  			data: &struct {
   221  				A string `json:"a,string"`
   222  			}{A: "foo"},
   223  		},
   224  		{
   225  			name: "PtrHeadStringStringOmitEmpty",
   226  			data: &struct {
   227  				A string `json:"a,string,omitempty"`
   228  			}{A: "foo"},
   229  		},
   230  
   231  		// PtrHeadStringPtr
   232  		{
   233  			name: "PtrHeadStringPtr",
   234  			data: &struct {
   235  				A *string `json:"a"`
   236  			}{A: stringptr("foo")},
   237  		},
   238  		{
   239  			name: "PtrHeadStringPtrOmitEmpty",
   240  			data: &struct {
   241  				A *string `json:"a,omitempty"`
   242  			}{A: stringptr("foo")},
   243  		},
   244  		{
   245  			name: "PtrHeadStringPtrString",
   246  			data: &struct {
   247  				A *string `json:"a,string"`
   248  			}{A: stringptr("foo")},
   249  		},
   250  		{
   251  			name: "PtrHeadStringPtrStringOmitEmpty",
   252  			data: &struct {
   253  				A *string `json:"a,string,omitempty"`
   254  			}{A: stringptr("foo")},
   255  		},
   256  
   257  		// PtrHeadStringPtrNil
   258  		{
   259  			name: "PtrHeadStringPtrNil",
   260  			data: &struct {
   261  				A *string `json:"a"`
   262  			}{A: nil},
   263  		},
   264  		{
   265  			name: "PtrHeadStringPtrNilOmitEmpty",
   266  			data: &struct {
   267  				A *string `json:"a,omitempty"`
   268  			}{A: nil},
   269  		},
   270  		{
   271  			name: "PtrHeadStringPtrNilString",
   272  			data: &struct {
   273  				A *string `json:"a,string"`
   274  			}{A: nil},
   275  		},
   276  		{
   277  			name: "PtrHeadStringPtrNilStringOmitEmpty",
   278  			data: &struct {
   279  				A *string `json:"a,string,omitempty"`
   280  			}{A: nil},
   281  		},
   282  
   283  		// PtrHeadStringNil
   284  		{
   285  			name: "PtrHeadStringNil",
   286  			data: (*struct {
   287  				A *string `json:"a"`
   288  			})(nil),
   289  		},
   290  		{
   291  			name: "PtrHeadStringNilOmitEmpty",
   292  			data: (*struct {
   293  				A *string `json:"a,omitempty"`
   294  			})(nil),
   295  		},
   296  		{
   297  			name: "PtrHeadStringNilString",
   298  			data: (*struct {
   299  				A *string `json:"a,string"`
   300  			})(nil),
   301  		},
   302  		{
   303  			name: "PtrHeadStringNilStringOmitEmpty",
   304  			data: (*struct {
   305  				A *string `json:"a,string,omitempty"`
   306  			})(nil),
   307  		},
   308  
   309  		// HeadStringZeroMultiFields
   310  		{
   311  			name: "HeadStringZeroMultiFields",
   312  			data: struct {
   313  				A string `json:"a"`
   314  				B string `json:"b"`
   315  				C string `json:"c"`
   316  			}{},
   317  		},
   318  		{
   319  			name: "HeadStringZeroMultiFieldsOmitEmpty",
   320  			data: struct {
   321  				A string `json:"a,omitempty"`
   322  				B string `json:"b,omitempty"`
   323  				C string `json:"c,omitempty"`
   324  			}{},
   325  		},
   326  		{
   327  			name: "HeadStringZeroMultiFieldsString",
   328  			data: struct {
   329  				A string `json:"a,string"`
   330  				B string `json:"b,string"`
   331  				C string `json:"c,string"`
   332  			}{},
   333  		},
   334  		{
   335  			name: "HeadStringZeroMultiFieldsStringOmitEmpty",
   336  			data: struct {
   337  				A string `json:"a,string,omitempty"`
   338  				B string `json:"b,string,omitempty"`
   339  				C string `json:"c,string,omitempty"`
   340  			}{},
   341  		},
   342  
   343  		// HeadStringMultiFields
   344  		{
   345  			name: "HeadStringMultiFields",
   346  			data: struct {
   347  				A string `json:"a"`
   348  				B string `json:"b"`
   349  				C string `json:"c"`
   350  			}{A: "foo", B: "bar", C: "baz"},
   351  		},
   352  		{
   353  			name: "HeadStringMultiFieldsOmitEmpty",
   354  			data: struct {
   355  				A string `json:"a,omitempty"`
   356  				B string `json:"b,omitempty"`
   357  				C string `json:"c,omitempty"`
   358  			}{A: "foo", B: "bar", C: "baz"},
   359  		},
   360  		{
   361  			name: "HeadStringMultiFieldsString",
   362  			data: struct {
   363  				A string `json:"a,string"`
   364  				B string `json:"b,string"`
   365  				C string `json:"c,string"`
   366  			}{A: "foo", B: "bar", C: "baz"},
   367  		},
   368  		{
   369  			name: "HeadStringMultiFieldsStringOmitEmpty",
   370  			data: struct {
   371  				A string `json:"a,string,omitempty"`
   372  				B string `json:"b,string,omitempty"`
   373  				C string `json:"c,string,omitempty"`
   374  			}{A: "foo", B: "bar", C: "baz"},
   375  		},
   376  
   377  		// HeadStringPtrMultiFields
   378  		{
   379  			name: "HeadStringPtrMultiFields",
   380  			data: struct {
   381  				A *string `json:"a"`
   382  				B *string `json:"b"`
   383  				C *string `json:"c"`
   384  			}{A: stringptr("foo"), B: stringptr("bar"), C: stringptr("baz")},
   385  		},
   386  		{
   387  			name: "HeadStringPtrMultiFieldsOmitEmpty",
   388  			data: struct {
   389  				A *string `json:"a,omitempty"`
   390  				B *string `json:"b,omitempty"`
   391  				C *string `json:"c,omitempty"`
   392  			}{A: stringptr("foo"), B: stringptr("bar"), C: stringptr("baz")},
   393  		},
   394  		{
   395  			name: "HeadStringPtrMultiFieldsString",
   396  			data: struct {
   397  				A *string `json:"a,string"`
   398  				B *string `json:"b,string"`
   399  				C *string `json:"c,string"`
   400  			}{A: stringptr("foo"), B: stringptr("bar"), C: stringptr("baz")},
   401  		},
   402  		{
   403  			name: "HeadStringPtrMultiFieldsStringOmitEmpty",
   404  			data: struct {
   405  				A *string `json:"a,string,omitempty"`
   406  				B *string `json:"b,string,omitempty"`
   407  				C *string `json:"c,string,omitempty"`
   408  			}{A: stringptr("foo"), B: stringptr("bar"), C: stringptr("baz")},
   409  		},
   410  
   411  		// HeadStringPtrNilMultiFields
   412  		{
   413  			name: "HeadStringPtrNilMultiFields",
   414  			data: struct {
   415  				A *string `json:"a"`
   416  				B *string `json:"b"`
   417  				C *string `json:"c"`
   418  			}{A: nil, B: nil, C: nil},
   419  		},
   420  		{
   421  			name: "HeadStringPtrNilMultiFieldsOmitEmpty",
   422  			data: struct {
   423  				A *string `json:"a,omitempty"`
   424  				B *string `json:"b,omitempty"`
   425  				C *string `json:"c,omitempty"`
   426  			}{A: nil, B: nil, C: nil},
   427  		},
   428  		{
   429  			name: "HeadStringPtrNilMultiFieldsString",
   430  			data: struct {
   431  				A *string `json:"a,string"`
   432  				B *string `json:"b,string"`
   433  				C *string `json:"c,string"`
   434  			}{A: nil, B: nil, C: nil},
   435  		},
   436  		{
   437  			name: "HeadStringPtrNilMultiFieldsStringOmitEmpty",
   438  			data: struct {
   439  				A *string `json:"a,string,omitempty"`
   440  				B *string `json:"b,string,omitempty"`
   441  				C *string `json:"c,string,omitempty"`
   442  			}{A: nil, B: nil, C: nil},
   443  		},
   444  
   445  		// PtrHeadStringZeroMultiFields
   446  		{
   447  			name: "PtrHeadStringZeroMultiFields",
   448  			data: &struct {
   449  				A string `json:"a"`
   450  				B string `json:"b"`
   451  				C string `json:"c"`
   452  			}{},
   453  		},
   454  		{
   455  			name: "PtrHeadStringZeroMultiFieldsOmitEmpty",
   456  			data: &struct {
   457  				A string `json:"a,omitempty"`
   458  				B string `json:"b,omitempty"`
   459  				C string `json:"c,omitempty"`
   460  			}{},
   461  		},
   462  		{
   463  			name: "PtrHeadStringZeroMultiFieldsString",
   464  			data: &struct {
   465  				A string `json:"a,string"`
   466  				B string `json:"b,string"`
   467  				C string `json:"c,string"`
   468  			}{},
   469  		},
   470  		{
   471  			name: "PtrHeadStringZeroMultiFieldsStringOmitEmpty",
   472  			data: &struct {
   473  				A string `json:"a,string,omitempty"`
   474  				B string `json:"b,string,omitempty"`
   475  				C string `json:"c,string,omitempty"`
   476  			}{},
   477  		},
   478  
   479  		// PtrHeadStringMultiFields
   480  		{
   481  			name: "PtrHeadStringMultiFields",
   482  			data: &struct {
   483  				A string `json:"a"`
   484  				B string `json:"b"`
   485  				C string `json:"c"`
   486  			}{A: "foo", B: "bar", C: "baz"},
   487  		},
   488  		{
   489  			name: "PtrHeadStringMultiFieldsOmitEmpty",
   490  			data: &struct {
   491  				A string `json:"a,omitempty"`
   492  				B string `json:"b,omitempty"`
   493  				C string `json:"c,omitempty"`
   494  			}{A: "foo", B: "bar", C: "baz"},
   495  		},
   496  		{
   497  			name: "PtrHeadStringMultiFieldsString",
   498  			data: &struct {
   499  				A string `json:"a,string"`
   500  				B string `json:"b,string"`
   501  				C string `json:"c,string"`
   502  			}{A: "foo", B: "bar", C: "baz"},
   503  		},
   504  		{
   505  			name: "PtrHeadStringMultiFieldsStringOmitEmpty",
   506  			data: &struct {
   507  				A string `json:"a,string,omitempty"`
   508  				B string `json:"b,string,omitempty"`
   509  				C string `json:"c,string,omitempty"`
   510  			}{A: "foo", B: "bar", C: "baz"},
   511  		},
   512  
   513  		// PtrHeadStringPtrMultiFields
   514  		{
   515  			name: "PtrHeadStringPtrMultiFields",
   516  			data: &struct {
   517  				A *string `json:"a"`
   518  				B *string `json:"b"`
   519  				C *string `json:"c"`
   520  			}{A: stringptr("foo"), B: stringptr("bar"), C: stringptr("baz")},
   521  		},
   522  		{
   523  			name: "PtrHeadStringPtrMultiFieldsOmitEmpty",
   524  			data: &struct {
   525  				A *string `json:"a,omitempty"`
   526  				B *string `json:"b,omitempty"`
   527  				C *string `json:"c,omitempty"`
   528  			}{A: stringptr("foo"), B: stringptr("bar"), C: stringptr("baz")},
   529  		},
   530  		{
   531  			name: "PtrHeadStringPtrMultiFieldsString",
   532  			data: &struct {
   533  				A *string `json:"a,string"`
   534  				B *string `json:"b,string"`
   535  				C *string `json:"c,string"`
   536  			}{A: stringptr("foo"), B: stringptr("bar"), C: stringptr("baz")},
   537  		},
   538  		{
   539  			name: "PtrHeadStringPtrMultiFieldsStringOmitEmpty",
   540  			data: &struct {
   541  				A *string `json:"a,string,omitempty"`
   542  				B *string `json:"b,string,omitempty"`
   543  				C *string `json:"c,string,omitempty"`
   544  			}{A: stringptr("foo"), B: stringptr("bar"), C: stringptr("baz")},
   545  		},
   546  
   547  		// PtrHeadStringPtrNilMultiFields
   548  		{
   549  			name: "PtrHeadStringPtrNilMultiFields",
   550  			data: &struct {
   551  				A *string `json:"a"`
   552  				B *string `json:"b"`
   553  				C *string `json:"c"`
   554  			}{A: nil, B: nil, C: nil},
   555  		},
   556  		{
   557  			name: "PtrHeadStringPtrNilMultiFieldsOmitEmpty",
   558  			data: &struct {
   559  				A *string `json:"a,omitempty"`
   560  				B *string `json:"b,omitempty"`
   561  				C *string `json:"c,omitempty"`
   562  			}{A: nil, B: nil, C: nil},
   563  		},
   564  		{
   565  			name: "PtrHeadStringPtrNilMultiFieldsString",
   566  			data: &struct {
   567  				A *string `json:"a,string"`
   568  				B *string `json:"b,string"`
   569  				C *string `json:"c,string"`
   570  			}{A: nil, B: nil, C: nil},
   571  		},
   572  		{
   573  			name: "PtrHeadStringPtrNilMultiFieldsStringOmitEmpty",
   574  			data: &struct {
   575  				A *string `json:"a,string,omitempty"`
   576  				B *string `json:"b,string,omitempty"`
   577  				C *string `json:"c,string,omitempty"`
   578  			}{A: nil, B: nil, C: nil},
   579  		},
   580  
   581  		// PtrHeadStringNilMultiFields
   582  		{
   583  			name: "PtrHeadStringNilMultiFields",
   584  			data: (*struct {
   585  				A *string `json:"a"`
   586  				B *string `json:"b"`
   587  				C *string `json:"c"`
   588  			})(nil),
   589  		},
   590  		{
   591  			name: "PtrHeadStringNilMultiFieldsOmitEmpty",
   592  			data: (*struct {
   593  				A *string `json:"a,omitempty"`
   594  				B *string `json:"b,omitempty"`
   595  				C *string `json:"c,omitempty"`
   596  			})(nil),
   597  		},
   598  		{
   599  			name: "PtrHeadStringNilMultiFieldsString",
   600  			data: (*struct {
   601  				A *string `json:"a,string"`
   602  				B *string `json:"b,string"`
   603  				C *string `json:"c,string"`
   604  			})(nil),
   605  		},
   606  		{
   607  			name: "PtrHeadStringNilMultiFieldsStringOmitEmpty",
   608  			data: (*struct {
   609  				A *string `json:"a,string,omitempty"`
   610  				B *string `json:"b,string,omitempty"`
   611  				C *string `json:"c,string,omitempty"`
   612  			})(nil),
   613  		},
   614  
   615  		// HeadStringZeroNotRoot
   616  		{
   617  			name: "HeadStringZeroNotRoot",
   618  			data: struct {
   619  				A struct {
   620  					A string `json:"a"`
   621  				}
   622  			}{},
   623  		},
   624  		{
   625  			name: "HeadStringZeroNotRootOmitEmpty",
   626  			data: struct {
   627  				A struct {
   628  					A string `json:"a,omitempty"`
   629  				}
   630  			}{},
   631  		},
   632  		{
   633  			name: "HeadStringZeroNotRootString",
   634  			data: struct {
   635  				A struct {
   636  					A string `json:"a,string"`
   637  				}
   638  			}{},
   639  		},
   640  		{
   641  			name: "HeadStringZeroNotRootStringOmitEmpty",
   642  			data: struct {
   643  				A struct {
   644  					A string `json:"a,string,omitempty"`
   645  				}
   646  			}{},
   647  		},
   648  
   649  		// HeadStringNotRoot
   650  		{
   651  			name: "HeadStringNotRoot",
   652  			data: struct {
   653  				A struct {
   654  					A string `json:"a"`
   655  				}
   656  			}{A: struct {
   657  				A string `json:"a"`
   658  			}{A: "foo"}},
   659  		},
   660  		{
   661  			name: "HeadStringNotRootOmitEmpty",
   662  			data: struct {
   663  				A struct {
   664  					A string `json:"a,omitempty"`
   665  				}
   666  			}{A: struct {
   667  				A string `json:"a,omitempty"`
   668  			}{A: "foo"}},
   669  		},
   670  		{
   671  			name: "HeadStringNotRootString",
   672  			data: struct {
   673  				A struct {
   674  					A string `json:"a,string"`
   675  				}
   676  			}{A: struct {
   677  				A string `json:"a,string"`
   678  			}{A: "foo"}},
   679  		},
   680  		{
   681  			name: "HeadStringNotRootStringOmitEmpty",
   682  			data: struct {
   683  				A struct {
   684  					A string `json:"a,string,omitempty"`
   685  				}
   686  			}{A: struct {
   687  				A string `json:"a,string,omitempty"`
   688  			}{A: "foo"}},
   689  		},
   690  
   691  		// HeadStringPtrNotRoot
   692  		{
   693  			name: "HeadStringPtrNotRoot",
   694  			data: struct {
   695  				A struct {
   696  					A *string `json:"a"`
   697  				}
   698  			}{A: struct {
   699  				A *string `json:"a"`
   700  			}{stringptr("foo")}},
   701  		},
   702  		{
   703  			name: "HeadStringPtrNotRootOmitEmpty",
   704  			data: struct {
   705  				A struct {
   706  					A *string `json:"a,omitempty"`
   707  				}
   708  			}{A: struct {
   709  				A *string `json:"a,omitempty"`
   710  			}{stringptr("foo")}},
   711  		},
   712  		{
   713  			name: "HeadStringPtrNotRootString",
   714  			data: struct {
   715  				A struct {
   716  					A *string `json:"a,string"`
   717  				}
   718  			}{A: struct {
   719  				A *string `json:"a,string"`
   720  			}{stringptr("foo")}},
   721  		},
   722  		{
   723  			name: "HeadStringPtrNotRootStringOmitEmpty",
   724  			data: struct {
   725  				A struct {
   726  					A *string `json:"a,string,omitempty"`
   727  				}
   728  			}{A: struct {
   729  				A *string `json:"a,string,omitempty"`
   730  			}{stringptr("foo")}},
   731  		},
   732  
   733  		// HeadStringPtrNilNotRoot
   734  		{
   735  			name: "HeadStringPtrNilNotRoot",
   736  			data: struct {
   737  				A struct {
   738  					A *string `json:"a"`
   739  				}
   740  			}{},
   741  		},
   742  		{
   743  			name: "HeadStringPtrNilNotRootOmitEmpty",
   744  			data: struct {
   745  				A struct {
   746  					A *string `json:"a,omitempty"`
   747  				}
   748  			}{},
   749  		},
   750  		{
   751  			name: "HeadStringPtrNilNotRootString",
   752  			data: struct {
   753  				A struct {
   754  					A *string `json:"a,string"`
   755  				}
   756  			}{},
   757  		},
   758  		{
   759  			name: "HeadStringPtrNilNotRootStringOmitEmpty",
   760  			data: struct {
   761  				A struct {
   762  					A *string `json:"a,string,omitempty"`
   763  				}
   764  			}{},
   765  		},
   766  
   767  		// PtrHeadStringZeroNotRoot
   768  		{
   769  			name: "PtrHeadStringZeroNotRoot",
   770  			data: struct {
   771  				A *struct {
   772  					A string `json:"a"`
   773  				}
   774  			}{A: new(struct {
   775  				A string `json:"a"`
   776  			})},
   777  		},
   778  		{
   779  			name: "PtrHeadStringZeroNotRootOmitEmpty",
   780  			data: struct {
   781  				A *struct {
   782  					A string `json:"a,omitempty"`
   783  				}
   784  			}{A: new(struct {
   785  				A string `json:"a,omitempty"`
   786  			})},
   787  		},
   788  		{
   789  			name: "PtrHeadStringZeroNotRootString",
   790  			data: struct {
   791  				A *struct {
   792  					A string `json:"a,string"`
   793  				}
   794  			}{A: new(struct {
   795  				A string `json:"a,string"`
   796  			})},
   797  		},
   798  		{
   799  			name: "PtrHeadStringZeroNotRootStringOmitEmpty",
   800  			data: struct {
   801  				A *struct {
   802  					A string `json:"a,string,omitempty"`
   803  				}
   804  			}{A: new(struct {
   805  				A string `json:"a,string,omitempty"`
   806  			})},
   807  		},
   808  
   809  		// PtrHeadStringNotRoot
   810  		{
   811  			name: "PtrHeadStringNotRoot",
   812  			data: struct {
   813  				A *struct {
   814  					A string `json:"a"`
   815  				}
   816  			}{A: &(struct {
   817  				A string `json:"a"`
   818  			}{A: "foo"})},
   819  		},
   820  		{
   821  			name: "PtrHeadStringNotRootOmitEmpty",
   822  			data: struct {
   823  				A *struct {
   824  					A string `json:"a,omitempty"`
   825  				}
   826  			}{A: &(struct {
   827  				A string `json:"a,omitempty"`
   828  			}{A: "foo"})},
   829  		},
   830  		{
   831  			name: "PtrHeadStringNotRootString",
   832  			data: struct {
   833  				A *struct {
   834  					A string `json:"a,string"`
   835  				}
   836  			}{A: &(struct {
   837  				A string `json:"a,string"`
   838  			}{A: "foo"})},
   839  		},
   840  		{
   841  			name: "PtrHeadStringNotRootStringOmitEmpty",
   842  			data: struct {
   843  				A *struct {
   844  					A string `json:"a,string,omitempty"`
   845  				}
   846  			}{A: &(struct {
   847  				A string `json:"a,string,omitempty"`
   848  			}{A: "foo"})},
   849  		},
   850  
   851  		// PtrHeadStringPtrNotRoot
   852  		{
   853  			name: "PtrHeadStringPtrNotRoot",
   854  			data: struct {
   855  				A *struct {
   856  					A *string `json:"a"`
   857  				}
   858  			}{A: &(struct {
   859  				A *string `json:"a"`
   860  			}{A: stringptr("foo")})},
   861  		},
   862  		{
   863  			name: "PtrHeadStringPtrNotRootOmitEmpty",
   864  			data: struct {
   865  				A *struct {
   866  					A *string `json:"a,omitempty"`
   867  				}
   868  			}{A: &(struct {
   869  				A *string `json:"a,omitempty"`
   870  			}{A: stringptr("foo")})},
   871  		},
   872  		{
   873  			name: "PtrHeadStringPtrNotRootString",
   874  			data: struct {
   875  				A *struct {
   876  					A *string `json:"a,string"`
   877  				}
   878  			}{A: &(struct {
   879  				A *string `json:"a,string"`
   880  			}{A: stringptr("foo")})},
   881  		},
   882  		{
   883  			name: "PtrHeadStringPtrNotRootStringOmitEmpty",
   884  			data: struct {
   885  				A *struct {
   886  					A *string `json:"a,string,omitempty"`
   887  				}
   888  			}{A: &(struct {
   889  				A *string `json:"a,string,omitempty"`
   890  			}{A: stringptr("foo")})},
   891  		},
   892  
   893  		// PtrHeadStringPtrNilNotRoot
   894  		{
   895  			name: "PtrHeadStringPtrNilNotRoot",
   896  			data: struct {
   897  				A *struct {
   898  					A *string `json:"a"`
   899  				}
   900  			}{A: &(struct {
   901  				A *string `json:"a"`
   902  			}{A: nil})},
   903  		},
   904  		{
   905  			name: "PtrHeadStringPtrNilNotRootOmitEmpty",
   906  			data: struct {
   907  				A *struct {
   908  					A *string `json:"a,omitempty"`
   909  				}
   910  			}{A: &(struct {
   911  				A *string `json:"a,omitempty"`
   912  			}{A: nil})},
   913  		},
   914  		{
   915  			name: "PtrHeadStringPtrNilNotRootString",
   916  			data: struct {
   917  				A *struct {
   918  					A *string `json:"a,string"`
   919  				}
   920  			}{A: &(struct {
   921  				A *string `json:"a,string"`
   922  			}{A: nil})},
   923  		},
   924  		{
   925  			name: "PtrHeadStringPtrNilNotRootStringOmitEmpty",
   926  			data: struct {
   927  				A *struct {
   928  					A *string `json:"a,string,omitempty"`
   929  				}
   930  			}{A: &(struct {
   931  				A *string `json:"a,string,omitempty"`
   932  			}{A: nil})},
   933  		},
   934  
   935  		// PtrHeadStringNilNotRoot
   936  		{
   937  			name: "PtrHeadStringNilNotRoot",
   938  			data: struct {
   939  				A *struct {
   940  					A *string `json:"a"`
   941  				}
   942  			}{A: nil},
   943  		},
   944  		{
   945  			name: "PtrHeadStringNilNotRootOmitEmpty",
   946  			data: struct {
   947  				A *struct {
   948  					A *string `json:"a,omitempty"`
   949  				} `json:",omitempty"`
   950  			}{A: nil},
   951  		},
   952  		{
   953  			name: "PtrHeadStringNilNotRootString",
   954  			data: struct {
   955  				A *struct {
   956  					A *string `json:"a,string"`
   957  				} `json:",string"`
   958  			}{A: nil},
   959  		},
   960  		{
   961  			name: "PtrHeadStringNilNotRootStringOmitEmpty",
   962  			data: struct {
   963  				A *struct {
   964  					A *string `json:"a,string,omitempty"`
   965  				} `json:",string,omitempty"`
   966  			}{A: nil},
   967  		},
   968  
   969  		// HeadStringZeroMultiFieldsNotRoot
   970  		{
   971  			name: "HeadStringZeroMultiFieldsNotRoot",
   972  			data: struct {
   973  				A struct {
   974  					A string `json:"a"`
   975  				}
   976  				B struct {
   977  					B string `json:"b"`
   978  				}
   979  			}{},
   980  		},
   981  		{
   982  			name: "HeadStringZeroMultiFieldsNotRootOmitEmpty",
   983  			data: struct {
   984  				A struct {
   985  					A string `json:"a,omitempty"`
   986  				}
   987  				B struct {
   988  					B string `json:"b,omitempty"`
   989  				}
   990  			}{},
   991  		},
   992  		{
   993  			name: "HeadStringZeroMultiFieldsNotRootString",
   994  			data: struct {
   995  				A struct {
   996  					A string `json:"a,string"`
   997  				}
   998  				B struct {
   999  					B string `json:"b,string"`
  1000  				}
  1001  			}{},
  1002  		},
  1003  		{
  1004  			name: "HeadStringZeroMultiFieldsNotRootStringOmitEmpty",
  1005  			data: struct {
  1006  				A struct {
  1007  					A string `json:"a,string,omitempty"`
  1008  				}
  1009  				B struct {
  1010  					B string `json:"b,string,omitempty"`
  1011  				}
  1012  			}{},
  1013  		},
  1014  
  1015  		// HeadStringMultiFieldsNotRoot
  1016  		{
  1017  			name: "HeadStringMultiFieldsNotRoot",
  1018  			data: struct {
  1019  				A struct {
  1020  					A string `json:"a"`
  1021  				}
  1022  				B struct {
  1023  					B string `json:"b"`
  1024  				}
  1025  			}{A: struct {
  1026  				A string `json:"a"`
  1027  			}{A: "foo"}, B: struct {
  1028  				B string `json:"b"`
  1029  			}{B: "bar"}},
  1030  		},
  1031  		{
  1032  			name: "HeadStringMultiFieldsNotRootOmitEmpty",
  1033  			data: struct {
  1034  				A struct {
  1035  					A string `json:"a,omitempty"`
  1036  				}
  1037  				B struct {
  1038  					B string `json:"b,omitempty"`
  1039  				}
  1040  			}{A: struct {
  1041  				A string `json:"a,omitempty"`
  1042  			}{A: "foo"}, B: struct {
  1043  				B string `json:"b,omitempty"`
  1044  			}{B: "bar"}},
  1045  		},
  1046  		{
  1047  			name: "HeadStringMultiFieldsNotRootString",
  1048  			data: struct {
  1049  				A struct {
  1050  					A string `json:"a,string"`
  1051  				}
  1052  				B struct {
  1053  					B string `json:"b,string"`
  1054  				}
  1055  			}{A: struct {
  1056  				A string `json:"a,string"`
  1057  			}{A: "foo"}, B: struct {
  1058  				B string `json:"b,string"`
  1059  			}{B: "bar"}},
  1060  		},
  1061  		{
  1062  			name: "HeadStringMultiFieldsNotRootStringOmitEmpty",
  1063  			data: struct {
  1064  				A struct {
  1065  					A string `json:"a,string,omitempty"`
  1066  				}
  1067  				B struct {
  1068  					B string `json:"b,string,omitempty"`
  1069  				}
  1070  			}{A: struct {
  1071  				A string `json:"a,string,omitempty"`
  1072  			}{A: "foo"}, B: struct {
  1073  				B string `json:"b,string,omitempty"`
  1074  			}{B: "bar"}},
  1075  		},
  1076  
  1077  		// HeadStringPtrMultiFieldsNotRoot
  1078  		{
  1079  			name: "HeadStringPtrMultiFieldsNotRoot",
  1080  			data: struct {
  1081  				A struct {
  1082  					A *string `json:"a"`
  1083  				}
  1084  				B struct {
  1085  					B *string `json:"b"`
  1086  				}
  1087  			}{A: struct {
  1088  				A *string `json:"a"`
  1089  			}{A: stringptr("foo")}, B: struct {
  1090  				B *string `json:"b"`
  1091  			}{B: stringptr("bar")}},
  1092  		},
  1093  		{
  1094  			name: "HeadStringPtrMultiFieldsNotRootOmitEmpty",
  1095  			data: struct {
  1096  				A struct {
  1097  					A *string `json:"a,omitempty"`
  1098  				}
  1099  				B struct {
  1100  					B *string `json:"b,omitempty"`
  1101  				}
  1102  			}{A: struct {
  1103  				A *string `json:"a,omitempty"`
  1104  			}{A: stringptr("foo")}, B: struct {
  1105  				B *string `json:"b,omitempty"`
  1106  			}{B: stringptr("bar")}},
  1107  		},
  1108  		{
  1109  			name: "HeadStringPtrMultiFieldsNotRootString",
  1110  			data: struct {
  1111  				A struct {
  1112  					A *string `json:"a,string"`
  1113  				}
  1114  				B struct {
  1115  					B *string `json:"b,string"`
  1116  				}
  1117  			}{A: struct {
  1118  				A *string `json:"a,string"`
  1119  			}{A: stringptr("foo")}, B: struct {
  1120  				B *string `json:"b,string"`
  1121  			}{B: stringptr("bar")}},
  1122  		},
  1123  		{
  1124  			name: "HeadStringPtrMultiFieldsNotRootStringOmitEmpty",
  1125  			data: struct {
  1126  				A struct {
  1127  					A *string `json:"a,string,omitempty"`
  1128  				}
  1129  				B struct {
  1130  					B *string `json:"b,string,omitempty"`
  1131  				}
  1132  			}{A: struct {
  1133  				A *string `json:"a,string,omitempty"`
  1134  			}{A: stringptr("foo")}, B: struct {
  1135  				B *string `json:"b,string,omitempty"`
  1136  			}{B: stringptr("bar")}},
  1137  		},
  1138  
  1139  		// HeadStringPtrNilMultiFieldsNotRoot
  1140  		{
  1141  			name: "HeadStringPtrNilMultiFieldsNotRoot",
  1142  			data: struct {
  1143  				A struct {
  1144  					A *string `json:"a"`
  1145  				}
  1146  				B struct {
  1147  					B *string `json:"b"`
  1148  				}
  1149  			}{A: struct {
  1150  				A *string `json:"a"`
  1151  			}{A: nil}, B: struct {
  1152  				B *string `json:"b"`
  1153  			}{B: nil}},
  1154  		},
  1155  		{
  1156  			name: "HeadStringPtrNilMultiFieldsNotRootOmitEmpty",
  1157  			data: struct {
  1158  				A struct {
  1159  					A *string `json:"a,omitempty"`
  1160  				}
  1161  				B struct {
  1162  					B *string `json:"b,omitempty"`
  1163  				}
  1164  			}{A: struct {
  1165  				A *string `json:"a,omitempty"`
  1166  			}{A: nil}, B: struct {
  1167  				B *string `json:"b,omitempty"`
  1168  			}{B: nil}},
  1169  		},
  1170  		{
  1171  			name: "HeadStringPtrNilMultiFieldsNotRootString",
  1172  			data: struct {
  1173  				A struct {
  1174  					A *string `json:"a,string"`
  1175  				}
  1176  				B struct {
  1177  					B *string `json:"b,string"`
  1178  				}
  1179  			}{A: struct {
  1180  				A *string `json:"a,string"`
  1181  			}{A: nil}, B: struct {
  1182  				B *string `json:"b,string"`
  1183  			}{B: nil}},
  1184  		},
  1185  		{
  1186  			name: "HeadStringPtrNilMultiFieldsNotRootStringOmitEmpty",
  1187  			data: struct {
  1188  				A struct {
  1189  					A *string `json:"a,string,omitempty"`
  1190  				}
  1191  				B struct {
  1192  					B *string `json:"b,string,omitempty"`
  1193  				}
  1194  			}{A: struct {
  1195  				A *string `json:"a,string,omitempty"`
  1196  			}{A: nil}, B: struct {
  1197  				B *string `json:"b,string,omitempty"`
  1198  			}{B: nil}},
  1199  		},
  1200  
  1201  		// PtrHeadStringZeroMultiFieldsNotRoot
  1202  		{
  1203  			name: "PtrHeadStringZeroMultiFieldsNotRoot",
  1204  			data: &struct {
  1205  				A struct {
  1206  					A string `json:"a"`
  1207  				}
  1208  				B struct {
  1209  					B string `json:"b"`
  1210  				}
  1211  			}{},
  1212  		},
  1213  		{
  1214  			name: "PtrHeadStringZeroMultiFieldsNotRootOmitEmpty",
  1215  			data: &struct {
  1216  				A struct {
  1217  					A string `json:"a,omitempty"`
  1218  				}
  1219  				B struct {
  1220  					B string `json:"b,omitempty"`
  1221  				}
  1222  			}{},
  1223  		},
  1224  		{
  1225  			name: "PtrHeadStringZeroMultiFieldsNotRootString",
  1226  			data: &struct {
  1227  				A struct {
  1228  					A string `json:"a,string"`
  1229  				}
  1230  				B struct {
  1231  					B string `json:"b,string"`
  1232  				}
  1233  			}{},
  1234  		},
  1235  		{
  1236  			name: "PtrHeadStringZeroMultiFieldsNotRootStringOmitEmpty",
  1237  			data: &struct {
  1238  				A struct {
  1239  					A string `json:"a,string,omitempty"`
  1240  				}
  1241  				B struct {
  1242  					B string `json:"b,string,omitempty"`
  1243  				}
  1244  			}{},
  1245  		},
  1246  
  1247  		// PtrHeadStringMultiFieldsNotRoot
  1248  		{
  1249  			name: "PtrHeadStringMultiFieldsNotRoot",
  1250  			data: &struct {
  1251  				A struct {
  1252  					A string `json:"a"`
  1253  				}
  1254  				B struct {
  1255  					B string `json:"b"`
  1256  				}
  1257  			}{A: struct {
  1258  				A string `json:"a"`
  1259  			}{A: "foo"}, B: struct {
  1260  				B string `json:"b"`
  1261  			}{B: "bar"}},
  1262  		},
  1263  		{
  1264  			name: "PtrHeadStringMultiFieldsNotRootOmitEmpty",
  1265  			data: &struct {
  1266  				A struct {
  1267  					A string `json:"a,omitempty"`
  1268  				}
  1269  				B struct {
  1270  					B string `json:"b,omitempty"`
  1271  				}
  1272  			}{A: struct {
  1273  				A string `json:"a,omitempty"`
  1274  			}{A: "foo"}, B: struct {
  1275  				B string `json:"b,omitempty"`
  1276  			}{B: "bar"}},
  1277  		},
  1278  		{
  1279  			name: "PtrHeadStringMultiFieldsNotRootString",
  1280  			data: &struct {
  1281  				A struct {
  1282  					A string `json:"a,string"`
  1283  				}
  1284  				B struct {
  1285  					B string `json:"b,string"`
  1286  				}
  1287  			}{A: struct {
  1288  				A string `json:"a,string"`
  1289  			}{A: "foo"}, B: struct {
  1290  				B string `json:"b,string"`
  1291  			}{B: "bar"}},
  1292  		},
  1293  		{
  1294  			name: "PtrHeadStringMultiFieldsNotRootStringOmitEmpty",
  1295  			data: &struct {
  1296  				A struct {
  1297  					A string `json:"a,string,omitempty"`
  1298  				}
  1299  				B struct {
  1300  					B string `json:"b,string,omitempty"`
  1301  				}
  1302  			}{A: struct {
  1303  				A string `json:"a,string,omitempty"`
  1304  			}{A: "foo"}, B: struct {
  1305  				B string `json:"b,string,omitempty"`
  1306  			}{B: "bar"}},
  1307  		},
  1308  
  1309  		// PtrHeadStringPtrMultiFieldsNotRoot
  1310  		{
  1311  			name: "PtrHeadStringPtrMultiFieldsNotRoot",
  1312  			data: &struct {
  1313  				A *struct {
  1314  					A *string `json:"a"`
  1315  				}
  1316  				B *struct {
  1317  					B *string `json:"b"`
  1318  				}
  1319  			}{A: &(struct {
  1320  				A *string `json:"a"`
  1321  			}{A: stringptr("foo")}), B: &(struct {
  1322  				B *string `json:"b"`
  1323  			}{B: stringptr("bar")})},
  1324  		},
  1325  		{
  1326  			name: "PtrHeadStringPtrMultiFieldsNotRootOmitEmpty",
  1327  			data: &struct {
  1328  				A *struct {
  1329  					A *string `json:"a,omitempty"`
  1330  				}
  1331  				B *struct {
  1332  					B *string `json:"b,omitempty"`
  1333  				}
  1334  			}{A: &(struct {
  1335  				A *string `json:"a,omitempty"`
  1336  			}{A: stringptr("foo")}), B: &(struct {
  1337  				B *string `json:"b,omitempty"`
  1338  			}{B: stringptr("bar")})},
  1339  		},
  1340  		{
  1341  			name: "PtrHeadStringPtrMultiFieldsNotRootString",
  1342  			data: &struct {
  1343  				A *struct {
  1344  					A *string `json:"a,string"`
  1345  				}
  1346  				B *struct {
  1347  					B *string `json:"b,string"`
  1348  				}
  1349  			}{A: &(struct {
  1350  				A *string `json:"a,string"`
  1351  			}{A: stringptr("foo")}), B: &(struct {
  1352  				B *string `json:"b,string"`
  1353  			}{B: stringptr("bar")})},
  1354  		},
  1355  		{
  1356  			name: "PtrHeadStringPtrMultiFieldsNotRootStringOmitEmpty",
  1357  			data: &struct {
  1358  				A *struct {
  1359  					A *string `json:"a,string,omitempty"`
  1360  				}
  1361  				B *struct {
  1362  					B *string `json:"b,string,omitempty"`
  1363  				}
  1364  			}{A: &(struct {
  1365  				A *string `json:"a,string,omitempty"`
  1366  			}{A: stringptr("foo")}), B: &(struct {
  1367  				B *string `json:"b,string,omitempty"`
  1368  			}{B: stringptr("bar")})},
  1369  		},
  1370  
  1371  		// PtrHeadStringPtrNilMultiFieldsNotRoot
  1372  		{
  1373  			name: "PtrHeadStringPtrNilMultiFieldsNotRoot",
  1374  			data: &struct {
  1375  				A *struct {
  1376  					A *string `json:"a"`
  1377  				}
  1378  				B *struct {
  1379  					B *string `json:"b"`
  1380  				}
  1381  			}{A: nil, B: nil},
  1382  		},
  1383  		{
  1384  			name: "PtrHeadStringPtrNilMultiFieldsNotRootOmitEmpty",
  1385  			data: &struct {
  1386  				A *struct {
  1387  					A *string `json:"a,omitempty"`
  1388  				}
  1389  				B *struct {
  1390  					B *string `json:"b,omitempty"`
  1391  				}
  1392  			}{A: nil, B: nil},
  1393  		},
  1394  		{
  1395  			name: "PtrHeadStringPtrNilMultiFieldsNotRootString",
  1396  			data: &struct {
  1397  				A *struct {
  1398  					A *string `json:"a,string"`
  1399  				}
  1400  				B *struct {
  1401  					B *string `json:"b,string"`
  1402  				}
  1403  			}{A: nil, B: nil},
  1404  		},
  1405  		{
  1406  			name: "PtrHeadStringPtrNilMultiFieldsNotRootStringOmitEmpty",
  1407  			data: &struct {
  1408  				A *struct {
  1409  					A *string `json:"a,string,omitempty"`
  1410  				}
  1411  				B *struct {
  1412  					B *string `json:"b,string,omitempty"`
  1413  				}
  1414  			}{A: nil, B: nil},
  1415  		},
  1416  
  1417  		// PtrHeadStringNilMultiFieldsNotRoot
  1418  		{
  1419  			name: "PtrHeadStringNilMultiFieldsNotRoot",
  1420  			data: (*struct {
  1421  				A *struct {
  1422  					A *string `json:"a"`
  1423  				}
  1424  				B *struct {
  1425  					B *string `json:"b"`
  1426  				}
  1427  			})(nil),
  1428  		},
  1429  		{
  1430  			name: "PtrHeadStringNilMultiFieldsNotRootOmitEmpty",
  1431  			data: (*struct {
  1432  				A *struct {
  1433  					A *string `json:"a,omitempty"`
  1434  				}
  1435  				B *struct {
  1436  					B *string `json:"b,omitempty"`
  1437  				}
  1438  			})(nil),
  1439  		},
  1440  		{
  1441  			name: "PtrHeadStringNilMultiFieldsNotRootString",
  1442  			data: (*struct {
  1443  				A *struct {
  1444  					A *string `json:"a,string"`
  1445  				}
  1446  				B *struct {
  1447  					B *string `json:"b,string"`
  1448  				}
  1449  			})(nil),
  1450  		},
  1451  		{
  1452  			name: "PtrHeadStringNilMultiFieldsNotRootStringOmitEmpty",
  1453  			data: (*struct {
  1454  				A *struct {
  1455  					A *string `json:"a,string,omitempty"`
  1456  				}
  1457  				B *struct {
  1458  					B *string `json:"b,string,omitempty"`
  1459  				}
  1460  			})(nil),
  1461  		},
  1462  
  1463  		// PtrHeadStringDoubleMultiFieldsNotRoot
  1464  		{
  1465  			name: "PtrHeadStringDoubleMultiFieldsNotRoot",
  1466  			data: &struct {
  1467  				A *struct {
  1468  					A string `json:"a"`
  1469  					B string `json:"b"`
  1470  					C string `json:"c"`
  1471  				}
  1472  				B *struct {
  1473  					A string `json:"a"`
  1474  					B string `json:"b"`
  1475  					C string `json:"c"`
  1476  				}
  1477  			}{A: &(struct {
  1478  				A string `json:"a"`
  1479  				B string `json:"b"`
  1480  				C string `json:"c"`
  1481  			}{A: "foo", B: "bar", C: "baz"}), B: &(struct {
  1482  				A string `json:"a"`
  1483  				B string `json:"b"`
  1484  				C string `json:"c"`
  1485  			}{A: "foo", B: "bar", C: "baz"})},
  1486  		},
  1487  		{
  1488  			name: "PtrHeadStringDoubleMultiFieldsNotRootOmitEmpty",
  1489  			data: &struct {
  1490  				A *struct {
  1491  					A string `json:"a,omitempty"`
  1492  					B string `json:"b,omitempty"`
  1493  				}
  1494  				B *struct {
  1495  					A string `json:"a,omitempty"`
  1496  					B string `json:"b,omitempty"`
  1497  				}
  1498  			}{A: &(struct {
  1499  				A string `json:"a,omitempty"`
  1500  				B string `json:"b,omitempty"`
  1501  			}{A: "foo", B: "bar"}), B: &(struct {
  1502  				A string `json:"a,omitempty"`
  1503  				B string `json:"b,omitempty"`
  1504  			}{A: "foo", B: "bar"})},
  1505  		},
  1506  		{
  1507  			name: "PtrHeadStringDoubleMultiFieldsNotRootString",
  1508  			data: &struct {
  1509  				A *struct {
  1510  					A string `json:"a,string"`
  1511  					B string `json:"b,string"`
  1512  				}
  1513  				B *struct {
  1514  					A string `json:"a,string"`
  1515  					B string `json:"b,string"`
  1516  				}
  1517  			}{A: &(struct {
  1518  				A string `json:"a,string"`
  1519  				B string `json:"b,string"`
  1520  			}{A: "foo", B: "bar"}), B: &(struct {
  1521  				A string `json:"a,string"`
  1522  				B string `json:"b,string"`
  1523  			}{A: "foo", B: "bar"})},
  1524  		},
  1525  		{
  1526  			name: "PtrHeadStringDoubleMultiFieldsNotRootStringOmitEmpty",
  1527  			data: &struct {
  1528  				A *struct {
  1529  					A string `json:"a,string,omitempty"`
  1530  					B string `json:"b,string,omitempty"`
  1531  				}
  1532  				B *struct {
  1533  					A string `json:"a,string,omitempty"`
  1534  					B string `json:"b,string,omitempty"`
  1535  				}
  1536  			}{A: &(struct {
  1537  				A string `json:"a,string,omitempty"`
  1538  				B string `json:"b,string,omitempty"`
  1539  			}{A: "foo", B: "bar"}), B: &(struct {
  1540  				A string `json:"a,string,omitempty"`
  1541  				B string `json:"b,string,omitempty"`
  1542  			}{A: "foo", B: "bar"})},
  1543  		},
  1544  
  1545  		// PtrHeadStringNilDoubleMultiFieldsNotRoot
  1546  		{
  1547  			name: "PtrHeadStringNilDoubleMultiFieldsNotRoot",
  1548  			data: &struct {
  1549  				A *struct {
  1550  					A string `json:"a"`
  1551  					B string `json:"b"`
  1552  				}
  1553  				B *struct {
  1554  					A string `json:"a"`
  1555  					B string `json:"b"`
  1556  				}
  1557  			}{A: nil, B: nil},
  1558  		},
  1559  		{
  1560  			name: "PtrHeadStringNilDoubleMultiFieldsNotRootOmitEmpty",
  1561  			data: &struct {
  1562  				A *struct {
  1563  					A string `json:"a,omitempty"`
  1564  					B string `json:"b,omitempty"`
  1565  				}
  1566  				B *struct {
  1567  					A string `json:"a,omitempty"`
  1568  					B string `json:"b,omitempty"`
  1569  				}
  1570  			}{A: nil, B: nil},
  1571  		},
  1572  		{
  1573  			name: "PtrHeadStringNilDoubleMultiFieldsNotRootString",
  1574  			data: &struct {
  1575  				A *struct {
  1576  					A string `json:"a,string"`
  1577  					B string `json:"b,string"`
  1578  				}
  1579  				B *struct {
  1580  					A string `json:"a,string"`
  1581  					B string `json:"b,string"`
  1582  				}
  1583  			}{A: nil, B: nil},
  1584  		},
  1585  		{
  1586  			name: "PtrHeadStringNilDoubleMultiFieldsNotRootStringOmitEmpty",
  1587  			data: &struct {
  1588  				A *struct {
  1589  					A string `json:"a,string,omitempty"`
  1590  					B string `json:"b,string,omitempty"`
  1591  				}
  1592  				B *struct {
  1593  					A string `json:"a,string,omitempty"`
  1594  					B string `json:"b,string,omitempty"`
  1595  				}
  1596  			}{A: nil, B: nil},
  1597  		},
  1598  
  1599  		// PtrHeadStringNilDoubleMultiFieldsNotRoot
  1600  		{
  1601  			name: "PtrHeadStringNilDoubleMultiFieldsNotRoot",
  1602  			data: (*struct {
  1603  				A *struct {
  1604  					A string `json:"a"`
  1605  					B string `json:"b"`
  1606  				}
  1607  				B *struct {
  1608  					A string `json:"a"`
  1609  					B string `json:"b"`
  1610  				}
  1611  			})(nil),
  1612  		},
  1613  		{
  1614  			name: "PtrHeadStringNilDoubleMultiFieldsNotRootOmitEmpty",
  1615  			data: (*struct {
  1616  				A *struct {
  1617  					A string `json:"a,omitempty"`
  1618  					B string `json:"b,omitempty"`
  1619  				}
  1620  				B *struct {
  1621  					A string `json:"a,omitempty"`
  1622  					B string `json:"b,omitempty"`
  1623  				}
  1624  			})(nil),
  1625  		},
  1626  		{
  1627  			name: "PtrHeadStringNilDoubleMultiFieldsNotRootString",
  1628  			data: (*struct {
  1629  				A *struct {
  1630  					A string `json:"a,string"`
  1631  					B string `json:"b,string"`
  1632  				}
  1633  				B *struct {
  1634  					A string `json:"a,string"`
  1635  					B string `json:"b,string"`
  1636  				}
  1637  			})(nil),
  1638  		},
  1639  		{
  1640  			name: "PtrHeadStringNilDoubleMultiFieldsNotRootStringOmitEmpty",
  1641  			data: (*struct {
  1642  				A *struct {
  1643  					A string `json:"a,string,omitempty"`
  1644  					B string `json:"b,string,omitempty"`
  1645  				}
  1646  				B *struct {
  1647  					A string `json:"a,string,omitempty"`
  1648  					B string `json:"b,string,omitempty"`
  1649  				}
  1650  			})(nil),
  1651  		},
  1652  
  1653  		// PtrHeadStringPtrDoubleMultiFieldsNotRoot
  1654  		{
  1655  			name: "PtrHeadStringPtrDoubleMultiFieldsNotRoot",
  1656  			data: &struct {
  1657  				A *struct {
  1658  					A *string `json:"a"`
  1659  					B *string `json:"b"`
  1660  				}
  1661  				B *struct {
  1662  					A *string `json:"a"`
  1663  					B *string `json:"b"`
  1664  				}
  1665  			}{A: &(struct {
  1666  				A *string `json:"a"`
  1667  				B *string `json:"b"`
  1668  			}{A: stringptr("foo"), B: stringptr("bar")}), B: &(struct {
  1669  				A *string `json:"a"`
  1670  				B *string `json:"b"`
  1671  			}{A: stringptr("foo"), B: stringptr("bar")})},
  1672  		},
  1673  		{
  1674  			name: "PtrHeadStringPtrDoubleMultiFieldsNotRootOmitEmpty",
  1675  			data: &struct {
  1676  				A *struct {
  1677  					A *string `json:"a,omitempty"`
  1678  					B *string `json:"b,omitempty"`
  1679  				}
  1680  				B *struct {
  1681  					A *string `json:"a,omitempty"`
  1682  					B *string `json:"b,omitempty"`
  1683  				}
  1684  			}{A: &(struct {
  1685  				A *string `json:"a,omitempty"`
  1686  				B *string `json:"b,omitempty"`
  1687  			}{A: stringptr("foo"), B: stringptr("bar")}), B: &(struct {
  1688  				A *string `json:"a,omitempty"`
  1689  				B *string `json:"b,omitempty"`
  1690  			}{A: stringptr("foo"), B: stringptr("bar")})},
  1691  		},
  1692  		{
  1693  			name: "PtrHeadStringPtrDoubleMultiFieldsNotRootString",
  1694  			data: &struct {
  1695  				A *struct {
  1696  					A *string `json:"a,string"`
  1697  					B *string `json:"b,string"`
  1698  				}
  1699  				B *struct {
  1700  					A *string `json:"a,string"`
  1701  					B *string `json:"b,string"`
  1702  				}
  1703  			}{A: &(struct {
  1704  				A *string `json:"a,string"`
  1705  				B *string `json:"b,string"`
  1706  			}{A: stringptr("foo"), B: stringptr("bar")}), B: &(struct {
  1707  				A *string `json:"a,string"`
  1708  				B *string `json:"b,string"`
  1709  			}{A: stringptr("foo"), B: stringptr("bar")})},
  1710  		},
  1711  		{
  1712  			name: "PtrHeadStringPtrDoubleMultiFieldsNotRootStringOmitEmpty",
  1713  			data: &struct {
  1714  				A *struct {
  1715  					A *string `json:"a,string,omitempty"`
  1716  					B *string `json:"b,string,omitempty"`
  1717  				}
  1718  				B *struct {
  1719  					A *string `json:"a,string,omitempty"`
  1720  					B *string `json:"b,string,omitempty"`
  1721  				}
  1722  			}{A: &(struct {
  1723  				A *string `json:"a,string,omitempty"`
  1724  				B *string `json:"b,string,omitempty"`
  1725  			}{A: stringptr("foo"), B: stringptr("bar")}), B: &(struct {
  1726  				A *string `json:"a,string,omitempty"`
  1727  				B *string `json:"b,string,omitempty"`
  1728  			}{A: stringptr("foo"), B: stringptr("bar")})},
  1729  		},
  1730  
  1731  		// PtrHeadStringPtrNilDoubleMultiFieldsNotRoot
  1732  		{
  1733  			name: "PtrHeadStringPtrNilDoubleMultiFieldsNotRoot",
  1734  			data: &struct {
  1735  				A *struct {
  1736  					A *string `json:"a"`
  1737  					B *string `json:"b"`
  1738  				}
  1739  				B *struct {
  1740  					A *string `json:"a"`
  1741  					B *string `json:"b"`
  1742  				}
  1743  			}{A: nil, B: nil},
  1744  		},
  1745  		{
  1746  			name: "PtrHeadStringPtrNilDoubleMultiFieldsNotRootOmitEmpty",
  1747  			data: &struct {
  1748  				A *struct {
  1749  					A *string `json:"a,omitempty"`
  1750  					B *string `json:"b,omitempty"`
  1751  				}
  1752  				B *struct {
  1753  					A *string `json:"a,omitempty"`
  1754  					B *string `json:"b,omitempty"`
  1755  				}
  1756  			}{A: nil, B: nil},
  1757  		},
  1758  		{
  1759  			name: "PtrHeadStringPtrNilDoubleMultiFieldsNotRootString",
  1760  			data: &struct {
  1761  				A *struct {
  1762  					A *string `json:"a,string"`
  1763  					B *string `json:"b,string"`
  1764  				}
  1765  				B *struct {
  1766  					A *string `json:"a,string"`
  1767  					B *string `json:"b,string"`
  1768  				}
  1769  			}{A: nil, B: nil},
  1770  		},
  1771  		{
  1772  			name: "PtrHeadStringPtrNilDoubleMultiFieldsNotRootStringOmitEmpty",
  1773  			data: &struct {
  1774  				A *struct {
  1775  					A *string `json:"a,string,omitempty"`
  1776  					B *string `json:"b,string,omitempty"`
  1777  				}
  1778  				B *struct {
  1779  					A *string `json:"a,string,omitempty"`
  1780  					B *string `json:"b,string,omitempty"`
  1781  				}
  1782  			}{A: nil, B: nil},
  1783  		},
  1784  
  1785  		// PtrHeadStringPtrNilDoubleMultiFieldsNotRoot
  1786  		{
  1787  			name: "PtrHeadStringPtrNilDoubleMultiFieldsNotRoot",
  1788  			data: (*struct {
  1789  				A *struct {
  1790  					A *string `json:"a"`
  1791  					B *string `json:"b"`
  1792  				}
  1793  				B *struct {
  1794  					A *string `json:"a"`
  1795  					B *string `json:"b"`
  1796  				}
  1797  			})(nil),
  1798  		},
  1799  		{
  1800  			name: "PtrHeadStringPtrNilDoubleMultiFieldsNotRootOmitEmpty",
  1801  			data: (*struct {
  1802  				A *struct {
  1803  					A *string `json:"a,omitempty"`
  1804  					B *string `json:"b,omitempty"`
  1805  				}
  1806  				B *struct {
  1807  					A *string `json:"a,omitempty"`
  1808  					B *string `json:"b,omitempty"`
  1809  				}
  1810  			})(nil),
  1811  		},
  1812  		{
  1813  			name: "PtrHeadStringPtrNilDoubleMultiFieldsNotRootString",
  1814  			data: (*struct {
  1815  				A *struct {
  1816  					A *string `json:"a,string"`
  1817  					B *string `json:"b,string"`
  1818  				}
  1819  				B *struct {
  1820  					A *string `json:"a,string"`
  1821  					B *string `json:"b,string"`
  1822  				}
  1823  			})(nil),
  1824  		},
  1825  		{
  1826  			name: "PtrHeadStringPtrNilDoubleMultiFieldsNotRootStringOmitEmpty",
  1827  			data: (*struct {
  1828  				A *struct {
  1829  					A *string `json:"a,string,omitempty"`
  1830  					B *string `json:"b,string,omitempty"`
  1831  				}
  1832  				B *struct {
  1833  					A *string `json:"a,string,omitempty"`
  1834  					B *string `json:"b,string,omitempty"`
  1835  				}
  1836  			})(nil),
  1837  		},
  1838  
  1839  		// AnonymousHeadString
  1840  		{
  1841  			name: "AnonymousHeadString",
  1842  			data: struct {
  1843  				structString
  1844  				B string `json:"b"`
  1845  			}{
  1846  				structString: structString{A: "foo"},
  1847  				B:            "bar",
  1848  			},
  1849  		},
  1850  		{
  1851  			name: "AnonymousHeadStringOmitEmpty",
  1852  			data: struct {
  1853  				structStringOmitEmpty
  1854  				B string `json:"b,omitempty"`
  1855  			}{
  1856  				structStringOmitEmpty: structStringOmitEmpty{A: "foo"},
  1857  				B:                     "bar",
  1858  			},
  1859  		},
  1860  		{
  1861  			name: "AnonymousHeadStringString",
  1862  			data: struct {
  1863  				structStringString
  1864  				B string `json:"b,string"`
  1865  			}{
  1866  				structStringString: structStringString{A: "foo"},
  1867  				B:                  "bar",
  1868  			},
  1869  		},
  1870  		{
  1871  			name: "AnonymousHeadStringStringOmitEmpty",
  1872  			data: struct {
  1873  				structStringStringOmitEmpty
  1874  				B string `json:"b,string,omitempty"`
  1875  			}{
  1876  				structStringStringOmitEmpty: structStringStringOmitEmpty{A: "foo"},
  1877  				B:                           "bar",
  1878  			},
  1879  		},
  1880  
  1881  		// PtrAnonymousHeadString
  1882  		{
  1883  			name: "PtrAnonymousHeadString",
  1884  			data: struct {
  1885  				*structString
  1886  				B string `json:"b"`
  1887  			}{
  1888  				structString: &structString{A: "foo"},
  1889  				B:            "bar",
  1890  			},
  1891  		},
  1892  		{
  1893  			name: "PtrAnonymousHeadStringOmitEmpty",
  1894  			data: struct {
  1895  				*structStringOmitEmpty
  1896  				B string `json:"b,omitempty"`
  1897  			}{
  1898  				structStringOmitEmpty: &structStringOmitEmpty{A: "foo"},
  1899  				B:                     "bar",
  1900  			},
  1901  		},
  1902  		{
  1903  			name: "PtrAnonymousHeadStringString",
  1904  			data: struct {
  1905  				*structStringString
  1906  				B string `json:"b,string"`
  1907  			}{
  1908  				structStringString: &structStringString{A: "foo"},
  1909  				B:                  "bar",
  1910  			},
  1911  		},
  1912  		{
  1913  			name: "PtrAnonymousHeadStringStringOmitEmpty",
  1914  			data: struct {
  1915  				*structStringStringOmitEmpty
  1916  				B string `json:"b,string,omitempty"`
  1917  			}{
  1918  				structStringStringOmitEmpty: &structStringStringOmitEmpty{A: "foo"},
  1919  				B:                           "bar",
  1920  			},
  1921  		},
  1922  
  1923  		// NilPtrAnonymousHeadString
  1924  		{
  1925  			name: "NilPtrAnonymousHeadString",
  1926  			data: struct {
  1927  				*structString
  1928  				B string `json:"b"`
  1929  			}{
  1930  				structString: nil,
  1931  				B:            "baz",
  1932  			},
  1933  		},
  1934  		{
  1935  			name: "NilPtrAnonymousHeadStringOmitEmpty",
  1936  			data: struct {
  1937  				*structStringOmitEmpty
  1938  				B string `json:"b,omitempty"`
  1939  			}{
  1940  				structStringOmitEmpty: nil,
  1941  				B:                     "baz",
  1942  			},
  1943  		},
  1944  		{
  1945  			name: "NilPtrAnonymousHeadStringString",
  1946  			data: struct {
  1947  				*structStringString
  1948  				B string `json:"b,string"`
  1949  			}{
  1950  				structStringString: nil,
  1951  				B:                  "baz",
  1952  			},
  1953  		},
  1954  		{
  1955  			name: "NilPtrAnonymousHeadStringStringOmitEmpty",
  1956  			data: struct {
  1957  				*structStringStringOmitEmpty
  1958  				B string `json:"b,string,omitempty"`
  1959  			}{
  1960  				structStringStringOmitEmpty: nil,
  1961  				B:                           "baz",
  1962  			},
  1963  		},
  1964  
  1965  		// AnonymousHeadStringPtr
  1966  		{
  1967  			name: "AnonymousHeadStringPtr",
  1968  			data: struct {
  1969  				structStringPtr
  1970  				B *string `json:"b"`
  1971  			}{
  1972  				structStringPtr: structStringPtr{A: stringptr("foo")},
  1973  				B:               stringptr("bar"),
  1974  			},
  1975  		},
  1976  		{
  1977  			name: "AnonymousHeadStringPtrOmitEmpty",
  1978  			data: struct {
  1979  				structStringPtrOmitEmpty
  1980  				B *string `json:"b,omitempty"`
  1981  			}{
  1982  				structStringPtrOmitEmpty: structStringPtrOmitEmpty{A: stringptr("foo")},
  1983  				B:                        stringptr("bar"),
  1984  			},
  1985  		},
  1986  		{
  1987  			name: "AnonymousHeadStringPtrString",
  1988  			data: struct {
  1989  				structStringPtrString
  1990  				B *string `json:"b,string"`
  1991  			}{
  1992  				structStringPtrString: structStringPtrString{A: stringptr("foo")},
  1993  				B:                     stringptr("bar"),
  1994  			},
  1995  		},
  1996  		{
  1997  			name: "AnonymousHeadStringPtrStringOmitEmpty",
  1998  			data: struct {
  1999  				structStringPtrStringOmitEmpty
  2000  				B *string `json:"b,string,omitempty"`
  2001  			}{
  2002  				structStringPtrStringOmitEmpty: structStringPtrStringOmitEmpty{A: stringptr("foo")},
  2003  				B:                              stringptr("bar"),
  2004  			},
  2005  		},
  2006  
  2007  		// AnonymousHeadStringPtrNil
  2008  		{
  2009  			name: "AnonymousHeadStringPtrNil",
  2010  			data: struct {
  2011  				structStringPtr
  2012  				B *string `json:"b"`
  2013  			}{
  2014  				structStringPtr: structStringPtr{A: nil},
  2015  				B:               stringptr("foo"),
  2016  			},
  2017  		},
  2018  		{
  2019  			name: "AnonymousHeadStringPtrNilOmitEmpty",
  2020  			data: struct {
  2021  				structStringPtrOmitEmpty
  2022  				B *string `json:"b,omitempty"`
  2023  			}{
  2024  				structStringPtrOmitEmpty: structStringPtrOmitEmpty{A: nil},
  2025  				B:                        stringptr("foo"),
  2026  			},
  2027  		},
  2028  		{
  2029  			name: "AnonymousHeadStringPtrNilString",
  2030  			data: struct {
  2031  				structStringPtrString
  2032  				B *string `json:"b,string"`
  2033  			}{
  2034  				structStringPtrString: structStringPtrString{A: nil},
  2035  				B:                     stringptr("foo"),
  2036  			},
  2037  		},
  2038  		{
  2039  			name: "AnonymousHeadStringPtrNilStringOmitEmpty",
  2040  			data: struct {
  2041  				structStringPtrStringOmitEmpty
  2042  				B *string `json:"b,string,omitempty"`
  2043  			}{
  2044  				structStringPtrStringOmitEmpty: structStringPtrStringOmitEmpty{A: nil},
  2045  				B:                              stringptr("foo"),
  2046  			},
  2047  		},
  2048  
  2049  		// PtrAnonymousHeadStringPtr
  2050  		{
  2051  			name: "PtrAnonymousHeadStringPtr",
  2052  			data: struct {
  2053  				*structStringPtr
  2054  				B *string `json:"b"`
  2055  			}{
  2056  				structStringPtr: &structStringPtr{A: stringptr("foo")},
  2057  				B:               stringptr("bar"),
  2058  			},
  2059  		},
  2060  		{
  2061  			name: "PtrAnonymousHeadStringPtrOmitEmpty",
  2062  			data: struct {
  2063  				*structStringPtrOmitEmpty
  2064  				B *string `json:"b,omitempty"`
  2065  			}{
  2066  				structStringPtrOmitEmpty: &structStringPtrOmitEmpty{A: stringptr("foo")},
  2067  				B:                        stringptr("bar"),
  2068  			},
  2069  		},
  2070  		{
  2071  			name: "PtrAnonymousHeadStringPtrString",
  2072  			data: struct {
  2073  				*structStringPtrString
  2074  				B *string `json:"b,string"`
  2075  			}{
  2076  				structStringPtrString: &structStringPtrString{A: stringptr("foo")},
  2077  				B:                     stringptr("bar"),
  2078  			},
  2079  		},
  2080  		{
  2081  			name: "PtrAnonymousHeadStringPtrStringOmitEmpty",
  2082  			data: struct {
  2083  				*structStringPtrStringOmitEmpty
  2084  				B *string `json:"b,string,omitempty"`
  2085  			}{
  2086  				structStringPtrStringOmitEmpty: &structStringPtrStringOmitEmpty{A: stringptr("foo")},
  2087  				B:                              stringptr("bar"),
  2088  			},
  2089  		},
  2090  
  2091  		// NilPtrAnonymousHeadStringPtr
  2092  		{
  2093  			name: "NilPtrAnonymousHeadStringPtr",
  2094  			data: struct {
  2095  				*structStringPtr
  2096  				B *string `json:"b"`
  2097  			}{
  2098  				structStringPtr: nil,
  2099  				B:               stringptr("foo"),
  2100  			},
  2101  		},
  2102  		{
  2103  			name: "NilPtrAnonymousHeadStringPtrOmitEmpty",
  2104  			data: struct {
  2105  				*structStringPtrOmitEmpty
  2106  				B *string `json:"b,omitempty"`
  2107  			}{
  2108  				structStringPtrOmitEmpty: nil,
  2109  				B:                        stringptr("foo"),
  2110  			},
  2111  		},
  2112  		{
  2113  			name: "NilPtrAnonymousHeadStringPtrString",
  2114  			data: struct {
  2115  				*structStringPtrString
  2116  				B *string `json:"b,string"`
  2117  			}{
  2118  				structStringPtrString: nil,
  2119  				B:                     stringptr("foo"),
  2120  			},
  2121  		},
  2122  		{
  2123  			name: "NilPtrAnonymousHeadStringPtrStringOmitEmpty",
  2124  			data: struct {
  2125  				*structStringPtrStringOmitEmpty
  2126  				B *string `json:"b,string,omitempty"`
  2127  			}{
  2128  				structStringPtrStringOmitEmpty: nil,
  2129  				B:                              stringptr("foo"),
  2130  			},
  2131  		},
  2132  
  2133  		// AnonymousHeadStringOnly
  2134  		{
  2135  			name: "AnonymousHeadStringOnly",
  2136  			data: struct {
  2137  				structString
  2138  			}{
  2139  				structString: structString{A: "foo"},
  2140  			},
  2141  		},
  2142  		{
  2143  			name: "AnonymousHeadStringOnlyOmitEmpty",
  2144  			data: struct {
  2145  				structStringOmitEmpty
  2146  			}{
  2147  				structStringOmitEmpty: structStringOmitEmpty{A: "foo"},
  2148  			},
  2149  		},
  2150  		{
  2151  			name: "AnonymousHeadStringOnlyString",
  2152  			data: struct {
  2153  				structStringString
  2154  			}{
  2155  				structStringString: structStringString{A: "foo"},
  2156  			},
  2157  		},
  2158  		{
  2159  			name: "AnonymousHeadStringOnlyStringOmitEmpty",
  2160  			data: struct {
  2161  				structStringStringOmitEmpty
  2162  			}{
  2163  				structStringStringOmitEmpty: structStringStringOmitEmpty{A: "foo"},
  2164  			},
  2165  		},
  2166  
  2167  		// PtrAnonymousHeadStringOnly
  2168  		{
  2169  			name: "PtrAnonymousHeadStringOnly",
  2170  			data: struct {
  2171  				*structString
  2172  			}{
  2173  				structString: &structString{A: "foo"},
  2174  			},
  2175  		},
  2176  		{
  2177  			name: "PtrAnonymousHeadStringOnlyOmitEmpty",
  2178  			data: struct {
  2179  				*structStringOmitEmpty
  2180  			}{
  2181  				structStringOmitEmpty: &structStringOmitEmpty{A: "foo"},
  2182  			},
  2183  		},
  2184  		{
  2185  			name: "PtrAnonymousHeadStringOnlyString",
  2186  			data: struct {
  2187  				*structStringString
  2188  			}{
  2189  				structStringString: &structStringString{A: "foo"},
  2190  			},
  2191  		},
  2192  		{
  2193  			name: "PtrAnonymousHeadStringOnlyStringOmitEmpty",
  2194  			data: struct {
  2195  				*structStringStringOmitEmpty
  2196  			}{
  2197  				structStringStringOmitEmpty: &structStringStringOmitEmpty{A: "foo"},
  2198  			},
  2199  		},
  2200  
  2201  		// NilPtrAnonymousHeadStringOnly
  2202  		{
  2203  			name: "NilPtrAnonymousHeadStringOnly",
  2204  			data: struct {
  2205  				*structString
  2206  			}{
  2207  				structString: nil,
  2208  			},
  2209  		},
  2210  		{
  2211  			name: "NilPtrAnonymousHeadStringOnlyOmitEmpty",
  2212  			data: struct {
  2213  				*structStringOmitEmpty
  2214  			}{
  2215  				structStringOmitEmpty: nil,
  2216  			},
  2217  		},
  2218  		{
  2219  			name: "NilPtrAnonymousHeadStringOnlyString",
  2220  			data: struct {
  2221  				*structStringString
  2222  			}{
  2223  				structStringString: nil,
  2224  			},
  2225  		},
  2226  		{
  2227  			name: "NilPtrAnonymousHeadStringOnlyStringOmitEmpty",
  2228  			data: struct {
  2229  				*structStringStringOmitEmpty
  2230  			}{
  2231  				structStringStringOmitEmpty: nil,
  2232  			},
  2233  		},
  2234  
  2235  		// AnonymousHeadStringPtrOnly
  2236  		{
  2237  			name: "AnonymousHeadStringPtrOnly",
  2238  			data: struct {
  2239  				structStringPtr
  2240  			}{
  2241  				structStringPtr: structStringPtr{A: stringptr("foo")},
  2242  			},
  2243  		},
  2244  		{
  2245  			name: "AnonymousHeadStringPtrOnlyOmitEmpty",
  2246  			data: struct {
  2247  				structStringPtrOmitEmpty
  2248  			}{
  2249  				structStringPtrOmitEmpty: structStringPtrOmitEmpty{A: stringptr("foo")},
  2250  			},
  2251  		},
  2252  		{
  2253  			name: "AnonymousHeadStringPtrOnlyString",
  2254  			data: struct {
  2255  				structStringPtrString
  2256  			}{
  2257  				structStringPtrString: structStringPtrString{A: stringptr("foo")},
  2258  			},
  2259  		},
  2260  		{
  2261  			name: "AnonymousHeadStringPtrOnlyStringOmitEmpty",
  2262  			data: struct {
  2263  				structStringPtrStringOmitEmpty
  2264  			}{
  2265  				structStringPtrStringOmitEmpty: structStringPtrStringOmitEmpty{A: stringptr("foo")},
  2266  			},
  2267  		},
  2268  
  2269  		// AnonymousHeadStringPtrNilOnly
  2270  		{
  2271  			name: "AnonymousHeadStringPtrNilOnly",
  2272  			data: struct {
  2273  				structStringPtr
  2274  			}{
  2275  				structStringPtr: structStringPtr{A: nil},
  2276  			},
  2277  		},
  2278  		{
  2279  			name: "AnonymousHeadStringPtrNilOnlyOmitEmpty",
  2280  			data: struct {
  2281  				structStringPtrOmitEmpty
  2282  			}{
  2283  				structStringPtrOmitEmpty: structStringPtrOmitEmpty{A: nil},
  2284  			},
  2285  		},
  2286  		{
  2287  			name: "AnonymousHeadStringPtrNilOnlyString",
  2288  			data: struct {
  2289  				structStringPtrString
  2290  			}{
  2291  				structStringPtrString: structStringPtrString{A: nil},
  2292  			},
  2293  		},
  2294  		{
  2295  			name: "AnonymousHeadStringPtrNilOnlyStringOmitEmpty",
  2296  			data: struct {
  2297  				structStringPtrStringOmitEmpty
  2298  			}{
  2299  				structStringPtrStringOmitEmpty: structStringPtrStringOmitEmpty{A: nil},
  2300  			},
  2301  		},
  2302  
  2303  		// PtrAnonymousHeadStringPtrOnly
  2304  		{
  2305  			name: "PtrAnonymousHeadStringPtrOnly",
  2306  			data: struct {
  2307  				*structStringPtr
  2308  			}{
  2309  				structStringPtr: &structStringPtr{A: stringptr("foo")},
  2310  			},
  2311  		},
  2312  		{
  2313  			name: "PtrAnonymousHeadStringPtrOnlyOmitEmpty",
  2314  			data: struct {
  2315  				*structStringPtrOmitEmpty
  2316  			}{
  2317  				structStringPtrOmitEmpty: &structStringPtrOmitEmpty{A: stringptr("foo")},
  2318  			},
  2319  		},
  2320  		{
  2321  			name: "PtrAnonymousHeadStringPtrOnlyString",
  2322  			data: struct {
  2323  				*structStringPtrString
  2324  			}{
  2325  				structStringPtrString: &structStringPtrString{A: stringptr("foo")},
  2326  			},
  2327  		},
  2328  		{
  2329  			name: "PtrAnonymousHeadStringPtrOnlyStringOmitEmpty",
  2330  			data: struct {
  2331  				*structStringPtrStringOmitEmpty
  2332  			}{
  2333  				structStringPtrStringOmitEmpty: &structStringPtrStringOmitEmpty{A: stringptr("foo")},
  2334  			},
  2335  		},
  2336  
  2337  		// NilPtrAnonymousHeadStringPtrOnly
  2338  		{
  2339  			name: "NilPtrAnonymousHeadStringPtrOnly",
  2340  			data: struct {
  2341  				*structStringPtr
  2342  			}{
  2343  				structStringPtr: nil,
  2344  			},
  2345  		},
  2346  		{
  2347  			name: "NilPtrAnonymousHeadStringPtrOnlyOmitEmpty",
  2348  			data: struct {
  2349  				*structStringPtrOmitEmpty
  2350  			}{
  2351  				structStringPtrOmitEmpty: nil,
  2352  			},
  2353  		},
  2354  		{
  2355  			name: "NilPtrAnonymousHeadStringPtrOnlyString",
  2356  			data: struct {
  2357  				*structStringPtrString
  2358  			}{
  2359  				structStringPtrString: nil,
  2360  			},
  2361  		},
  2362  		{
  2363  			name: "NilPtrAnonymousHeadStringPtrOnlyStringOmitEmpty",
  2364  			data: struct {
  2365  				*structStringPtrStringOmitEmpty
  2366  			}{
  2367  				structStringPtrStringOmitEmpty: nil,
  2368  			},
  2369  		},
  2370  	}
  2371  	for _, test := range tests {
  2372  		for _, indent := range []bool{true, false} {
  2373  			for _, htmlEscape := range []bool{true, false} {
  2374  				t.Run(fmt.Sprintf("%s_indent_%t_escape_%t", test.name, indent, htmlEscape), func(t *testing.T) {
  2375  					var buf bytes.Buffer
  2376  					enc := json.NewEncoder(&buf)
  2377  					enc.SetEscapeHTML(htmlEscape)
  2378  					if indent {
  2379  						enc.SetIndent("", "  ")
  2380  					}
  2381  					if err := enc.Encode(test.data); err != nil {
  2382  						t.Fatalf("%s(htmlEscape:%v,indent:%v): %v: %s", test.name, htmlEscape, indent, test.data, err)
  2383  					}
  2384  					stdresult := encodeByEncodingJSON(test.data, indent, htmlEscape)
  2385  					if buf.String() != stdresult {
  2386  						t.Errorf("%s(htmlEscape:%v,indent:%v): doesn't compatible with encoding/json. expected %q but got %q", test.name, htmlEscape, indent, stdresult, buf.String())
  2387  					}
  2388  				})
  2389  			}
  2390  		}
  2391  	}
  2392  }