marshaler_test.go 4.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233
  1. package mapping
  2. import (
  3. "testing"
  4. "github.com/stretchr/testify/assert"
  5. )
  6. func TestMarshal(t *testing.T) {
  7. v := struct {
  8. Name string `path:"name"`
  9. Address string `json:"address,options=[beijing,shanghai]"`
  10. Age int `json:"age"`
  11. Anonymous bool
  12. }{
  13. Name: "kevin",
  14. Address: "shanghai",
  15. Age: 20,
  16. Anonymous: true,
  17. }
  18. m, err := Marshal(v)
  19. assert.Nil(t, err)
  20. assert.Equal(t, "kevin", m["path"]["name"])
  21. assert.Equal(t, "shanghai", m["json"]["address"])
  22. assert.Equal(t, 20, m["json"]["age"].(int))
  23. assert.True(t, m[emptyTag]["Anonymous"].(bool))
  24. }
  25. func TestMarshal_OptionalPtr(t *testing.T) {
  26. var val = 1
  27. v := struct {
  28. Age *int `json:"age"`
  29. }{
  30. Age: &val,
  31. }
  32. m, err := Marshal(v)
  33. assert.Nil(t, err)
  34. assert.Equal(t, 1, *m["json"]["age"].(*int))
  35. }
  36. func TestMarshal_OptionalPtrNil(t *testing.T) {
  37. v := struct {
  38. Age *int `json:"age"`
  39. }{}
  40. _, err := Marshal(v)
  41. assert.NotNil(t, err)
  42. }
  43. func TestMarshal_BadOptions(t *testing.T) {
  44. v := struct {
  45. Name string `json:"name,options"`
  46. }{
  47. Name: "kevin",
  48. }
  49. _, err := Marshal(v)
  50. assert.NotNil(t, err)
  51. }
  52. func TestMarshal_NotInOptions(t *testing.T) {
  53. v := struct {
  54. Name string `json:"name,options=[a,b]"`
  55. }{
  56. Name: "kevin",
  57. }
  58. _, err := Marshal(v)
  59. assert.NotNil(t, err)
  60. }
  61. func TestMarshal_Nested(t *testing.T) {
  62. type address struct {
  63. Country string `json:"country"`
  64. City string `json:"city"`
  65. }
  66. v := struct {
  67. Name string `json:"name,options=[kevin,wan]"`
  68. Address address `json:"address"`
  69. }{
  70. Name: "kevin",
  71. Address: address{
  72. Country: "China",
  73. City: "Shanghai",
  74. },
  75. }
  76. m, err := Marshal(v)
  77. assert.Nil(t, err)
  78. assert.Equal(t, "kevin", m["json"]["name"])
  79. assert.Equal(t, "China", m["json"]["address"].(address).Country)
  80. assert.Equal(t, "Shanghai", m["json"]["address"].(address).City)
  81. }
  82. func TestMarshal_NestedPtr(t *testing.T) {
  83. type address struct {
  84. Country string `json:"country"`
  85. City string `json:"city"`
  86. }
  87. v := struct {
  88. Name string `json:"name,options=[kevin,wan]"`
  89. Address *address `json:"address"`
  90. }{
  91. Name: "kevin",
  92. Address: &address{
  93. Country: "China",
  94. City: "Shanghai",
  95. },
  96. }
  97. m, err := Marshal(v)
  98. assert.Nil(t, err)
  99. assert.Equal(t, "kevin", m["json"]["name"])
  100. assert.Equal(t, "China", m["json"]["address"].(*address).Country)
  101. assert.Equal(t, "Shanghai", m["json"]["address"].(*address).City)
  102. }
  103. func TestMarshal_Slice(t *testing.T) {
  104. v := struct {
  105. Name []string `json:"name"`
  106. }{
  107. Name: []string{"kevin", "wan"},
  108. }
  109. m, err := Marshal(v)
  110. assert.Nil(t, err)
  111. assert.ElementsMatch(t, []string{"kevin", "wan"}, m["json"]["name"].([]string))
  112. }
  113. func TestMarshal_SliceNil(t *testing.T) {
  114. v := struct {
  115. Name []string `json:"name"`
  116. }{
  117. Name: nil,
  118. }
  119. _, err := Marshal(v)
  120. assert.NotNil(t, err)
  121. }
  122. func TestMarshal_Range(t *testing.T) {
  123. v := struct {
  124. Int int `json:"int,range=[1:3]"`
  125. Int8 int8 `json:"int8,range=[1:3)"`
  126. Int16 int16 `json:"int16,range=(1:3]"`
  127. Int32 int32 `json:"int32,range=(1:3)"`
  128. Int64 int64 `json:"int64,range=(1:3)"`
  129. Uint uint `json:"uint,range=[1:3]"`
  130. Uint8 uint8 `json:"uint8,range=[1:3)"`
  131. Uint16 uint16 `json:"uint16,range=(1:3]"`
  132. Uint32 uint32 `json:"uint32,range=(1:3)"`
  133. Uint64 uint64 `json:"uint64,range=(1:3)"`
  134. Float32 float32 `json:"float32,range=(1:3)"`
  135. Float64 float64 `json:"float64,range=(1:3)"`
  136. }{
  137. Int: 1,
  138. Int8: 1,
  139. Int16: 2,
  140. Int32: 2,
  141. Int64: 2,
  142. Uint: 1,
  143. Uint8: 1,
  144. Uint16: 2,
  145. Uint32: 2,
  146. Uint64: 2,
  147. Float32: 2,
  148. Float64: 2,
  149. }
  150. m, err := Marshal(v)
  151. assert.Nil(t, err)
  152. assert.Equal(t, 1, m["json"]["int"].(int))
  153. assert.Equal(t, int8(1), m["json"]["int8"].(int8))
  154. assert.Equal(t, int16(2), m["json"]["int16"].(int16))
  155. assert.Equal(t, int32(2), m["json"]["int32"].(int32))
  156. assert.Equal(t, int64(2), m["json"]["int64"].(int64))
  157. assert.Equal(t, uint(1), m["json"]["uint"].(uint))
  158. assert.Equal(t, uint8(1), m["json"]["uint8"].(uint8))
  159. assert.Equal(t, uint16(2), m["json"]["uint16"].(uint16))
  160. assert.Equal(t, uint32(2), m["json"]["uint32"].(uint32))
  161. assert.Equal(t, uint64(2), m["json"]["uint64"].(uint64))
  162. assert.Equal(t, float32(2), m["json"]["float32"].(float32))
  163. assert.Equal(t, float64(2), m["json"]["float64"].(float64))
  164. }
  165. func TestMarshal_RangeOut(t *testing.T) {
  166. tests := []interface{}{
  167. struct {
  168. Int int `json:"int,range=[1:3]"`
  169. }{
  170. Int: 4,
  171. },
  172. struct {
  173. Int int `json:"int,range=(1:3]"`
  174. }{
  175. Int: 1,
  176. },
  177. struct {
  178. Int int `json:"int,range=[1:3)"`
  179. }{
  180. Int: 3,
  181. },
  182. struct {
  183. Int int `json:"int,range=(1:3)"`
  184. }{
  185. Int: 3,
  186. },
  187. struct {
  188. Bool bool `json:"bool,range=(1:3)"`
  189. }{
  190. Bool: true,
  191. },
  192. }
  193. for _, test := range tests {
  194. _, err := Marshal(test)
  195. assert.NotNil(t, err)
  196. }
  197. }
  198. func TestMarshal_FromString(t *testing.T) {
  199. v := struct {
  200. Age int `json:"age,string"`
  201. }{
  202. Age: 10,
  203. }
  204. m, err := Marshal(v)
  205. assert.Nil(t, err)
  206. assert.Equal(t, "10", m["json"]["age"].(string))
  207. }