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

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