github.com/bingoohuang/gg@v0.0.0-20240325092523-45da7dee9335/pkg/cast/cast_test.go (about)

     1  // Copyright © 2014 Steve Francia <spf@spf13.com>.
     2  //
     3  // Use of this source code is governed by an MIT-style
     4  // license that can be found in the LICENSE file.
     5  
     6  package cast
     7  
     8  import (
     9  	"errors"
    10  	"fmt"
    11  	"html/template"
    12  	"testing"
    13  	"time"
    14  
    15  	"github.com/stretchr/testify/assert"
    16  )
    17  
    18  type MyString string
    19  
    20  func TestConvertableString(t *testing.T) {
    21  	value := ToInt(MyString("100"))
    22  	assert.Equal(t, 100, value)
    23  }
    24  
    25  func TestToUintE(t *testing.T) {
    26  	tests := []struct {
    27  		input  interface{}
    28  		expect uint
    29  		iserr  bool
    30  	}{
    31  		{int(8), 8, false},
    32  		{int8(8), 8, false},
    33  		{int16(8), 8, false},
    34  		{int32(8), 8, false},
    35  		{int64(8), 8, false},
    36  		{uint(8), 8, false},
    37  		{uint8(8), 8, false},
    38  		{uint16(8), 8, false},
    39  		{uint32(8), 8, false},
    40  		{uint64(8), 8, false},
    41  		{float32(8.31), 8, false},
    42  		{float64(8.31), 8, false},
    43  		{true, 1, false},
    44  		{false, 0, false},
    45  		{"8", 8, false},
    46  		{nil, 0, false},
    47  		// errors
    48  		{int(-8), 0, true},
    49  		{int8(-8), 0, true},
    50  		{int16(-8), 0, true},
    51  		{int32(-8), 0, true},
    52  		{int64(-8), 0, true},
    53  		{float32(-8.31), 0, true},
    54  		{float64(-8.31), 0, true},
    55  		{"-8", 0, true},
    56  		{"test", 0, true},
    57  		{testing.T{}, 0, true},
    58  	}
    59  
    60  	for i, test := range tests {
    61  		errmsg := fmt.Sprintf("i = %d", i) // assert helper message
    62  
    63  		v, err := ToUintE(test.input)
    64  		if test.iserr {
    65  			assert.Error(t, err, errmsg)
    66  			continue
    67  		}
    68  
    69  		assert.NoError(t, err, errmsg)
    70  		assert.Equal(t, test.expect, v, errmsg)
    71  
    72  		// Non-E test:
    73  		v = ToUint(test.input)
    74  		assert.Equal(t, test.expect, v, errmsg)
    75  	}
    76  }
    77  
    78  func TestToUint64E(t *testing.T) {
    79  	tests := []struct {
    80  		input  interface{}
    81  		expect uint64
    82  		iserr  bool
    83  	}{
    84  		{int(8), 8, false},
    85  		{int8(8), 8, false},
    86  		{int16(8), 8, false},
    87  		{int32(8), 8, false},
    88  		{int64(8), 8, false},
    89  		{uint(8), 8, false},
    90  		{uint8(8), 8, false},
    91  		{uint16(8), 8, false},
    92  		{uint32(8), 8, false},
    93  		{uint64(8), 8, false},
    94  		{float32(8.31), 8, false},
    95  		{float64(8.31), 8, false},
    96  		{true, 1, false},
    97  		{false, 0, false},
    98  		{"8", 8, false},
    99  		{nil, 0, false},
   100  		// errors
   101  		{int(-8), 0, true},
   102  		{int8(-8), 0, true},
   103  		{int16(-8), 0, true},
   104  		{int32(-8), 0, true},
   105  		{int64(-8), 0, true},
   106  		{float32(-8.31), 0, true},
   107  		{float64(-8.31), 0, true},
   108  		{"-8", 0, true},
   109  		{"test", 0, true},
   110  		{testing.T{}, 0, true},
   111  	}
   112  
   113  	for i, test := range tests {
   114  		errmsg := fmt.Sprintf("i = %d", i) // assert helper message
   115  
   116  		v, err := ToUint64E(test.input)
   117  		if test.iserr {
   118  			assert.Error(t, err, errmsg)
   119  			continue
   120  		}
   121  
   122  		assert.NoError(t, err, errmsg)
   123  		assert.Equal(t, test.expect, v, errmsg)
   124  
   125  		// Non-E test:
   126  		v = ToUint64(test.input)
   127  		assert.Equal(t, test.expect, v, errmsg)
   128  	}
   129  }
   130  
   131  func TestToUint32E(t *testing.T) {
   132  	tests := []struct {
   133  		input  interface{}
   134  		expect uint32
   135  		iserr  bool
   136  	}{
   137  		{int(8), 8, false},
   138  		{int8(8), 8, false},
   139  		{int16(8), 8, false},
   140  		{int32(8), 8, false},
   141  		{int64(8), 8, false},
   142  		{uint(8), 8, false},
   143  		{uint8(8), 8, false},
   144  		{uint16(8), 8, false},
   145  		{uint32(8), 8, false},
   146  		{uint64(8), 8, false},
   147  		{float32(8.31), 8, false},
   148  		{float64(8.31), 8, false},
   149  		{true, 1, false},
   150  		{false, 0, false},
   151  		{"8", 8, false},
   152  		{nil, 0, false},
   153  		{int(-8), 0, true},
   154  		{int8(-8), 0, true},
   155  		{int16(-8), 0, true},
   156  		{int32(-8), 0, true},
   157  		{int64(-8), 0, true},
   158  		{float32(-8.31), 0, true},
   159  		{float64(-8.31), 0, true},
   160  		{"-8", 0, true},
   161  		// errors
   162  		{"test", 0, true},
   163  		{testing.T{}, 0, true},
   164  	}
   165  
   166  	for i, test := range tests {
   167  		errmsg := fmt.Sprintf("i = %d", i) // assert helper message
   168  
   169  		v, err := ToUint32E(test.input)
   170  		if test.iserr {
   171  			assert.Error(t, err, errmsg)
   172  			continue
   173  		}
   174  
   175  		assert.NoError(t, err, errmsg)
   176  		assert.Equal(t, test.expect, v, errmsg)
   177  
   178  		// Non-E test:
   179  		v = ToUint32(test.input)
   180  		assert.Equal(t, test.expect, v, errmsg)
   181  	}
   182  }
   183  
   184  func TestToUint16E(t *testing.T) {
   185  	tests := []struct {
   186  		input  interface{}
   187  		expect uint16
   188  		iserr  bool
   189  	}{
   190  		{int(8), 8, false},
   191  		{int8(8), 8, false},
   192  		{int16(8), 8, false},
   193  		{int32(8), 8, false},
   194  		{int64(8), 8, false},
   195  		{uint(8), 8, false},
   196  		{uint8(8), 8, false},
   197  		{uint16(8), 8, false},
   198  		{uint32(8), 8, false},
   199  		{uint64(8), 8, false},
   200  		{float32(8.31), 8, false},
   201  		{float64(8.31), 8, false},
   202  		{true, 1, false},
   203  		{false, 0, false},
   204  		{"8", 8, false},
   205  		{nil, 0, false},
   206  		// errors
   207  		{int(-8), 0, true},
   208  		{int8(-8), 0, true},
   209  		{int16(-8), 0, true},
   210  		{int32(-8), 0, true},
   211  		{int64(-8), 0, true},
   212  		{float32(-8.31), 0, true},
   213  		{float64(-8.31), 0, true},
   214  		{"-8", 0, true},
   215  		{"test", 0, true},
   216  		{testing.T{}, 0, true},
   217  	}
   218  
   219  	for i, test := range tests {
   220  		errmsg := fmt.Sprintf("i = %d", i) // assert helper message
   221  
   222  		v, err := ToUint16E(test.input)
   223  		if test.iserr {
   224  			assert.Error(t, err, errmsg)
   225  			continue
   226  		}
   227  
   228  		assert.NoError(t, err, errmsg)
   229  		assert.Equal(t, test.expect, v, errmsg)
   230  
   231  		// Non-E test
   232  		v = ToUint16(test.input)
   233  		assert.Equal(t, test.expect, v, errmsg)
   234  	}
   235  }
   236  
   237  func TestToUint8E(t *testing.T) {
   238  	tests := []struct {
   239  		input  interface{}
   240  		expect uint8
   241  		iserr  bool
   242  	}{
   243  		{int(8), 8, false},
   244  		{int8(8), 8, false},
   245  		{int16(8), 8, false},
   246  		{int32(8), 8, false},
   247  		{int64(8), 8, false},
   248  		{uint(8), 8, false},
   249  		{uint8(8), 8, false},
   250  		{uint16(8), 8, false},
   251  		{uint32(8), 8, false},
   252  		{uint64(8), 8, false},
   253  		{float32(8.31), 8, false},
   254  		{float64(8.31), 8, false},
   255  		{true, 1, false},
   256  		{false, 0, false},
   257  		{"8", 8, false},
   258  		{nil, 0, false},
   259  		// errors
   260  		{int(-8), 0, true},
   261  		{int8(-8), 0, true},
   262  		{int16(-8), 0, true},
   263  		{int32(-8), 0, true},
   264  		{int64(-8), 0, true},
   265  		{float32(-8.31), 0, true},
   266  		{float64(-8.31), 0, true},
   267  		{"-8", 0, true},
   268  		{"test", 0, true},
   269  		{testing.T{}, 0, true},
   270  	}
   271  
   272  	for i, test := range tests {
   273  		errmsg := fmt.Sprintf("i = %d", i) // assert helper message
   274  
   275  		v, err := ToUint8E(test.input)
   276  		if test.iserr {
   277  			assert.Error(t, err, errmsg)
   278  			continue
   279  		}
   280  
   281  		assert.NoError(t, err, errmsg)
   282  		assert.Equal(t, test.expect, v, errmsg)
   283  
   284  		// Non-E test
   285  		v = ToUint8(test.input)
   286  		assert.Equal(t, test.expect, v, errmsg)
   287  	}
   288  }
   289  
   290  func TestToIntE(t *testing.T) {
   291  	tests := []struct {
   292  		input  interface{}
   293  		expect int
   294  		iserr  bool
   295  	}{
   296  		{int(8), 8, false},
   297  		{int8(8), 8, false},
   298  		{int16(8), 8, false},
   299  		{int32(8), 8, false},
   300  		{int64(8), 8, false},
   301  		{uint(8), 8, false},
   302  		{uint8(8), 8, false},
   303  		{uint16(8), 8, false},
   304  		{uint32(8), 8, false},
   305  		{uint64(8), 8, false},
   306  		{float32(8.31), 8, false},
   307  		{float64(8.31), 8, false},
   308  		{true, 1, false},
   309  		{false, 0, false},
   310  		{"8", 8, false},
   311  		{nil, 0, false},
   312  		// errors
   313  		{"test", 0, true},
   314  		{testing.T{}, 0, true},
   315  	}
   316  
   317  	for i, test := range tests {
   318  		errmsg := fmt.Sprintf("i = %d", i) // assert helper message
   319  
   320  		v, err := ToIntE(test.input)
   321  		if test.iserr {
   322  			assert.Error(t, err, errmsg)
   323  			continue
   324  		}
   325  
   326  		assert.NoError(t, err, errmsg)
   327  		assert.Equal(t, test.expect, v, errmsg)
   328  
   329  		// Non-E test
   330  		v = ToInt(test.input)
   331  		assert.Equal(t, test.expect, v, errmsg)
   332  	}
   333  }
   334  
   335  func TestToInt64E(t *testing.T) {
   336  	tests := []struct {
   337  		input  interface{}
   338  		expect int64
   339  		iserr  bool
   340  	}{
   341  		{int(8), 8, false},
   342  		{int8(8), 8, false},
   343  		{int16(8), 8, false},
   344  		{int32(8), 8, false},
   345  		{int64(8), 8, false},
   346  		{uint(8), 8, false},
   347  		{uint8(8), 8, false},
   348  		{uint16(8), 8, false},
   349  		{uint32(8), 8, false},
   350  		{uint64(8), 8, false},
   351  		{float32(8.31), 8, false},
   352  		{float64(8.31), 8, false},
   353  		{true, 1, false},
   354  		{false, 0, false},
   355  		{"8", 8, false},
   356  		{nil, 0, false},
   357  		// errors
   358  		{"test", 0, true},
   359  		{testing.T{}, 0, true},
   360  	}
   361  
   362  	for i, test := range tests {
   363  		errmsg := fmt.Sprintf("i = %d", i) // assert helper message
   364  
   365  		v, err := ToInt64E(test.input)
   366  		if test.iserr {
   367  			assert.Error(t, err, errmsg)
   368  			continue
   369  		}
   370  
   371  		assert.NoError(t, err, errmsg)
   372  		assert.Equal(t, test.expect, v, errmsg)
   373  
   374  		// Non-E test
   375  		v = ToInt64(test.input)
   376  		assert.Equal(t, test.expect, v, errmsg)
   377  	}
   378  }
   379  
   380  func TestToInt32E(t *testing.T) {
   381  	tests := []struct {
   382  		input  interface{}
   383  		expect int32
   384  		iserr  bool
   385  	}{
   386  		{int(8), 8, false},
   387  		{int8(8), 8, false},
   388  		{int16(8), 8, false},
   389  		{int32(8), 8, false},
   390  		{int64(8), 8, false},
   391  		{uint(8), 8, false},
   392  		{uint8(8), 8, false},
   393  		{uint16(8), 8, false},
   394  		{uint32(8), 8, false},
   395  		{uint64(8), 8, false},
   396  		{float32(8.31), 8, false},
   397  		{float64(8.31), 8, false},
   398  		{true, 1, false},
   399  		{false, 0, false},
   400  		{"8", 8, false},
   401  		{nil, 0, false},
   402  		// errors
   403  		{"test", 0, true},
   404  		{testing.T{}, 0, true},
   405  	}
   406  
   407  	for i, test := range tests {
   408  		errmsg := fmt.Sprintf("i = %d", i) // assert helper message
   409  
   410  		v, err := ToInt32E(test.input)
   411  		if test.iserr {
   412  			assert.Error(t, err, errmsg)
   413  			continue
   414  		}
   415  
   416  		assert.NoError(t, err, errmsg)
   417  		assert.Equal(t, test.expect, v, errmsg)
   418  
   419  		// Non-E test
   420  		v = ToInt32(test.input)
   421  		assert.Equal(t, test.expect, v, errmsg)
   422  	}
   423  }
   424  
   425  func TestToInt16E(t *testing.T) {
   426  	tests := []struct {
   427  		input  interface{}
   428  		expect int16
   429  		iserr  bool
   430  	}{
   431  		{int(8), 8, false},
   432  		{int8(8), 8, false},
   433  		{int16(8), 8, false},
   434  		{int32(8), 8, false},
   435  		{int64(8), 8, false},
   436  		{uint(8), 8, false},
   437  		{uint8(8), 8, false},
   438  		{uint16(8), 8, false},
   439  		{uint32(8), 8, false},
   440  		{uint64(8), 8, false},
   441  		{float32(8.31), 8, false},
   442  		{float64(8.31), 8, false},
   443  		{true, 1, false},
   444  		{false, 0, false},
   445  		{"8", 8, false},
   446  		{nil, 0, false},
   447  		// errors
   448  		{"test", 0, true},
   449  		{testing.T{}, 0, true},
   450  	}
   451  
   452  	for i, test := range tests {
   453  		errmsg := fmt.Sprintf("i = %d", i) // assert helper message
   454  
   455  		v, err := ToInt16E(test.input)
   456  		if test.iserr {
   457  			assert.Error(t, err, errmsg)
   458  			continue
   459  		}
   460  
   461  		assert.NoError(t, err, errmsg)
   462  		assert.Equal(t, test.expect, v, errmsg)
   463  
   464  		// Non-E test
   465  		v = ToInt16(test.input)
   466  		assert.Equal(t, test.expect, v, errmsg)
   467  	}
   468  }
   469  
   470  func TestToInt8E(t *testing.T) {
   471  	tests := []struct {
   472  		input  interface{}
   473  		expect int8
   474  		iserr  bool
   475  	}{
   476  		{int(8), 8, false},
   477  		{int8(8), 8, false},
   478  		{int16(8), 8, false},
   479  		{int32(8), 8, false},
   480  		{int64(8), 8, false},
   481  		{uint(8), 8, false},
   482  		{uint8(8), 8, false},
   483  		{uint16(8), 8, false},
   484  		{uint32(8), 8, false},
   485  		{uint64(8), 8, false},
   486  		{float32(8.31), 8, false},
   487  		{float64(8.31), 8, false},
   488  		{true, 1, false},
   489  		{false, 0, false},
   490  		{"8", 8, false},
   491  		{nil, 0, false},
   492  		// errors
   493  		{"test", 0, true},
   494  		{testing.T{}, 0, true},
   495  	}
   496  
   497  	for i, test := range tests {
   498  		errmsg := fmt.Sprintf("i = %d", i) // assert helper message
   499  
   500  		v, err := ToInt8E(test.input)
   501  		if test.iserr {
   502  			assert.Error(t, err, errmsg)
   503  			continue
   504  		}
   505  
   506  		assert.NoError(t, err, errmsg)
   507  		assert.Equal(t, test.expect, v, errmsg)
   508  
   509  		// Non-E test
   510  		v = ToInt8(test.input)
   511  		assert.Equal(t, test.expect, v, errmsg)
   512  	}
   513  }
   514  
   515  func TestToFloat64E(t *testing.T) {
   516  	tests := []struct {
   517  		input  interface{}
   518  		expect float64
   519  		iserr  bool
   520  	}{
   521  		{int(8), 8, false},
   522  		{int8(8), 8, false},
   523  		{int16(8), 8, false},
   524  		{int32(8), 8, false},
   525  		{int64(8), 8, false},
   526  		{uint(8), 8, false},
   527  		{uint8(8), 8, false},
   528  		{uint16(8), 8, false},
   529  		{uint32(8), 8, false},
   530  		{uint64(8), 8, false},
   531  		{float32(8), 8, false},
   532  		{float64(8.31), 8.31, false},
   533  		{"8", 8, false},
   534  		{true, 1, false},
   535  		{false, 0, false},
   536  		// errors
   537  		{"test", 0, true},
   538  		{testing.T{}, 0, true},
   539  	}
   540  
   541  	for i, test := range tests {
   542  		errmsg := fmt.Sprintf("i = %d", i) // assert helper message
   543  
   544  		v, err := ToFloat64E(test.input)
   545  		if test.iserr {
   546  			assert.Error(t, err, errmsg)
   547  			continue
   548  		}
   549  
   550  		assert.NoError(t, err, errmsg)
   551  		assert.Equal(t, test.expect, v, errmsg)
   552  
   553  		// Non-E test
   554  		v = ToFloat64(test.input)
   555  		assert.Equal(t, test.expect, v, errmsg)
   556  	}
   557  }
   558  
   559  func TestToFloat32E(t *testing.T) {
   560  	tests := []struct {
   561  		input  interface{}
   562  		expect float32
   563  		iserr  bool
   564  	}{
   565  		{int(8), 8, false},
   566  		{int8(8), 8, false},
   567  		{int16(8), 8, false},
   568  		{int32(8), 8, false},
   569  		{int64(8), 8, false},
   570  		{uint(8), 8, false},
   571  		{uint8(8), 8, false},
   572  		{uint16(8), 8, false},
   573  		{uint32(8), 8, false},
   574  		{uint64(8), 8, false},
   575  		{float32(8.31), 8.31, false},
   576  		{float64(8.31), 8.31, false},
   577  		{"8", 8, false},
   578  		{true, 1, false},
   579  		{false, 0, false},
   580  		// errors
   581  		{"test", 0, true},
   582  		{testing.T{}, 0, true},
   583  	}
   584  
   585  	for i, test := range tests {
   586  		errmsg := fmt.Sprintf("i = %d", i) // assert helper message
   587  
   588  		v, err := ToFloat32E(test.input)
   589  		if test.iserr {
   590  			assert.Error(t, err, errmsg)
   591  			continue
   592  		}
   593  
   594  		assert.NoError(t, err, errmsg)
   595  		assert.Equal(t, test.expect, v, errmsg)
   596  
   597  		// Non-E test
   598  		v = ToFloat32(test.input)
   599  		assert.Equal(t, test.expect, v, errmsg)
   600  	}
   601  }
   602  
   603  func TestToStringE(t *testing.T) {
   604  	type Key struct {
   605  		k string
   606  	}
   607  	key := &Key{"foo"}
   608  
   609  	tests := []struct {
   610  		input  interface{}
   611  		expect string
   612  		iserr  bool
   613  	}{
   614  		{int(8), "8", false},
   615  		{int8(8), "8", false},
   616  		{int16(8), "8", false},
   617  		{int32(8), "8", false},
   618  		{int64(8), "8", false},
   619  		{uint(8), "8", false},
   620  		{uint8(8), "8", false},
   621  		{uint16(8), "8", false},
   622  		{uint32(8), "8", false},
   623  		{uint64(8), "8", false},
   624  		{float32(8.31), "8.31", false},
   625  		{float64(8.31), "8.31", false},
   626  		{true, "true", false},
   627  		{false, "false", false},
   628  		{nil, "", false},
   629  		{[]byte("one time"), "one time", false},
   630  		{"one more time", "one more time", false},
   631  		{template.HTML("one time"), "one time", false},
   632  		{template.URL("http://somehost.foo"), "http://somehost.foo", false},
   633  		{template.JS("(1+2)"), "(1+2)", false},
   634  		{template.CSS("a"), "a", false},
   635  		{template.HTMLAttr("a"), "a", false},
   636  		// errors
   637  		{testing.T{}, "", true},
   638  		{key, "", true},
   639  	}
   640  
   641  	for i, test := range tests {
   642  		errmsg := fmt.Sprintf("i = %d", i) // assert helper message
   643  
   644  		v, err := ToStringE(test.input)
   645  		if test.iserr {
   646  			assert.Error(t, err, errmsg)
   647  			continue
   648  		}
   649  
   650  		assert.NoError(t, err, errmsg)
   651  		assert.Equal(t, test.expect, v, errmsg)
   652  
   653  		// Non-E test
   654  		v = ToString(test.input)
   655  		assert.Equal(t, test.expect, v, errmsg)
   656  	}
   657  }
   658  
   659  type foo struct {
   660  	val string
   661  }
   662  
   663  func (x foo) String() string {
   664  	return x.val
   665  }
   666  
   667  func TestStringerToString(t *testing.T) {
   668  	var x foo
   669  	x.val = "bar"
   670  	assert.Equal(t, "bar", ToString(x))
   671  }
   672  
   673  type fu struct {
   674  	val string
   675  }
   676  
   677  func (x fu) Error() string {
   678  	return x.val
   679  }
   680  
   681  func TestErrorToString(t *testing.T) {
   682  	var x fu
   683  	x.val = "bar"
   684  	assert.Equal(t, "bar", ToString(x))
   685  }
   686  
   687  func TestStringMapStringSliceE(t *testing.T) {
   688  	// ToStringMapString inputs/outputs
   689  	stringMapString := map[string]string{"key 1": "value 1", "key 2": "value 2", "key 3": "value 3"}
   690  	stringMapInterface := map[string]interface{}{"key 1": "value 1", "key 2": "value 2", "key 3": "value 3"}
   691  	interfaceMapString := map[interface{}]string{"key 1": "value 1", "key 2": "value 2", "key 3": "value 3"}
   692  	interfaceMapInterface := map[interface{}]interface{}{"key 1": "value 1", "key 2": "value 2", "key 3": "value 3"}
   693  
   694  	// ToStringMapStringSlice inputs/outputs
   695  	stringMapStringSlice := map[string][]string{"key 1": {"value 1", "value 2", "value 3"}, "key 2": {"value 1", "value 2", "value 3"}, "key 3": {"value 1", "value 2", "value 3"}}
   696  	stringMapInterfaceSlice := map[string][]interface{}{"key 1": {"value 1", "value 2", "value 3"}, "key 2": {"value 1", "value 2", "value 3"}, "key 3": {"value 1", "value 2", "value 3"}}
   697  	stringMapInterfaceInterfaceSlice := map[string]interface{}{"key 1": []interface{}{"value 1", "value 2", "value 3"}, "key 2": []interface{}{"value 1", "value 2", "value 3"}, "key 3": []interface{}{"value 1", "value 2", "value 3"}}
   698  	stringMapStringSingleSliceFieldsResult := map[string][]string{"key 1": {"value", "1"}, "key 2": {"value", "2"}, "key 3": {"value", "3"}}
   699  	interfaceMapStringSlice := map[interface{}][]string{"key 1": {"value 1", "value 2", "value 3"}, "key 2": {"value 1", "value 2", "value 3"}, "key 3": {"value 1", "value 2", "value 3"}}
   700  	interfaceMapInterfaceSlice := map[interface{}][]interface{}{"key 1": {"value 1", "value 2", "value 3"}, "key 2": {"value 1", "value 2", "value 3"}, "key 3": {"value 1", "value 2", "value 3"}}
   701  
   702  	stringMapStringSliceMultiple := map[string][]string{"key 1": {"value 1", "value 2", "value 3"}, "key 2": {"value 1", "value 2", "value 3"}, "key 3": {"value 1", "value 2", "value 3"}}
   703  	stringMapStringSliceSingle := map[string][]string{"key 1": {"value 1"}, "key 2": {"value 2"}, "key 3": {"value 3"}}
   704  
   705  	stringMapInterface1 := map[string]interface{}{"key 1": []string{"value 1"}, "key 2": []string{"value 2"}}
   706  	stringMapInterfaceResult1 := map[string][]string{"key 1": {"value 1"}, "key 2": {"value 2"}}
   707  
   708  	jsonStringMapString := `{"key 1": "value 1", "key 2": "value 2"}`
   709  	jsonStringMapStringArray := `{"key 1": ["value 1"], "key 2": ["value 2", "value 3"]}`
   710  	jsonStringMapStringArrayResult := map[string][]string{"key 1": {"value 1"}, "key 2": {"value 2", "value 3"}}
   711  
   712  	type Key struct {
   713  		k string
   714  	}
   715  
   716  	tests := []struct {
   717  		input  interface{}
   718  		expect map[string][]string
   719  		iserr  bool
   720  	}{
   721  		{stringMapStringSlice, stringMapStringSlice, false},
   722  		{stringMapInterfaceSlice, stringMapStringSlice, false},
   723  		{stringMapInterfaceInterfaceSlice, stringMapStringSlice, false},
   724  		{stringMapStringSliceMultiple, stringMapStringSlice, false},
   725  		{stringMapStringSliceMultiple, stringMapStringSlice, false},
   726  		{stringMapString, stringMapStringSliceSingle, false},
   727  		{stringMapInterface, stringMapStringSliceSingle, false},
   728  		{stringMapInterface1, stringMapInterfaceResult1, false},
   729  		{interfaceMapStringSlice, stringMapStringSlice, false},
   730  		{interfaceMapInterfaceSlice, stringMapStringSlice, false},
   731  		{interfaceMapString, stringMapStringSingleSliceFieldsResult, false},
   732  		{interfaceMapInterface, stringMapStringSingleSliceFieldsResult, false},
   733  		{jsonStringMapStringArray, jsonStringMapStringArrayResult, false},
   734  
   735  		// errors
   736  		{nil, nil, true},
   737  		{testing.T{}, nil, true},
   738  		{map[interface{}]interface{}{"foo": testing.T{}}, nil, true},
   739  		{map[interface{}]interface{}{Key{"foo"}: "bar"}, nil, true}, // ToStringE(Key{"foo"}) should fail
   740  		{jsonStringMapString, nil, true},
   741  		{"", nil, true},
   742  	}
   743  
   744  	for i, test := range tests {
   745  		errmsg := fmt.Sprintf("i = %d", i) // assert helper message
   746  
   747  		v, err := ToStringMapStringSliceE(test.input)
   748  		if test.iserr {
   749  			assert.Error(t, err, errmsg)
   750  			continue
   751  		}
   752  
   753  		assert.NoError(t, err, errmsg)
   754  		assert.Equal(t, test.expect, v, errmsg)
   755  
   756  		// Non-E test
   757  		v = ToStringMapStringSlice(test.input)
   758  		assert.Equal(t, test.expect, v, errmsg)
   759  	}
   760  }
   761  
   762  func TestToStringMapE(t *testing.T) {
   763  	tests := []struct {
   764  		input  interface{}
   765  		expect map[string]interface{}
   766  		iserr  bool
   767  	}{
   768  		{map[interface{}]interface{}{"tag": "tags", "group": "groups"}, map[string]interface{}{"tag": "tags", "group": "groups"}, false},
   769  		{map[string]interface{}{"tag": "tags", "group": "groups"}, map[string]interface{}{"tag": "tags", "group": "groups"}, false},
   770  		{`{"tag": "tags", "group": "groups"}`, map[string]interface{}{"tag": "tags", "group": "groups"}, false},
   771  		{`{"tag": "tags", "group": true}`, map[string]interface{}{"tag": "tags", "group": true}, false},
   772  
   773  		// errors
   774  		{nil, nil, true},
   775  		{testing.T{}, nil, true},
   776  		{"", nil, true},
   777  	}
   778  
   779  	for i, test := range tests {
   780  		errmsg := fmt.Sprintf("i = %d", i) // assert helper message
   781  
   782  		v, err := ToStringMapE(test.input)
   783  		if test.iserr {
   784  			assert.Error(t, err, errmsg)
   785  			continue
   786  		}
   787  
   788  		assert.NoError(t, err, errmsg)
   789  		assert.Equal(t, test.expect, v, errmsg)
   790  
   791  		// Non-E test
   792  		v = ToStringMap(test.input)
   793  		assert.Equal(t, test.expect, v, errmsg)
   794  	}
   795  }
   796  
   797  func TestToStringMapBoolE(t *testing.T) {
   798  	tests := []struct {
   799  		input  interface{}
   800  		expect map[string]bool
   801  		iserr  bool
   802  	}{
   803  		{map[interface{}]interface{}{"v1": true, "v2": false}, map[string]bool{"v1": true, "v2": false}, false},
   804  		{map[string]interface{}{"v1": true, "v2": false}, map[string]bool{"v1": true, "v2": false}, false},
   805  		{map[string]bool{"v1": true, "v2": false}, map[string]bool{"v1": true, "v2": false}, false},
   806  		{`{"v1": true, "v2": false}`, map[string]bool{"v1": true, "v2": false}, false},
   807  
   808  		// errors
   809  		{nil, nil, true},
   810  		{testing.T{}, nil, true},
   811  		{"", nil, true},
   812  	}
   813  
   814  	for i, test := range tests {
   815  		errmsg := fmt.Sprintf("i = %d", i) // assert helper message
   816  
   817  		v, err := ToStringMapBoolE(test.input)
   818  		if test.iserr {
   819  			assert.Error(t, err, errmsg)
   820  			continue
   821  		}
   822  
   823  		assert.NoError(t, err, errmsg)
   824  		assert.Equal(t, test.expect, v, errmsg)
   825  
   826  		// Non-E test
   827  		v = ToStringMapBool(test.input)
   828  		assert.Equal(t, test.expect, v, errmsg)
   829  	}
   830  }
   831  
   832  func TestToStringMapIntE(t *testing.T) {
   833  	tests := []struct {
   834  		input  interface{}
   835  		expect map[string]int
   836  		iserr  bool
   837  	}{
   838  		{map[interface{}]interface{}{"v1": 1, "v2": 222}, map[string]int{"v1": 1, "v2": 222}, false},
   839  		{map[string]interface{}{"v1": 342, "v2": 5141}, map[string]int{"v1": 342, "v2": 5141}, false},
   840  		{map[string]int{"v1": 33, "v2": 88}, map[string]int{"v1": 33, "v2": 88}, false},
   841  		{map[string]int32{"v1": int32(33), "v2": int32(88)}, map[string]int{"v1": 33, "v2": 88}, false},
   842  		{map[string]uint16{"v1": uint16(33), "v2": uint16(88)}, map[string]int{"v1": 33, "v2": 88}, false},
   843  		{map[string]float64{"v1": float64(8.22), "v2": float64(43.32)}, map[string]int{"v1": 8, "v2": 43}, false},
   844  		{`{"v1": 67, "v2": 56}`, map[string]int{"v1": 67, "v2": 56}, false},
   845  
   846  		// errors
   847  		{nil, nil, true},
   848  		{testing.T{}, nil, true},
   849  		{"", nil, true},
   850  	}
   851  
   852  	for i, test := range tests {
   853  		errmsg := fmt.Sprintf("i = %d", i) // assert helper message
   854  
   855  		v, err := ToStringMapIntE(test.input)
   856  		if test.iserr {
   857  			assert.Error(t, err, errmsg)
   858  			continue
   859  		}
   860  
   861  		assert.NoError(t, err, errmsg)
   862  		assert.Equal(t, test.expect, v, errmsg)
   863  
   864  		// Non-E test
   865  		v = ToStringMapInt(test.input)
   866  		assert.Equal(t, test.expect, v, errmsg)
   867  	}
   868  }
   869  
   870  func TestToStringMapInt64E(t *testing.T) {
   871  	tests := []struct {
   872  		input  interface{}
   873  		expect map[string]int64
   874  		iserr  bool
   875  	}{
   876  		{map[interface{}]interface{}{"v1": int32(8), "v2": int32(888)}, map[string]int64{"v1": int64(8), "v2": int64(888)}, false},
   877  		{map[string]interface{}{"v1": int64(45), "v2": int64(67)}, map[string]int64{"v1": 45, "v2": 67}, false},
   878  		{map[string]int64{"v1": 33, "v2": 88}, map[string]int64{"v1": 33, "v2": 88}, false},
   879  		{map[string]int{"v1": 33, "v2": 88}, map[string]int64{"v1": 33, "v2": 88}, false},
   880  		{map[string]int32{"v1": int32(33), "v2": int32(88)}, map[string]int64{"v1": 33, "v2": 88}, false},
   881  		{map[string]uint16{"v1": uint16(33), "v2": uint16(88)}, map[string]int64{"v1": 33, "v2": 88}, false},
   882  		{map[string]float64{"v1": float64(8.22), "v2": float64(43.32)}, map[string]int64{"v1": 8, "v2": 43}, false},
   883  		{`{"v1": 67, "v2": 56}`, map[string]int64{"v1": 67, "v2": 56}, false},
   884  
   885  		// errors
   886  		{nil, nil, true},
   887  		{testing.T{}, nil, true},
   888  		{"", nil, true},
   889  	}
   890  
   891  	for i, test := range tests {
   892  		errmsg := fmt.Sprintf("i = %d", i) // assert helper message
   893  
   894  		v, err := ToStringMapInt64E(test.input)
   895  		if test.iserr {
   896  			assert.Error(t, err, errmsg)
   897  			continue
   898  		}
   899  
   900  		assert.NoError(t, err, errmsg)
   901  		assert.Equal(t, test.expect, v, errmsg)
   902  
   903  		// Non-E test
   904  		v = ToStringMapInt64(test.input)
   905  		assert.Equal(t, test.expect, v, errmsg)
   906  	}
   907  }
   908  
   909  func TestToStringMapStringE(t *testing.T) {
   910  	stringMapString := map[string]string{"key 1": "value 1", "key 2": "value 2", "key 3": "value 3"}
   911  	stringMapInterface := map[string]interface{}{"key 1": "value 1", "key 2": "value 2", "key 3": "value 3"}
   912  	interfaceMapString := map[interface{}]string{"key 1": "value 1", "key 2": "value 2", "key 3": "value 3"}
   913  	interfaceMapInterface := map[interface{}]interface{}{"key 1": "value 1", "key 2": "value 2", "key 3": "value 3"}
   914  	jsonString := `{"key 1": "value 1", "key 2": "value 2", "key 3": "value 3"}`
   915  	invalidJsonString := `{"key 1": "value 1", "key 2": "value 2", "key 3": "value 3"`
   916  	emptyString := ""
   917  
   918  	tests := []struct {
   919  		input  interface{}
   920  		expect map[string]string
   921  		iserr  bool
   922  	}{
   923  		{stringMapString, stringMapString, false},
   924  		{stringMapInterface, stringMapString, false},
   925  		{interfaceMapString, stringMapString, false},
   926  		{interfaceMapInterface, stringMapString, false},
   927  		{jsonString, stringMapString, false},
   928  
   929  		// errors
   930  		{nil, nil, true},
   931  		{testing.T{}, nil, true},
   932  		{invalidJsonString, nil, true},
   933  		{emptyString, nil, true},
   934  	}
   935  
   936  	for i, test := range tests {
   937  		errmsg := fmt.Sprintf("i = %d", i) // assert helper message
   938  
   939  		v, err := ToStringMapStringE(test.input)
   940  		if test.iserr {
   941  			assert.Error(t, err, errmsg)
   942  			continue
   943  		}
   944  
   945  		assert.NoError(t, err, errmsg)
   946  		assert.Equal(t, test.expect, v, errmsg)
   947  
   948  		// Non-E test
   949  		v = ToStringMapString(test.input)
   950  		assert.Equal(t, test.expect, v, errmsg)
   951  	}
   952  }
   953  
   954  func TestToBoolSliceE(t *testing.T) {
   955  	tests := []struct {
   956  		input  interface{}
   957  		expect []bool
   958  		iserr  bool
   959  	}{
   960  		{[]bool{true, false, true}, []bool{true, false, true}, false},
   961  		{[]interface{}{true, false, true}, []bool{true, false, true}, false},
   962  		{[]int{1, 0, 1}, []bool{true, false, true}, false},
   963  		{[]string{"true", "false", "true"}, []bool{true, false, true}, false},
   964  		// errors
   965  		{nil, nil, true},
   966  		{testing.T{}, nil, true},
   967  		{[]string{"foo", "bar"}, nil, true},
   968  	}
   969  
   970  	for i, test := range tests {
   971  		errmsg := fmt.Sprintf("i = %d", i) // assert helper message
   972  
   973  		v, err := ToBoolSliceE(test.input)
   974  		if test.iserr {
   975  			assert.Error(t, err, errmsg)
   976  			continue
   977  		}
   978  
   979  		assert.NoError(t, err, errmsg)
   980  		assert.Equal(t, test.expect, v, errmsg)
   981  
   982  		// Non-E test
   983  		v = ToBoolSlice(test.input)
   984  		assert.Equal(t, test.expect, v, errmsg)
   985  	}
   986  }
   987  
   988  func TestToIntSliceE(t *testing.T) {
   989  	tests := []struct {
   990  		input  interface{}
   991  		expect []int
   992  		iserr  bool
   993  	}{
   994  		{[]int{1, 3}, []int{1, 3}, false},
   995  		{[]interface{}{1.2, 3.2}, []int{1, 3}, false},
   996  		{[]string{"2", "3"}, []int{2, 3}, false},
   997  		{[2]string{"2", "3"}, []int{2, 3}, false},
   998  		// errors
   999  		{nil, nil, true},
  1000  		{testing.T{}, nil, true},
  1001  		{[]string{"foo", "bar"}, nil, true},
  1002  	}
  1003  
  1004  	for i, test := range tests {
  1005  		errmsg := fmt.Sprintf("i = %d", i) // assert helper message
  1006  
  1007  		v, err := ToIntSliceE(test.input)
  1008  		if test.iserr {
  1009  			assert.Error(t, err, errmsg)
  1010  			continue
  1011  		}
  1012  
  1013  		assert.NoError(t, err, errmsg)
  1014  		assert.Equal(t, test.expect, v, errmsg)
  1015  
  1016  		// Non-E test
  1017  		v = ToIntSlice(test.input)
  1018  		assert.Equal(t, test.expect, v, errmsg)
  1019  	}
  1020  }
  1021  
  1022  func TestToSliceE(t *testing.T) {
  1023  	tests := []struct {
  1024  		input  interface{}
  1025  		expect []interface{}
  1026  		iserr  bool
  1027  	}{
  1028  		{[]interface{}{1, 3}, []interface{}{1, 3}, false},
  1029  		{[]map[string]interface{}{{"k1": 1}, {"k2": 2}}, []interface{}{map[string]interface{}{"k1": 1}, map[string]interface{}{"k2": 2}}, false},
  1030  		// errors
  1031  		{nil, nil, true},
  1032  		{testing.T{}, nil, true},
  1033  	}
  1034  
  1035  	for i, test := range tests {
  1036  		errmsg := fmt.Sprintf("i = %d", i) // assert helper message
  1037  
  1038  		v, err := ToSliceE(test.input)
  1039  		if test.iserr {
  1040  			assert.Error(t, err, errmsg)
  1041  			continue
  1042  		}
  1043  
  1044  		assert.NoError(t, err, errmsg)
  1045  		assert.Equal(t, test.expect, v, errmsg)
  1046  
  1047  		// Non-E test
  1048  		v = ToSlice(test.input)
  1049  		assert.Equal(t, test.expect, v, errmsg)
  1050  	}
  1051  }
  1052  
  1053  func TestToStringSliceE(t *testing.T) {
  1054  	tests := []struct {
  1055  		input  interface{}
  1056  		expect []string
  1057  		iserr  bool
  1058  	}{
  1059  		{[]int{1, 2}, []string{"1", "2"}, false},
  1060  		{[]int8{int8(1), int8(2)}, []string{"1", "2"}, false},
  1061  		{[]int32{int32(1), int32(2)}, []string{"1", "2"}, false},
  1062  		{[]int64{int64(1), int64(2)}, []string{"1", "2"}, false},
  1063  		{[]float32{float32(1.01), float32(2.01)}, []string{"1.01", "2.01"}, false},
  1064  		{[]float64{float64(1.01), float64(2.01)}, []string{"1.01", "2.01"}, false},
  1065  		{[]string{"a", "b"}, []string{"a", "b"}, false},
  1066  		{[]interface{}{1, 3}, []string{"1", "3"}, false},
  1067  		{interface{}(1), []string{"1"}, false},
  1068  		{[]error{errors.New("a"), errors.New("b")}, []string{"a", "b"}, false},
  1069  		// errors
  1070  		{nil, nil, true},
  1071  		{testing.T{}, nil, true},
  1072  	}
  1073  
  1074  	for i, test := range tests {
  1075  		errmsg := fmt.Sprintf("i = %d", i) // assert helper message
  1076  
  1077  		v, err := ToStringSliceE(test.input)
  1078  		if test.iserr {
  1079  			assert.Error(t, err, errmsg)
  1080  			continue
  1081  		}
  1082  
  1083  		assert.NoError(t, err, errmsg)
  1084  		assert.Equal(t, test.expect, v, errmsg)
  1085  
  1086  		// Non-E test
  1087  		v = ToStringSlice(test.input)
  1088  		assert.Equal(t, test.expect, v, errmsg)
  1089  	}
  1090  }
  1091  
  1092  func TestToDurationSliceE(t *testing.T) {
  1093  	tests := []struct {
  1094  		input  interface{}
  1095  		expect []time.Duration
  1096  		iserr  bool
  1097  	}{
  1098  		{[]string{"1s", "1m"}, []time.Duration{time.Second, time.Minute}, false},
  1099  		{[]int{1, 2}, []time.Duration{1, 2}, false},
  1100  		{[]interface{}{1, 3}, []time.Duration{1, 3}, false},
  1101  		{[]time.Duration{1, 3}, []time.Duration{1, 3}, false},
  1102  
  1103  		// errors
  1104  		{nil, nil, true},
  1105  		{testing.T{}, nil, true},
  1106  		{[]string{"invalid"}, nil, true},
  1107  	}
  1108  
  1109  	for i, test := range tests {
  1110  		errmsg := fmt.Sprintf("i = %d", i) // assert helper message
  1111  
  1112  		v, err := ToDurationSliceE(test.input)
  1113  		if test.iserr {
  1114  			assert.Error(t, err, errmsg)
  1115  			continue
  1116  		}
  1117  
  1118  		assert.NoError(t, err, errmsg)
  1119  		assert.Equal(t, test.expect, v, errmsg)
  1120  
  1121  		// Non-E test
  1122  		v = ToDurationSlice(test.input)
  1123  		assert.Equal(t, test.expect, v, errmsg)
  1124  	}
  1125  }
  1126  
  1127  func TestToBoolE(t *testing.T) {
  1128  	tests := []struct {
  1129  		input  interface{}
  1130  		expect bool
  1131  		iserr  bool
  1132  	}{
  1133  		{0, false, false},
  1134  		{nil, false, false},
  1135  		{"false", false, false},
  1136  		{"FALSE", false, false},
  1137  		{"False", false, false},
  1138  		{"f", false, false},
  1139  		{"F", false, false},
  1140  		{false, false, false},
  1141  
  1142  		{"true", true, false},
  1143  		{"TRUE", true, false},
  1144  		{"True", true, false},
  1145  		{"t", true, false},
  1146  		{"T", true, false},
  1147  		{1, true, false},
  1148  		{true, true, false},
  1149  		{-1, true, false},
  1150  
  1151  		// errors
  1152  		{"test", false, true},
  1153  		{testing.T{}, false, true},
  1154  	}
  1155  
  1156  	for i, test := range tests {
  1157  		errmsg := fmt.Sprintf("i = %d", i) // assert helper message
  1158  
  1159  		v, err := ToBoolE(test.input)
  1160  		if test.iserr {
  1161  			assert.Error(t, err, errmsg)
  1162  			continue
  1163  		}
  1164  
  1165  		assert.NoError(t, err, errmsg)
  1166  		assert.Equal(t, test.expect, v, errmsg)
  1167  
  1168  		// Non-E test
  1169  		v = ToBool(test.input)
  1170  		assert.Equal(t, test.expect, v, errmsg)
  1171  	}
  1172  }
  1173  
  1174  func BenchmarkTooBool(b *testing.B) {
  1175  	for i := 0; i < b.N; i++ {
  1176  		if !ToBool(true) {
  1177  			b.Fatal("ToBool returned false")
  1178  		}
  1179  	}
  1180  }
  1181  
  1182  func TestIndirectPointers(t *testing.T) {
  1183  	x := 13
  1184  	y := &x
  1185  	z := &y
  1186  
  1187  	assert.Equal(t, ToInt(y), 13)
  1188  	assert.Equal(t, ToInt(z), 13)
  1189  }
  1190  
  1191  func TestToTimeEE(t *testing.T) {
  1192  	tests := []struct {
  1193  		input  interface{}
  1194  		expect time.Time
  1195  		iserr  bool
  1196  	}{
  1197  		{"2009-11-10 23:00:00 +0000 UTC", time.Date(2009, 11, 10, 23, 0, 0, 0, time.UTC), false},   // Time.String()
  1198  		{"Tue Nov 10 23:00:00 2009", time.Date(2009, 11, 10, 23, 0, 0, 0, time.UTC), false},        // ANSIC
  1199  		{"Tue Nov 10 23:00:00 UTC 2009", time.Date(2009, 11, 10, 23, 0, 0, 0, time.UTC), false},    // UnixDate
  1200  		{"Tue Nov 10 23:00:00 +0000 2009", time.Date(2009, 11, 10, 23, 0, 0, 0, time.UTC), false},  // RubyDate
  1201  		{"10 Nov 09 23:00 UTC", time.Date(2009, 11, 10, 23, 0, 0, 0, time.UTC), false},             // RFC822
  1202  		{"10 Nov 09 23:00 +0000", time.Date(2009, 11, 10, 23, 0, 0, 0, time.UTC), false},           // RFC822Z
  1203  		{"Tuesday, 10-Nov-09 23:00:00 UTC", time.Date(2009, 11, 10, 23, 0, 0, 0, time.UTC), false}, // RFC850
  1204  		{"Tue, 10 Nov 2009 23:00:00 UTC", time.Date(2009, 11, 10, 23, 0, 0, 0, time.UTC), false},   // RFC1123
  1205  		{"Tue, 10 Nov 2009 23:00:00 +0000", time.Date(2009, 11, 10, 23, 0, 0, 0, time.UTC), false}, // RFC1123Z
  1206  		{"2009-11-10T23:00:00Z", time.Date(2009, 11, 10, 23, 0, 0, 0, time.UTC), false},            // RFC3339
  1207  		{"2018-10-21T23:21:29+0200", time.Date(2018, 10, 21, 21, 21, 29, 0, time.UTC), false},      // RFC3339 without timezone hh:mm colon
  1208  		{"2009-11-10T23:00:00Z", time.Date(2009, 11, 10, 23, 0, 0, 0, time.UTC), false},            // RFC3339Nano
  1209  		{"11:00PM", time.Date(0, 1, 1, 23, 0, 0, 0, time.UTC), false},                              // Kitchen
  1210  		{"Nov 10 23:00:00", time.Date(0, 11, 10, 23, 0, 0, 0, time.UTC), false},                    // Stamp
  1211  		{"Nov 10 23:00:00.000", time.Date(0, 11, 10, 23, 0, 0, 0, time.UTC), false},                // StampMilli
  1212  		{"Nov 10 23:00:00.000000", time.Date(0, 11, 10, 23, 0, 0, 0, time.UTC), false},             // StampMicro
  1213  		{"Nov 10 23:00:00.000000000", time.Date(0, 11, 10, 23, 0, 0, 0, time.UTC), false},          // StampNano
  1214  		{"2016-03-06 15:28:01-00:00", time.Date(2016, 3, 6, 15, 28, 1, 0, time.UTC), false},        // RFC3339 without T
  1215  		{"2016-03-06 15:28:01-0000", time.Date(2016, 3, 6, 15, 28, 1, 0, time.UTC), false},         // RFC3339 without T or timezone hh:mm colon
  1216  		{"2016-03-06 15:28:01", time.Date(2016, 3, 6, 15, 28, 1, 0, time.UTC), false},
  1217  		{"2016-03-06 15:28:01 -0000", time.Date(2016, 3, 6, 15, 28, 1, 0, time.UTC), false},
  1218  		{"2016-03-06 15:28:01 -00:00", time.Date(2016, 3, 6, 15, 28, 1, 0, time.UTC), false},
  1219  		{"2006-01-02", time.Date(2006, 1, 2, 0, 0, 0, 0, time.UTC), false},
  1220  		{"02 Jan 2006", time.Date(2006, 1, 2, 0, 0, 0, 0, time.UTC), false},
  1221  		{1472574600, time.Date(2016, 8, 30, 16, 30, 0, 0, time.UTC), false},
  1222  		{int(1482597504), time.Date(2016, 12, 24, 16, 38, 24, 0, time.UTC), false},
  1223  		{int64(1234567890), time.Date(2009, 2, 13, 23, 31, 30, 0, time.UTC), false},
  1224  		{int32(1234567890), time.Date(2009, 2, 13, 23, 31, 30, 0, time.UTC), false},
  1225  		{uint(1482597504), time.Date(2016, 12, 24, 16, 38, 24, 0, time.UTC), false},
  1226  		{uint64(1234567890), time.Date(2009, 2, 13, 23, 31, 30, 0, time.UTC), false},
  1227  		{uint32(1234567890), time.Date(2009, 2, 13, 23, 31, 30, 0, time.UTC), false},
  1228  		{time.Date(2009, 2, 13, 23, 31, 30, 0, time.UTC), time.Date(2009, 2, 13, 23, 31, 30, 0, time.UTC), false},
  1229  		// errors
  1230  		{"2006", time.Time{}, true},
  1231  		{testing.T{}, time.Time{}, true},
  1232  	}
  1233  
  1234  	for i, test := range tests {
  1235  		errmsg := fmt.Sprintf("i = %d", i) // assert helper message
  1236  
  1237  		v, err := ToTimeE(test.input)
  1238  		if test.iserr {
  1239  			assert.Error(t, err, errmsg)
  1240  			continue
  1241  		}
  1242  
  1243  		assert.NoError(t, err, errmsg)
  1244  		assert.Equal(t, test.expect, v.UTC(), errmsg)
  1245  
  1246  		// Non-E test
  1247  		v = ToTime(test.input)
  1248  		assert.Equal(t, test.expect, v.UTC(), errmsg)
  1249  	}
  1250  }
  1251  
  1252  func TestToDurationE(t *testing.T) {
  1253  	var td time.Duration = 5
  1254  
  1255  	tests := []struct {
  1256  		input  interface{}
  1257  		expect time.Duration
  1258  		iserr  bool
  1259  	}{
  1260  		{time.Duration(5), td, false},
  1261  		{int(5), td, false},
  1262  		{int64(5), td, false},
  1263  		{int32(5), td, false},
  1264  		{int16(5), td, false},
  1265  		{int8(5), td, false},
  1266  		{uint(5), td, false},
  1267  		{uint64(5), td, false},
  1268  		{uint32(5), td, false},
  1269  		{uint16(5), td, false},
  1270  		{uint8(5), td, false},
  1271  		{float64(5), td, false},
  1272  		{float32(5), td, false},
  1273  		{string("5"), td, false},
  1274  		{string("5ns"), td, false},
  1275  		{string("5us"), time.Microsecond * td, false},
  1276  		{string("5µs"), time.Microsecond * td, false},
  1277  		{string("5ms"), time.Millisecond * td, false},
  1278  		{string("5s"), time.Second * td, false},
  1279  		{string("5m"), time.Minute * td, false},
  1280  		{string("5h"), time.Hour * td, false},
  1281  		// errors
  1282  		{"test", 0, true},
  1283  		{testing.T{}, 0, true},
  1284  	}
  1285  
  1286  	for i, test := range tests {
  1287  		errmsg := fmt.Sprintf("i = %d", i) // assert helper message
  1288  
  1289  		v, err := ToDurationE(test.input)
  1290  		if test.iserr {
  1291  			assert.Error(t, err, errmsg)
  1292  			continue
  1293  		}
  1294  
  1295  		assert.NoError(t, err, errmsg)
  1296  		assert.Equal(t, test.expect, v, errmsg)
  1297  
  1298  		// Non-E test
  1299  		v = ToDuration(test.input)
  1300  		assert.Equal(t, test.expect, v, errmsg)
  1301  	}
  1302  }