在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.
 
 
 

1152 lines
29 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 TestToUintE(t *testing.T) {
  14. tests := []struct {
  15. input interface{}
  16. expect uint
  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. {uint(8), 8, false},
  25. {uint8(8), 8, false},
  26. {uint16(8), 8, false},
  27. {uint32(8), 8, false},
  28. {uint64(8), 8, false},
  29. {float32(8.31), 8, false},
  30. {float64(8.31), 8, false},
  31. {true, 1, false},
  32. {false, 0, false},
  33. {"8", 8, false},
  34. {nil, 0, false},
  35. // errors
  36. {int(-8), 0, true},
  37. {int8(-8), 0, true},
  38. {int16(-8), 0, true},
  39. {int32(-8), 0, true},
  40. {int64(-8), 0, true},
  41. {float32(-8.31), 0, true},
  42. {float64(-8.31), 0, true},
  43. {"-8", 0, true},
  44. {"test", 0, true},
  45. {testing.T{}, 0, true},
  46. }
  47. for i, test := range tests {
  48. errmsg := fmt.Sprintf("i = %d", i) // assert helper message
  49. v, err := ToUintE(test.input)
  50. if test.iserr {
  51. assert.Error(t, err, errmsg)
  52. continue
  53. }
  54. assert.NoError(t, err, errmsg)
  55. assert.Equal(t, test.expect, v, errmsg)
  56. // Non-E test:
  57. v = ToUint(test.input)
  58. assert.Equal(t, test.expect, v, errmsg)
  59. }
  60. }
  61. func TestToUint64E(t *testing.T) {
  62. tests := []struct {
  63. input interface{}
  64. expect uint64
  65. iserr bool
  66. }{
  67. {int(8), 8, false},
  68. {int8(8), 8, false},
  69. {int16(8), 8, false},
  70. {int32(8), 8, false},
  71. {int64(8), 8, false},
  72. {uint(8), 8, false},
  73. {uint8(8), 8, false},
  74. {uint16(8), 8, false},
  75. {uint32(8), 8, false},
  76. {uint64(8), 8, false},
  77. {float32(8.31), 8, false},
  78. {float64(8.31), 8, false},
  79. {true, 1, false},
  80. {false, 0, false},
  81. {"8", 8, false},
  82. {nil, 0, false},
  83. // errors
  84. {int(-8), 0, true},
  85. {int8(-8), 0, true},
  86. {int16(-8), 0, true},
  87. {int32(-8), 0, true},
  88. {int64(-8), 0, true},
  89. {float32(-8.31), 0, true},
  90. {float64(-8.31), 0, true},
  91. {"-8", 0, true},
  92. {"test", 0, true},
  93. {testing.T{}, 0, true},
  94. }
  95. for i, test := range tests {
  96. errmsg := fmt.Sprintf("i = %d", i) // assert helper message
  97. v, err := ToUint64E(test.input)
  98. if test.iserr {
  99. assert.Error(t, err, errmsg)
  100. continue
  101. }
  102. assert.NoError(t, err, errmsg)
  103. assert.Equal(t, test.expect, v, errmsg)
  104. // Non-E test:
  105. v = ToUint64(test.input)
  106. assert.Equal(t, test.expect, v, errmsg)
  107. }
  108. }
  109. func TestToUint32E(t *testing.T) {
  110. tests := []struct {
  111. input interface{}
  112. expect uint32
  113. iserr bool
  114. }{
  115. {int(8), 8, false},
  116. {int8(8), 8, false},
  117. {int16(8), 8, false},
  118. {int32(8), 8, false},
  119. {int64(8), 8, false},
  120. {uint(8), 8, false},
  121. {uint8(8), 8, false},
  122. {uint16(8), 8, false},
  123. {uint32(8), 8, false},
  124. {uint64(8), 8, false},
  125. {float32(8.31), 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. {int(-8), 0, true},
  132. {int8(-8), 0, true},
  133. {int16(-8), 0, true},
  134. {int32(-8), 0, true},
  135. {int64(-8), 0, true},
  136. {float32(-8.31), 0, true},
  137. {float64(-8.31), 0, true},
  138. {"-8", 0, true},
  139. // errors
  140. {"test", 0, true},
  141. {testing.T{}, 0, true},
  142. }
  143. for i, test := range tests {
  144. errmsg := fmt.Sprintf("i = %d", i) // assert helper message
  145. v, err := ToUint32E(test.input)
  146. if test.iserr {
  147. assert.Error(t, err, errmsg)
  148. continue
  149. }
  150. assert.NoError(t, err, errmsg)
  151. assert.Equal(t, test.expect, v, errmsg)
  152. // Non-E test:
  153. v = ToUint32(test.input)
  154. assert.Equal(t, test.expect, v, errmsg)
  155. }
  156. }
  157. func TestToUint16E(t *testing.T) {
  158. tests := []struct {
  159. input interface{}
  160. expect uint16
  161. iserr bool
  162. }{
  163. {int(8), 8, false},
  164. {int8(8), 8, false},
  165. {int16(8), 8, false},
  166. {int32(8), 8, false},
  167. {int64(8), 8, false},
  168. {uint(8), 8, false},
  169. {uint8(8), 8, false},
  170. {uint16(8), 8, false},
  171. {uint32(8), 8, false},
  172. {uint64(8), 8, false},
  173. {float32(8.31), 8, false},
  174. {float64(8.31), 8, false},
  175. {true, 1, false},
  176. {false, 0, false},
  177. {"8", 8, false},
  178. {nil, 0, false},
  179. // errors
  180. {int(-8), 0, true},
  181. {int8(-8), 0, true},
  182. {int16(-8), 0, true},
  183. {int32(-8), 0, true},
  184. {int64(-8), 0, true},
  185. {float32(-8.31), 0, true},
  186. {float64(-8.31), 0, true},
  187. {"-8", 0, true},
  188. {"test", 0, true},
  189. {testing.T{}, 0, true},
  190. }
  191. for i, test := range tests {
  192. errmsg := fmt.Sprintf("i = %d", i) // assert helper message
  193. v, err := ToUint16E(test.input)
  194. if test.iserr {
  195. assert.Error(t, err, errmsg)
  196. continue
  197. }
  198. assert.NoError(t, err, errmsg)
  199. assert.Equal(t, test.expect, v, errmsg)
  200. // Non-E test
  201. v = ToUint16(test.input)
  202. assert.Equal(t, test.expect, v, errmsg)
  203. }
  204. }
  205. func TestToUint8E(t *testing.T) {
  206. tests := []struct {
  207. input interface{}
  208. expect uint8
  209. iserr bool
  210. }{
  211. {int(8), 8, false},
  212. {int8(8), 8, false},
  213. {int16(8), 8, false},
  214. {int32(8), 8, false},
  215. {int64(8), 8, false},
  216. {uint(8), 8, false},
  217. {uint8(8), 8, false},
  218. {uint16(8), 8, false},
  219. {uint32(8), 8, false},
  220. {uint64(8), 8, false},
  221. {float32(8.31), 8, false},
  222. {float64(8.31), 8, false},
  223. {true, 1, false},
  224. {false, 0, false},
  225. {"8", 8, false},
  226. {nil, 0, false},
  227. // errors
  228. {int(-8), 0, true},
  229. {int8(-8), 0, true},
  230. {int16(-8), 0, true},
  231. {int32(-8), 0, true},
  232. {int64(-8), 0, true},
  233. {float32(-8.31), 0, true},
  234. {float64(-8.31), 0, true},
  235. {"-8", 0, true},
  236. {"test", 0, true},
  237. {testing.T{}, 0, true},
  238. }
  239. for i, test := range tests {
  240. errmsg := fmt.Sprintf("i = %d", i) // assert helper message
  241. v, err := ToUint8E(test.input)
  242. if test.iserr {
  243. assert.Error(t, err, errmsg)
  244. continue
  245. }
  246. assert.NoError(t, err, errmsg)
  247. assert.Equal(t, test.expect, v, errmsg)
  248. // Non-E test
  249. v = ToUint8(test.input)
  250. assert.Equal(t, test.expect, v, errmsg)
  251. }
  252. }
  253. func TestToIntE(t *testing.T) {
  254. tests := []struct {
  255. input interface{}
  256. expect int
  257. iserr bool
  258. }{
  259. {int(8), 8, false},
  260. {int8(8), 8, false},
  261. {int16(8), 8, false},
  262. {int32(8), 8, false},
  263. {int64(8), 8, false},
  264. {uint(8), 8, false},
  265. {uint8(8), 8, false},
  266. {uint16(8), 8, false},
  267. {uint32(8), 8, false},
  268. {uint64(8), 8, false},
  269. {float32(8.31), 8, false},
  270. {float64(8.31), 8, false},
  271. {true, 1, false},
  272. {false, 0, false},
  273. {"8", 8, false},
  274. {nil, 0, false},
  275. // errors
  276. {"test", 0, true},
  277. {testing.T{}, 0, true},
  278. }
  279. for i, test := range tests {
  280. errmsg := fmt.Sprintf("i = %d", i) // assert helper message
  281. v, err := ToIntE(test.input)
  282. if test.iserr {
  283. assert.Error(t, err, errmsg)
  284. continue
  285. }
  286. assert.NoError(t, err, errmsg)
  287. assert.Equal(t, test.expect, v, errmsg)
  288. // Non-E test
  289. v = ToInt(test.input)
  290. assert.Equal(t, test.expect, v, errmsg)
  291. }
  292. }
  293. func TestToInt64E(t *testing.T) {
  294. tests := []struct {
  295. input interface{}
  296. expect int64
  297. iserr bool
  298. }{
  299. {int(8), 8, false},
  300. {int8(8), 8, false},
  301. {int16(8), 8, false},
  302. {int32(8), 8, false},
  303. {int64(8), 8, false},
  304. {uint(8), 8, false},
  305. {uint8(8), 8, false},
  306. {uint16(8), 8, false},
  307. {uint32(8), 8, false},
  308. {uint64(8), 8, false},
  309. {float32(8.31), 8, false},
  310. {float64(8.31), 8, false},
  311. {true, 1, false},
  312. {false, 0, false},
  313. {"8", 8, false},
  314. {nil, 0, false},
  315. // errors
  316. {"test", 0, true},
  317. {testing.T{}, 0, true},
  318. }
  319. for i, test := range tests {
  320. errmsg := fmt.Sprintf("i = %d", i) // assert helper message
  321. v, err := ToInt64E(test.input)
  322. if test.iserr {
  323. assert.Error(t, err, errmsg)
  324. continue
  325. }
  326. assert.NoError(t, err, errmsg)
  327. assert.Equal(t, test.expect, v, errmsg)
  328. // Non-E test
  329. v = ToInt64(test.input)
  330. assert.Equal(t, test.expect, v, errmsg)
  331. }
  332. }
  333. func TestToInt32E(t *testing.T) {
  334. tests := []struct {
  335. input interface{}
  336. expect int32
  337. iserr bool
  338. }{
  339. {int(8), 8, false},
  340. {int8(8), 8, false},
  341. {int16(8), 8, false},
  342. {int32(8), 8, false},
  343. {int64(8), 8, false},
  344. {uint(8), 8, false},
  345. {uint8(8), 8, false},
  346. {uint16(8), 8, false},
  347. {uint32(8), 8, false},
  348. {uint64(8), 8, false},
  349. {float32(8.31), 8, false},
  350. {float64(8.31), 8, false},
  351. {true, 1, false},
  352. {false, 0, false},
  353. {"8", 8, false},
  354. {nil, 0, false},
  355. // errors
  356. {"test", 0, true},
  357. {testing.T{}, 0, true},
  358. }
  359. for i, test := range tests {
  360. errmsg := fmt.Sprintf("i = %d", i) // assert helper message
  361. v, err := ToInt32E(test.input)
  362. if test.iserr {
  363. assert.Error(t, err, errmsg)
  364. continue
  365. }
  366. assert.NoError(t, err, errmsg)
  367. assert.Equal(t, test.expect, v, errmsg)
  368. // Non-E test
  369. v = ToInt32(test.input)
  370. assert.Equal(t, test.expect, v, errmsg)
  371. }
  372. }
  373. func TestToInt16E(t *testing.T) {
  374. tests := []struct {
  375. input interface{}
  376. expect int16
  377. iserr bool
  378. }{
  379. {int(8), 8, false},
  380. {int8(8), 8, false},
  381. {int16(8), 8, false},
  382. {int32(8), 8, false},
  383. {int64(8), 8, false},
  384. {uint(8), 8, false},
  385. {uint8(8), 8, false},
  386. {uint16(8), 8, false},
  387. {uint32(8), 8, false},
  388. {uint64(8), 8, false},
  389. {float32(8.31), 8, false},
  390. {float64(8.31), 8, false},
  391. {true, 1, false},
  392. {false, 0, false},
  393. {"8", 8, false},
  394. {nil, 0, false},
  395. // errors
  396. {"test", 0, true},
  397. {testing.T{}, 0, true},
  398. }
  399. for i, test := range tests {
  400. errmsg := fmt.Sprintf("i = %d", i) // assert helper message
  401. v, err := ToInt16E(test.input)
  402. if test.iserr {
  403. assert.Error(t, err, errmsg)
  404. continue
  405. }
  406. assert.NoError(t, err, errmsg)
  407. assert.Equal(t, test.expect, v, errmsg)
  408. // Non-E test
  409. v = ToInt16(test.input)
  410. assert.Equal(t, test.expect, v, errmsg)
  411. }
  412. }
  413. func TestToInt8E(t *testing.T) {
  414. tests := []struct {
  415. input interface{}
  416. expect int8
  417. iserr bool
  418. }{
  419. {int(8), 8, false},
  420. {int8(8), 8, false},
  421. {int16(8), 8, false},
  422. {int32(8), 8, false},
  423. {int64(8), 8, false},
  424. {uint(8), 8, false},
  425. {uint8(8), 8, false},
  426. {uint16(8), 8, false},
  427. {uint32(8), 8, false},
  428. {uint64(8), 8, false},
  429. {float32(8.31), 8, false},
  430. {float64(8.31), 8, false},
  431. {true, 1, false},
  432. {false, 0, false},
  433. {"8", 8, false},
  434. {nil, 0, false},
  435. // errors
  436. {"test", 0, true},
  437. {testing.T{}, 0, true},
  438. }
  439. for i, test := range tests {
  440. errmsg := fmt.Sprintf("i = %d", i) // assert helper message
  441. v, err := ToInt8E(test.input)
  442. if test.iserr {
  443. assert.Error(t, err, errmsg)
  444. continue
  445. }
  446. assert.NoError(t, err, errmsg)
  447. assert.Equal(t, test.expect, v, errmsg)
  448. // Non-E test
  449. v = ToInt8(test.input)
  450. assert.Equal(t, test.expect, v, errmsg)
  451. }
  452. }
  453. func TestToFloat64E(t *testing.T) {
  454. tests := []struct {
  455. input interface{}
  456. expect float64
  457. iserr bool
  458. }{
  459. {int(8), 8, false},
  460. {int8(8), 8, false},
  461. {int16(8), 8, false},
  462. {int32(8), 8, false},
  463. {int64(8), 8, false},
  464. {uint(8), 8, false},
  465. {uint8(8), 8, false},
  466. {uint16(8), 8, false},
  467. {uint32(8), 8, false},
  468. {uint64(8), 8, false},
  469. {float32(8), 8, false},
  470. {float64(8.31), 8.31, false},
  471. {"8", 8, false},
  472. {true, 1, false},
  473. {false, 0, false},
  474. // errors
  475. {"test", 0, true},
  476. {testing.T{}, 0, true},
  477. }
  478. for i, test := range tests {
  479. errmsg := fmt.Sprintf("i = %d", i) // assert helper message
  480. v, err := ToFloat64E(test.input)
  481. if test.iserr {
  482. assert.Error(t, err, errmsg)
  483. continue
  484. }
  485. assert.NoError(t, err, errmsg)
  486. assert.Equal(t, test.expect, v, errmsg)
  487. // Non-E test
  488. v = ToFloat64(test.input)
  489. assert.Equal(t, test.expect, v, errmsg)
  490. }
  491. }
  492. func TestToFloat32E(t *testing.T) {
  493. tests := []struct {
  494. input interface{}
  495. expect float32
  496. iserr bool
  497. }{
  498. {int(8), 8, false},
  499. {int8(8), 8, false},
  500. {int16(8), 8, false},
  501. {int32(8), 8, false},
  502. {int64(8), 8, false},
  503. {uint(8), 8, false},
  504. {uint8(8), 8, false},
  505. {uint16(8), 8, false},
  506. {uint32(8), 8, false},
  507. {uint64(8), 8, false},
  508. {float32(8.31), 8.31, false},
  509. {float64(8.31), 8.31, false},
  510. {"8", 8, false},
  511. {true, 1, false},
  512. {false, 0, false},
  513. // errors
  514. {"test", 0, true},
  515. {testing.T{}, 0, true},
  516. }
  517. for i, test := range tests {
  518. errmsg := fmt.Sprintf("i = %d", i) // assert helper message
  519. v, err := ToFloat32E(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 = ToFloat32(test.input)
  528. assert.Equal(t, test.expect, v, errmsg)
  529. }
  530. }
  531. func TestToStringE(t *testing.T) {
  532. type Key struct {
  533. k string
  534. }
  535. key := &Key{"foo"}
  536. tests := []struct {
  537. input interface{}
  538. expect string
  539. iserr bool
  540. }{
  541. {int(8), "8", false},
  542. {int8(8), "8", false},
  543. {int16(8), "8", false},
  544. {int32(8), "8", false},
  545. {int64(8), "8", false},
  546. {uint(8), "8", false},
  547. {uint8(8), "8", false},
  548. {uint16(8), "8", false},
  549. {uint32(8), "8", false},
  550. {uint64(8), "8", false},
  551. {float32(8.31), "8.31", false},
  552. {float64(8.31), "8.31", false},
  553. {true, "true", false},
  554. {false, "false", false},
  555. {nil, "", false},
  556. {[]byte("one time"), "one time", false},
  557. {"one more time", "one more time", false},
  558. {template.HTML("one time"), "one time", false},
  559. {template.URL("http://somehost.foo"), "http://somehost.foo", false},
  560. {template.JS("(1+2)"), "(1+2)", false},
  561. {template.CSS("a"), "a", false},
  562. {template.HTMLAttr("a"), "a", false},
  563. // errors
  564. {testing.T{}, "", true},
  565. {key, "", true},
  566. }
  567. for i, test := range tests {
  568. errmsg := fmt.Sprintf("i = %d", i) // assert helper message
  569. v, err := ToStringE(test.input)
  570. if test.iserr {
  571. assert.Error(t, err, errmsg)
  572. continue
  573. }
  574. assert.NoError(t, err, errmsg)
  575. assert.Equal(t, test.expect, v, errmsg)
  576. // Non-E test
  577. v = ToString(test.input)
  578. assert.Equal(t, test.expect, v, errmsg)
  579. }
  580. }
  581. type foo struct {
  582. val string
  583. }
  584. func (x foo) String() string {
  585. return x.val
  586. }
  587. func TestStringerToString(t *testing.T) {
  588. var x foo
  589. x.val = "bar"
  590. assert.Equal(t, "bar", ToString(x))
  591. }
  592. type fu struct {
  593. val string
  594. }
  595. func (x fu) Error() string {
  596. return x.val
  597. }
  598. func TestErrorToString(t *testing.T) {
  599. var x fu
  600. x.val = "bar"
  601. assert.Equal(t, "bar", ToString(x))
  602. }
  603. func TestStringMapStringSliceE(t *testing.T) {
  604. // ToStringMapString inputs/outputs
  605. var stringMapString = map[string]string{"key 1": "value 1", "key 2": "value 2", "key 3": "value 3"}
  606. var stringMapInterface = map[string]interface{}{"key 1": "value 1", "key 2": "value 2", "key 3": "value 3"}
  607. var interfaceMapString = map[interface{}]string{"key 1": "value 1", "key 2": "value 2", "key 3": "value 3"}
  608. var interfaceMapInterface = map[interface{}]interface{}{"key 1": "value 1", "key 2": "value 2", "key 3": "value 3"}
  609. // ToStringMapStringSlice inputs/outputs
  610. 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"}}
  611. 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"}}
  612. 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"}}
  613. var stringMapStringSingleSliceFieldsResult = map[string][]string{"key 1": {"value", "1"}, "key 2": {"value", "2"}, "key 3": {"value", "3"}}
  614. 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"}}
  615. 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"}}
  616. 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"}}
  617. var stringMapStringSliceSingle = map[string][]string{"key 1": {"value 1"}, "key 2": {"value 2"}, "key 3": {"value 3"}}
  618. var stringMapInterface1 = map[string]interface{}{"key 1": []string{"value 1"}, "key 2": []string{"value 2"}}
  619. var stringMapInterfaceResult1 = map[string][]string{"key 1": {"value 1"}, "key 2": {"value 2"}}
  620. type Key struct {
  621. k string
  622. }
  623. tests := []struct {
  624. input interface{}
  625. expect map[string][]string
  626. iserr bool
  627. }{
  628. {stringMapStringSlice, stringMapStringSlice, false},
  629. {stringMapInterfaceSlice, stringMapStringSlice, false},
  630. {stringMapInterfaceInterfaceSlice, stringMapStringSlice, false},
  631. {stringMapStringSliceMultiple, stringMapStringSlice, false},
  632. {stringMapStringSliceMultiple, stringMapStringSlice, false},
  633. {stringMapString, stringMapStringSliceSingle, false},
  634. {stringMapInterface, stringMapStringSliceSingle, false},
  635. {stringMapInterface1, stringMapInterfaceResult1, false},
  636. {interfaceMapStringSlice, stringMapStringSlice, false},
  637. {interfaceMapInterfaceSlice, stringMapStringSlice, false},
  638. {interfaceMapString, stringMapStringSingleSliceFieldsResult, false},
  639. {interfaceMapInterface, stringMapStringSingleSliceFieldsResult, false},
  640. // errors
  641. {nil, nil, true},
  642. {testing.T{}, nil, true},
  643. {map[interface{}]interface{}{"foo": testing.T{}}, nil, true},
  644. {map[interface{}]interface{}{Key{"foo"}: "bar"}, nil, true}, // ToStringE(Key{"foo"}) should fail
  645. }
  646. for i, test := range tests {
  647. errmsg := fmt.Sprintf("i = %d", i) // assert helper message
  648. v, err := ToStringMapStringSliceE(test.input)
  649. if test.iserr {
  650. assert.Error(t, err, errmsg)
  651. continue
  652. }
  653. assert.NoError(t, err, errmsg)
  654. assert.Equal(t, test.expect, v, errmsg)
  655. // Non-E test
  656. v = ToStringMapStringSlice(test.input)
  657. assert.Equal(t, test.expect, v, errmsg)
  658. }
  659. }
  660. func TestToStringMapE(t *testing.T) {
  661. tests := []struct {
  662. input interface{}
  663. expect map[string]interface{}
  664. iserr bool
  665. }{
  666. {map[interface{}]interface{}{"tag": "tags", "group": "groups"}, map[string]interface{}{"tag": "tags", "group": "groups"}, false},
  667. {map[string]interface{}{"tag": "tags", "group": "groups"}, map[string]interface{}{"tag": "tags", "group": "groups"}, false},
  668. // errors
  669. {nil, nil, true},
  670. {testing.T{}, nil, true},
  671. }
  672. for i, test := range tests {
  673. errmsg := fmt.Sprintf("i = %d", i) // assert helper message
  674. v, err := ToStringMapE(test.input)
  675. if test.iserr {
  676. assert.Error(t, err, errmsg)
  677. continue
  678. }
  679. assert.NoError(t, err, errmsg)
  680. assert.Equal(t, test.expect, v, errmsg)
  681. // Non-E test
  682. v = ToStringMap(test.input)
  683. assert.Equal(t, test.expect, v, errmsg)
  684. }
  685. }
  686. func TestToStringMapBoolE(t *testing.T) {
  687. tests := []struct {
  688. input interface{}
  689. expect map[string]bool
  690. iserr bool
  691. }{
  692. {map[interface{}]interface{}{"v1": true, "v2": false}, map[string]bool{"v1": true, "v2": false}, false},
  693. {map[string]interface{}{"v1": true, "v2": false}, map[string]bool{"v1": true, "v2": false}, false},
  694. {map[string]bool{"v1": true, "v2": false}, map[string]bool{"v1": true, "v2": false}, false},
  695. // errors
  696. {nil, nil, true},
  697. {testing.T{}, nil, true},
  698. }
  699. for i, test := range tests {
  700. errmsg := fmt.Sprintf("i = %d", i) // assert helper message
  701. v, err := ToStringMapBoolE(test.input)
  702. if test.iserr {
  703. assert.Error(t, err, errmsg)
  704. continue
  705. }
  706. assert.NoError(t, err, errmsg)
  707. assert.Equal(t, test.expect, v, errmsg)
  708. // Non-E test
  709. v = ToStringMapBool(test.input)
  710. assert.Equal(t, test.expect, v, errmsg)
  711. }
  712. }
  713. func TestToStringMapStringE(t *testing.T) {
  714. var stringMapString = map[string]string{"key 1": "value 1", "key 2": "value 2", "key 3": "value 3"}
  715. var stringMapInterface = map[string]interface{}{"key 1": "value 1", "key 2": "value 2", "key 3": "value 3"}
  716. var interfaceMapString = map[interface{}]string{"key 1": "value 1", "key 2": "value 2", "key 3": "value 3"}
  717. var interfaceMapInterface = map[interface{}]interface{}{"key 1": "value 1", "key 2": "value 2", "key 3": "value 3"}
  718. tests := []struct {
  719. input interface{}
  720. expect map[string]string
  721. iserr bool
  722. }{
  723. {stringMapString, stringMapString, false},
  724. {stringMapInterface, stringMapString, false},
  725. {interfaceMapString, stringMapString, false},
  726. {interfaceMapInterface, stringMapString, false},
  727. // errors
  728. {nil, nil, true},
  729. {testing.T{}, nil, true},
  730. }
  731. for i, test := range tests {
  732. errmsg := fmt.Sprintf("i = %d", i) // assert helper message
  733. v, err := ToStringMapStringE(test.input)
  734. if test.iserr {
  735. assert.Error(t, err, errmsg)
  736. continue
  737. }
  738. assert.NoError(t, err, errmsg)
  739. assert.Equal(t, test.expect, v, errmsg)
  740. // Non-E test
  741. v = ToStringMapString(test.input)
  742. assert.Equal(t, test.expect, v, errmsg)
  743. }
  744. }
  745. func TestToBoolSliceE(t *testing.T) {
  746. tests := []struct {
  747. input interface{}
  748. expect []bool
  749. iserr bool
  750. }{
  751. {[]bool{true, false, true}, []bool{true, false, true}, false},
  752. {[]interface{}{true, false, true}, []bool{true, false, true}, false},
  753. {[]int{1, 0, 1}, []bool{true, false, true}, false},
  754. {[]string{"true", "false", "true"}, []bool{true, false, true}, false},
  755. // errors
  756. {nil, nil, true},
  757. {testing.T{}, nil, true},
  758. {[]string{"foo", "bar"}, nil, true},
  759. }
  760. for i, test := range tests {
  761. errmsg := fmt.Sprintf("i = %d", i) // assert helper message
  762. v, err := ToBoolSliceE(test.input)
  763. if test.iserr {
  764. assert.Error(t, err, errmsg)
  765. continue
  766. }
  767. assert.NoError(t, err, errmsg)
  768. assert.Equal(t, test.expect, v, errmsg)
  769. // Non-E test
  770. v = ToBoolSlice(test.input)
  771. assert.Equal(t, test.expect, v, errmsg)
  772. }
  773. }
  774. func TestToIntSliceE(t *testing.T) {
  775. tests := []struct {
  776. input interface{}
  777. expect []int
  778. iserr bool
  779. }{
  780. {[]int{1, 3}, []int{1, 3}, false},
  781. {[]interface{}{1.2, 3.2}, []int{1, 3}, false},
  782. {[]string{"2", "3"}, []int{2, 3}, false},
  783. {[2]string{"2", "3"}, []int{2, 3}, false},
  784. // errors
  785. {nil, nil, true},
  786. {testing.T{}, nil, true},
  787. {[]string{"foo", "bar"}, nil, true},
  788. }
  789. for i, test := range tests {
  790. errmsg := fmt.Sprintf("i = %d", i) // assert helper message
  791. v, err := ToIntSliceE(test.input)
  792. if test.iserr {
  793. assert.Error(t, err, errmsg)
  794. continue
  795. }
  796. assert.NoError(t, err, errmsg)
  797. assert.Equal(t, test.expect, v, errmsg)
  798. // Non-E test
  799. v = ToIntSlice(test.input)
  800. assert.Equal(t, test.expect, v, errmsg)
  801. }
  802. }
  803. func TestToSliceE(t *testing.T) {
  804. tests := []struct {
  805. input interface{}
  806. expect []interface{}
  807. iserr bool
  808. }{
  809. {[]interface{}{1, 3}, []interface{}{1, 3}, false},
  810. {[]map[string]interface{}{{"k1": 1}, {"k2": 2}}, []interface{}{map[string]interface{}{"k1": 1}, map[string]interface{}{"k2": 2}}, false},
  811. // errors
  812. {nil, nil, true},
  813. {testing.T{}, nil, true},
  814. }
  815. for i, test := range tests {
  816. errmsg := fmt.Sprintf("i = %d", i) // assert helper message
  817. v, err := ToSliceE(test.input)
  818. if test.iserr {
  819. assert.Error(t, err, errmsg)
  820. continue
  821. }
  822. assert.NoError(t, err, errmsg)
  823. assert.Equal(t, test.expect, v, errmsg)
  824. // Non-E test
  825. v = ToSlice(test.input)
  826. assert.Equal(t, test.expect, v, errmsg)
  827. }
  828. }
  829. func TestToStringSliceE(t *testing.T) {
  830. tests := []struct {
  831. input interface{}
  832. expect []string
  833. iserr bool
  834. }{
  835. {[]string{"a", "b"}, []string{"a", "b"}, false},
  836. {[]interface{}{1, 3}, []string{"1", "3"}, false},
  837. {interface{}(1), []string{"1"}, false},
  838. // errors
  839. {nil, nil, true},
  840. {testing.T{}, nil, true},
  841. }
  842. for i, test := range tests {
  843. errmsg := fmt.Sprintf("i = %d", i) // assert helper message
  844. v, err := ToStringSliceE(test.input)
  845. if test.iserr {
  846. assert.Error(t, err, errmsg)
  847. continue
  848. }
  849. assert.NoError(t, err, errmsg)
  850. assert.Equal(t, test.expect, v, errmsg)
  851. // Non-E test
  852. v = ToStringSlice(test.input)
  853. assert.Equal(t, test.expect, v, errmsg)
  854. }
  855. }
  856. func TestToBoolE(t *testing.T) {
  857. tests := []struct {
  858. input interface{}
  859. expect bool
  860. iserr bool
  861. }{
  862. {0, false, false},
  863. {nil, false, false},
  864. {"false", false, false},
  865. {"FALSE", false, false},
  866. {"False", false, false},
  867. {"f", false, false},
  868. {"F", false, false},
  869. {false, false, false},
  870. {"true", true, false},
  871. {"TRUE", true, false},
  872. {"True", true, false},
  873. {"t", true, false},
  874. {"T", true, false},
  875. {1, true, false},
  876. {true, true, false},
  877. {-1, true, false},
  878. // errors
  879. {"test", false, true},
  880. {testing.T{}, false, true},
  881. }
  882. for i, test := range tests {
  883. errmsg := fmt.Sprintf("i = %d", i) // assert helper message
  884. v, err := ToBoolE(test.input)
  885. if test.iserr {
  886. assert.Error(t, err, errmsg)
  887. continue
  888. }
  889. assert.NoError(t, err, errmsg)
  890. assert.Equal(t, test.expect, v, errmsg)
  891. // Non-E test
  892. v = ToBool(test.input)
  893. assert.Equal(t, test.expect, v, errmsg)
  894. }
  895. }
  896. func BenchmarkTooBool(b *testing.B) {
  897. for i := 0; i < b.N; i++ {
  898. if !ToBool(true) {
  899. b.Fatal("ToBool returned false")
  900. }
  901. }
  902. }
  903. func TestIndirectPointers(t *testing.T) {
  904. x := 13
  905. y := &x
  906. z := &y
  907. assert.Equal(t, ToInt(y), 13)
  908. assert.Equal(t, ToInt(z), 13)
  909. }
  910. func TestToTimeEE(t *testing.T) {
  911. tests := []struct {
  912. input interface{}
  913. expect time.Time
  914. iserr bool
  915. }{
  916. {"2009-11-10 23:00:00 +0000 UTC", time.Date(2009, 11, 10, 23, 0, 0, 0, time.UTC), false}, // Time.String()
  917. {"Tue Nov 10 23:00:00 2009", time.Date(2009, 11, 10, 23, 0, 0, 0, time.UTC), false}, // ANSIC
  918. {"Tue Nov 10 23:00:00 UTC 2009", time.Date(2009, 11, 10, 23, 0, 0, 0, time.UTC), false}, // UnixDate
  919. {"Tue Nov 10 23:00:00 +0000 2009", time.Date(2009, 11, 10, 23, 0, 0, 0, time.UTC), false}, // RubyDate
  920. {"10 Nov 09 23:00 UTC", time.Date(2009, 11, 10, 23, 0, 0, 0, time.UTC), false}, // RFC822
  921. {"10 Nov 09 23:00 +0000", time.Date(2009, 11, 10, 23, 0, 0, 0, time.UTC), false}, // RFC822Z
  922. {"Tuesday, 10-Nov-09 23:00:00 UTC", time.Date(2009, 11, 10, 23, 0, 0, 0, time.UTC), false}, // RFC850
  923. {"Tue, 10 Nov 2009 23:00:00 UTC", time.Date(2009, 11, 10, 23, 0, 0, 0, time.UTC), false}, // RFC1123
  924. {"Tue, 10 Nov 2009 23:00:00 +0000", time.Date(2009, 11, 10, 23, 0, 0, 0, time.UTC), false}, // RFC1123Z
  925. {"2009-11-10T23:00:00Z", time.Date(2009, 11, 10, 23, 0, 0, 0, time.UTC), false}, // RFC3339
  926. {"2009-11-10T23:00:00Z", time.Date(2009, 11, 10, 23, 0, 0, 0, time.UTC), false}, // RFC3339Nano
  927. {"11:00PM", time.Date(0, 1, 1, 23, 0, 0, 0, time.UTC), false}, // Kitchen
  928. {"Nov 10 23:00:00", time.Date(0, 11, 10, 23, 0, 0, 0, time.UTC), false}, // Stamp
  929. {"Nov 10 23:00:00.000", time.Date(0, 11, 10, 23, 0, 0, 0, time.UTC), false}, // StampMilli
  930. {"Nov 10 23:00:00.000000", time.Date(0, 11, 10, 23, 0, 0, 0, time.UTC), false}, // StampMicro
  931. {"Nov 10 23:00:00.000000000", time.Date(0, 11, 10, 23, 0, 0, 0, time.UTC), false}, // StampNano
  932. {"2016-03-06 15:28:01-00:00", time.Date(2016, 3, 6, 15, 28, 1, 0, time.UTC), false}, // RFC3339 without T
  933. {"2016-03-06 15:28:01", time.Date(2016, 3, 6, 15, 28, 1, 0, time.UTC), false},
  934. {"2016-03-06 15:28:01 -0000", time.Date(2016, 3, 6, 15, 28, 1, 0, time.UTC), false},
  935. {"2016-03-06 15:28:01 -00:00", time.Date(2016, 3, 6, 15, 28, 1, 0, time.UTC), false},
  936. {"2006-01-02", time.Date(2006, 1, 2, 0, 0, 0, 0, time.UTC), false},
  937. {"02 Jan 2006", time.Date(2006, 1, 2, 0, 0, 0, 0, time.UTC), false},
  938. {1472574600, time.Date(2016, 8, 30, 16, 30, 0, 0, time.UTC), false},
  939. {int(1482597504), time.Date(2016, 12, 24, 16, 38, 24, 0, time.UTC), false},
  940. {int64(1234567890), time.Date(2009, 2, 13, 23, 31, 30, 0, time.UTC), false},
  941. {int32(1234567890), time.Date(2009, 2, 13, 23, 31, 30, 0, time.UTC), false},
  942. {uint(1482597504), time.Date(2016, 12, 24, 16, 38, 24, 0, time.UTC), false},
  943. {uint64(1234567890), time.Date(2009, 2, 13, 23, 31, 30, 0, time.UTC), false},
  944. {uint32(1234567890), time.Date(2009, 2, 13, 23, 31, 30, 0, time.UTC), false},
  945. {time.Date(2009, 2, 13, 23, 31, 30, 0, time.UTC), time.Date(2009, 2, 13, 23, 31, 30, 0, time.UTC), false},
  946. // errors
  947. {"2006", time.Time{}, true},
  948. {testing.T{}, time.Time{}, true},
  949. }
  950. for i, test := range tests {
  951. errmsg := fmt.Sprintf("i = %d", i) // assert helper message
  952. v, err := ToTimeE(test.input)
  953. if test.iserr {
  954. assert.Error(t, err, errmsg)
  955. continue
  956. }
  957. assert.NoError(t, err, errmsg)
  958. assert.Equal(t, test.expect, v.UTC(), errmsg)
  959. // Non-E test
  960. v = ToTime(test.input)
  961. assert.Equal(t, test.expect, v.UTC(), errmsg)
  962. }
  963. }
  964. func TestToDurationE(t *testing.T) {
  965. var td time.Duration = 5
  966. tests := []struct {
  967. input interface{}
  968. expect time.Duration
  969. iserr bool
  970. }{
  971. {time.Duration(5), td, false},
  972. {int(5), td, false},
  973. {int64(5), td, false},
  974. {int32(5), td, false},
  975. {int16(5), td, false},
  976. {int8(5), td, false},
  977. {uint(5), td, false},
  978. {uint64(5), td, false},
  979. {uint32(5), td, false},
  980. {uint16(5), td, false},
  981. {uint8(5), td, false},
  982. {float64(5), td, false},
  983. {float32(5), td, false},
  984. {string("5"), td, false},
  985. {string("5ns"), td, false},
  986. {string("5us"), time.Microsecond * td, false},
  987. {string("5µs"), time.Microsecond * td, false},
  988. {string("5ms"), time.Millisecond * td, false},
  989. {string("5s"), time.Second * td, false},
  990. {string("5m"), time.Minute * td, false},
  991. {string("5h"), time.Hour * td, false},
  992. // errors
  993. {"test", 0, true},
  994. {testing.T{}, 0, true},
  995. }
  996. for i, test := range tests {
  997. errmsg := fmt.Sprintf("i = %d", i) // assert helper message
  998. v, err := ToDurationE(test.input)
  999. if test.iserr {
  1000. assert.Error(t, err, errmsg)
  1001. continue
  1002. }
  1003. assert.NoError(t, err, errmsg)
  1004. assert.Equal(t, test.expect, v, errmsg)
  1005. // Non-E test
  1006. v = ToDuration(test.input)
  1007. assert.Equal(t, test.expect, v, errmsg)
  1008. }
  1009. }