在Go中轻松安全地从一种数据类型转换为另一种数据类型
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 

788 lines
21 KiB

  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. package cast
  6. import (
  7. "fmt"
  8. "html/template"
  9. "testing"
  10. "time"
  11. "github.com/stretchr/testify/assert"
  12. )
  13. func TestToIntE(t *testing.T) {
  14. tests := []struct {
  15. input interface{}
  16. expect int
  17. iserr bool
  18. }{
  19. {int(8), 8, false},
  20. {int8(8), 8, false},
  21. {int16(8), 8, false},
  22. {int32(8), 8, false},
  23. {int64(8), 8, false},
  24. {float64(8.31), 8, false},
  25. {true, 1, false},
  26. {false, 0, false},
  27. {"8", 8, false},
  28. {nil, 0, false},
  29. // errors
  30. {"test", 0, true},
  31. {testing.T{}, 0, true},
  32. }
  33. for i, test := range tests {
  34. errmsg := fmt.Sprintf("i = %d", i) // assert helper message
  35. v, err := ToIntE(test.input)
  36. if test.iserr {
  37. assert.Error(t, err, errmsg)
  38. continue
  39. }
  40. assert.NoError(t, err, errmsg)
  41. assert.Equal(t, test.expect, v, errmsg)
  42. // Non-E test
  43. v = ToInt(test.input)
  44. assert.Equal(t, test.expect, v, errmsg)
  45. }
  46. }
  47. func TestToInt64E(t *testing.T) {
  48. tests := []struct {
  49. input interface{}
  50. expect int64
  51. iserr bool
  52. }{
  53. {int(8), 8, false},
  54. {int8(8), 8, false},
  55. {int16(8), 8, false},
  56. {int32(8), 8, false},
  57. {int64(8), 8, false},
  58. {float64(8.31), 8, false},
  59. {true, 1, false},
  60. {false, 0, false},
  61. {"8", 8, false},
  62. {nil, 0, false},
  63. // errors
  64. {"test", 0, true},
  65. {testing.T{}, 0, true},
  66. }
  67. for i, test := range tests {
  68. errmsg := fmt.Sprintf("i = %d", i) // assert helper message
  69. v, err := ToInt64E(test.input)
  70. if test.iserr {
  71. assert.Error(t, err, errmsg)
  72. continue
  73. }
  74. assert.NoError(t, err, errmsg)
  75. assert.Equal(t, test.expect, v, errmsg)
  76. // Non-E test
  77. v = ToInt64(test.input)
  78. assert.Equal(t, test.expect, v, errmsg)
  79. }
  80. }
  81. func TestToInt32E(t *testing.T) {
  82. tests := []struct {
  83. input interface{}
  84. expect int32
  85. iserr bool
  86. }{
  87. {int(8), 8, false},
  88. {int8(8), 8, false},
  89. {int16(8), 8, false},
  90. {int32(8), 8, false},
  91. {int64(8), 8, false},
  92. {float64(8.31), 8, false},
  93. {true, 1, false},
  94. {false, 0, false},
  95. {"8", 8, false},
  96. {nil, 0, false},
  97. // errors
  98. {"test", 0, true},
  99. {testing.T{}, 0, true},
  100. }
  101. for i, test := range tests {
  102. errmsg := fmt.Sprintf("i = %d", i) // assert helper message
  103. v, err := ToInt32E(test.input)
  104. if test.iserr {
  105. assert.Error(t, err, errmsg)
  106. continue
  107. }
  108. assert.NoError(t, err, errmsg)
  109. assert.Equal(t, test.expect, v, errmsg)
  110. // Non-E test
  111. v = ToInt32(test.input)
  112. assert.Equal(t, test.expect, v, errmsg)
  113. }
  114. }
  115. func TestToInt16E(t *testing.T) {
  116. tests := []struct {
  117. input interface{}
  118. expect int16
  119. iserr bool
  120. }{
  121. {int(8), 8, false},
  122. {int8(8), 8, false},
  123. {int16(8), 8, false},
  124. {int32(8), 8, false},
  125. {int64(8), 8, false},
  126. {float64(8.31), 8, false},
  127. {true, 1, false},
  128. {false, 0, false},
  129. {"8", 8, false},
  130. {nil, 0, false},
  131. // errors
  132. {"test", 0, true},
  133. {testing.T{}, 0, true},
  134. }
  135. for i, test := range tests {
  136. errmsg := fmt.Sprintf("i = %d", i) // assert helper message
  137. v, err := ToInt16E(test.input)
  138. if test.iserr {
  139. assert.Error(t, err, errmsg)
  140. continue
  141. }
  142. assert.NoError(t, err, errmsg)
  143. assert.Equal(t, test.expect, v, errmsg)
  144. // Non-E test
  145. v = ToInt16(test.input)
  146. assert.Equal(t, test.expect, v, errmsg)
  147. }
  148. }
  149. func TestToInt8E(t *testing.T) {
  150. tests := []struct {
  151. input interface{}
  152. expect int8
  153. iserr bool
  154. }{
  155. {int(8), 8, false},
  156. {int8(8), 8, false},
  157. {int16(8), 8, false},
  158. {int32(8), 8, false},
  159. {int64(8), 8, false},
  160. {float64(8.31), 8, false},
  161. {true, 1, false},
  162. {false, 0, false},
  163. {"8", 8, false},
  164. {nil, 0, false},
  165. // errors
  166. {"test", 0, true},
  167. {testing.T{}, 0, true},
  168. }
  169. for i, test := range tests {
  170. errmsg := fmt.Sprintf("i = %d", i) // assert helper message
  171. v, err := ToInt8E(test.input)
  172. if test.iserr {
  173. assert.Error(t, err, errmsg)
  174. continue
  175. }
  176. assert.NoError(t, err, errmsg)
  177. assert.Equal(t, test.expect, v, errmsg)
  178. // Non-E test
  179. v = ToInt8(test.input)
  180. assert.Equal(t, test.expect, v, errmsg)
  181. }
  182. }
  183. func TestToFloat64E(t *testing.T) {
  184. tests := []struct {
  185. input interface{}
  186. expect float64
  187. iserr bool
  188. }{
  189. {int(8), 8, false},
  190. {int8(8), 8, false},
  191. {int16(8), 8, false},
  192. {int32(8), 8, false},
  193. {int64(8), 8, false},
  194. {float32(8), 8, false},
  195. {float64(8.31), 8.31, false},
  196. {"8", 8, false},
  197. // errors
  198. {"test", 0, true},
  199. {testing.T{}, 0, true},
  200. }
  201. for i, test := range tests {
  202. errmsg := fmt.Sprintf("i = %d", i) // assert helper message
  203. v, err := ToFloat64E(test.input)
  204. if test.iserr {
  205. assert.Error(t, err, errmsg)
  206. continue
  207. }
  208. assert.NoError(t, err, errmsg)
  209. assert.Equal(t, test.expect, v, errmsg)
  210. // Non-E test
  211. v = ToFloat64(test.input)
  212. assert.Equal(t, test.expect, v, errmsg)
  213. }
  214. }
  215. func TestToStringE(t *testing.T) {
  216. type Key struct {
  217. k string
  218. }
  219. key := &Key{"foo"}
  220. tests := []struct {
  221. input interface{}
  222. expect string
  223. iserr bool
  224. }{
  225. {int(8), "8", false},
  226. {int64(8), "8", false},
  227. {float64(8.31), "8.31", false},
  228. {true, "true", false},
  229. {false, "false", false},
  230. {nil, "", false},
  231. {[]byte("one time"), "one time", false},
  232. {"one more time", "one more time", false},
  233. {template.HTML("one time"), "one time", false},
  234. {template.URL("http://somehost.foo"), "http://somehost.foo", false},
  235. {template.JS("(1+2)"), "(1+2)", false},
  236. {template.CSS("a"), "a", false},
  237. {template.HTMLAttr("a"), "a", false},
  238. // errors
  239. {testing.T{}, "", true},
  240. {key, "", true},
  241. }
  242. for i, test := range tests {
  243. errmsg := fmt.Sprintf("i = %d", i) // assert helper message
  244. v, err := ToStringE(test.input)
  245. if test.iserr {
  246. assert.Error(t, err, errmsg)
  247. continue
  248. }
  249. assert.NoError(t, err, errmsg)
  250. assert.Equal(t, test.expect, v, errmsg)
  251. // Non-E test
  252. v = ToString(test.input)
  253. assert.Equal(t, test.expect, v, errmsg)
  254. }
  255. }
  256. type foo struct {
  257. val string
  258. }
  259. func (x foo) String() string {
  260. return x.val
  261. }
  262. func TestStringerToString(t *testing.T) {
  263. var x foo
  264. x.val = "bar"
  265. assert.Equal(t, "bar", ToString(x))
  266. }
  267. type fu struct {
  268. val string
  269. }
  270. func (x fu) Error() string {
  271. return x.val
  272. }
  273. func TestErrorToString(t *testing.T) {
  274. var x fu
  275. x.val = "bar"
  276. assert.Equal(t, "bar", ToString(x))
  277. }
  278. func TestStringMapStringSliceE(t *testing.T) {
  279. // ToStringMapString inputs/outputs
  280. var stringMapString = map[string]string{"key 1": "value 1", "key 2": "value 2", "key 3": "value 3"}
  281. var stringMapInterface = map[string]interface{}{"key 1": "value 1", "key 2": "value 2", "key 3": "value 3"}
  282. var interfaceMapString = map[interface{}]string{"key 1": "value 1", "key 2": "value 2", "key 3": "value 3"}
  283. var interfaceMapInterface = map[interface{}]interface{}{"key 1": "value 1", "key 2": "value 2", "key 3": "value 3"}
  284. // ToStringMapStringSlice inputs/outputs
  285. var 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"}}
  286. var 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"}}
  287. var 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"}}
  288. var stringMapStringSingleSliceFieldsResult = map[string][]string{"key 1": {"value", "1"}, "key 2": {"value", "2"}, "key 3": {"value", "3"}}
  289. var 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"}}
  290. var 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"}}
  291. var 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"}}
  292. var stringMapStringSliceSingle = map[string][]string{"key 1": {"value 1"}, "key 2": {"value 2"}, "key 3": {"value 3"}}
  293. var stringMapInterface1 = map[string]interface{}{"key 1": []string{"value 1"}, "key 2": []string{"value 2"}}
  294. var stringMapInterfaceResult1 = map[string][]string{"key 1": {"value 1"}, "key 2": {"value 2"}}
  295. type Key struct {
  296. k string
  297. }
  298. tests := []struct {
  299. input interface{}
  300. expect map[string][]string
  301. iserr bool
  302. }{
  303. {stringMapStringSlice, stringMapStringSlice, false},
  304. {stringMapInterfaceSlice, stringMapStringSlice, false},
  305. {stringMapInterfaceInterfaceSlice, stringMapStringSlice, false},
  306. {stringMapStringSliceMultiple, stringMapStringSlice, false},
  307. {stringMapStringSliceMultiple, stringMapStringSlice, false},
  308. {stringMapString, stringMapStringSliceSingle, false},
  309. {stringMapInterface, stringMapStringSliceSingle, false},
  310. {stringMapInterface1, stringMapInterfaceResult1, false},
  311. {interfaceMapStringSlice, stringMapStringSlice, false},
  312. {interfaceMapInterfaceSlice, stringMapStringSlice, false},
  313. {interfaceMapString, stringMapStringSingleSliceFieldsResult, false},
  314. {interfaceMapInterface, stringMapStringSingleSliceFieldsResult, false},
  315. // errors
  316. {nil, nil, true},
  317. {testing.T{}, nil, true},
  318. {map[interface{}]interface{}{"foo": testing.T{}}, nil, true},
  319. {map[interface{}]interface{}{Key{"foo"}: "bar"}, nil, true}, // ToStringE(Key{"foo"}) should fail
  320. }
  321. for i, test := range tests {
  322. errmsg := fmt.Sprintf("i = %d", i) // assert helper message
  323. v, err := ToStringMapStringSliceE(test.input)
  324. if test.iserr {
  325. assert.Error(t, err, errmsg)
  326. continue
  327. }
  328. assert.NoError(t, err, errmsg)
  329. assert.Equal(t, test.expect, v, errmsg)
  330. // Non-E test
  331. v = ToStringMapStringSlice(test.input)
  332. assert.Equal(t, test.expect, v, errmsg)
  333. }
  334. }
  335. func TestToStringMapE(t *testing.T) {
  336. tests := []struct {
  337. input interface{}
  338. expect map[string]interface{}
  339. iserr bool
  340. }{
  341. {map[interface{}]interface{}{"tag": "tags", "group": "groups"}, map[string]interface{}{"tag": "tags", "group": "groups"}, false},
  342. {map[string]interface{}{"tag": "tags", "group": "groups"}, map[string]interface{}{"tag": "tags", "group": "groups"}, false},
  343. // errors
  344. {nil, nil, true},
  345. {testing.T{}, nil, true},
  346. }
  347. for i, test := range tests {
  348. errmsg := fmt.Sprintf("i = %d", i) // assert helper message
  349. v, err := ToStringMapE(test.input)
  350. if test.iserr {
  351. assert.Error(t, err, errmsg)
  352. continue
  353. }
  354. assert.NoError(t, err, errmsg)
  355. assert.Equal(t, test.expect, v, errmsg)
  356. // Non-E test
  357. v = ToStringMap(test.input)
  358. assert.Equal(t, test.expect, v, errmsg)
  359. }
  360. }
  361. func TestToStringMapBoolE(t *testing.T) {
  362. tests := []struct {
  363. input interface{}
  364. expect map[string]bool
  365. iserr bool
  366. }{
  367. {map[interface{}]interface{}{"v1": true, "v2": false}, map[string]bool{"v1": true, "v2": false}, false},
  368. {map[string]interface{}{"v1": true, "v2": false}, map[string]bool{"v1": true, "v2": false}, false},
  369. {map[string]bool{"v1": true, "v2": false}, map[string]bool{"v1": true, "v2": false}, false},
  370. // errors
  371. {nil, nil, true},
  372. {testing.T{}, nil, true},
  373. }
  374. for i, test := range tests {
  375. errmsg := fmt.Sprintf("i = %d", i) // assert helper message
  376. v, err := ToStringMapBoolE(test.input)
  377. if test.iserr {
  378. assert.Error(t, err, errmsg)
  379. continue
  380. }
  381. assert.NoError(t, err, errmsg)
  382. assert.Equal(t, test.expect, v, errmsg)
  383. // Non-E test
  384. v = ToStringMapBool(test.input)
  385. assert.Equal(t, test.expect, v, errmsg)
  386. }
  387. }
  388. func TestToStringMapStringE(t *testing.T) {
  389. var stringMapString = map[string]string{"key 1": "value 1", "key 2": "value 2", "key 3": "value 3"}
  390. var stringMapInterface = map[string]interface{}{"key 1": "value 1", "key 2": "value 2", "key 3": "value 3"}
  391. var interfaceMapString = map[interface{}]string{"key 1": "value 1", "key 2": "value 2", "key 3": "value 3"}
  392. var interfaceMapInterface = map[interface{}]interface{}{"key 1": "value 1", "key 2": "value 2", "key 3": "value 3"}
  393. tests := []struct {
  394. input interface{}
  395. expect map[string]string
  396. iserr bool
  397. }{
  398. {stringMapString, stringMapString, false},
  399. {stringMapInterface, stringMapString, false},
  400. {interfaceMapString, stringMapString, false},
  401. {interfaceMapInterface, stringMapString, false},
  402. // errors
  403. {nil, nil, true},
  404. {testing.T{}, nil, true},
  405. }
  406. for i, test := range tests {
  407. errmsg := fmt.Sprintf("i = %d", i) // assert helper message
  408. v, err := ToStringMapStringE(test.input)
  409. if test.iserr {
  410. assert.Error(t, err, errmsg)
  411. continue
  412. }
  413. assert.NoError(t, err, errmsg)
  414. assert.Equal(t, test.expect, v, errmsg)
  415. // Non-E test
  416. v = ToStringMapString(test.input)
  417. assert.Equal(t, test.expect, v, errmsg)
  418. }
  419. }
  420. func TestToBoolSliceE(t *testing.T) {
  421. tests := []struct {
  422. input interface{}
  423. expect []bool
  424. iserr bool
  425. }{
  426. {[]bool{true, false, true}, []bool{true, false, true}, false},
  427. {[]interface{}{true, false, true}, []bool{true, false, true}, false},
  428. {[]int{1, 0, 1}, []bool{true, false, true}, false},
  429. {[]string{"true", "false", "true"}, []bool{true, false, true}, false},
  430. // errors
  431. {nil, nil, true},
  432. {testing.T{}, nil, true},
  433. {[]string{"foo", "bar"}, nil, true},
  434. }
  435. for i, test := range tests {
  436. errmsg := fmt.Sprintf("i = %d", i) // assert helper message
  437. v, err := ToBoolSliceE(test.input)
  438. if test.iserr {
  439. assert.Error(t, err, errmsg)
  440. continue
  441. }
  442. assert.NoError(t, err, errmsg)
  443. assert.Equal(t, test.expect, v, errmsg)
  444. // Non-E test
  445. v = ToBoolSlice(test.input)
  446. assert.Equal(t, test.expect, v, errmsg)
  447. }
  448. }
  449. func TestToIntSliceE(t *testing.T) {
  450. tests := []struct {
  451. input interface{}
  452. expect []int
  453. iserr bool
  454. }{
  455. {[]int{1, 3}, []int{1, 3}, false},
  456. {[]interface{}{1.2, 3.2}, []int{1, 3}, false},
  457. {[]string{"2", "3"}, []int{2, 3}, false},
  458. {[2]string{"2", "3"}, []int{2, 3}, false},
  459. // errors
  460. {nil, nil, true},
  461. {testing.T{}, nil, true},
  462. {[]string{"foo", "bar"}, nil, true},
  463. }
  464. for i, test := range tests {
  465. errmsg := fmt.Sprintf("i = %d", i) // assert helper message
  466. v, err := ToIntSliceE(test.input)
  467. if test.iserr {
  468. assert.Error(t, err, errmsg)
  469. continue
  470. }
  471. assert.NoError(t, err, errmsg)
  472. assert.Equal(t, test.expect, v, errmsg)
  473. // Non-E test
  474. v = ToIntSlice(test.input)
  475. assert.Equal(t, test.expect, v, errmsg)
  476. }
  477. }
  478. func TestToSliceE(t *testing.T) {
  479. tests := []struct {
  480. input interface{}
  481. expect []interface{}
  482. iserr bool
  483. }{
  484. {[]interface{}{1, 3}, []interface{}{1, 3}, false},
  485. {[]map[string]interface{}{{"k1": 1}, {"k2": 2}}, []interface{}{map[string]interface{}{"k1": 1}, map[string]interface{}{"k2": 2}}, false},
  486. // errors
  487. {nil, nil, true},
  488. {testing.T{}, nil, true},
  489. }
  490. for i, test := range tests {
  491. errmsg := fmt.Sprintf("i = %d", i) // assert helper message
  492. v, err := ToSliceE(test.input)
  493. if test.iserr {
  494. assert.Error(t, err, errmsg)
  495. continue
  496. }
  497. assert.NoError(t, err, errmsg)
  498. assert.Equal(t, test.expect, v, errmsg)
  499. // Non-E test
  500. v = ToSlice(test.input)
  501. assert.Equal(t, test.expect, v, errmsg)
  502. }
  503. }
  504. func TestToStringSliceE(t *testing.T) {
  505. tests := []struct {
  506. input interface{}
  507. expect []string
  508. iserr bool
  509. }{
  510. {[]string{"a", "b"}, []string{"a", "b"}, false},
  511. {[]interface{}{1, 3}, []string{"1", "3"}, false},
  512. {interface{}(1), []string{"1"}, false},
  513. // errors
  514. {nil, nil, true},
  515. {testing.T{}, nil, true},
  516. }
  517. for i, test := range tests {
  518. errmsg := fmt.Sprintf("i = %d", i) // assert helper message
  519. v, err := ToStringSliceE(test.input)
  520. if test.iserr {
  521. assert.Error(t, err, errmsg)
  522. continue
  523. }
  524. assert.NoError(t, err, errmsg)
  525. assert.Equal(t, test.expect, v, errmsg)
  526. // Non-E test
  527. v = ToStringSlice(test.input)
  528. assert.Equal(t, test.expect, v, errmsg)
  529. }
  530. }
  531. func TestToBoolE(t *testing.T) {
  532. tests := []struct {
  533. input interface{}
  534. expect bool
  535. iserr bool
  536. }{
  537. {0, false, false},
  538. {nil, false, false},
  539. {"false", false, false},
  540. {"FALSE", false, false},
  541. {"False", false, false},
  542. {"f", false, false},
  543. {"F", false, false},
  544. {false, false, false},
  545. {"true", true, false},
  546. {"TRUE", true, false},
  547. {"True", true, false},
  548. {"t", true, false},
  549. {"T", true, false},
  550. {1, true, false},
  551. {true, true, false},
  552. {-1, true, false},
  553. // errors
  554. {"test", false, true},
  555. {testing.T{}, false, true},
  556. }
  557. for i, test := range tests {
  558. errmsg := fmt.Sprintf("i = %d", i) // assert helper message
  559. v, err := ToBoolE(test.input)
  560. if test.iserr {
  561. assert.Error(t, err, errmsg)
  562. continue
  563. }
  564. assert.NoError(t, err, errmsg)
  565. assert.Equal(t, test.expect, v, errmsg)
  566. // Non-E test
  567. v = ToBool(test.input)
  568. assert.Equal(t, test.expect, v, errmsg)
  569. }
  570. }
  571. func BenchmarkTooBool(b *testing.B) {
  572. for i := 0; i < b.N; i++ {
  573. if !ToBool(true) {
  574. b.Fatal("ToBool returned false")
  575. }
  576. }
  577. }
  578. func TestIndirectPointers(t *testing.T) {
  579. x := 13
  580. y := &x
  581. z := &y
  582. assert.Equal(t, ToInt(y), 13)
  583. assert.Equal(t, ToInt(z), 13)
  584. }
  585. func TestToTimeEE(t *testing.T) {
  586. tests := []struct {
  587. input interface{}
  588. expect time.Time
  589. iserr bool
  590. }{
  591. {"2009-11-10 23:00:00 +0000 UTC", time.Date(2009, 11, 10, 23, 0, 0, 0, time.UTC), false}, // Time.String()
  592. {"Tue Nov 10 23:00:00 2009", time.Date(2009, 11, 10, 23, 0, 0, 0, time.UTC), false}, // ANSIC
  593. {"Tue Nov 10 23:00:00 UTC 2009", time.Date(2009, 11, 10, 23, 0, 0, 0, time.UTC), false}, // UnixDate
  594. {"Tue Nov 10 23:00:00 +0000 2009", time.Date(2009, 11, 10, 23, 0, 0, 0, time.UTC), false}, // RubyDate
  595. {"10 Nov 09 23:00 UTC", time.Date(2009, 11, 10, 23, 0, 0, 0, time.UTC), false}, // RFC822
  596. {"10 Nov 09 23:00 +0000", time.Date(2009, 11, 10, 23, 0, 0, 0, time.UTC), false}, // RFC822Z
  597. {"Tuesday, 10-Nov-09 23:00:00 UTC", time.Date(2009, 11, 10, 23, 0, 0, 0, time.UTC), false}, // RFC850
  598. {"Tue, 10 Nov 2009 23:00:00 UTC", time.Date(2009, 11, 10, 23, 0, 0, 0, time.UTC), false}, // RFC1123
  599. {"Tue, 10 Nov 2009 23:00:00 +0000", time.Date(2009, 11, 10, 23, 0, 0, 0, time.UTC), false}, // RFC1123Z
  600. {"2009-11-10T23:00:00Z", time.Date(2009, 11, 10, 23, 0, 0, 0, time.UTC), false}, // RFC3339
  601. {"2009-11-10T23:00:00Z", time.Date(2009, 11, 10, 23, 0, 0, 0, time.UTC), false}, // RFC3339Nano
  602. {"11:00PM", time.Date(0, 1, 1, 23, 0, 0, 0, time.UTC), false}, // Kitchen
  603. {"Nov 10 23:00:00", time.Date(0, 11, 10, 23, 0, 0, 0, time.UTC), false}, // Stamp
  604. {"Nov 10 23:00:00.000", time.Date(0, 11, 10, 23, 0, 0, 0, time.UTC), false}, // StampMilli
  605. {"Nov 10 23:00:00.000000", time.Date(0, 11, 10, 23, 0, 0, 0, time.UTC), false}, // StampMicro
  606. {"Nov 10 23:00:00.000000000", time.Date(0, 11, 10, 23, 0, 0, 0, time.UTC), false}, // StampNano
  607. {"2016-03-06 15:28:01-00:00", time.Date(2016, 3, 6, 15, 28, 1, 0, time.UTC), false}, // RFC3339 without T
  608. {"2016-03-06 15:28:01", time.Date(2016, 3, 6, 15, 28, 1, 0, time.UTC), false},
  609. {"2016-03-06 15:28:01 -0000", time.Date(2016, 3, 6, 15, 28, 1, 0, time.UTC), false},
  610. {"2016-03-06 15:28:01 -00:00", time.Date(2016, 3, 6, 15, 28, 1, 0, time.UTC), false},
  611. {"2006-01-02", time.Date(2006, 1, 2, 0, 0, 0, 0, time.UTC), false},
  612. {"02 Jan 2006", time.Date(2006, 1, 2, 0, 0, 0, 0, time.UTC), false},
  613. {1472574600, time.Date(2016, 8, 30, 16, 30, 0, 0, time.UTC), false},
  614. {int(1482597504), time.Date(2016, 12, 24, 16, 38, 24, 0, time.UTC), false},
  615. {int64(1234567890), time.Date(2009, 2, 13, 23, 31, 30, 0, time.UTC), false},
  616. {int32(1234567890), time.Date(2009, 2, 13, 23, 31, 30, 0, time.UTC), false},
  617. {time.Date(2009, 2, 13, 23, 31, 30, 0, time.UTC), time.Date(2009, 2, 13, 23, 31, 30, 0, time.UTC), false},
  618. // errors
  619. {"2006", time.Time{}, true},
  620. {testing.T{}, time.Time{}, true},
  621. }
  622. for i, test := range tests {
  623. errmsg := fmt.Sprintf("i = %d", i) // assert helper message
  624. v, err := ToTimeE(test.input)
  625. if test.iserr {
  626. assert.Error(t, err, errmsg)
  627. continue
  628. }
  629. assert.NoError(t, err, errmsg)
  630. assert.Equal(t, test.expect, v.UTC(), errmsg)
  631. // Non-E test
  632. v = ToTime(test.input)
  633. assert.Equal(t, test.expect, v.UTC(), errmsg)
  634. }
  635. }
  636. func TestToDurationE(t *testing.T) {
  637. var td time.Duration = 5
  638. tests := []struct {
  639. input interface{}
  640. expect time.Duration
  641. iserr bool
  642. }{
  643. {time.Duration(5), td, false},
  644. {int(5), td, false},
  645. {int64(5), td, false},
  646. {int32(5), td, false},
  647. {int16(5), td, false},
  648. {int8(5), td, false},
  649. {float64(5), td, false},
  650. {string("5"), td, false},
  651. {string("5ns"), td, false},
  652. {string("5us"), time.Microsecond * td, false},
  653. {string("5µs"), time.Microsecond * td, false},
  654. {string("5ms"), time.Millisecond * td, false},
  655. {string("5s"), time.Second * td, false},
  656. {string("5m"), time.Minute * td, false},
  657. {string("5h"), time.Hour * td, false},
  658. // errors
  659. {"test", 0, true},
  660. {testing.T{}, 0, true},
  661. }
  662. for i, test := range tests {
  663. errmsg := fmt.Sprintf("i = %d", i) // assert helper message
  664. v, err := ToDurationE(test.input)
  665. if test.iserr {
  666. assert.Error(t, err, errmsg)
  667. continue
  668. }
  669. assert.NoError(t, err, errmsg)
  670. assert.Equal(t, test.expect, v, errmsg)
  671. // Non-E test
  672. v = ToDuration(test.input)
  673. assert.Equal(t, test.expect, v, errmsg)
  674. }
  675. }