unmarshaler_test.go 67 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697989910010110210310410510610710810911011111211311411511611711811912012112212312412512612712812913013113213313413513613713813914014114214314414514614714814915015115215315415515615715815916016116216316416516616716816917017117217317417517617717817918018118218318418518618718818919019119219319419519619719819920020120220320420520620720820921021121221321421521621721821922022122222322422522622722822923023123223323423523623723823924024124224324424524624724824925025125225325425525625725825926026126226326426526626726826927027127227327427527627727827928028128228328428528628728828929029129229329429529629729829930030130230330430530630730830931031131231331431531631731831932032132232332432532632732832933033133233333433533633733833934034134234334434534634734834935035135235335435535635735835936036136236336436536636736836937037137237337437537637737837938038138238338438538638738838939039139239339439539639739839940040140240340440540640740840941041141241341441541641741841942042142242342442542642742842943043143243343443543643743843944044144244344444544644744844945045145245345445545645745845946046146246346446546646746846947047147247347447547647747847948048148248348448548648748848949049149249349449549649749849950050150250350450550650750850951051151251351451551651751851952052152252352452552652752852953053153253353453553653753853954054154254354454554654754854955055155255355455555655755855956056156256356456556656756856957057157257357457557657757857958058158258358458558658758858959059159259359459559659759859960060160260360460560660760860961061161261361461561661761861962062162262362462562662762862963063163263363463563663763863964064164264364464564664764864965065165265365465565665765865966066166266366466566666766866967067167267367467567667767867968068168268368468568668768868969069169269369469569669769869970070170270370470570670770870971071171271371471571671771871972072172272372472572672772872973073173273373473573673773873974074174274374474574674774874975075175275375475575675775875976076176276376476576676776876977077177277377477577677777877978078178278378478578678778878979079179279379479579679779879980080180280380480580680780880981081181281381481581681781881982082182282382482582682782882983083183283383483583683783883984084184284384484584684784884985085185285385485585685785885986086186286386486586686786886987087187287387487587687787887988088188288388488588688788888989089189289389489589689789889990090190290390490590690790890991091191291391491591691791891992092192292392492592692792892993093193293393493593693793893994094194294394494594694794894995095195295395495595695795895996096196296396496596696796896997097197297397497597697797897998098198298398498598698798898999099199299399499599699799899910001001100210031004100510061007100810091010101110121013101410151016101710181019102010211022102310241025102610271028102910301031103210331034103510361037103810391040104110421043104410451046104710481049105010511052105310541055105610571058105910601061106210631064106510661067106810691070107110721073107410751076107710781079108010811082108310841085108610871088108910901091109210931094109510961097109810991100110111021103110411051106110711081109111011111112111311141115111611171118111911201121112211231124112511261127112811291130113111321133113411351136113711381139114011411142114311441145114611471148114911501151115211531154115511561157115811591160116111621163116411651166116711681169117011711172117311741175117611771178117911801181118211831184118511861187118811891190119111921193119411951196119711981199120012011202120312041205120612071208120912101211121212131214121512161217121812191220122112221223122412251226122712281229123012311232123312341235123612371238123912401241124212431244124512461247124812491250125112521253125412551256125712581259126012611262126312641265126612671268126912701271127212731274127512761277127812791280128112821283128412851286128712881289129012911292129312941295129612971298129913001301130213031304130513061307130813091310131113121313131413151316131713181319132013211322132313241325132613271328132913301331133213331334133513361337133813391340134113421343134413451346134713481349135013511352135313541355135613571358135913601361136213631364136513661367136813691370137113721373137413751376137713781379138013811382138313841385138613871388138913901391139213931394139513961397139813991400140114021403140414051406140714081409141014111412141314141415141614171418141914201421142214231424142514261427142814291430143114321433143414351436143714381439144014411442144314441445144614471448144914501451145214531454145514561457145814591460146114621463146414651466146714681469147014711472147314741475147614771478147914801481148214831484148514861487148814891490149114921493149414951496149714981499150015011502150315041505150615071508150915101511151215131514151515161517151815191520152115221523152415251526152715281529153015311532153315341535153615371538153915401541154215431544154515461547154815491550155115521553155415551556155715581559156015611562156315641565156615671568156915701571157215731574157515761577157815791580158115821583158415851586158715881589159015911592159315941595159615971598159916001601160216031604160516061607160816091610161116121613161416151616161716181619162016211622162316241625162616271628162916301631163216331634163516361637163816391640164116421643164416451646164716481649165016511652165316541655165616571658165916601661166216631664166516661667166816691670167116721673167416751676167716781679168016811682168316841685168616871688168916901691169216931694169516961697169816991700170117021703170417051706170717081709171017111712171317141715171617171718171917201721172217231724172517261727172817291730173117321733173417351736173717381739174017411742174317441745174617471748174917501751175217531754175517561757175817591760176117621763176417651766176717681769177017711772177317741775177617771778177917801781178217831784178517861787178817891790179117921793179417951796179717981799180018011802180318041805180618071808180918101811181218131814181518161817181818191820182118221823182418251826182718281829183018311832183318341835183618371838183918401841184218431844184518461847184818491850185118521853185418551856185718581859186018611862186318641865186618671868186918701871187218731874187518761877187818791880188118821883188418851886188718881889189018911892189318941895189618971898189919001901190219031904190519061907190819091910191119121913191419151916191719181919192019211922192319241925192619271928192919301931193219331934193519361937193819391940194119421943194419451946194719481949195019511952195319541955195619571958195919601961196219631964196519661967196819691970197119721973197419751976197719781979198019811982198319841985198619871988198919901991199219931994199519961997199819992000200120022003200420052006200720082009201020112012201320142015201620172018201920202021202220232024202520262027202820292030203120322033203420352036203720382039204020412042204320442045204620472048204920502051205220532054205520562057205820592060206120622063206420652066206720682069207020712072207320742075207620772078207920802081208220832084208520862087208820892090209120922093209420952096209720982099210021012102210321042105210621072108210921102111211221132114211521162117211821192120212121222123212421252126212721282129213021312132213321342135213621372138213921402141214221432144214521462147214821492150215121522153215421552156215721582159216021612162216321642165216621672168216921702171217221732174217521762177217821792180218121822183218421852186218721882189219021912192219321942195219621972198219922002201220222032204220522062207220822092210221122122213221422152216221722182219222022212222222322242225222622272228222922302231223222332234223522362237223822392240224122422243224422452246224722482249225022512252225322542255225622572258225922602261226222632264226522662267226822692270227122722273227422752276227722782279228022812282228322842285228622872288228922902291229222932294229522962297229822992300230123022303230423052306230723082309231023112312231323142315231623172318231923202321232223232324232523262327232823292330233123322333233423352336233723382339234023412342234323442345234623472348234923502351235223532354235523562357235823592360236123622363236423652366236723682369237023712372237323742375237623772378237923802381238223832384238523862387238823892390239123922393239423952396239723982399240024012402240324042405240624072408240924102411241224132414241524162417241824192420242124222423242424252426242724282429243024312432243324342435243624372438243924402441244224432444244524462447244824492450245124522453245424552456245724582459246024612462246324642465246624672468246924702471247224732474247524762477247824792480248124822483248424852486248724882489249024912492249324942495249624972498249925002501250225032504250525062507250825092510251125122513251425152516251725182519252025212522252325242525252625272528252925302531253225332534253525362537253825392540254125422543254425452546254725482549255025512552255325542555255625572558255925602561256225632564256525662567256825692570257125722573257425752576257725782579258025812582258325842585258625872588258925902591259225932594259525962597259825992600260126022603260426052606260726082609261026112612261326142615261626172618261926202621262226232624262526262627262826292630263126322633263426352636263726382639264026412642264326442645264626472648264926502651265226532654265526562657265826592660266126622663266426652666266726682669267026712672267326742675267626772678267926802681268226832684268526862687268826892690269126922693269426952696269726982699270027012702270327042705270627072708270927102711271227132714271527162717271827192720272127222723272427252726272727282729273027312732273327342735273627372738273927402741274227432744274527462747274827492750275127522753275427552756275727582759276027612762276327642765276627672768276927702771277227732774277527762777277827792780278127822783278427852786278727882789279027912792279327942795279627972798279928002801280228032804280528062807280828092810281128122813281428152816281728182819282028212822282328242825282628272828282928302831283228332834283528362837283828392840284128422843284428452846284728482849285028512852285328542855285628572858285928602861286228632864286528662867286828692870287128722873287428752876287728782879288028812882288328842885288628872888288928902891289228932894289528962897289828992900290129022903290429052906290729082909291029112912291329142915291629172918291929202921292229232924292529262927292829292930293129322933293429352936293729382939294029412942294329442945294629472948294929502951295229532954295529562957295829592960296129622963296429652966296729682969297029712972297329742975297629772978297929802981298229832984298529862987298829892990299129922993299429952996299729982999300030013002300330043005300630073008300930103011301230133014301530163017301830193020302130223023302430253026302730283029303030313032303330343035303630373038303930403041304230433044304530463047304830493050305130523053
  1. package mapping
  2. import (
  3. "encoding/json"
  4. "fmt"
  5. "strconv"
  6. "strings"
  7. "testing"
  8. "time"
  9. "github.com/google/uuid"
  10. "github.com/stretchr/testify/assert"
  11. "github.com/zeromicro/go-zero/core/stringx"
  12. )
  13. // because json.Number doesn't support strconv.ParseUint(...),
  14. // so we only can test to 62 bits.
  15. const maxUintBitsToTest = 62
  16. func TestUnmarshalWithFullNameNotStruct(t *testing.T) {
  17. var s map[string]interface{}
  18. content := []byte(`{"name":"xiaoming"}`)
  19. err := UnmarshalJsonBytes(content, &s)
  20. assert.Equal(t, errValueNotStruct, err)
  21. }
  22. func TestUnmarshalWithoutTagName(t *testing.T) {
  23. type inner struct {
  24. Optional bool `key:",optional"`
  25. }
  26. m := map[string]interface{}{
  27. "Optional": true,
  28. }
  29. var in inner
  30. assert.Nil(t, UnmarshalKey(m, &in))
  31. assert.True(t, in.Optional)
  32. }
  33. func TestUnmarshalBool(t *testing.T) {
  34. type inner struct {
  35. True bool `key:"yes"`
  36. False bool `key:"no"`
  37. TrueFromOne bool `key:"yesone,string"`
  38. FalseFromZero bool `key:"nozero,string"`
  39. TrueFromTrue bool `key:"yestrue,string"`
  40. FalseFromFalse bool `key:"nofalse,string"`
  41. DefaultTrue bool `key:"defaulttrue,default=1"`
  42. Optional bool `key:"optional,optional"`
  43. }
  44. m := map[string]interface{}{
  45. "yes": true,
  46. "no": false,
  47. "yesone": "1",
  48. "nozero": "0",
  49. "yestrue": "true",
  50. "nofalse": "false",
  51. }
  52. var in inner
  53. ast := assert.New(t)
  54. ast.Nil(UnmarshalKey(m, &in))
  55. ast.True(in.True)
  56. ast.False(in.False)
  57. ast.True(in.TrueFromOne)
  58. ast.False(in.FalseFromZero)
  59. ast.True(in.TrueFromTrue)
  60. ast.False(in.FalseFromFalse)
  61. ast.True(in.DefaultTrue)
  62. }
  63. func TestUnmarshalDuration(t *testing.T) {
  64. type inner struct {
  65. Duration time.Duration `key:"duration"`
  66. LessDuration time.Duration `key:"less"`
  67. MoreDuration time.Duration `key:"more"`
  68. }
  69. m := map[string]interface{}{
  70. "duration": "5s",
  71. "less": "100ms",
  72. "more": "24h",
  73. }
  74. var in inner
  75. assert.Nil(t, UnmarshalKey(m, &in))
  76. assert.Equal(t, time.Second*5, in.Duration)
  77. assert.Equal(t, time.Millisecond*100, in.LessDuration)
  78. assert.Equal(t, time.Hour*24, in.MoreDuration)
  79. }
  80. func TestUnmarshalDurationDefault(t *testing.T) {
  81. type inner struct {
  82. Int int `key:"int"`
  83. Duration time.Duration `key:"duration,default=5s"`
  84. }
  85. m := map[string]interface{}{
  86. "int": 5,
  87. }
  88. var in inner
  89. assert.Nil(t, UnmarshalKey(m, &in))
  90. assert.Equal(t, 5, in.Int)
  91. assert.Equal(t, time.Second*5, in.Duration)
  92. }
  93. func TestUnmarshalDurationPtr(t *testing.T) {
  94. type inner struct {
  95. Duration *time.Duration `key:"duration"`
  96. }
  97. m := map[string]interface{}{
  98. "duration": "5s",
  99. }
  100. var in inner
  101. assert.Nil(t, UnmarshalKey(m, &in))
  102. assert.Equal(t, time.Second*5, *in.Duration)
  103. }
  104. func TestUnmarshalDurationPtrDefault(t *testing.T) {
  105. type inner struct {
  106. Int int `key:"int"`
  107. Value *int `key:",default=5"`
  108. Duration *time.Duration `key:"duration,default=5s"`
  109. }
  110. m := map[string]interface{}{
  111. "int": 5,
  112. }
  113. var in inner
  114. assert.Nil(t, UnmarshalKey(m, &in))
  115. assert.Equal(t, 5, in.Int)
  116. assert.Equal(t, 5, *in.Value)
  117. assert.Equal(t, time.Second*5, *in.Duration)
  118. }
  119. func TestUnmarshalInt(t *testing.T) {
  120. type inner struct {
  121. Int int `key:"int"`
  122. IntFromStr int `key:"intstr,string"`
  123. Int8 int8 `key:"int8"`
  124. Int8FromStr int8 `key:"int8str,string"`
  125. Int16 int16 `key:"int16"`
  126. Int16FromStr int16 `key:"int16str,string"`
  127. Int32 int32 `key:"int32"`
  128. Int32FromStr int32 `key:"int32str,string"`
  129. Int64 int64 `key:"int64"`
  130. Int64FromStr int64 `key:"int64str,string"`
  131. DefaultInt int64 `key:"defaultint,default=11"`
  132. Optional int `key:"optional,optional"`
  133. }
  134. m := map[string]interface{}{
  135. "int": 1,
  136. "intstr": "2",
  137. "int8": int8(3),
  138. "int8str": "4",
  139. "int16": int16(5),
  140. "int16str": "6",
  141. "int32": int32(7),
  142. "int32str": "8",
  143. "int64": int64(9),
  144. "int64str": "10",
  145. }
  146. var in inner
  147. ast := assert.New(t)
  148. ast.Nil(UnmarshalKey(m, &in))
  149. ast.Equal(1, in.Int)
  150. ast.Equal(2, in.IntFromStr)
  151. ast.Equal(int8(3), in.Int8)
  152. ast.Equal(int8(4), in.Int8FromStr)
  153. ast.Equal(int16(5), in.Int16)
  154. ast.Equal(int16(6), in.Int16FromStr)
  155. ast.Equal(int32(7), in.Int32)
  156. ast.Equal(int32(8), in.Int32FromStr)
  157. ast.Equal(int64(9), in.Int64)
  158. ast.Equal(int64(10), in.Int64FromStr)
  159. ast.Equal(int64(11), in.DefaultInt)
  160. }
  161. func TestUnmarshalIntPtr(t *testing.T) {
  162. type inner struct {
  163. Int *int `key:"int"`
  164. }
  165. m := map[string]interface{}{
  166. "int": 1,
  167. }
  168. var in inner
  169. assert.Nil(t, UnmarshalKey(m, &in))
  170. assert.NotNil(t, in.Int)
  171. assert.Equal(t, 1, *in.Int)
  172. }
  173. func TestUnmarshalIntWithDefault(t *testing.T) {
  174. type inner struct {
  175. Int int `key:"int,default=5"`
  176. }
  177. m := map[string]interface{}{
  178. "int": 1,
  179. }
  180. var in inner
  181. assert.Nil(t, UnmarshalKey(m, &in))
  182. assert.Equal(t, 1, in.Int)
  183. }
  184. func TestUnmarshalBoolSliceRequired(t *testing.T) {
  185. type inner struct {
  186. Bools []bool `key:"bools"`
  187. }
  188. var in inner
  189. assert.NotNil(t, UnmarshalKey(map[string]interface{}{}, &in))
  190. }
  191. func TestUnmarshalBoolSliceNil(t *testing.T) {
  192. type inner struct {
  193. Bools []bool `key:"bools,optional"`
  194. }
  195. var in inner
  196. assert.Nil(t, UnmarshalKey(map[string]interface{}{}, &in))
  197. assert.Nil(t, in.Bools)
  198. }
  199. func TestUnmarshalBoolSliceNilExplicit(t *testing.T) {
  200. type inner struct {
  201. Bools []bool `key:"bools,optional"`
  202. }
  203. var in inner
  204. assert.Nil(t, UnmarshalKey(map[string]interface{}{
  205. "bools": nil,
  206. }, &in))
  207. assert.Nil(t, in.Bools)
  208. }
  209. func TestUnmarshalBoolSliceEmpty(t *testing.T) {
  210. type inner struct {
  211. Bools []bool `key:"bools,optional"`
  212. }
  213. var in inner
  214. assert.Nil(t, UnmarshalKey(map[string]interface{}{
  215. "bools": []bool{},
  216. }, &in))
  217. assert.Empty(t, in.Bools)
  218. }
  219. func TestUnmarshalBoolSliceWithDefault(t *testing.T) {
  220. type inner struct {
  221. Bools []bool `key:"bools,default=[true,false]"`
  222. }
  223. var in inner
  224. assert.Nil(t, UnmarshalKey(nil, &in))
  225. assert.ElementsMatch(t, []bool{true, false}, in.Bools)
  226. }
  227. func TestUnmarshalIntSliceWithDefault(t *testing.T) {
  228. type inner struct {
  229. Ints []int `key:"ints,default=[1,2,3]"`
  230. }
  231. var in inner
  232. assert.Nil(t, UnmarshalKey(nil, &in))
  233. assert.ElementsMatch(t, []int{1, 2, 3}, in.Ints)
  234. }
  235. func TestUnmarshalIntSliceWithDefaultHasSpaces(t *testing.T) {
  236. type inner struct {
  237. Ints []int `key:"ints,default=[1, 2, 3]"`
  238. }
  239. var in inner
  240. assert.Nil(t, UnmarshalKey(nil, &in))
  241. assert.ElementsMatch(t, []int{1, 2, 3}, in.Ints)
  242. }
  243. func TestUnmarshalFloatSliceWithDefault(t *testing.T) {
  244. type inner struct {
  245. Floats []float32 `key:"floats,default=[1.1,2.2,3.3]"`
  246. }
  247. var in inner
  248. assert.Nil(t, UnmarshalKey(nil, &in))
  249. assert.ElementsMatch(t, []float32{1.1, 2.2, 3.3}, in.Floats)
  250. }
  251. func TestUnmarshalStringSliceWithDefault(t *testing.T) {
  252. type inner struct {
  253. Strs []string `key:"strs,default=[foo,bar,woo]"`
  254. }
  255. var in inner
  256. assert.Nil(t, UnmarshalKey(nil, &in))
  257. assert.ElementsMatch(t, []string{"foo", "bar", "woo"}, in.Strs)
  258. }
  259. func TestUnmarshalStringSliceWithDefaultHasSpaces(t *testing.T) {
  260. type inner struct {
  261. Strs []string `key:"strs,default=[foo, bar, woo]"`
  262. }
  263. var in inner
  264. assert.Nil(t, UnmarshalKey(nil, &in))
  265. assert.ElementsMatch(t, []string{"foo", "bar", "woo"}, in.Strs)
  266. }
  267. func TestUnmarshalUint(t *testing.T) {
  268. type inner struct {
  269. Uint uint `key:"uint"`
  270. UintFromStr uint `key:"uintstr,string"`
  271. Uint8 uint8 `key:"uint8"`
  272. Uint8FromStr uint8 `key:"uint8str,string"`
  273. Uint16 uint16 `key:"uint16"`
  274. Uint16FromStr uint16 `key:"uint16str,string"`
  275. Uint32 uint32 `key:"uint32"`
  276. Uint32FromStr uint32 `key:"uint32str,string"`
  277. Uint64 uint64 `key:"uint64"`
  278. Uint64FromStr uint64 `key:"uint64str,string"`
  279. DefaultUint uint `key:"defaultuint,default=11"`
  280. Optional uint `key:"optional,optional"`
  281. }
  282. m := map[string]interface{}{
  283. "uint": uint(1),
  284. "uintstr": "2",
  285. "uint8": uint8(3),
  286. "uint8str": "4",
  287. "uint16": uint16(5),
  288. "uint16str": "6",
  289. "uint32": uint32(7),
  290. "uint32str": "8",
  291. "uint64": uint64(9),
  292. "uint64str": "10",
  293. }
  294. var in inner
  295. ast := assert.New(t)
  296. ast.Nil(UnmarshalKey(m, &in))
  297. ast.Equal(uint(1), in.Uint)
  298. ast.Equal(uint(2), in.UintFromStr)
  299. ast.Equal(uint8(3), in.Uint8)
  300. ast.Equal(uint8(4), in.Uint8FromStr)
  301. ast.Equal(uint16(5), in.Uint16)
  302. ast.Equal(uint16(6), in.Uint16FromStr)
  303. ast.Equal(uint32(7), in.Uint32)
  304. ast.Equal(uint32(8), in.Uint32FromStr)
  305. ast.Equal(uint64(9), in.Uint64)
  306. ast.Equal(uint64(10), in.Uint64FromStr)
  307. ast.Equal(uint(11), in.DefaultUint)
  308. }
  309. func TestUnmarshalFloat(t *testing.T) {
  310. type inner struct {
  311. Float32 float32 `key:"float32"`
  312. Float32Str float32 `key:"float32str,string"`
  313. Float64 float64 `key:"float64"`
  314. Float64Str float64 `key:"float64str,string"`
  315. DefaultFloat float32 `key:"defaultfloat,default=5.5"`
  316. Optional float32 `key:",optional"`
  317. }
  318. m := map[string]interface{}{
  319. "float32": float32(1.5),
  320. "float32str": "2.5",
  321. "float64": float64(3.5),
  322. "float64str": "4.5",
  323. }
  324. var in inner
  325. ast := assert.New(t)
  326. ast.Nil(UnmarshalKey(m, &in))
  327. ast.Equal(float32(1.5), in.Float32)
  328. ast.Equal(float32(2.5), in.Float32Str)
  329. ast.Equal(3.5, in.Float64)
  330. ast.Equal(4.5, in.Float64Str)
  331. ast.Equal(float32(5.5), in.DefaultFloat)
  332. }
  333. func TestUnmarshalInt64Slice(t *testing.T) {
  334. var v struct {
  335. Ages []int64 `key:"ages"`
  336. Slice []int64 `key:"slice"`
  337. }
  338. m := map[string]interface{}{
  339. "ages": []int64{1, 2},
  340. "slice": []interface{}{},
  341. }
  342. ast := assert.New(t)
  343. ast.Nil(UnmarshalKey(m, &v))
  344. ast.ElementsMatch([]int64{1, 2}, v.Ages)
  345. ast.Equal([]int64{}, v.Slice)
  346. }
  347. func TestUnmarshalIntSlice(t *testing.T) {
  348. var v struct {
  349. Ages []int `key:"ages"`
  350. Slice []int `key:"slice"`
  351. }
  352. m := map[string]interface{}{
  353. "ages": []int{1, 2},
  354. "slice": []interface{}{},
  355. }
  356. ast := assert.New(t)
  357. ast.Nil(UnmarshalKey(m, &v))
  358. ast.ElementsMatch([]int{1, 2}, v.Ages)
  359. ast.Equal([]int{}, v.Slice)
  360. }
  361. func TestUnmarshalString(t *testing.T) {
  362. type inner struct {
  363. Name string `key:"name"`
  364. NameStr string `key:"namestr,string"`
  365. NotPresent string `key:",optional"`
  366. NotPresentWithTag string `key:"notpresent,optional"`
  367. DefaultString string `key:"defaultstring,default=hello"`
  368. Optional string `key:",optional"`
  369. }
  370. m := map[string]interface{}{
  371. "name": "kevin",
  372. "namestr": "namewithstring",
  373. }
  374. var in inner
  375. ast := assert.New(t)
  376. ast.Nil(UnmarshalKey(m, &in))
  377. ast.Equal("kevin", in.Name)
  378. ast.Equal("namewithstring", in.NameStr)
  379. ast.Empty(in.NotPresent)
  380. ast.Empty(in.NotPresentWithTag)
  381. ast.Equal("hello", in.DefaultString)
  382. }
  383. func TestUnmarshalStringWithMissing(t *testing.T) {
  384. type inner struct {
  385. Name string `key:"name"`
  386. }
  387. m := map[string]interface{}{}
  388. var in inner
  389. assert.NotNil(t, UnmarshalKey(m, &in))
  390. }
  391. func TestUnmarshalStringSliceFromString(t *testing.T) {
  392. var v struct {
  393. Names []string `key:"names"`
  394. }
  395. m := map[string]interface{}{
  396. "names": `["first", "second"]`,
  397. }
  398. ast := assert.New(t)
  399. ast.Nil(UnmarshalKey(m, &v))
  400. ast.Equal(2, len(v.Names))
  401. ast.Equal("first", v.Names[0])
  402. ast.Equal("second", v.Names[1])
  403. }
  404. func TestUnmarshalIntSliceFromString(t *testing.T) {
  405. var v struct {
  406. Values []int `key:"values"`
  407. }
  408. m := map[string]interface{}{
  409. "values": `[1, 2]`,
  410. }
  411. ast := assert.New(t)
  412. ast.Nil(UnmarshalKey(m, &v))
  413. ast.Equal(2, len(v.Values))
  414. ast.Equal(1, v.Values[0])
  415. ast.Equal(2, v.Values[1])
  416. }
  417. func TestUnmarshalIntMapFromString(t *testing.T) {
  418. var v struct {
  419. Sort map[string]int `key:"sort"`
  420. }
  421. m := map[string]interface{}{
  422. "sort": `{"value":12345,"zeroVal":0,"nullVal":null}`,
  423. }
  424. ast := assert.New(t)
  425. ast.Nil(UnmarshalKey(m, &v))
  426. ast.Equal(3, len(v.Sort))
  427. ast.Equal(12345, v.Sort["value"])
  428. ast.Equal(0, v.Sort["zeroVal"])
  429. ast.Equal(0, v.Sort["nullVal"])
  430. }
  431. func TestUnmarshalBoolMapFromString(t *testing.T) {
  432. var v struct {
  433. Sort map[string]bool `key:"sort"`
  434. }
  435. m := map[string]interface{}{
  436. "sort": `{"value":true,"zeroVal":false,"nullVal":null}`,
  437. }
  438. ast := assert.New(t)
  439. ast.Nil(UnmarshalKey(m, &v))
  440. ast.Equal(3, len(v.Sort))
  441. ast.Equal(true, v.Sort["value"])
  442. ast.Equal(false, v.Sort["zeroVal"])
  443. ast.Equal(false, v.Sort["nullVal"])
  444. }
  445. type CustomStringer string
  446. type UnsupportedStringer string
  447. func (c CustomStringer) String() string {
  448. return fmt.Sprintf("{%s}", string(c))
  449. }
  450. func TestUnmarshalStringMapFromStringer(t *testing.T) {
  451. var v struct {
  452. Sort map[string]string `key:"sort"`
  453. }
  454. m := map[string]interface{}{
  455. "sort": CustomStringer(`"value":"ascend","emptyStr":""`),
  456. }
  457. ast := assert.New(t)
  458. ast.Nil(UnmarshalKey(m, &v))
  459. ast.Equal(2, len(v.Sort))
  460. ast.Equal("ascend", v.Sort["value"])
  461. ast.Equal("", v.Sort["emptyStr"])
  462. }
  463. func TestUnmarshalStringMapFromUnsupportedType(t *testing.T) {
  464. var v struct {
  465. Sort map[string]string `key:"sort"`
  466. }
  467. m := map[string]interface{}{
  468. "sort": UnsupportedStringer(`{"value":"ascend","emptyStr":""}`),
  469. }
  470. ast := assert.New(t)
  471. ast.NotNil(UnmarshalKey(m, &v))
  472. }
  473. func TestUnmarshalStringMapFromNotSettableValue(t *testing.T) {
  474. var v struct {
  475. sort map[string]string `key:"sort"`
  476. psort *map[string]string `key:"sort"`
  477. }
  478. m := map[string]interface{}{
  479. "sort": `{"value":"ascend","emptyStr":""}`,
  480. "psort": `{"value":"ascend","emptyStr":""}`,
  481. }
  482. ast := assert.New(t)
  483. ast.NotNil(UnmarshalKey(m, &v))
  484. }
  485. func TestUnmarshalStringMapFromString(t *testing.T) {
  486. var v struct {
  487. Sort map[string]string `key:"sort"`
  488. }
  489. m := map[string]interface{}{
  490. "sort": `{"value":"ascend","emptyStr":""}`,
  491. }
  492. ast := assert.New(t)
  493. ast.Nil(UnmarshalKey(m, &v))
  494. ast.Equal(2, len(v.Sort))
  495. ast.Equal("ascend", v.Sort["value"])
  496. ast.Equal("", v.Sort["emptyStr"])
  497. }
  498. func TestUnmarshalStructMapFromString(t *testing.T) {
  499. var v struct {
  500. Filter map[string]struct {
  501. Field1 bool `json:"field1"`
  502. Field2 int64 `json:"field2,string"`
  503. Field3 string `json:"field3"`
  504. Field4 *string `json:"field4"`
  505. Field5 []string `json:"field5"`
  506. } `key:"filter"`
  507. }
  508. m := map[string]interface{}{
  509. "filter": `{"obj":{"field1":true,"field2":"1573570455447539712","field3":"this is a string",
  510. "field4":"this is a string pointer","field5":["str1","str2"]}}`,
  511. }
  512. ast := assert.New(t)
  513. ast.Nil(UnmarshalKey(m, &v))
  514. ast.Equal(1, len(v.Filter))
  515. ast.NotNil(v.Filter["obj"])
  516. ast.Equal(true, v.Filter["obj"].Field1)
  517. ast.Equal(int64(1573570455447539712), v.Filter["obj"].Field2)
  518. ast.Equal("this is a string", v.Filter["obj"].Field3)
  519. ast.Equal("this is a string pointer", *v.Filter["obj"].Field4)
  520. ast.ElementsMatch([]string{"str1", "str2"}, v.Filter["obj"].Field5)
  521. }
  522. func TestUnmarshalStringSliceMapFromString(t *testing.T) {
  523. var v struct {
  524. Filter map[string][]string `key:"filter"`
  525. }
  526. m := map[string]interface{}{
  527. "filter": `{"assignType":null,"status":["process","comment"],"rate":[]}`,
  528. }
  529. ast := assert.New(t)
  530. ast.Nil(UnmarshalKey(m, &v))
  531. ast.Equal(3, len(v.Filter))
  532. ast.Equal([]string(nil), v.Filter["assignType"])
  533. ast.Equal(2, len(v.Filter["status"]))
  534. ast.Equal("process", v.Filter["status"][0])
  535. ast.Equal("comment", v.Filter["status"][1])
  536. ast.Equal(0, len(v.Filter["rate"]))
  537. }
  538. func TestUnmarshalStruct(t *testing.T) {
  539. type address struct {
  540. City string `key:"city"`
  541. ZipCode int `key:"zipcode,string"`
  542. DefaultString string `key:"defaultstring,default=hello"`
  543. Optional string `key:",optional"`
  544. }
  545. type inner struct {
  546. Name string `key:"name"`
  547. Address address `key:"address"`
  548. }
  549. m := map[string]interface{}{
  550. "name": "kevin",
  551. "address": map[string]interface{}{
  552. "city": "shanghai",
  553. "zipcode": "200000",
  554. },
  555. }
  556. var in inner
  557. ast := assert.New(t)
  558. ast.Nil(UnmarshalKey(m, &in))
  559. ast.Equal("kevin", in.Name)
  560. ast.Equal("shanghai", in.Address.City)
  561. ast.Equal(200000, in.Address.ZipCode)
  562. ast.Equal("hello", in.Address.DefaultString)
  563. }
  564. func TestUnmarshalStructOptionalDepends(t *testing.T) {
  565. type address struct {
  566. City string `key:"city"`
  567. Optional string `key:",optional"`
  568. OptionalDepends string `key:",optional=Optional"`
  569. }
  570. type inner struct {
  571. Name string `key:"name"`
  572. Address address `key:"address"`
  573. }
  574. tests := []struct {
  575. input map[string]string
  576. pass bool
  577. }{
  578. {
  579. pass: true,
  580. },
  581. {
  582. input: map[string]string{
  583. "OptionalDepends": "b",
  584. },
  585. pass: false,
  586. },
  587. {
  588. input: map[string]string{
  589. "Optional": "a",
  590. },
  591. pass: false,
  592. },
  593. {
  594. input: map[string]string{
  595. "Optional": "a",
  596. "OptionalDepends": "b",
  597. },
  598. pass: true,
  599. },
  600. }
  601. for _, test := range tests {
  602. t.Run(stringx.Rand(), func(t *testing.T) {
  603. m := map[string]interface{}{
  604. "name": "kevin",
  605. "address": map[string]interface{}{
  606. "city": "shanghai",
  607. },
  608. }
  609. for k, v := range test.input {
  610. m["address"].(map[string]interface{})[k] = v
  611. }
  612. var in inner
  613. ast := assert.New(t)
  614. if test.pass {
  615. ast.Nil(UnmarshalKey(m, &in))
  616. ast.Equal("kevin", in.Name)
  617. ast.Equal("shanghai", in.Address.City)
  618. ast.Equal(test.input["Optional"], in.Address.Optional)
  619. ast.Equal(test.input["OptionalDepends"], in.Address.OptionalDepends)
  620. } else {
  621. ast.NotNil(UnmarshalKey(m, &in))
  622. }
  623. })
  624. }
  625. }
  626. func TestUnmarshalStructOptionalDependsNot(t *testing.T) {
  627. type address struct {
  628. City string `key:"city"`
  629. Optional string `key:",optional"`
  630. OptionalDepends string `key:",optional=!Optional"`
  631. }
  632. type inner struct {
  633. Name string `key:"name"`
  634. Address address `key:"address"`
  635. }
  636. tests := []struct {
  637. input map[string]string
  638. pass bool
  639. }{
  640. {
  641. input: map[string]string{},
  642. pass: false,
  643. },
  644. {
  645. input: map[string]string{
  646. "Optional": "a",
  647. "OptionalDepends": "b",
  648. },
  649. pass: false,
  650. },
  651. {
  652. input: map[string]string{
  653. "Optional": "a",
  654. },
  655. pass: true,
  656. },
  657. {
  658. input: map[string]string{
  659. "OptionalDepends": "b",
  660. },
  661. pass: true,
  662. },
  663. }
  664. for _, test := range tests {
  665. t.Run(stringx.Rand(), func(t *testing.T) {
  666. m := map[string]interface{}{
  667. "name": "kevin",
  668. "address": map[string]interface{}{
  669. "city": "shanghai",
  670. },
  671. }
  672. for k, v := range test.input {
  673. m["address"].(map[string]interface{})[k] = v
  674. }
  675. var in inner
  676. ast := assert.New(t)
  677. if test.pass {
  678. ast.Nil(UnmarshalKey(m, &in))
  679. ast.Equal("kevin", in.Name)
  680. ast.Equal("shanghai", in.Address.City)
  681. ast.Equal(test.input["Optional"], in.Address.Optional)
  682. ast.Equal(test.input["OptionalDepends"], in.Address.OptionalDepends)
  683. } else {
  684. ast.NotNil(UnmarshalKey(m, &in))
  685. }
  686. })
  687. }
  688. }
  689. func TestUnmarshalStructOptionalDependsNotErrorDetails(t *testing.T) {
  690. type address struct {
  691. Optional string `key:",optional"`
  692. OptionalDepends string `key:",optional=!Optional"`
  693. }
  694. type inner struct {
  695. Name string `key:"name"`
  696. Address address `key:"address"`
  697. }
  698. m := map[string]interface{}{
  699. "name": "kevin",
  700. }
  701. var in inner
  702. err := UnmarshalKey(m, &in)
  703. assert.NotNil(t, err)
  704. }
  705. func TestUnmarshalStructOptionalDependsNotNested(t *testing.T) {
  706. type address struct {
  707. Optional string `key:",optional"`
  708. OptionalDepends string `key:",optional=!Optional"`
  709. }
  710. type combo struct {
  711. Name string `key:"name,optional"`
  712. Address address `key:"address"`
  713. }
  714. type inner struct {
  715. Name string `key:"name"`
  716. Combo combo `key:"combo"`
  717. }
  718. m := map[string]interface{}{
  719. "name": "kevin",
  720. }
  721. var in inner
  722. err := UnmarshalKey(m, &in)
  723. assert.NotNil(t, err)
  724. }
  725. func TestUnmarshalStructOptionalNestedDifferentKey(t *testing.T) {
  726. type address struct {
  727. Optional string `dkey:",optional"`
  728. OptionalDepends string `key:",optional"`
  729. }
  730. type combo struct {
  731. Name string `key:"name,optional"`
  732. Address address `key:"address"`
  733. }
  734. type inner struct {
  735. Name string `key:"name"`
  736. Combo combo `key:"combo"`
  737. }
  738. m := map[string]interface{}{
  739. "name": "kevin",
  740. }
  741. var in inner
  742. assert.NotNil(t, UnmarshalKey(m, &in))
  743. }
  744. func TestUnmarshalStructOptionalDependsNotEnoughValue(t *testing.T) {
  745. type address struct {
  746. Optional string `key:",optional"`
  747. OptionalDepends string `key:",optional=!"`
  748. }
  749. type inner struct {
  750. Name string `key:"name"`
  751. Address address `key:"address"`
  752. }
  753. m := map[string]interface{}{
  754. "name": "kevin",
  755. "address": map[string]interface{}{},
  756. }
  757. var in inner
  758. err := UnmarshalKey(m, &in)
  759. assert.NotNil(t, err)
  760. }
  761. func TestUnmarshalAnonymousStructOptionalDepends(t *testing.T) {
  762. type AnonAddress struct {
  763. City string `key:"city"`
  764. Optional string `key:",optional"`
  765. OptionalDepends string `key:",optional=Optional"`
  766. }
  767. type inner struct {
  768. Name string `key:"name"`
  769. AnonAddress
  770. }
  771. tests := []struct {
  772. input map[string]string
  773. pass bool
  774. }{
  775. {
  776. pass: true,
  777. },
  778. {
  779. input: map[string]string{
  780. "OptionalDepends": "b",
  781. },
  782. pass: false,
  783. },
  784. {
  785. input: map[string]string{
  786. "Optional": "a",
  787. },
  788. pass: false,
  789. },
  790. {
  791. input: map[string]string{
  792. "Optional": "a",
  793. "OptionalDepends": "b",
  794. },
  795. pass: true,
  796. },
  797. }
  798. for _, test := range tests {
  799. t.Run(stringx.Rand(), func(t *testing.T) {
  800. m := map[string]interface{}{
  801. "name": "kevin",
  802. "city": "shanghai",
  803. }
  804. for k, v := range test.input {
  805. m[k] = v
  806. }
  807. var in inner
  808. ast := assert.New(t)
  809. if test.pass {
  810. ast.Nil(UnmarshalKey(m, &in))
  811. ast.Equal("kevin", in.Name)
  812. ast.Equal("shanghai", in.City)
  813. ast.Equal(test.input["Optional"], in.Optional)
  814. ast.Equal(test.input["OptionalDepends"], in.OptionalDepends)
  815. } else {
  816. ast.NotNil(UnmarshalKey(m, &in))
  817. }
  818. })
  819. }
  820. }
  821. func TestUnmarshalStructPtr(t *testing.T) {
  822. type address struct {
  823. City string `key:"city"`
  824. ZipCode int `key:"zipcode,string"`
  825. DefaultString string `key:"defaultstring,default=hello"`
  826. Optional string `key:",optional"`
  827. }
  828. type inner struct {
  829. Name string `key:"name"`
  830. Address *address `key:"address"`
  831. }
  832. m := map[string]interface{}{
  833. "name": "kevin",
  834. "address": map[string]interface{}{
  835. "city": "shanghai",
  836. "zipcode": "200000",
  837. },
  838. }
  839. var in inner
  840. ast := assert.New(t)
  841. ast.Nil(UnmarshalKey(m, &in))
  842. ast.Equal("kevin", in.Name)
  843. ast.Equal("shanghai", in.Address.City)
  844. ast.Equal(200000, in.Address.ZipCode)
  845. ast.Equal("hello", in.Address.DefaultString)
  846. }
  847. func TestUnmarshalWithStringIgnored(t *testing.T) {
  848. type inner struct {
  849. True bool `key:"yes"`
  850. False bool `key:"no"`
  851. Int int `key:"int"`
  852. Int8 int8 `key:"int8"`
  853. Int16 int16 `key:"int16"`
  854. Int32 int32 `key:"int32"`
  855. Int64 int64 `key:"int64"`
  856. Uint uint `key:"uint"`
  857. Uint8 uint8 `key:"uint8"`
  858. Uint16 uint16 `key:"uint16"`
  859. Uint32 uint32 `key:"uint32"`
  860. Uint64 uint64 `key:"uint64"`
  861. Float32 float32 `key:"float32"`
  862. Float64 float64 `key:"float64"`
  863. }
  864. m := map[string]interface{}{
  865. "yes": "1",
  866. "no": "0",
  867. "int": "1",
  868. "int8": "3",
  869. "int16": "5",
  870. "int32": "7",
  871. "int64": "9",
  872. "uint": "1",
  873. "uint8": "3",
  874. "uint16": "5",
  875. "uint32": "7",
  876. "uint64": "9",
  877. "float32": "1.5",
  878. "float64": "3.5",
  879. }
  880. var in inner
  881. um := NewUnmarshaler("key", WithStringValues())
  882. ast := assert.New(t)
  883. ast.Nil(um.Unmarshal(m, &in))
  884. ast.True(in.True)
  885. ast.False(in.False)
  886. ast.Equal(1, in.Int)
  887. ast.Equal(int8(3), in.Int8)
  888. ast.Equal(int16(5), in.Int16)
  889. ast.Equal(int32(7), in.Int32)
  890. ast.Equal(int64(9), in.Int64)
  891. ast.Equal(uint(1), in.Uint)
  892. ast.Equal(uint8(3), in.Uint8)
  893. ast.Equal(uint16(5), in.Uint16)
  894. ast.Equal(uint32(7), in.Uint32)
  895. ast.Equal(uint64(9), in.Uint64)
  896. ast.Equal(float32(1.5), in.Float32)
  897. ast.Equal(3.5, in.Float64)
  898. }
  899. func TestUnmarshalJsonNumberInt64(t *testing.T) {
  900. for i := 0; i <= maxUintBitsToTest; i++ {
  901. var intValue int64 = 1 << uint(i)
  902. strValue := strconv.FormatInt(intValue, 10)
  903. number := json.Number(strValue)
  904. m := map[string]interface{}{
  905. "ID": number,
  906. }
  907. var v struct {
  908. ID int64
  909. }
  910. assert.Nil(t, UnmarshalKey(m, &v))
  911. assert.Equal(t, intValue, v.ID)
  912. }
  913. }
  914. func TestUnmarshalJsonNumberUint64(t *testing.T) {
  915. for i := 0; i <= maxUintBitsToTest; i++ {
  916. var intValue uint64 = 1 << uint(i)
  917. strValue := strconv.FormatUint(intValue, 10)
  918. number := json.Number(strValue)
  919. m := map[string]interface{}{
  920. "ID": number,
  921. }
  922. var v struct {
  923. ID uint64
  924. }
  925. assert.Nil(t, UnmarshalKey(m, &v))
  926. assert.Equal(t, intValue, v.ID)
  927. }
  928. }
  929. func TestUnmarshalJsonNumberUint64Ptr(t *testing.T) {
  930. for i := 0; i <= maxUintBitsToTest; i++ {
  931. var intValue uint64 = 1 << uint(i)
  932. strValue := strconv.FormatUint(intValue, 10)
  933. number := json.Number(strValue)
  934. m := map[string]interface{}{
  935. "ID": number,
  936. }
  937. var v struct {
  938. ID *uint64
  939. }
  940. ast := assert.New(t)
  941. ast.Nil(UnmarshalKey(m, &v))
  942. ast.NotNil(v.ID)
  943. ast.Equal(intValue, *v.ID)
  944. }
  945. }
  946. func TestUnmarshalMapOfInt(t *testing.T) {
  947. m := map[string]interface{}{
  948. "Ids": map[string]bool{"first": true},
  949. }
  950. var v struct {
  951. Ids map[string]bool
  952. }
  953. assert.Nil(t, UnmarshalKey(m, &v))
  954. assert.True(t, v.Ids["first"])
  955. }
  956. func TestUnmarshalMapOfStructError(t *testing.T) {
  957. m := map[string]interface{}{
  958. "Ids": map[string]interface{}{"first": "second"},
  959. }
  960. var v struct {
  961. Ids map[string]struct {
  962. Name string
  963. }
  964. }
  965. assert.NotNil(t, UnmarshalKey(m, &v))
  966. }
  967. func TestUnmarshalSlice(t *testing.T) {
  968. m := map[string]interface{}{
  969. "Ids": []interface{}{"first", "second"},
  970. }
  971. var v struct {
  972. Ids []string
  973. }
  974. ast := assert.New(t)
  975. ast.Nil(UnmarshalKey(m, &v))
  976. ast.Equal(2, len(v.Ids))
  977. ast.Equal("first", v.Ids[0])
  978. ast.Equal("second", v.Ids[1])
  979. }
  980. func TestUnmarshalSliceOfStruct(t *testing.T) {
  981. m := map[string]interface{}{
  982. "Ids": []map[string]interface{}{
  983. {
  984. "First": 1,
  985. "Second": 2,
  986. },
  987. },
  988. }
  989. var v struct {
  990. Ids []struct {
  991. First int
  992. Second int
  993. }
  994. }
  995. ast := assert.New(t)
  996. ast.Nil(UnmarshalKey(m, &v))
  997. ast.Equal(1, len(v.Ids))
  998. ast.Equal(1, v.Ids[0].First)
  999. ast.Equal(2, v.Ids[0].Second)
  1000. }
  1001. func TestUnmarshalWithStringOptionsCorrect(t *testing.T) {
  1002. type inner struct {
  1003. Value string `key:"value,options=first|second"`
  1004. Foo string `key:"foo,options=[bar,baz]"`
  1005. Correct string `key:"correct,options=1|2"`
  1006. }
  1007. m := map[string]interface{}{
  1008. "value": "first",
  1009. "foo": "bar",
  1010. "correct": "2",
  1011. }
  1012. var in inner
  1013. ast := assert.New(t)
  1014. ast.Nil(UnmarshalKey(m, &in))
  1015. ast.Equal("first", in.Value)
  1016. ast.Equal("bar", in.Foo)
  1017. ast.Equal("2", in.Correct)
  1018. }
  1019. func TestUnmarshalOptionsOptional(t *testing.T) {
  1020. type inner struct {
  1021. Value string `key:"value,options=first|second,optional"`
  1022. OptionalValue string `key:"optional_value,options=first|second,optional"`
  1023. Foo string `key:"foo,options=[bar,baz]"`
  1024. Correct string `key:"correct,options=1|2"`
  1025. }
  1026. m := map[string]interface{}{
  1027. "value": "first",
  1028. "foo": "bar",
  1029. "correct": "2",
  1030. }
  1031. var in inner
  1032. ast := assert.New(t)
  1033. ast.Nil(UnmarshalKey(m, &in))
  1034. ast.Equal("first", in.Value)
  1035. ast.Equal("", in.OptionalValue)
  1036. ast.Equal("bar", in.Foo)
  1037. ast.Equal("2", in.Correct)
  1038. }
  1039. func TestUnmarshalOptionsOptionalWrongValue(t *testing.T) {
  1040. type inner struct {
  1041. Value string `key:"value,options=first|second,optional"`
  1042. OptionalValue string `key:"optional_value,options=first|second,optional"`
  1043. WrongValue string `key:"wrong_value,options=first|second,optional"`
  1044. }
  1045. m := map[string]interface{}{
  1046. "value": "first",
  1047. "wrong_value": "third",
  1048. }
  1049. var in inner
  1050. assert.NotNil(t, UnmarshalKey(m, &in))
  1051. }
  1052. func TestUnmarshalStringOptionsWithStringOptionsNotString(t *testing.T) {
  1053. type inner struct {
  1054. Value string `key:"value,options=first|second"`
  1055. Correct string `key:"correct,options=1|2"`
  1056. }
  1057. m := map[string]interface{}{
  1058. "value": "first",
  1059. "correct": 2,
  1060. }
  1061. var in inner
  1062. unmarshaler := NewUnmarshaler(defaultKeyName, WithStringValues())
  1063. ast := assert.New(t)
  1064. ast.NotNil(unmarshaler.Unmarshal(m, &in))
  1065. }
  1066. func TestUnmarshalStringOptionsWithStringOptions(t *testing.T) {
  1067. type inner struct {
  1068. Value string `key:"value,options=first|second"`
  1069. Correct string `key:"correct,options=1|2"`
  1070. }
  1071. m := map[string]interface{}{
  1072. "value": "first",
  1073. "correct": "2",
  1074. }
  1075. var in inner
  1076. unmarshaler := NewUnmarshaler(defaultKeyName, WithStringValues())
  1077. ast := assert.New(t)
  1078. ast.Nil(unmarshaler.Unmarshal(m, &in))
  1079. ast.Equal("first", in.Value)
  1080. ast.Equal("2", in.Correct)
  1081. }
  1082. func TestUnmarshalStringOptionsWithStringOptionsPtr(t *testing.T) {
  1083. type inner struct {
  1084. Value *string `key:"value,options=first|second"`
  1085. Correct *int `key:"correct,options=1|2"`
  1086. }
  1087. m := map[string]interface{}{
  1088. "value": "first",
  1089. "correct": "2",
  1090. }
  1091. var in inner
  1092. unmarshaler := NewUnmarshaler(defaultKeyName, WithStringValues())
  1093. ast := assert.New(t)
  1094. ast.Nil(unmarshaler.Unmarshal(m, &in))
  1095. ast.True(*in.Value == "first")
  1096. ast.True(*in.Correct == 2)
  1097. }
  1098. func TestUnmarshalStringOptionsWithStringOptionsIncorrect(t *testing.T) {
  1099. type inner struct {
  1100. Value string `key:"value,options=first|second"`
  1101. Correct string `key:"correct,options=1|2"`
  1102. }
  1103. m := map[string]interface{}{
  1104. "value": "third",
  1105. "correct": "2",
  1106. }
  1107. var in inner
  1108. unmarshaler := NewUnmarshaler(defaultKeyName, WithStringValues())
  1109. ast := assert.New(t)
  1110. ast.NotNil(unmarshaler.Unmarshal(m, &in))
  1111. }
  1112. func TestUnmarshalStringOptionsWithStringOptionsIncorrectGrouped(t *testing.T) {
  1113. type inner struct {
  1114. Value string `key:"value,options=[first,second]"`
  1115. Correct string `key:"correct,options=1|2"`
  1116. }
  1117. m := map[string]interface{}{
  1118. "value": "third",
  1119. "correct": "2",
  1120. }
  1121. var in inner
  1122. unmarshaler := NewUnmarshaler(defaultKeyName, WithStringValues())
  1123. ast := assert.New(t)
  1124. ast.NotNil(unmarshaler.Unmarshal(m, &in))
  1125. }
  1126. func TestUnmarshalWithStringOptionsIncorrect(t *testing.T) {
  1127. type inner struct {
  1128. Value string `key:"value,options=first|second"`
  1129. Incorrect string `key:"incorrect,options=1|2"`
  1130. }
  1131. m := map[string]interface{}{
  1132. "value": "first",
  1133. "incorrect": "3",
  1134. }
  1135. var in inner
  1136. assert.NotNil(t, UnmarshalKey(m, &in))
  1137. }
  1138. func TestUnmarshalWithIntOptionsCorrect(t *testing.T) {
  1139. type inner struct {
  1140. Value string `key:"value,options=first|second"`
  1141. Number int `key:"number,options=1|2"`
  1142. }
  1143. m := map[string]interface{}{
  1144. "value": "first",
  1145. "number": 2,
  1146. }
  1147. var in inner
  1148. ast := assert.New(t)
  1149. ast.Nil(UnmarshalKey(m, &in))
  1150. ast.Equal("first", in.Value)
  1151. ast.Equal(2, in.Number)
  1152. }
  1153. func TestUnmarshalWithIntOptionsCorrectPtr(t *testing.T) {
  1154. type inner struct {
  1155. Value *string `key:"value,options=first|second"`
  1156. Number *int `key:"number,options=1|2"`
  1157. }
  1158. m := map[string]interface{}{
  1159. "value": "first",
  1160. "number": 2,
  1161. }
  1162. var in inner
  1163. ast := assert.New(t)
  1164. ast.Nil(UnmarshalKey(m, &in))
  1165. ast.True(*in.Value == "first")
  1166. ast.True(*in.Number == 2)
  1167. }
  1168. func TestUnmarshalWithIntOptionsIncorrect(t *testing.T) {
  1169. type inner struct {
  1170. Value string `key:"value,options=first|second"`
  1171. Incorrect int `key:"incorrect,options=1|2"`
  1172. }
  1173. m := map[string]interface{}{
  1174. "value": "first",
  1175. "incorrect": 3,
  1176. }
  1177. var in inner
  1178. assert.NotNil(t, UnmarshalKey(m, &in))
  1179. }
  1180. func TestUnmarshalWithJsonNumberOptionsIncorrect(t *testing.T) {
  1181. type inner struct {
  1182. Value string `key:"value,options=first|second"`
  1183. Incorrect int `key:"incorrect,options=1|2"`
  1184. }
  1185. m := map[string]interface{}{
  1186. "value": "first",
  1187. "incorrect": json.Number("3"),
  1188. }
  1189. var in inner
  1190. assert.NotNil(t, UnmarshalKey(m, &in))
  1191. }
  1192. func TestUnmarshaler_UnmarshalIntOptions(t *testing.T) {
  1193. var val struct {
  1194. Sex int `json:"sex,options=0|1"`
  1195. }
  1196. input := []byte(`{"sex": 2}`)
  1197. assert.NotNil(t, UnmarshalJsonBytes(input, &val))
  1198. }
  1199. func TestUnmarshalWithUintOptionsCorrect(t *testing.T) {
  1200. type inner struct {
  1201. Value string `key:"value,options=first|second"`
  1202. Number uint `key:"number,options=1|2"`
  1203. }
  1204. m := map[string]interface{}{
  1205. "value": "first",
  1206. "number": uint(2),
  1207. }
  1208. var in inner
  1209. ast := assert.New(t)
  1210. ast.Nil(UnmarshalKey(m, &in))
  1211. ast.Equal("first", in.Value)
  1212. ast.Equal(uint(2), in.Number)
  1213. }
  1214. func TestUnmarshalWithUintOptionsIncorrect(t *testing.T) {
  1215. type inner struct {
  1216. Value string `key:"value,options=first|second"`
  1217. Incorrect uint `key:"incorrect,options=1|2"`
  1218. }
  1219. m := map[string]interface{}{
  1220. "value": "first",
  1221. "incorrect": uint(3),
  1222. }
  1223. var in inner
  1224. assert.NotNil(t, UnmarshalKey(m, &in))
  1225. }
  1226. func TestUnmarshalWithOptionsAndDefault(t *testing.T) {
  1227. type inner struct {
  1228. Value string `key:"value,options=first|second|third,default=second"`
  1229. }
  1230. m := map[string]interface{}{}
  1231. var in inner
  1232. assert.Nil(t, UnmarshalKey(m, &in))
  1233. assert.Equal(t, "second", in.Value)
  1234. }
  1235. func TestUnmarshalWithOptionsAndSet(t *testing.T) {
  1236. type inner struct {
  1237. Value string `key:"value,options=first|second|third,default=second"`
  1238. }
  1239. m := map[string]interface{}{
  1240. "value": "first",
  1241. }
  1242. var in inner
  1243. assert.Nil(t, UnmarshalKey(m, &in))
  1244. assert.Equal(t, "first", in.Value)
  1245. }
  1246. func TestUnmarshalNestedKey(t *testing.T) {
  1247. var c struct {
  1248. ID int `json:"Persons.first.ID"`
  1249. }
  1250. m := map[string]interface{}{
  1251. "Persons": map[string]interface{}{
  1252. "first": map[string]interface{}{
  1253. "ID": 1,
  1254. },
  1255. },
  1256. }
  1257. assert.Nil(t, NewUnmarshaler("json").Unmarshal(m, &c))
  1258. assert.Equal(t, 1, c.ID)
  1259. }
  1260. func TestUnmarhsalNestedKeyArray(t *testing.T) {
  1261. var c struct {
  1262. First []struct {
  1263. ID int
  1264. } `json:"Persons.first"`
  1265. }
  1266. m := map[string]interface{}{
  1267. "Persons": map[string]interface{}{
  1268. "first": []map[string]interface{}{
  1269. {"ID": 1},
  1270. {"ID": 2},
  1271. },
  1272. },
  1273. }
  1274. assert.Nil(t, NewUnmarshaler("json").Unmarshal(m, &c))
  1275. assert.Equal(t, 2, len(c.First))
  1276. assert.Equal(t, 1, c.First[0].ID)
  1277. }
  1278. func TestUnmarshalAnonymousOptionalRequiredProvided(t *testing.T) {
  1279. type (
  1280. Foo struct {
  1281. Value string `json:"v"`
  1282. }
  1283. Bar struct {
  1284. Foo `json:",optional"`
  1285. }
  1286. )
  1287. m := map[string]interface{}{
  1288. "v": "anything",
  1289. }
  1290. var b Bar
  1291. assert.Nil(t, NewUnmarshaler("json").Unmarshal(m, &b))
  1292. assert.Equal(t, "anything", b.Value)
  1293. }
  1294. func TestUnmarshalAnonymousOptionalRequiredMissed(t *testing.T) {
  1295. type (
  1296. Foo struct {
  1297. Value string `json:"v"`
  1298. }
  1299. Bar struct {
  1300. Foo `json:",optional"`
  1301. }
  1302. )
  1303. m := map[string]interface{}{}
  1304. var b Bar
  1305. assert.Nil(t, NewUnmarshaler("json").Unmarshal(m, &b))
  1306. assert.True(t, len(b.Value) == 0)
  1307. }
  1308. func TestUnmarshalAnonymousOptionalOptionalProvided(t *testing.T) {
  1309. type (
  1310. Foo struct {
  1311. Value string `json:"v,optional"`
  1312. }
  1313. Bar struct {
  1314. Foo `json:",optional"`
  1315. }
  1316. )
  1317. m := map[string]interface{}{
  1318. "v": "anything",
  1319. }
  1320. var b Bar
  1321. assert.Nil(t, NewUnmarshaler("json").Unmarshal(m, &b))
  1322. assert.Equal(t, "anything", b.Value)
  1323. }
  1324. func TestUnmarshalAnonymousOptionalOptionalMissed(t *testing.T) {
  1325. type (
  1326. Foo struct {
  1327. Value string `json:"v,optional"`
  1328. }
  1329. Bar struct {
  1330. Foo `json:",optional"`
  1331. }
  1332. )
  1333. m := map[string]interface{}{}
  1334. var b Bar
  1335. assert.Nil(t, NewUnmarshaler("json").Unmarshal(m, &b))
  1336. assert.True(t, len(b.Value) == 0)
  1337. }
  1338. func TestUnmarshalAnonymousOptionalRequiredBothProvided(t *testing.T) {
  1339. type (
  1340. Foo struct {
  1341. Name string `json:"n"`
  1342. Value string `json:"v"`
  1343. }
  1344. Bar struct {
  1345. Foo `json:",optional"`
  1346. }
  1347. )
  1348. m := map[string]interface{}{
  1349. "n": "kevin",
  1350. "v": "anything",
  1351. }
  1352. var b Bar
  1353. assert.Nil(t, NewUnmarshaler("json").Unmarshal(m, &b))
  1354. assert.Equal(t, "kevin", b.Name)
  1355. assert.Equal(t, "anything", b.Value)
  1356. }
  1357. func TestUnmarshalAnonymousOptionalRequiredOneProvidedOneMissed(t *testing.T) {
  1358. type (
  1359. Foo struct {
  1360. Name string `json:"n"`
  1361. Value string `json:"v"`
  1362. }
  1363. Bar struct {
  1364. Foo `json:",optional"`
  1365. }
  1366. )
  1367. m := map[string]interface{}{
  1368. "v": "anything",
  1369. }
  1370. var b Bar
  1371. assert.NotNil(t, NewUnmarshaler("json").Unmarshal(m, &b))
  1372. }
  1373. func TestUnmarshalAnonymousOptionalRequiredBothMissed(t *testing.T) {
  1374. type (
  1375. Foo struct {
  1376. Name string `json:"n"`
  1377. Value string `json:"v"`
  1378. }
  1379. Bar struct {
  1380. Foo `json:",optional"`
  1381. }
  1382. )
  1383. m := map[string]interface{}{}
  1384. var b Bar
  1385. assert.Nil(t, NewUnmarshaler("json").Unmarshal(m, &b))
  1386. assert.True(t, len(b.Name) == 0)
  1387. assert.True(t, len(b.Value) == 0)
  1388. }
  1389. func TestUnmarshalAnonymousOptionalOneRequiredOneOptionalBothProvided(t *testing.T) {
  1390. type (
  1391. Foo struct {
  1392. Name string `json:"n,optional"`
  1393. Value string `json:"v"`
  1394. }
  1395. Bar struct {
  1396. Foo `json:",optional"`
  1397. }
  1398. )
  1399. m := map[string]interface{}{
  1400. "n": "kevin",
  1401. "v": "anything",
  1402. }
  1403. var b Bar
  1404. assert.Nil(t, NewUnmarshaler("json").Unmarshal(m, &b))
  1405. assert.Equal(t, "kevin", b.Name)
  1406. assert.Equal(t, "anything", b.Value)
  1407. }
  1408. func TestUnmarshalAnonymousOptionalOneRequiredOneOptionalBothMissed(t *testing.T) {
  1409. type (
  1410. Foo struct {
  1411. Name string `json:"n,optional"`
  1412. Value string `json:"v"`
  1413. }
  1414. Bar struct {
  1415. Foo `json:",optional"`
  1416. }
  1417. )
  1418. m := map[string]interface{}{}
  1419. var b Bar
  1420. assert.Nil(t, NewUnmarshaler("json").Unmarshal(m, &b))
  1421. assert.True(t, len(b.Name) == 0)
  1422. assert.True(t, len(b.Value) == 0)
  1423. }
  1424. func TestUnmarshalAnonymousOptionalOneRequiredOneOptionalRequiredProvidedOptionalMissed(t *testing.T) {
  1425. type (
  1426. Foo struct {
  1427. Name string `json:"n,optional"`
  1428. Value string `json:"v"`
  1429. }
  1430. Bar struct {
  1431. Foo `json:",optional"`
  1432. }
  1433. )
  1434. m := map[string]interface{}{
  1435. "v": "anything",
  1436. }
  1437. var b Bar
  1438. assert.Nil(t, NewUnmarshaler("json").Unmarshal(m, &b))
  1439. assert.True(t, len(b.Name) == 0)
  1440. assert.Equal(t, "anything", b.Value)
  1441. }
  1442. func TestUnmarshalAnonymousOptionalOneRequiredOneOptionalRequiredMissedOptionalProvided(t *testing.T) {
  1443. type (
  1444. Foo struct {
  1445. Name string `json:"n,optional"`
  1446. Value string `json:"v"`
  1447. }
  1448. Bar struct {
  1449. Foo `json:",optional"`
  1450. }
  1451. )
  1452. m := map[string]interface{}{
  1453. "n": "anything",
  1454. }
  1455. var b Bar
  1456. assert.NotNil(t, NewUnmarshaler("json").Unmarshal(m, &b))
  1457. }
  1458. func TestUnmarshalAnonymousOptionalBothOptionalBothProvided(t *testing.T) {
  1459. type (
  1460. Foo struct {
  1461. Name string `json:"n,optional"`
  1462. Value string `json:"v,optional"`
  1463. }
  1464. Bar struct {
  1465. Foo `json:",optional"`
  1466. }
  1467. )
  1468. m := map[string]interface{}{
  1469. "n": "kevin",
  1470. "v": "anything",
  1471. }
  1472. var b Bar
  1473. assert.Nil(t, NewUnmarshaler("json").Unmarshal(m, &b))
  1474. assert.Equal(t, "kevin", b.Name)
  1475. assert.Equal(t, "anything", b.Value)
  1476. }
  1477. func TestUnmarshalAnonymousOptionalBothOptionalOneProvidedOneMissed(t *testing.T) {
  1478. type (
  1479. Foo struct {
  1480. Name string `json:"n,optional"`
  1481. Value string `json:"v,optional"`
  1482. }
  1483. Bar struct {
  1484. Foo `json:",optional"`
  1485. }
  1486. )
  1487. m := map[string]interface{}{
  1488. "v": "anything",
  1489. }
  1490. var b Bar
  1491. assert.Nil(t, NewUnmarshaler("json").Unmarshal(m, &b))
  1492. assert.True(t, len(b.Name) == 0)
  1493. assert.Equal(t, "anything", b.Value)
  1494. }
  1495. func TestUnmarshalAnonymousOptionalBothOptionalBothMissed(t *testing.T) {
  1496. type (
  1497. Foo struct {
  1498. Name string `json:"n,optional"`
  1499. Value string `json:"v,optional"`
  1500. }
  1501. Bar struct {
  1502. Foo `json:",optional"`
  1503. }
  1504. )
  1505. m := map[string]interface{}{}
  1506. var b Bar
  1507. assert.Nil(t, NewUnmarshaler("json").Unmarshal(m, &b))
  1508. assert.True(t, len(b.Name) == 0)
  1509. assert.True(t, len(b.Value) == 0)
  1510. }
  1511. func TestUnmarshalAnonymousRequiredProvided(t *testing.T) {
  1512. type (
  1513. Foo struct {
  1514. Value string `json:"v"`
  1515. }
  1516. Bar struct {
  1517. Foo
  1518. }
  1519. )
  1520. m := map[string]interface{}{
  1521. "v": "anything",
  1522. }
  1523. var b Bar
  1524. assert.Nil(t, NewUnmarshaler("json").Unmarshal(m, &b))
  1525. assert.Equal(t, "anything", b.Value)
  1526. }
  1527. func TestUnmarshalAnonymousRequiredMissed(t *testing.T) {
  1528. type (
  1529. Foo struct {
  1530. Value string `json:"v"`
  1531. }
  1532. Bar struct {
  1533. Foo
  1534. }
  1535. )
  1536. m := map[string]interface{}{}
  1537. var b Bar
  1538. assert.NotNil(t, NewUnmarshaler("json").Unmarshal(m, &b))
  1539. }
  1540. func TestUnmarshalAnonymousOptionalProvided(t *testing.T) {
  1541. type (
  1542. Foo struct {
  1543. Value string `json:"v,optional"`
  1544. }
  1545. Bar struct {
  1546. Foo
  1547. }
  1548. )
  1549. m := map[string]interface{}{
  1550. "v": "anything",
  1551. }
  1552. var b Bar
  1553. assert.Nil(t, NewUnmarshaler("json").Unmarshal(m, &b))
  1554. assert.Equal(t, "anything", b.Value)
  1555. }
  1556. func TestUnmarshalAnonymousOptionalMissed(t *testing.T) {
  1557. type (
  1558. Foo struct {
  1559. Value string `json:"v,optional"`
  1560. }
  1561. Bar struct {
  1562. Foo
  1563. }
  1564. )
  1565. m := map[string]interface{}{}
  1566. var b Bar
  1567. assert.Nil(t, NewUnmarshaler("json").Unmarshal(m, &b))
  1568. assert.True(t, len(b.Value) == 0)
  1569. }
  1570. func TestUnmarshalAnonymousRequiredBothProvided(t *testing.T) {
  1571. type (
  1572. Foo struct {
  1573. Name string `json:"n"`
  1574. Value string `json:"v"`
  1575. }
  1576. Bar struct {
  1577. Foo
  1578. }
  1579. )
  1580. m := map[string]interface{}{
  1581. "n": "kevin",
  1582. "v": "anything",
  1583. }
  1584. var b Bar
  1585. assert.Nil(t, NewUnmarshaler("json").Unmarshal(m, &b))
  1586. assert.Equal(t, "kevin", b.Name)
  1587. assert.Equal(t, "anything", b.Value)
  1588. }
  1589. func TestUnmarshalAnonymousRequiredOneProvidedOneMissed(t *testing.T) {
  1590. type (
  1591. Foo struct {
  1592. Name string `json:"n"`
  1593. Value string `json:"v"`
  1594. }
  1595. Bar struct {
  1596. Foo
  1597. }
  1598. )
  1599. m := map[string]interface{}{
  1600. "v": "anything",
  1601. }
  1602. var b Bar
  1603. assert.NotNil(t, NewUnmarshaler("json").Unmarshal(m, &b))
  1604. }
  1605. func TestUnmarshalAnonymousRequiredBothMissed(t *testing.T) {
  1606. type (
  1607. Foo struct {
  1608. Name string `json:"n"`
  1609. Value string `json:"v"`
  1610. }
  1611. Bar struct {
  1612. Foo
  1613. }
  1614. )
  1615. m := map[string]interface{}{
  1616. "v": "anything",
  1617. }
  1618. var b Bar
  1619. assert.NotNil(t, NewUnmarshaler("json").Unmarshal(m, &b))
  1620. }
  1621. func TestUnmarshalAnonymousOneRequiredOneOptionalBothProvided(t *testing.T) {
  1622. type (
  1623. Foo struct {
  1624. Name string `json:"n,optional"`
  1625. Value string `json:"v"`
  1626. }
  1627. Bar struct {
  1628. Foo
  1629. }
  1630. )
  1631. m := map[string]interface{}{
  1632. "n": "kevin",
  1633. "v": "anything",
  1634. }
  1635. var b Bar
  1636. assert.Nil(t, NewUnmarshaler("json").Unmarshal(m, &b))
  1637. assert.Equal(t, "kevin", b.Name)
  1638. assert.Equal(t, "anything", b.Value)
  1639. }
  1640. func TestUnmarshalAnonymousOneRequiredOneOptionalBothMissed(t *testing.T) {
  1641. type (
  1642. Foo struct {
  1643. Name string `json:"n,optional"`
  1644. Value string `json:"v"`
  1645. }
  1646. Bar struct {
  1647. Foo
  1648. }
  1649. )
  1650. m := map[string]interface{}{}
  1651. var b Bar
  1652. assert.NotNil(t, NewUnmarshaler("json").Unmarshal(m, &b))
  1653. }
  1654. func TestUnmarshalAnonymousOneRequiredOneOptionalRequiredProvidedOptionalMissed(t *testing.T) {
  1655. type (
  1656. Foo struct {
  1657. Name string `json:"n,optional"`
  1658. Value string `json:"v"`
  1659. }
  1660. Bar struct {
  1661. Foo
  1662. }
  1663. )
  1664. m := map[string]interface{}{
  1665. "v": "anything",
  1666. }
  1667. var b Bar
  1668. assert.Nil(t, NewUnmarshaler("json").Unmarshal(m, &b))
  1669. assert.True(t, len(b.Name) == 0)
  1670. assert.Equal(t, "anything", b.Value)
  1671. }
  1672. func TestUnmarshalAnonymousOneRequiredOneOptionalRequiredMissedOptionalProvided(t *testing.T) {
  1673. type (
  1674. Foo struct {
  1675. Name string `json:"n,optional"`
  1676. Value string `json:"v"`
  1677. }
  1678. Bar struct {
  1679. Foo
  1680. }
  1681. )
  1682. m := map[string]interface{}{
  1683. "n": "anything",
  1684. }
  1685. var b Bar
  1686. assert.NotNil(t, NewUnmarshaler("json").Unmarshal(m, &b))
  1687. }
  1688. func TestUnmarshalAnonymousBothOptionalBothProvided(t *testing.T) {
  1689. type (
  1690. Foo struct {
  1691. Name string `json:"n,optional"`
  1692. Value string `json:"v,optional"`
  1693. }
  1694. Bar struct {
  1695. Foo
  1696. }
  1697. )
  1698. m := map[string]interface{}{
  1699. "n": "kevin",
  1700. "v": "anything",
  1701. }
  1702. var b Bar
  1703. assert.Nil(t, NewUnmarshaler("json").Unmarshal(m, &b))
  1704. assert.Equal(t, "kevin", b.Name)
  1705. assert.Equal(t, "anything", b.Value)
  1706. }
  1707. func TestUnmarshalAnonymousBothOptionalOneProvidedOneMissed(t *testing.T) {
  1708. type (
  1709. Foo struct {
  1710. Name string `json:"n,optional"`
  1711. Value string `json:"v,optional"`
  1712. }
  1713. Bar struct {
  1714. Foo
  1715. }
  1716. )
  1717. m := map[string]interface{}{
  1718. "v": "anything",
  1719. }
  1720. var b Bar
  1721. assert.Nil(t, NewUnmarshaler("json").Unmarshal(m, &b))
  1722. assert.True(t, len(b.Name) == 0)
  1723. assert.Equal(t, "anything", b.Value)
  1724. }
  1725. func TestUnmarshalAnonymousBothOptionalBothMissed(t *testing.T) {
  1726. type (
  1727. Foo struct {
  1728. Name string `json:"n,optional"`
  1729. Value string `json:"v,optional"`
  1730. }
  1731. Bar struct {
  1732. Foo
  1733. }
  1734. )
  1735. m := map[string]interface{}{}
  1736. var b Bar
  1737. assert.Nil(t, NewUnmarshaler("json").Unmarshal(m, &b))
  1738. assert.True(t, len(b.Name) == 0)
  1739. assert.True(t, len(b.Value) == 0)
  1740. }
  1741. func TestUnmarshalAnonymousWrappedToMuch(t *testing.T) {
  1742. type (
  1743. Foo struct {
  1744. Name string `json:"n"`
  1745. Value string `json:"v"`
  1746. }
  1747. Bar struct {
  1748. Foo
  1749. }
  1750. )
  1751. m := map[string]interface{}{
  1752. "Foo": map[string]interface{}{
  1753. "n": "name",
  1754. "v": "anything",
  1755. },
  1756. }
  1757. var b Bar
  1758. assert.NotNil(t, NewUnmarshaler("json").Unmarshal(m, &b))
  1759. }
  1760. func TestUnmarshalWrappedObject(t *testing.T) {
  1761. type (
  1762. Foo struct {
  1763. Value string `json:"v"`
  1764. }
  1765. Bar struct {
  1766. Inner Foo
  1767. }
  1768. )
  1769. m := map[string]interface{}{
  1770. "Inner": map[string]interface{}{
  1771. "v": "anything",
  1772. },
  1773. }
  1774. var b Bar
  1775. assert.Nil(t, NewUnmarshaler("json").Unmarshal(m, &b))
  1776. assert.Equal(t, "anything", b.Inner.Value)
  1777. }
  1778. func TestUnmarshalWrappedObjectOptional(t *testing.T) {
  1779. type (
  1780. Foo struct {
  1781. Hosts []string
  1782. Key string
  1783. }
  1784. Bar struct {
  1785. Inner Foo `json:",optional"`
  1786. Name string
  1787. }
  1788. )
  1789. m := map[string]interface{}{
  1790. "Name": "anything",
  1791. }
  1792. var b Bar
  1793. assert.Nil(t, NewUnmarshaler("json").Unmarshal(m, &b))
  1794. assert.Equal(t, "anything", b.Name)
  1795. }
  1796. func TestUnmarshalWrappedObjectOptionalFilled(t *testing.T) {
  1797. type (
  1798. Foo struct {
  1799. Hosts []string
  1800. Key string
  1801. }
  1802. Bar struct {
  1803. Inner Foo `json:",optional"`
  1804. Name string
  1805. }
  1806. )
  1807. hosts := []string{"1", "2"}
  1808. m := map[string]interface{}{
  1809. "Inner": map[string]interface{}{
  1810. "Hosts": hosts,
  1811. "Key": "key",
  1812. },
  1813. "Name": "anything",
  1814. }
  1815. var b Bar
  1816. assert.Nil(t, NewUnmarshaler("json").Unmarshal(m, &b))
  1817. assert.EqualValues(t, hosts, b.Inner.Hosts)
  1818. assert.Equal(t, "key", b.Inner.Key)
  1819. assert.Equal(t, "anything", b.Name)
  1820. }
  1821. func TestUnmarshalWrappedNamedObjectOptional(t *testing.T) {
  1822. type (
  1823. Foo struct {
  1824. Host string
  1825. Key string
  1826. }
  1827. Bar struct {
  1828. Inner Foo `json:",optional"`
  1829. Name string
  1830. }
  1831. )
  1832. m := map[string]interface{}{
  1833. "Inner": map[string]interface{}{
  1834. "Host": "thehost",
  1835. "Key": "thekey",
  1836. },
  1837. "Name": "anything",
  1838. }
  1839. var b Bar
  1840. assert.Nil(t, NewUnmarshaler("json").Unmarshal(m, &b))
  1841. assert.Equal(t, "thehost", b.Inner.Host)
  1842. assert.Equal(t, "thekey", b.Inner.Key)
  1843. assert.Equal(t, "anything", b.Name)
  1844. }
  1845. func TestUnmarshalWrappedObjectNamedPtr(t *testing.T) {
  1846. type (
  1847. Foo struct {
  1848. Value string `json:"v"`
  1849. }
  1850. Bar struct {
  1851. Inner *Foo `json:"foo,optional"`
  1852. }
  1853. )
  1854. m := map[string]interface{}{
  1855. "foo": map[string]interface{}{
  1856. "v": "anything",
  1857. },
  1858. }
  1859. var b Bar
  1860. assert.Nil(t, NewUnmarshaler("json").Unmarshal(m, &b))
  1861. assert.Equal(t, "anything", b.Inner.Value)
  1862. }
  1863. func TestUnmarshalWrappedObjectPtr(t *testing.T) {
  1864. type (
  1865. Foo struct {
  1866. Value string `json:"v"`
  1867. }
  1868. Bar struct {
  1869. Inner *Foo
  1870. }
  1871. )
  1872. m := map[string]interface{}{
  1873. "Inner": map[string]interface{}{
  1874. "v": "anything",
  1875. },
  1876. }
  1877. var b Bar
  1878. assert.Nil(t, NewUnmarshaler("json").Unmarshal(m, &b))
  1879. assert.Equal(t, "anything", b.Inner.Value)
  1880. }
  1881. func TestUnmarshalInt2String(t *testing.T) {
  1882. type inner struct {
  1883. Int string `key:"int"`
  1884. }
  1885. m := map[string]interface{}{
  1886. "int": 123,
  1887. }
  1888. var in inner
  1889. assert.NotNil(t, UnmarshalKey(m, &in))
  1890. }
  1891. func TestUnmarshalZeroValues(t *testing.T) {
  1892. type inner struct {
  1893. False bool `key:"no"`
  1894. Int int `key:"int"`
  1895. String string `key:"string"`
  1896. }
  1897. m := map[string]interface{}{
  1898. "no": false,
  1899. "int": 0,
  1900. "string": "",
  1901. }
  1902. var in inner
  1903. ast := assert.New(t)
  1904. ast.Nil(UnmarshalKey(m, &in))
  1905. ast.False(in.False)
  1906. ast.Equal(0, in.Int)
  1907. ast.Equal("", in.String)
  1908. }
  1909. func TestUnmarshalUsingDifferentKeys(t *testing.T) {
  1910. type inner struct {
  1911. False bool `key:"no"`
  1912. Int int `key:"int"`
  1913. String string `bson:"string"`
  1914. }
  1915. m := map[string]interface{}{
  1916. "no": false,
  1917. "int": 9,
  1918. "string": "value",
  1919. }
  1920. var in inner
  1921. ast := assert.New(t)
  1922. ast.Nil(UnmarshalKey(m, &in))
  1923. ast.False(in.False)
  1924. ast.Equal(9, in.Int)
  1925. ast.True(len(in.String) == 0)
  1926. }
  1927. func TestUnmarshalNumberRangeInt(t *testing.T) {
  1928. type inner struct {
  1929. Value1 int `key:"value1,range=[1:]"`
  1930. Value2 int8 `key:"value2,range=[1:5]"`
  1931. Value3 int16 `key:"value3,range=[1:5]"`
  1932. Value4 int32 `key:"value4,range=[1:5]"`
  1933. Value5 int64 `key:"value5,range=[1:5]"`
  1934. Value6 uint `key:"value6,range=[:5]"`
  1935. Value8 uint8 `key:"value8,range=[1:5],string"`
  1936. Value9 uint16 `key:"value9,range=[1:5],string"`
  1937. Value10 uint32 `key:"value10,range=[1:5],string"`
  1938. Value11 uint64 `key:"value11,range=[1:5],string"`
  1939. }
  1940. m := map[string]interface{}{
  1941. "value1": 10,
  1942. "value2": int8(1),
  1943. "value3": int16(2),
  1944. "value4": int32(4),
  1945. "value5": int64(5),
  1946. "value6": uint(0),
  1947. "value8": "1",
  1948. "value9": "2",
  1949. "value10": "4",
  1950. "value11": "5",
  1951. }
  1952. var in inner
  1953. ast := assert.New(t)
  1954. ast.Nil(UnmarshalKey(m, &in))
  1955. ast.Equal(10, in.Value1)
  1956. ast.Equal(int8(1), in.Value2)
  1957. ast.Equal(int16(2), in.Value3)
  1958. ast.Equal(int32(4), in.Value4)
  1959. ast.Equal(int64(5), in.Value5)
  1960. ast.Equal(uint(0), in.Value6)
  1961. ast.Equal(uint8(1), in.Value8)
  1962. ast.Equal(uint16(2), in.Value9)
  1963. ast.Equal(uint32(4), in.Value10)
  1964. ast.Equal(uint64(5), in.Value11)
  1965. }
  1966. func TestUnmarshalNumberRangeJsonNumber(t *testing.T) {
  1967. type inner struct {
  1968. Value3 uint `key:"value3,range=(1:5]"`
  1969. Value4 uint8 `key:"value4,range=(1:5]"`
  1970. Value5 uint16 `key:"value5,range=(1:5]"`
  1971. }
  1972. m := map[string]interface{}{
  1973. "value3": json.Number("2"),
  1974. "value4": json.Number("4"),
  1975. "value5": json.Number("5"),
  1976. }
  1977. var in inner
  1978. ast := assert.New(t)
  1979. ast.Nil(UnmarshalKey(m, &in))
  1980. ast.Equal(uint(2), in.Value3)
  1981. ast.Equal(uint8(4), in.Value4)
  1982. ast.Equal(uint16(5), in.Value5)
  1983. type inner1 struct {
  1984. Value int `key:"value,range=(1:5]"`
  1985. }
  1986. m = map[string]interface{}{
  1987. "value": json.Number("a"),
  1988. }
  1989. var in1 inner1
  1990. ast.NotNil(UnmarshalKey(m, &in1))
  1991. }
  1992. func TestUnmarshalNumberRangeIntLeftExclude(t *testing.T) {
  1993. type inner struct {
  1994. Value3 uint `key:"value3,range=(1:5]"`
  1995. Value4 uint32 `key:"value4,default=4,range=(1:5]"`
  1996. Value5 uint64 `key:"value5,range=(1:5]"`
  1997. Value9 int `key:"value9,range=(1:5],string"`
  1998. Value10 int `key:"value10,range=(1:5],string"`
  1999. Value11 int `key:"value11,range=(1:5],string"`
  2000. }
  2001. m := map[string]interface{}{
  2002. "value3": uint(2),
  2003. "value4": uint32(4),
  2004. "value5": uint64(5),
  2005. "value9": "2",
  2006. "value10": "4",
  2007. "value11": "5",
  2008. }
  2009. var in inner
  2010. ast := assert.New(t)
  2011. ast.Nil(UnmarshalKey(m, &in))
  2012. ast.Equal(uint(2), in.Value3)
  2013. ast.Equal(uint32(4), in.Value4)
  2014. ast.Equal(uint64(5), in.Value5)
  2015. ast.Equal(2, in.Value9)
  2016. ast.Equal(4, in.Value10)
  2017. ast.Equal(5, in.Value11)
  2018. }
  2019. func TestUnmarshalNumberRangeIntRightExclude(t *testing.T) {
  2020. type inner struct {
  2021. Value2 uint `key:"value2,range=[1:5)"`
  2022. Value3 uint8 `key:"value3,range=[1:5)"`
  2023. Value4 uint16 `key:"value4,range=[1:5)"`
  2024. Value8 int `key:"value8,range=[1:5),string"`
  2025. Value9 int `key:"value9,range=[1:5),string"`
  2026. Value10 int `key:"value10,range=[1:5),string"`
  2027. }
  2028. m := map[string]interface{}{
  2029. "value2": uint(1),
  2030. "value3": uint8(2),
  2031. "value4": uint16(4),
  2032. "value8": "1",
  2033. "value9": "2",
  2034. "value10": "4",
  2035. }
  2036. var in inner
  2037. ast := assert.New(t)
  2038. ast.Nil(UnmarshalKey(m, &in))
  2039. ast.Equal(uint(1), in.Value2)
  2040. ast.Equal(uint8(2), in.Value3)
  2041. ast.Equal(uint16(4), in.Value4)
  2042. ast.Equal(1, in.Value8)
  2043. ast.Equal(2, in.Value9)
  2044. ast.Equal(4, in.Value10)
  2045. }
  2046. func TestUnmarshalNumberRangeIntExclude(t *testing.T) {
  2047. type inner struct {
  2048. Value3 int `key:"value3,range=(1:5)"`
  2049. Value4 int `key:"value4,range=(1:5)"`
  2050. Value9 int `key:"value9,range=(1:5),string"`
  2051. Value10 int `key:"value10,range=(1:5),string"`
  2052. }
  2053. m := map[string]interface{}{
  2054. "value3": 2,
  2055. "value4": 4,
  2056. "value9": "2",
  2057. "value10": "4",
  2058. }
  2059. var in inner
  2060. ast := assert.New(t)
  2061. ast.Nil(UnmarshalKey(m, &in))
  2062. ast.Equal(2, in.Value3)
  2063. ast.Equal(4, in.Value4)
  2064. ast.Equal(2, in.Value9)
  2065. ast.Equal(4, in.Value10)
  2066. }
  2067. func TestUnmarshalNumberRangeIntOutOfRange(t *testing.T) {
  2068. type inner1 struct {
  2069. Value int64 `key:"value,default=3,range=(1:5)"`
  2070. }
  2071. var in1 inner1
  2072. assert.Equal(t, errNumberRange, UnmarshalKey(map[string]interface{}{
  2073. "value": int64(1),
  2074. }, &in1))
  2075. assert.Equal(t, errNumberRange, UnmarshalKey(map[string]interface{}{
  2076. "value": int64(0),
  2077. }, &in1))
  2078. assert.Equal(t, errNumberRange, UnmarshalKey(map[string]interface{}{
  2079. "value": int64(5),
  2080. }, &in1))
  2081. assert.Equal(t, errNumberRange, UnmarshalKey(map[string]interface{}{
  2082. "value": json.Number("6"),
  2083. }, &in1))
  2084. type inner2 struct {
  2085. Value int64 `key:"value,optional,range=[1:5)"`
  2086. }
  2087. var in2 inner2
  2088. assert.Equal(t, errNumberRange, UnmarshalKey(map[string]interface{}{
  2089. "value": int64(0),
  2090. }, &in2))
  2091. assert.Equal(t, errNumberRange, UnmarshalKey(map[string]interface{}{
  2092. "value": int64(5),
  2093. }, &in2))
  2094. type inner3 struct {
  2095. Value int64 `key:"value,range=(1:5]"`
  2096. }
  2097. var in3 inner3
  2098. assert.Equal(t, errNumberRange, UnmarshalKey(map[string]interface{}{
  2099. "value": int64(1),
  2100. }, &in3))
  2101. assert.Equal(t, errNumberRange, UnmarshalKey(map[string]interface{}{
  2102. "value": int64(6),
  2103. }, &in3))
  2104. type inner4 struct {
  2105. Value int64 `key:"value,range=[1:5]"`
  2106. }
  2107. var in4 inner4
  2108. assert.Equal(t, errNumberRange, UnmarshalKey(map[string]interface{}{
  2109. "value": int64(0),
  2110. }, &in4))
  2111. assert.Equal(t, errNumberRange, UnmarshalKey(map[string]interface{}{
  2112. "value": int64(6),
  2113. }, &in4))
  2114. }
  2115. func TestUnmarshalNumberRangeFloat(t *testing.T) {
  2116. type inner struct {
  2117. Value2 float32 `key:"value2,range=[1:5]"`
  2118. Value3 float32 `key:"value3,range=[1:5]"`
  2119. Value4 float64 `key:"value4,range=[1:5]"`
  2120. Value5 float64 `key:"value5,range=[1:5]"`
  2121. Value8 float64 `key:"value8,range=[1:5],string"`
  2122. Value9 float64 `key:"value9,range=[1:5],string"`
  2123. Value10 float64 `key:"value10,range=[1:5],string"`
  2124. Value11 float64 `key:"value11,range=[1:5],string"`
  2125. }
  2126. m := map[string]interface{}{
  2127. "value2": float32(1),
  2128. "value3": float32(2),
  2129. "value4": float64(4),
  2130. "value5": float64(5),
  2131. "value8": "1",
  2132. "value9": "2",
  2133. "value10": "4",
  2134. "value11": "5",
  2135. }
  2136. var in inner
  2137. ast := assert.New(t)
  2138. ast.Nil(UnmarshalKey(m, &in))
  2139. ast.Equal(float32(1), in.Value2)
  2140. ast.Equal(float32(2), in.Value3)
  2141. ast.Equal(float64(4), in.Value4)
  2142. ast.Equal(float64(5), in.Value5)
  2143. ast.Equal(float64(1), in.Value8)
  2144. ast.Equal(float64(2), in.Value9)
  2145. ast.Equal(float64(4), in.Value10)
  2146. ast.Equal(float64(5), in.Value11)
  2147. }
  2148. func TestUnmarshalNumberRangeFloatLeftExclude(t *testing.T) {
  2149. type inner struct {
  2150. Value3 float64 `key:"value3,range=(1:5]"`
  2151. Value4 float64 `key:"value4,range=(1:5]"`
  2152. Value5 float64 `key:"value5,range=(1:5]"`
  2153. Value9 float64 `key:"value9,range=(1:5],string"`
  2154. Value10 float64 `key:"value10,range=(1:5],string"`
  2155. Value11 float64 `key:"value11,range=(1:5],string"`
  2156. }
  2157. m := map[string]interface{}{
  2158. "value3": float64(2),
  2159. "value4": float64(4),
  2160. "value5": float64(5),
  2161. "value9": "2",
  2162. "value10": "4",
  2163. "value11": "5",
  2164. }
  2165. var in inner
  2166. ast := assert.New(t)
  2167. ast.Nil(UnmarshalKey(m, &in))
  2168. ast.Equal(float64(2), in.Value3)
  2169. ast.Equal(float64(4), in.Value4)
  2170. ast.Equal(float64(5), in.Value5)
  2171. ast.Equal(float64(2), in.Value9)
  2172. ast.Equal(float64(4), in.Value10)
  2173. ast.Equal(float64(5), in.Value11)
  2174. }
  2175. func TestUnmarshalNumberRangeFloatRightExclude(t *testing.T) {
  2176. type inner struct {
  2177. Value2 float64 `key:"value2,range=[1:5)"`
  2178. Value3 float64 `key:"value3,range=[1:5)"`
  2179. Value4 float64 `key:"value4,range=[1:5)"`
  2180. Value8 float64 `key:"value8,range=[1:5),string"`
  2181. Value9 float64 `key:"value9,range=[1:5),string"`
  2182. Value10 float64 `key:"value10,range=[1:5),string"`
  2183. }
  2184. m := map[string]interface{}{
  2185. "value2": float64(1),
  2186. "value3": float64(2),
  2187. "value4": float64(4),
  2188. "value8": "1",
  2189. "value9": "2",
  2190. "value10": "4",
  2191. }
  2192. var in inner
  2193. ast := assert.New(t)
  2194. ast.Nil(UnmarshalKey(m, &in))
  2195. ast.Equal(float64(1), in.Value2)
  2196. ast.Equal(float64(2), in.Value3)
  2197. ast.Equal(float64(4), in.Value4)
  2198. ast.Equal(float64(1), in.Value8)
  2199. ast.Equal(float64(2), in.Value9)
  2200. ast.Equal(float64(4), in.Value10)
  2201. }
  2202. func TestUnmarshalNumberRangeFloatExclude(t *testing.T) {
  2203. type inner struct {
  2204. Value3 float64 `key:"value3,range=(1:5)"`
  2205. Value4 float64 `key:"value4,range=(1:5)"`
  2206. Value9 float64 `key:"value9,range=(1:5),string"`
  2207. Value10 float64 `key:"value10,range=(1:5),string"`
  2208. }
  2209. m := map[string]interface{}{
  2210. "value3": float64(2),
  2211. "value4": float64(4),
  2212. "value9": "2",
  2213. "value10": "4",
  2214. }
  2215. var in inner
  2216. ast := assert.New(t)
  2217. ast.Nil(UnmarshalKey(m, &in))
  2218. ast.Equal(float64(2), in.Value3)
  2219. ast.Equal(float64(4), in.Value4)
  2220. ast.Equal(float64(2), in.Value9)
  2221. ast.Equal(float64(4), in.Value10)
  2222. }
  2223. func TestUnmarshalNumberRangeFloatOutOfRange(t *testing.T) {
  2224. type inner1 struct {
  2225. Value float64 `key:"value,range=(1:5)"`
  2226. }
  2227. var in1 inner1
  2228. assert.Equal(t, errNumberRange, UnmarshalKey(map[string]interface{}{
  2229. "value": float64(1),
  2230. }, &in1))
  2231. assert.Equal(t, errNumberRange, UnmarshalKey(map[string]interface{}{
  2232. "value": float64(0),
  2233. }, &in1))
  2234. assert.Equal(t, errNumberRange, UnmarshalKey(map[string]interface{}{
  2235. "value": float64(5),
  2236. }, &in1))
  2237. assert.Equal(t, errNumberRange, UnmarshalKey(map[string]interface{}{
  2238. "value": json.Number("6"),
  2239. }, &in1))
  2240. type inner2 struct {
  2241. Value float64 `key:"value,range=[1:5)"`
  2242. }
  2243. var in2 inner2
  2244. assert.Equal(t, errNumberRange, UnmarshalKey(map[string]interface{}{
  2245. "value": float64(0),
  2246. }, &in2))
  2247. assert.Equal(t, errNumberRange, UnmarshalKey(map[string]interface{}{
  2248. "value": float64(5),
  2249. }, &in2))
  2250. type inner3 struct {
  2251. Value float64 `key:"value,range=(1:5]"`
  2252. }
  2253. var in3 inner3
  2254. assert.Equal(t, errNumberRange, UnmarshalKey(map[string]interface{}{
  2255. "value": float64(1),
  2256. }, &in3))
  2257. assert.Equal(t, errNumberRange, UnmarshalKey(map[string]interface{}{
  2258. "value": float64(6),
  2259. }, &in3))
  2260. type inner4 struct {
  2261. Value float64 `key:"value,range=[1:5]"`
  2262. }
  2263. var in4 inner4
  2264. assert.Equal(t, errNumberRange, UnmarshalKey(map[string]interface{}{
  2265. "value": float64(0),
  2266. }, &in4))
  2267. assert.Equal(t, errNumberRange, UnmarshalKey(map[string]interface{}{
  2268. "value": float64(6),
  2269. }, &in4))
  2270. }
  2271. func TestUnmarshalRangeError(t *testing.T) {
  2272. type inner1 struct {
  2273. Value int `key:",range="`
  2274. }
  2275. var in1 inner1
  2276. assert.Equal(t, errNumberRange, UnmarshalKey(map[string]interface{}{
  2277. "Value": 1,
  2278. }, &in1))
  2279. type inner2 struct {
  2280. Value int `key:",range=["`
  2281. }
  2282. var in2 inner2
  2283. assert.Equal(t, errNumberRange, UnmarshalKey(map[string]interface{}{
  2284. "Value": 1,
  2285. }, &in2))
  2286. type inner3 struct {
  2287. Value int `key:",range=[:"`
  2288. }
  2289. var in3 inner3
  2290. assert.Equal(t, errNumberRange, UnmarshalKey(map[string]interface{}{
  2291. "Value": 1,
  2292. }, &in3))
  2293. type inner4 struct {
  2294. Value int `key:",range=[:]"`
  2295. }
  2296. var in4 inner4
  2297. assert.Equal(t, errNumberRange, UnmarshalKey(map[string]interface{}{
  2298. "Value": 1,
  2299. }, &in4))
  2300. type inner5 struct {
  2301. Value int `key:",range={:]"`
  2302. }
  2303. var in5 inner5
  2304. assert.Equal(t, errNumberRange, UnmarshalKey(map[string]interface{}{
  2305. "Value": 1,
  2306. }, &in5))
  2307. type inner6 struct {
  2308. Value int `key:",range=[:}"`
  2309. }
  2310. var in6 inner6
  2311. assert.Equal(t, errNumberRange, UnmarshalKey(map[string]interface{}{
  2312. "Value": 1,
  2313. }, &in6))
  2314. type inner7 struct {
  2315. Value int `key:",range=[]"`
  2316. }
  2317. var in7 inner7
  2318. assert.Equal(t, errNumberRange, UnmarshalKey(map[string]interface{}{
  2319. "Value": 1,
  2320. }, &in7))
  2321. type inner8 struct {
  2322. Value int `key:",range=[a:]"`
  2323. }
  2324. var in8 inner8
  2325. assert.NotNil(t, UnmarshalKey(map[string]interface{}{
  2326. "Value": 1,
  2327. }, &in8))
  2328. type inner9 struct {
  2329. Value int `key:",range=[:a]"`
  2330. }
  2331. var in9 inner9
  2332. assert.NotNil(t, UnmarshalKey(map[string]interface{}{
  2333. "Value": 1,
  2334. }, &in9))
  2335. type inner10 struct {
  2336. Value int `key:",range"`
  2337. }
  2338. var in10 inner10
  2339. assert.NotNil(t, UnmarshalKey(map[string]interface{}{
  2340. "Value": 1,
  2341. }, &in10))
  2342. type inner11 struct {
  2343. Value int `key:",range=[1,2]"`
  2344. }
  2345. var in11 inner11
  2346. assert.Equal(t, errNumberRange, UnmarshalKey(map[string]interface{}{
  2347. "Value": "a",
  2348. }, &in11))
  2349. }
  2350. func TestUnmarshalNestedMap(t *testing.T) {
  2351. var c struct {
  2352. Anything map[string]map[string]string `json:"anything"`
  2353. }
  2354. m := map[string]interface{}{
  2355. "anything": map[string]map[string]interface{}{
  2356. "inner": {
  2357. "id": "1",
  2358. "name": "any",
  2359. },
  2360. },
  2361. }
  2362. assert.Nil(t, NewUnmarshaler("json").Unmarshal(m, &c))
  2363. assert.Equal(t, "1", c.Anything["inner"]["id"])
  2364. }
  2365. func TestUnmarshalNestedMapMismatch(t *testing.T) {
  2366. var c struct {
  2367. Anything map[string]map[string]map[string]string `json:"anything"`
  2368. }
  2369. m := map[string]interface{}{
  2370. "anything": map[string]map[string]interface{}{
  2371. "inner": {
  2372. "name": "any",
  2373. },
  2374. },
  2375. }
  2376. assert.NotNil(t, NewUnmarshaler("json").Unmarshal(m, &c))
  2377. }
  2378. func TestUnmarshalNestedMapSimple(t *testing.T) {
  2379. var c struct {
  2380. Anything map[string]string `json:"anything"`
  2381. }
  2382. m := map[string]interface{}{
  2383. "anything": map[string]interface{}{
  2384. "id": "1",
  2385. "name": "any",
  2386. },
  2387. }
  2388. assert.Nil(t, NewUnmarshaler("json").Unmarshal(m, &c))
  2389. assert.Equal(t, "1", c.Anything["id"])
  2390. }
  2391. func TestUnmarshalNestedMapSimpleTypeMatch(t *testing.T) {
  2392. var c struct {
  2393. Anything map[string]string `json:"anything"`
  2394. }
  2395. m := map[string]interface{}{
  2396. "anything": map[string]string{
  2397. "id": "1",
  2398. "name": "any",
  2399. },
  2400. }
  2401. assert.Nil(t, NewUnmarshaler("json").Unmarshal(m, &c))
  2402. assert.Equal(t, "1", c.Anything["id"])
  2403. }
  2404. func TestUnmarshalValuer(t *testing.T) {
  2405. unmarshaler := NewUnmarshaler(jsonTagKey)
  2406. var foo string
  2407. err := unmarshaler.UnmarshalValuer(nil, foo)
  2408. assert.NotNil(t, err)
  2409. }
  2410. func BenchmarkUnmarshalString(b *testing.B) {
  2411. type inner struct {
  2412. Value string `key:"value"`
  2413. }
  2414. m := map[string]interface{}{
  2415. "value": "first",
  2416. }
  2417. for i := 0; i < b.N; i++ {
  2418. var in inner
  2419. if err := UnmarshalKey(m, &in); err != nil {
  2420. b.Fatal(err)
  2421. }
  2422. }
  2423. }
  2424. func BenchmarkUnmarshalStruct(b *testing.B) {
  2425. b.ReportAllocs()
  2426. m := map[string]interface{}{
  2427. "Ids": []map[string]interface{}{
  2428. {
  2429. "First": 1,
  2430. "Second": 2,
  2431. },
  2432. },
  2433. }
  2434. for i := 0; i < b.N; i++ {
  2435. var v struct {
  2436. Ids []struct {
  2437. First int
  2438. Second int
  2439. }
  2440. }
  2441. if err := UnmarshalKey(m, &v); err != nil {
  2442. b.Fatal(err)
  2443. }
  2444. }
  2445. }
  2446. func BenchmarkMapToStruct(b *testing.B) {
  2447. data := map[string]interface{}{
  2448. "valid": "1",
  2449. "age": "5",
  2450. "name": "liao",
  2451. }
  2452. type anonymous struct {
  2453. Valid bool
  2454. Age int
  2455. Name string
  2456. }
  2457. for i := 0; i < b.N; i++ {
  2458. var an anonymous
  2459. if valid, ok := data["valid"]; ok {
  2460. an.Valid = valid == "1"
  2461. }
  2462. if age, ok := data["age"]; ok {
  2463. ages, _ := age.(string)
  2464. an.Age, _ = strconv.Atoi(ages)
  2465. }
  2466. if name, ok := data["name"]; ok {
  2467. names, _ := name.(string)
  2468. an.Name = names
  2469. }
  2470. }
  2471. }
  2472. func BenchmarkUnmarshal(b *testing.B) {
  2473. data := map[string]interface{}{
  2474. "valid": "1",
  2475. "age": "5",
  2476. "name": "liao",
  2477. }
  2478. type anonymous struct {
  2479. Valid bool `key:"valid,string"`
  2480. Age int `key:"age,string"`
  2481. Name string `key:"name"`
  2482. }
  2483. for i := 0; i < b.N; i++ {
  2484. var an anonymous
  2485. UnmarshalKey(data, &an)
  2486. }
  2487. }
  2488. func TestUnmarshalJsonReaderMultiArray(t *testing.T) {
  2489. payload := `{"a": "133", "b": [["add", "cccd"], ["eeee"]]}`
  2490. var res struct {
  2491. A string `json:"a"`
  2492. B [][]string `json:"b"`
  2493. }
  2494. reader := strings.NewReader(payload)
  2495. err := UnmarshalJsonReader(reader, &res)
  2496. assert.Nil(t, err)
  2497. assert.Equal(t, 2, len(res.B))
  2498. }
  2499. func TestUnmarshalJsonReaderPtrMultiArrayString(t *testing.T) {
  2500. payload := `{"a": "133", "b": [["add", "cccd"], ["eeee"]]}`
  2501. var res struct {
  2502. A string `json:"a"`
  2503. B [][]*string `json:"b"`
  2504. }
  2505. reader := strings.NewReader(payload)
  2506. err := UnmarshalJsonReader(reader, &res)
  2507. assert.Nil(t, err)
  2508. assert.Equal(t, 2, len(res.B))
  2509. assert.Equal(t, 2, len(res.B[0]))
  2510. }
  2511. func TestUnmarshalJsonReaderPtrMultiArrayString_Int(t *testing.T) {
  2512. payload := `{"a": "133", "b": [[11, 22], [33]]}`
  2513. var res struct {
  2514. A string `json:"a"`
  2515. B [][]*string `json:"b"`
  2516. }
  2517. reader := strings.NewReader(payload)
  2518. err := UnmarshalJsonReader(reader, &res)
  2519. assert.Nil(t, err)
  2520. assert.Equal(t, 2, len(res.B))
  2521. assert.Equal(t, 2, len(res.B[0]))
  2522. }
  2523. func TestUnmarshalJsonReaderPtrMultiArrayInt(t *testing.T) {
  2524. payload := `{"a": "133", "b": [[11, 22], [33]]}`
  2525. var res struct {
  2526. A string `json:"a"`
  2527. B [][]*int `json:"b"`
  2528. }
  2529. reader := strings.NewReader(payload)
  2530. err := UnmarshalJsonReader(reader, &res)
  2531. assert.Nil(t, err)
  2532. assert.Equal(t, 2, len(res.B))
  2533. assert.Equal(t, 2, len(res.B[0]))
  2534. }
  2535. func TestUnmarshalJsonReaderPtrArray(t *testing.T) {
  2536. payload := `{"a": "133", "b": ["add", "cccd", "eeee"]}`
  2537. var res struct {
  2538. A string `json:"a"`
  2539. B []*string `json:"b"`
  2540. }
  2541. reader := strings.NewReader(payload)
  2542. err := UnmarshalJsonReader(reader, &res)
  2543. assert.Nil(t, err)
  2544. assert.Equal(t, 3, len(res.B))
  2545. }
  2546. func TestUnmarshalJsonReaderPtrArray_Int(t *testing.T) {
  2547. payload := `{"a": "133", "b": [11, 22, 33]}`
  2548. var res struct {
  2549. A string `json:"a"`
  2550. B []*string `json:"b"`
  2551. }
  2552. reader := strings.NewReader(payload)
  2553. err := UnmarshalJsonReader(reader, &res)
  2554. assert.Nil(t, err)
  2555. assert.Equal(t, 3, len(res.B))
  2556. }
  2557. func TestUnmarshalJsonReaderPtrInt(t *testing.T) {
  2558. payload := `{"a": "133", "b": [11, 22, 33]}`
  2559. var res struct {
  2560. A string `json:"a"`
  2561. B []*string `json:"b"`
  2562. }
  2563. reader := strings.NewReader(payload)
  2564. err := UnmarshalJsonReader(reader, &res)
  2565. assert.Nil(t, err)
  2566. assert.Equal(t, 3, len(res.B))
  2567. }
  2568. func TestUnmarshalJsonWithoutKey(t *testing.T) {
  2569. payload := `{"A": "1", "B": "2"}`
  2570. var res struct {
  2571. A string `json:""`
  2572. B string `json:","`
  2573. }
  2574. reader := strings.NewReader(payload)
  2575. err := UnmarshalJsonReader(reader, &res)
  2576. assert.Nil(t, err)
  2577. assert.Equal(t, "1", res.A)
  2578. assert.Equal(t, "2", res.B)
  2579. }
  2580. func TestUnmarshalJsonUintNegative(t *testing.T) {
  2581. payload := `{"a": -1}`
  2582. var res struct {
  2583. A uint `json:"a"`
  2584. }
  2585. reader := strings.NewReader(payload)
  2586. err := UnmarshalJsonReader(reader, &res)
  2587. assert.NotNil(t, err)
  2588. }
  2589. func TestUnmarshalJsonDefinedInt(t *testing.T) {
  2590. type Int int
  2591. var res struct {
  2592. A Int `json:"a"`
  2593. }
  2594. payload := `{"a": -1}`
  2595. reader := strings.NewReader(payload)
  2596. err := UnmarshalJsonReader(reader, &res)
  2597. assert.Nil(t, err)
  2598. assert.Equal(t, Int(-1), res.A)
  2599. }
  2600. func TestUnmarshalJsonDefinedString(t *testing.T) {
  2601. type String string
  2602. var res struct {
  2603. A String `json:"a"`
  2604. }
  2605. payload := `{"a": "foo"}`
  2606. reader := strings.NewReader(payload)
  2607. err := UnmarshalJsonReader(reader, &res)
  2608. assert.Nil(t, err)
  2609. assert.Equal(t, String("foo"), res.A)
  2610. }
  2611. func TestUnmarshalJsonDefinedStringPtr(t *testing.T) {
  2612. type String string
  2613. var res struct {
  2614. A *String `json:"a"`
  2615. }
  2616. payload := `{"a": "foo"}`
  2617. reader := strings.NewReader(payload)
  2618. err := UnmarshalJsonReader(reader, &res)
  2619. assert.Nil(t, err)
  2620. assert.Equal(t, String("foo"), *res.A)
  2621. }
  2622. func TestUnmarshalJsonReaderComplex(t *testing.T) {
  2623. type (
  2624. MyInt int
  2625. MyTxt string
  2626. MyTxtArray []string
  2627. Req struct {
  2628. MyInt MyInt `json:"my_int"` // int.. ok
  2629. MyTxtArray MyTxtArray `json:"my_txt_array"`
  2630. MyTxt MyTxt `json:"my_txt"` // but string is not assignable
  2631. Int int `json:"int"`
  2632. Txt string `json:"txt"`
  2633. }
  2634. )
  2635. body := `{
  2636. "my_int": 100,
  2637. "my_txt_array": [
  2638. "a",
  2639. "b"
  2640. ],
  2641. "my_txt": "my_txt",
  2642. "int": 200,
  2643. "txt": "txt"
  2644. }`
  2645. var req Req
  2646. err := UnmarshalJsonReader(strings.NewReader(body), &req)
  2647. assert.Nil(t, err)
  2648. assert.Equal(t, MyInt(100), req.MyInt)
  2649. assert.Equal(t, MyTxt("my_txt"), req.MyTxt)
  2650. assert.EqualValues(t, MyTxtArray([]string{"a", "b"}), req.MyTxtArray)
  2651. assert.Equal(t, 200, req.Int)
  2652. assert.Equal(t, "txt", req.Txt)
  2653. }
  2654. func TestUnmarshalJsonReaderArrayBool(t *testing.T) {
  2655. payload := `{"id": false}`
  2656. var res struct {
  2657. ID []string `json:"id"`
  2658. }
  2659. reader := strings.NewReader(payload)
  2660. err := UnmarshalJsonReader(reader, &res)
  2661. assert.NotNil(t, err)
  2662. }
  2663. func TestUnmarshalJsonReaderArrayInt(t *testing.T) {
  2664. payload := `{"id": 123}`
  2665. var res struct {
  2666. ID []string `json:"id"`
  2667. }
  2668. reader := strings.NewReader(payload)
  2669. err := UnmarshalJsonReader(reader, &res)
  2670. assert.NotNil(t, err)
  2671. }
  2672. func TestUnmarshalJsonReaderArrayString(t *testing.T) {
  2673. payload := `{"id": "123"}`
  2674. var res struct {
  2675. ID []string `json:"id"`
  2676. }
  2677. reader := strings.NewReader(payload)
  2678. err := UnmarshalJsonReader(reader, &res)
  2679. assert.NotNil(t, err)
  2680. }
  2681. func TestGoogleUUID(t *testing.T) {
  2682. var val struct {
  2683. Uid uuid.UUID `json:"uid,optional"`
  2684. Uidp *uuid.UUID `json:"uidp,optional"`
  2685. }
  2686. assert.NoError(t, UnmarshalJsonBytes([]byte(`{
  2687. "uid": "6ba7b810-9dad-11d1-80b4-00c04fd430c8",
  2688. "uidp": "6ba7b810-9dad-11d1-80b4-00c04fd430c9"}`), &val))
  2689. assert.Equal(t, "6ba7b810-9dad-11d1-80b4-00c04fd430c8", val.Uid.String())
  2690. assert.Equal(t, "6ba7b810-9dad-11d1-80b4-00c04fd430c9", val.Uidp.String())
  2691. assert.NoError(t, UnmarshalJsonMap(map[string]interface{}{
  2692. "uid": []byte("6ba7b810-9dad-11d1-80b4-00c04fd430c1"),
  2693. "uidp": []byte("6ba7b810-9dad-11d1-80b4-00c04fd430c2"),
  2694. }, &val))
  2695. assert.Equal(t, "6ba7b810-9dad-11d1-80b4-00c04fd430c1", val.Uid.String())
  2696. assert.Equal(t, "6ba7b810-9dad-11d1-80b4-00c04fd430c2", val.Uidp.String())
  2697. }
  2698. func BenchmarkDefaultValue(b *testing.B) {
  2699. for i := 0; i < b.N; i++ {
  2700. var a struct {
  2701. Ints []int `json:"ints,default=[1,2,3]"`
  2702. Strs []string `json:"strs,default=[foo,bar,baz]"`
  2703. }
  2704. _ = UnmarshalJsonMap(nil, &a)
  2705. if len(a.Strs) != 3 || len(a.Ints) != 3 {
  2706. b.Fatal("failed")
  2707. }
  2708. }
  2709. }