marshaler_test.go 6.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346
  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_Ptr(t *testing.T) {
  26. v := &struct {
  27. Name string `path:"name"`
  28. Address string `json:"address,options=[beijing,shanghai]"`
  29. Age int `json:"age"`
  30. Anonymous bool
  31. }{
  32. Name: "kevin",
  33. Address: "shanghai",
  34. Age: 20,
  35. Anonymous: true,
  36. }
  37. m, err := Marshal(v)
  38. assert.Nil(t, err)
  39. assert.Equal(t, "kevin", m["path"]["name"])
  40. assert.Equal(t, "shanghai", m["json"]["address"])
  41. assert.Equal(t, 20, m["json"]["age"].(int))
  42. assert.True(t, m[emptyTag]["Anonymous"].(bool))
  43. }
  44. func TestMarshal_OptionalPtr(t *testing.T) {
  45. var val = 1
  46. v := struct {
  47. Age *int `json:"age"`
  48. }{
  49. Age: &val,
  50. }
  51. m, err := Marshal(v)
  52. assert.Nil(t, err)
  53. assert.Equal(t, 1, *m["json"]["age"].(*int))
  54. }
  55. func TestMarshal_OptionalPtrNil(t *testing.T) {
  56. v := struct {
  57. Age *int `json:"age"`
  58. }{}
  59. _, err := Marshal(v)
  60. assert.NotNil(t, err)
  61. }
  62. func TestMarshal_BadOptions(t *testing.T) {
  63. v := struct {
  64. Name string `json:"name,options"`
  65. }{
  66. Name: "kevin",
  67. }
  68. _, err := Marshal(v)
  69. assert.NotNil(t, err)
  70. }
  71. func TestMarshal_NotInOptions(t *testing.T) {
  72. v := struct {
  73. Name string `json:"name,options=[a,b]"`
  74. }{
  75. Name: "kevin",
  76. }
  77. _, err := Marshal(v)
  78. assert.NotNil(t, err)
  79. }
  80. func TestMarshal_NotInOptionsOptional(t *testing.T) {
  81. v := struct {
  82. Name string `json:"name,options=[a,b],optional"`
  83. }{}
  84. _, err := Marshal(v)
  85. assert.Nil(t, err)
  86. }
  87. func TestMarshal_NotInOptionsOptionalWrongValue(t *testing.T) {
  88. v := struct {
  89. Name string `json:"name,options=[a,b],optional"`
  90. }{
  91. Name: "kevin",
  92. }
  93. _, err := Marshal(v)
  94. assert.NotNil(t, err)
  95. }
  96. func TestMarshal_Nested(t *testing.T) {
  97. type address struct {
  98. Country string `json:"country"`
  99. City string `json:"city"`
  100. }
  101. v := struct {
  102. Name string `json:"name,options=[kevin,wan]"`
  103. Address address `json:"address"`
  104. }{
  105. Name: "kevin",
  106. Address: address{
  107. Country: "China",
  108. City: "Shanghai",
  109. },
  110. }
  111. m, err := Marshal(v)
  112. assert.Nil(t, err)
  113. assert.Equal(t, "kevin", m["json"]["name"])
  114. assert.Equal(t, "China", m["json"]["address"].(address).Country)
  115. assert.Equal(t, "Shanghai", m["json"]["address"].(address).City)
  116. }
  117. func TestMarshal_NestedPtr(t *testing.T) {
  118. type address struct {
  119. Country string `json:"country"`
  120. City string `json:"city"`
  121. }
  122. v := struct {
  123. Name string `json:"name,options=[kevin,wan]"`
  124. Address *address `json:"address"`
  125. }{
  126. Name: "kevin",
  127. Address: &address{
  128. Country: "China",
  129. City: "Shanghai",
  130. },
  131. }
  132. m, err := Marshal(v)
  133. assert.Nil(t, err)
  134. assert.Equal(t, "kevin", m["json"]["name"])
  135. assert.Equal(t, "China", m["json"]["address"].(*address).Country)
  136. assert.Equal(t, "Shanghai", m["json"]["address"].(*address).City)
  137. }
  138. func TestMarshal_Slice(t *testing.T) {
  139. v := struct {
  140. Name []string `json:"name"`
  141. }{
  142. Name: []string{"kevin", "wan"},
  143. }
  144. m, err := Marshal(v)
  145. assert.Nil(t, err)
  146. assert.ElementsMatch(t, []string{"kevin", "wan"}, m["json"]["name"].([]string))
  147. }
  148. func TestMarshal_SliceNil(t *testing.T) {
  149. v := struct {
  150. Name []string `json:"name"`
  151. }{
  152. Name: nil,
  153. }
  154. _, err := Marshal(v)
  155. assert.NotNil(t, err)
  156. }
  157. func TestMarshal_Range(t *testing.T) {
  158. v := struct {
  159. Int int `json:"int,range=[1:3]"`
  160. Int8 int8 `json:"int8,range=[1:3)"`
  161. Int16 int16 `json:"int16,range=(1:3]"`
  162. Int32 int32 `json:"int32,range=(1:3)"`
  163. Int64 int64 `json:"int64,range=(1:3)"`
  164. Uint uint `json:"uint,range=[1:3]"`
  165. Uint8 uint8 `json:"uint8,range=[1:3)"`
  166. Uint16 uint16 `json:"uint16,range=(1:3]"`
  167. Uint32 uint32 `json:"uint32,range=(1:3)"`
  168. Uint64 uint64 `json:"uint64,range=(1:3)"`
  169. Float32 float32 `json:"float32,range=(1:3)"`
  170. Float64 float64 `json:"float64,range=(1:3)"`
  171. }{
  172. Int: 1,
  173. Int8: 1,
  174. Int16: 2,
  175. Int32: 2,
  176. Int64: 2,
  177. Uint: 1,
  178. Uint8: 1,
  179. Uint16: 2,
  180. Uint32: 2,
  181. Uint64: 2,
  182. Float32: 2,
  183. Float64: 2,
  184. }
  185. m, err := Marshal(v)
  186. assert.Nil(t, err)
  187. assert.Equal(t, 1, m["json"]["int"].(int))
  188. assert.Equal(t, int8(1), m["json"]["int8"].(int8))
  189. assert.Equal(t, int16(2), m["json"]["int16"].(int16))
  190. assert.Equal(t, int32(2), m["json"]["int32"].(int32))
  191. assert.Equal(t, int64(2), m["json"]["int64"].(int64))
  192. assert.Equal(t, uint(1), m["json"]["uint"].(uint))
  193. assert.Equal(t, uint8(1), m["json"]["uint8"].(uint8))
  194. assert.Equal(t, uint16(2), m["json"]["uint16"].(uint16))
  195. assert.Equal(t, uint32(2), m["json"]["uint32"].(uint32))
  196. assert.Equal(t, uint64(2), m["json"]["uint64"].(uint64))
  197. assert.Equal(t, float32(2), m["json"]["float32"].(float32))
  198. assert.Equal(t, float64(2), m["json"]["float64"].(float64))
  199. }
  200. func TestMarshal_RangeOut(t *testing.T) {
  201. tests := []any{
  202. struct {
  203. Int int `json:"int,range=[1:3]"`
  204. }{
  205. Int: 4,
  206. },
  207. struct {
  208. Int int `json:"int,range=(1:3]"`
  209. }{
  210. Int: 1,
  211. },
  212. struct {
  213. Int int `json:"int,range=[1:3)"`
  214. }{
  215. Int: 3,
  216. },
  217. struct {
  218. Int int `json:"int,range=(1:3)"`
  219. }{
  220. Int: 3,
  221. },
  222. struct {
  223. Bool bool `json:"bool,range=(1:3)"`
  224. }{
  225. Bool: true,
  226. },
  227. }
  228. for _, test := range tests {
  229. _, err := Marshal(test)
  230. assert.NotNil(t, err)
  231. }
  232. }
  233. func TestMarshal_RangeIllegal(t *testing.T) {
  234. tests := []any{
  235. struct {
  236. Int int `json:"int,range=[3:1]"`
  237. }{
  238. Int: 2,
  239. },
  240. struct {
  241. Int int `json:"int,range=(3:1]"`
  242. }{
  243. Int: 2,
  244. },
  245. }
  246. for _, test := range tests {
  247. _, err := Marshal(test)
  248. assert.Equal(t, err, errNumberRange)
  249. }
  250. }
  251. func TestMarshal_RangeLeftEqualsToRight(t *testing.T) {
  252. tests := []struct {
  253. name string
  254. value any
  255. err error
  256. }{
  257. {
  258. name: "left inclusive, right inclusive",
  259. value: struct {
  260. Int int `json:"int,range=[2:2]"`
  261. }{
  262. Int: 2,
  263. },
  264. },
  265. {
  266. name: "left inclusive, right exclusive",
  267. value: struct {
  268. Int int `json:"int,range=[2:2)"`
  269. }{
  270. Int: 2,
  271. },
  272. err: errNumberRange,
  273. },
  274. {
  275. name: "left exclusive, right inclusive",
  276. value: struct {
  277. Int int `json:"int,range=(2:2]"`
  278. }{
  279. Int: 2,
  280. },
  281. err: errNumberRange,
  282. },
  283. {
  284. name: "left exclusive, right exclusive",
  285. value: struct {
  286. Int int `json:"int,range=(2:2)"`
  287. }{
  288. Int: 2,
  289. },
  290. err: errNumberRange,
  291. },
  292. }
  293. for _, test := range tests {
  294. test := test
  295. t.Run(test.name, func(t *testing.T) {
  296. _, err := Marshal(test.value)
  297. assert.Equal(t, test.err, err)
  298. })
  299. }
  300. }
  301. func TestMarshal_FromString(t *testing.T) {
  302. v := struct {
  303. Age int `json:"age,string"`
  304. }{
  305. Age: 10,
  306. }
  307. m, err := Marshal(v)
  308. assert.Nil(t, err)
  309. assert.Equal(t, "10", m["json"]["age"].(string))
  310. }