assign_tag_test.go 50 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095109610971098109911001101110211031104110511061107110811091110111111121113111411151116111711181119112011211122112311241125112611271128112911301131113211331134113511361137113811391140114111421143114411451146114711481149115011511152115311541155115611571158115911601161116211631164116511661167116811691170117111721173117411751176117711781179118011811182118311841185118611871188118911901191119211931194119511961197119811991200120112021203120412051206120712081209121012111212121312141215121612171218121912201221122212231224122512261227122812291230123112321233123412351236123712381239124012411242124312441245124612471248124912501251125212531254125512561257125812591260126112621263126412651266126712681269127012711272127312741275127612771278127912801281128212831284128512861287128812891290129112921293129412951296129712981299130013011302130313041305130613071308130913101311131213131314131513161317131813191320132113221323132413251326132713281329133013311332133313341335133613371338133913401341134213431344134513461347134813491350135113521353135413551356135713581359136013611362136313641365136613671368136913701371137213731374137513761377137813791380138113821383138413851386138713881389139013911392139313941395139613971398139914001401140214031404140514061407140814091410141114121413141414151416141714181419142014211422142314241425142614271428142914301431143214331434143514361437143814391440144114421443144414451446144714481449145014511452145314541455145614571458145914601461146214631464146514661467146814691470147114721473147414751476147714781479148014811482148314841485148614871488148914901491149214931494149514961497149814991500150115021503150415051506150715081509151015111512151315141515151615171518151915201521152215231524
  1. package test
  2. import (
  3. "git.sxidc.com/go-framework/baize/framework/core/tag/assign"
  4. "git.sxidc.com/go-tools/utils/strutils"
  5. "github.com/pkg/errors"
  6. "math/rand"
  7. "strings"
  8. "testing"
  9. "time"
  10. )
  11. type AssignTagFrom struct {
  12. StringField string `assign:"toField:StringField"`
  13. BoolField bool `assign:"toField:BoolField"`
  14. IntField int `assign:"toField:IntField"`
  15. Int8Field int8 `assign:"toField:Int8Field"`
  16. Int16Field int16 `assign:"toField:Int16Field"`
  17. Int32Field int32 `assign:"toField:Int32Field"`
  18. Int64Field int64 `assign:"toField:Int64Field"`
  19. UintField uint `assign:"toField:UintField"`
  20. Uint8Field uint8 `assign:"toField:Uint8Field"`
  21. Uint16Field uint16 `assign:"toField:Uint16Field"`
  22. Uint32Field uint32 `assign:"toField:Uint32Field"`
  23. Uint64Field uint64 `assign:"toField:Uint64Field"`
  24. Float32Field float32 `assign:"toField:Float32Field"`
  25. Float64Field float64 `assign:"toField:Float64Field"`
  26. MapField map[string]string `assign:"toField:MapField"`
  27. ChanField chan any `assign:"toField:ChanField"`
  28. FuncField func() string `assign:"toField:FuncField"`
  29. StructField struct{ ID string } `assign:"toField:StructField"`
  30. FromTimeToStringField time.Time `assign:"toField:FromTimeToStringField"`
  31. FromTimeToTimeField time.Time `assign:"toField:FromTimeToTimeField"`
  32. FromStringToTimeField string `assign:"toField:FromStringToTimeField"`
  33. }
  34. type AssignTagFromPointerField struct {
  35. StringField *string `assign:"toField:StringField"`
  36. BoolField *bool `assign:"toField:BoolField"`
  37. IntField *int `assign:"toField:IntField"`
  38. Int8Field *int8 `assign:"toField:Int8Field"`
  39. Int16Field *int16 `assign:"toField:Int16Field"`
  40. Int32Field *int32 `assign:"toField:Int32Field"`
  41. Int64Field *int64 `assign:"toField:Int64Field"`
  42. UintField *uint `assign:"toField:UintField"`
  43. Uint8Field *uint8 `assign:"toField:Uint8Field"`
  44. Uint16Field *uint16 `assign:"toField:Uint16Field"`
  45. Uint32Field *uint32 `assign:"toField:Uint32Field"`
  46. Uint64Field *uint64 `assign:"toField:Uint64Field"`
  47. Float32Field *float32 `assign:"toField:Float32Field"`
  48. Float64Field *float64 `assign:"toField:Float64Field"`
  49. MapField *map[string]string `assign:"toField:MapField"`
  50. ChanField *chan any `assign:"toField:ChanField"`
  51. FuncField *func() string `assign:"toField:FuncField"`
  52. StructField *struct{ ID string } `assign:"toField:StructField"`
  53. FromTimeToStringField *time.Time `assign:"toField:FromTimeToStringField"`
  54. FromTimeToTimeField *time.Time `assign:"toField:FromTimeToTimeField"`
  55. FromStringToTimeField *string `assign:"toField:FromStringToTimeField"`
  56. }
  57. type AssignTagTo struct {
  58. StringField string
  59. BoolField bool
  60. IntField int
  61. Int8Field int8
  62. Int16Field int16
  63. Int32Field int32
  64. Int64Field int64
  65. UintField uint
  66. Uint8Field uint8
  67. Uint16Field uint16
  68. Uint32Field uint32
  69. Uint64Field uint64
  70. Float32Field float32
  71. Float64Field float64
  72. MapField map[string]string
  73. ChanField chan any
  74. FuncField func() string
  75. StructField struct{ ID string }
  76. FromTimeToStringField string
  77. FromTimeToTimeField time.Time
  78. FromStringToTimeField time.Time
  79. }
  80. func (to AssignTagTo) checkFields(t *testing.T, from AssignTagFrom) {
  81. if from.StringField != to.StringField {
  82. t.Fatalf("%+v\n", errors.Errorf("StringField not equal: from %v, to %v",
  83. from.StringField, to.StringField))
  84. }
  85. if from.BoolField != to.BoolField {
  86. t.Fatalf("%+v\n", errors.Errorf("BoolField not equal: from %v, to %v",
  87. from.BoolField, to.BoolField))
  88. }
  89. if from.IntField != to.IntField {
  90. t.Fatalf("%+v\n", errors.Errorf("IntField not equal: from %v, to %v",
  91. from.IntField, to.IntField))
  92. }
  93. if from.Int8Field != to.Int8Field {
  94. t.Fatalf("%+v\n", errors.Errorf("Int8Field not equal: from %v, to %v",
  95. from.Int8Field, to.Int8Field))
  96. }
  97. if from.Int16Field != to.Int16Field {
  98. t.Fatalf("%+v\n", errors.Errorf("Int16Field not equal: from %v, to %v",
  99. from.Int16Field, to.Int16Field))
  100. }
  101. if from.Int32Field != to.Int32Field {
  102. t.Fatalf("%+v\n", errors.Errorf("Int32Field not equal: from %v, to %v",
  103. from.Int32Field, to.Int32Field))
  104. }
  105. if from.Int64Field != to.Int64Field {
  106. t.Fatalf("%+v\n", errors.Errorf("Int64Field not equal: from %v, to %v",
  107. from.Int64Field, to.Int64Field))
  108. }
  109. if from.UintField != to.UintField {
  110. t.Fatalf("%+v\n", errors.Errorf("UintField not equal: from %v, to %v",
  111. from.UintField, to.UintField))
  112. }
  113. if from.Uint8Field != to.Uint8Field {
  114. t.Fatalf("%+v\n", errors.Errorf("Uint8Field not equal: from %v, to %v",
  115. from.Uint8Field, to.Uint8Field))
  116. }
  117. if from.Uint16Field != to.Uint16Field {
  118. t.Fatalf("%+v\n", errors.Errorf("Uint16Field not equal: from %v, to %v",
  119. from.Uint16Field, to.Uint16Field))
  120. }
  121. if from.Uint32Field != to.Uint32Field {
  122. t.Fatalf("%+v\n", errors.Errorf("Uint32Field not equal: from %v, to %v",
  123. from.Uint32Field, to.Uint32Field))
  124. }
  125. if from.Uint64Field != to.Uint64Field {
  126. t.Fatalf("%+v\n", errors.Errorf("Uint64Field not equal: from %v, to %v",
  127. from.Uint64Field, to.Uint64Field))
  128. }
  129. if from.Float32Field != to.Float32Field {
  130. t.Fatalf("%+v\n", errors.Errorf("Float32Field not equal: from %v, to %v",
  131. from.Float32Field, to.Float32Field))
  132. }
  133. if from.Float64Field != to.Float64Field {
  134. t.Fatalf("%+v\n", errors.Errorf("Float64Field not equal: from %v, to %v",
  135. from.Float64Field, to.Float64Field))
  136. }
  137. for key, value := range from.MapField {
  138. if value != to.MapField[key] {
  139. t.Fatalf("%+v\n", errors.Errorf("MapField not equal: from %v, to %v",
  140. value, to.MapField[key]))
  141. }
  142. }
  143. if from.ChanField != to.ChanField {
  144. t.Fatalf("%+v\n", errors.Errorf("ChanField not equal: from %v, to %v",
  145. from.ChanField, to.ChanField))
  146. }
  147. if from.FuncField() != to.FuncField() {
  148. t.Fatalf("%+v\n", errors.Errorf("FuncField not equal: from %v, to %v",
  149. from.FuncField(), to.FuncField()))
  150. }
  151. if from.StructField.ID != to.StructField.ID {
  152. t.Fatalf("%+v\n", errors.Errorf("StructField not equal: from %v, to %v",
  153. from.StructField.ID, to.StructField.ID))
  154. }
  155. if from.FromTimeToStringField.Format(time.DateTime) != to.FromTimeToStringField {
  156. t.Fatalf("%+v\n", errors.Errorf("FromTimeToStringField not equal: from %v, to %v",
  157. from.FromTimeToStringField.Format(time.DateTime), to.FromTimeToStringField))
  158. }
  159. if from.FromTimeToTimeField.Format(time.DateTime) != to.FromTimeToTimeField.Format(time.DateTime) {
  160. t.Fatalf("%+v\n", errors.Errorf("FromTimeToTimeField not equal: from %v, to %v",
  161. from.FromTimeToTimeField.Format(time.DateTime), to.FromTimeToTimeField.Format(time.DateTime)))
  162. }
  163. if from.FromStringToTimeField != to.FromStringToTimeField.Format(time.DateTime) {
  164. t.Fatalf("%+v\n", errors.Errorf("FromStringToTimeField not equal: from %v, to %v",
  165. from.FromStringToTimeField, to.FromStringToTimeField.Format(time.DateTime)))
  166. }
  167. }
  168. func (to AssignTagTo) checkNil(t *testing.T) {
  169. if to.StringField != "" {
  170. t.Fatalf("%+v\n", errors.New("StringField not zero"))
  171. }
  172. if to.BoolField != false {
  173. t.Fatalf("%+v\n", errors.New("BoolField not zero"))
  174. }
  175. if to.IntField != 0 {
  176. t.Fatalf("%+v\n", errors.New("IntField not zero"))
  177. }
  178. if to.Int8Field != 0 {
  179. t.Fatalf("%+v\n", errors.New("Int8Field not zero"))
  180. }
  181. if to.Int16Field != 0 {
  182. t.Fatalf("%+v\n", errors.New("Int16Field not zero"))
  183. }
  184. if to.Int32Field != 0 {
  185. t.Fatalf("%+v\n", errors.New("Int32Field not zero"))
  186. }
  187. if to.Int64Field != 0 {
  188. t.Fatalf("%+v\n", errors.New("Int64Field not zero"))
  189. }
  190. if to.UintField != 0 {
  191. t.Fatalf("%+v\n", errors.New("UintField not zero"))
  192. }
  193. if to.Uint8Field != 0 {
  194. t.Fatalf("%+v\n", errors.New("Uint8Field not zero"))
  195. }
  196. if to.Uint16Field != 0 {
  197. t.Fatalf("%+v\n", errors.New("Uint16Field not zero"))
  198. }
  199. if to.Uint32Field != 0 {
  200. t.Fatalf("%+v\n", errors.New("Uint32Field not zero"))
  201. }
  202. if to.Uint64Field != 0 {
  203. t.Fatalf("%+v\n", errors.New("Uint64Field not zero"))
  204. }
  205. if to.Float32Field != 0 {
  206. t.Fatalf("%+v\n", errors.New("Float32Field not zero"))
  207. }
  208. if to.Float64Field != 0 {
  209. t.Fatalf("%+v\n", errors.New("Float64Field not zero"))
  210. }
  211. if to.MapField != nil {
  212. t.Fatalf("%+v\n", errors.New("MapField not zero"))
  213. }
  214. if to.ChanField != nil {
  215. t.Fatalf("%+v\n", errors.New("ChanField not zero"))
  216. }
  217. if to.FuncField != nil {
  218. t.Fatalf("%+v\n", errors.New("FuncField not zero"))
  219. }
  220. if to.StructField.ID != "" {
  221. t.Fatalf("%+v\n", errors.New("StructField not zero"))
  222. }
  223. if to.FromTimeToStringField != "" {
  224. t.Fatalf("%+v\n", errors.New("FromTimeToStringField not zero"))
  225. }
  226. if !to.FromTimeToTimeField.IsZero() {
  227. t.Fatalf("%+v\n", errors.New("FromTimeToTimeField not zero"))
  228. }
  229. if !to.FromStringToTimeField.IsZero() {
  230. t.Fatalf("%+v\n", errors.New("FromStringToTimeField not zero"))
  231. }
  232. }
  233. type AssignTagToPointerField struct {
  234. StringField *string
  235. BoolField *bool
  236. IntField *int
  237. Int8Field *int8
  238. Int16Field *int16
  239. Int32Field *int32
  240. Int64Field *int64
  241. UintField *uint
  242. Uint8Field *uint8
  243. Uint16Field *uint16
  244. Uint32Field *uint32
  245. Uint64Field *uint64
  246. Float32Field *float32
  247. Float64Field *float64
  248. MapField *map[string]string
  249. ChanField *chan any
  250. FuncField *func() string
  251. StructField *struct{ ID string }
  252. FromTimeToStringField *string
  253. FromTimeToTimeField *time.Time
  254. FromStringToTimeField *time.Time
  255. }
  256. func (to AssignTagToPointerField) checkFields(t *testing.T, from AssignTagFrom) {
  257. if from.StringField != *to.StringField {
  258. t.Fatalf("%+v\n", errors.Errorf("StringField not equal: from %v, to %v",
  259. from.StringField, *to.StringField))
  260. }
  261. if from.BoolField != *to.BoolField {
  262. t.Fatalf("%+v\n", errors.Errorf("BoolField not equal: from %v, to %v",
  263. from.BoolField, *to.BoolField))
  264. }
  265. if from.IntField != *to.IntField {
  266. t.Fatalf("%+v\n", errors.Errorf("IntField not equal: from %v, to %v",
  267. from.IntField, *to.IntField))
  268. }
  269. if from.Int8Field != *to.Int8Field {
  270. t.Fatalf("%+v\n", errors.Errorf("Int8Field not equal: from %v, to %v",
  271. from.Int8Field, *to.Int8Field))
  272. }
  273. if from.Int16Field != *to.Int16Field {
  274. t.Fatalf("%+v\n", errors.Errorf("Int16Field not equal: from %v, to %v",
  275. from.Int16Field, *to.Int16Field))
  276. }
  277. if from.Int32Field != *to.Int32Field {
  278. t.Fatalf("%+v\n", errors.Errorf("Int32Field not equal: from %v, to %v",
  279. from.Int32Field, *to.Int32Field))
  280. }
  281. if from.Int64Field != *to.Int64Field {
  282. t.Fatalf("%+v\n", errors.Errorf("Int64Field not equal: from %v, to %v",
  283. from.Int64Field, *to.Int64Field))
  284. }
  285. if from.UintField != *to.UintField {
  286. t.Fatalf("%+v\n", errors.Errorf("UintField not equal: from %v, to %v",
  287. from.UintField, *to.UintField))
  288. }
  289. if from.Uint8Field != *to.Uint8Field {
  290. t.Fatalf("%+v\n", errors.Errorf("Uint8Field not equal: from %v, to %v",
  291. from.Uint8Field, *to.Uint8Field))
  292. }
  293. if from.Uint16Field != *to.Uint16Field {
  294. t.Fatalf("%+v\n", errors.Errorf("Uint16Field not equal: from %v, to %v",
  295. from.Uint16Field, *to.Uint16Field))
  296. }
  297. if from.Uint32Field != *to.Uint32Field {
  298. t.Fatalf("%+v\n", errors.Errorf("Uint32Field not equal: from %v, to %v",
  299. from.Uint32Field, *to.Uint32Field))
  300. }
  301. if from.Uint64Field != *to.Uint64Field {
  302. t.Fatalf("%+v\n", errors.Errorf("Uint64Field not equal: from %v, to %v",
  303. from.Uint64Field, *to.Uint64Field))
  304. }
  305. if from.Float32Field != *to.Float32Field {
  306. t.Fatalf("%+v\n", errors.Errorf("Float32Field not equal: from %v, to %v",
  307. from.Float32Field, *to.Float32Field))
  308. }
  309. if from.Float64Field != *to.Float64Field {
  310. t.Fatalf("%+v\n", errors.Errorf("Float64Field not equal: from %v, to %v",
  311. from.Float64Field, *to.Float64Field))
  312. }
  313. for key, value := range from.MapField {
  314. if value != (*to.MapField)[key] {
  315. t.Fatalf("%+v\n", errors.Errorf("MapField not equal: from %v, to %v",
  316. value, (*to.MapField)[key]))
  317. }
  318. }
  319. if from.ChanField != *to.ChanField {
  320. t.Fatalf("%+v\n", errors.Errorf("ChanField not equal: from %v, to %v",
  321. from.ChanField, *to.ChanField))
  322. }
  323. if from.FuncField() != (*to.FuncField)() {
  324. t.Fatalf("%+v\n", errors.Errorf("FuncField not equal: from %v, to %v",
  325. from.FuncField(), (*to.FuncField)()))
  326. }
  327. if from.StructField.ID != (*to.StructField).ID {
  328. t.Fatalf("%+v\n", errors.Errorf("StructField not equal: from %v, to %v",
  329. from.StructField.ID, (*to.StructField).ID))
  330. }
  331. if from.FromTimeToStringField.Format(time.DateTime) != *to.FromTimeToStringField {
  332. t.Fatalf("%+v\n", errors.Errorf("FromTimeToStringField not equal: from %v, to %v",
  333. from.FromTimeToStringField.Format(time.DateTime), to.FromTimeToStringField))
  334. }
  335. if from.FromTimeToTimeField.Format(time.DateTime) != (*to.FromTimeToTimeField).Format(time.DateTime) {
  336. t.Fatalf("%+v\n", errors.Errorf("FromTimeToTimeField not equal: from %v, to %v",
  337. from.FromTimeToTimeField.Format(time.DateTime), (*to.FromTimeToTimeField).Format(time.DateTime)))
  338. }
  339. if from.FromStringToTimeField != (*to.FromStringToTimeField).Format(time.DateTime) {
  340. t.Fatalf("%+v\n", errors.Errorf("FromStringToTimeField not equal: from %v, to %v",
  341. from.FromStringToTimeField, (*to.FromStringToTimeField).Format(time.DateTime)))
  342. }
  343. }
  344. func (to AssignTagToPointerField) checkNil(t *testing.T) {
  345. if to.StringField != nil {
  346. t.Fatalf("%+v\n", errors.New("StringField not nil"))
  347. }
  348. if to.BoolField != nil {
  349. t.Fatalf("%+v\n", errors.New("BoolField not nil"))
  350. }
  351. if to.IntField != nil {
  352. t.Fatalf("%+v\n", errors.New("IntField not nil"))
  353. }
  354. if to.Int8Field != nil {
  355. t.Fatalf("%+v\n", errors.New("Int8Field not nil"))
  356. }
  357. if to.Int16Field != nil {
  358. t.Fatalf("%+v\n", errors.New("Int16Field not nil"))
  359. }
  360. if to.Int32Field != nil {
  361. t.Fatalf("%+v\n", errors.New("Int32Field not nil"))
  362. }
  363. if to.Int64Field != nil {
  364. t.Fatalf("%+v\n", errors.New("Int64Field not nil"))
  365. }
  366. if to.UintField != nil {
  367. t.Fatalf("%+v\n", errors.New("UintField not nil"))
  368. }
  369. if to.Uint8Field != nil {
  370. t.Fatalf("%+v\n", errors.New("Uint8Field not nil"))
  371. }
  372. if to.Uint16Field != nil {
  373. t.Fatalf("%+v\n", errors.New("Uint16Field not nil"))
  374. }
  375. if to.Uint32Field != nil {
  376. t.Fatalf("%+v\n", errors.New("Uint32Field not nil"))
  377. }
  378. if to.Uint64Field != nil {
  379. t.Fatalf("%+v\n", errors.New("Uint64Field not nil"))
  380. }
  381. if to.Float32Field != nil {
  382. t.Fatalf("%+v\n", errors.New("Float32Field not nil"))
  383. }
  384. if to.Float64Field != nil {
  385. t.Fatalf("%+v\n", errors.New("Float64Field not nil"))
  386. }
  387. if to.MapField != nil {
  388. t.Fatalf("%+v\n", errors.New("MapField not nil"))
  389. }
  390. if to.ChanField != nil {
  391. t.Fatalf("%+v\n", errors.New("ChanField not nil"))
  392. }
  393. if to.FuncField != nil {
  394. t.Fatalf("%+v\n", errors.New("ChanField not nil"))
  395. }
  396. if to.StructField != nil {
  397. t.Fatalf("%+v\n", errors.New("ChanField not nil"))
  398. }
  399. if to.FromTimeToStringField != nil {
  400. t.Fatalf("%+v\n", errors.New("ChanField not nil"))
  401. }
  402. if to.FromTimeToTimeField != nil {
  403. t.Fatalf("%+v\n", errors.New("ChanField not nil"))
  404. }
  405. if to.FromStringToTimeField != nil {
  406. t.Fatalf("%+v\n", errors.New("ChanField not nil"))
  407. }
  408. }
  409. func TestAssignTagDefaultUsage(t *testing.T) {
  410. stringField := strutils.SimpleUUID()
  411. boolField := rand.Intn(2) == 0
  412. intField := rand.Int()
  413. int8Field := int8(rand.Int())
  414. int16Field := int16(rand.Int())
  415. int32Field := int32(rand.Int())
  416. int64Field := int64(rand.Int())
  417. uintField := uint(rand.Int())
  418. uint8Field := uint8(rand.Int())
  419. uint16Field := uint16(rand.Int())
  420. uint32Field := uint32(rand.Int())
  421. uint64Field := uint64(rand.Int())
  422. float32Field := rand.Float32()
  423. float64Field := rand.Float64()
  424. mapField := map[string]string{strutils.SimpleUUID(): strutils.SimpleUUID()}
  425. chanField := make(chan any)
  426. returnValue := strutils.SimpleUUID()
  427. funcField := func() string { return returnValue }
  428. structField := struct{ ID string }{ID: strutils.SimpleUUID()}
  429. fromTimeToStringField := time.Now().Local()
  430. fromTimeToTimeField := time.Now().Local()
  431. fromStringToTimeField := time.Now().Local().Format(time.DateTime)
  432. from := AssignTagFrom{
  433. StringField: stringField,
  434. BoolField: boolField,
  435. IntField: intField,
  436. Int8Field: int8Field,
  437. Int16Field: int16Field,
  438. Int32Field: int32Field,
  439. Int64Field: int64Field,
  440. UintField: uintField,
  441. Uint8Field: uint8Field,
  442. Uint16Field: uint16Field,
  443. Uint32Field: uint32Field,
  444. Uint64Field: uint64Field,
  445. Float32Field: float32Field,
  446. Float64Field: float64Field,
  447. MapField: mapField,
  448. ChanField: chanField,
  449. FuncField: funcField,
  450. StructField: structField,
  451. FromTimeToStringField: fromTimeToStringField,
  452. FromTimeToTimeField: fromTimeToTimeField,
  453. FromStringToTimeField: fromStringToTimeField,
  454. }
  455. fromPointer := AssignTagFromPointerField{
  456. StringField: &stringField,
  457. BoolField: &boolField,
  458. IntField: &intField,
  459. Int8Field: &int8Field,
  460. Int16Field: &int16Field,
  461. Int32Field: &int32Field,
  462. Int64Field: &int64Field,
  463. UintField: &uintField,
  464. Uint8Field: &uint8Field,
  465. Uint16Field: &uint16Field,
  466. Uint32Field: &uint32Field,
  467. Uint64Field: &uint64Field,
  468. Float32Field: &float32Field,
  469. Float64Field: &float64Field,
  470. MapField: &mapField,
  471. ChanField: &chanField,
  472. FuncField: &funcField,
  473. StructField: &structField,
  474. FromTimeToStringField: &fromTimeToStringField,
  475. FromTimeToTimeField: &fromTimeToTimeField,
  476. FromStringToTimeField: &fromStringToTimeField,
  477. }
  478. fromPointerNil := AssignTagFromPointerField{}
  479. to := AssignTagTo{}
  480. toPointer := AssignTagToPointerField{}
  481. err := assign.DefaultUsage(from, to)
  482. if err == nil || err.Error() != "返回类型不是结构指针" {
  483. t.Fatalf("%+v\n", errors.Errorf("没有检测出to参数必须是指针类型"))
  484. }
  485. err = assign.DefaultUsage(from, toPointer)
  486. if err == nil || err.Error() != "返回类型不是结构指针" {
  487. t.Fatalf("%+v\n", errors.Errorf("没有检测出to参数必须是指针类型"))
  488. }
  489. err = assign.DefaultUsage(fromPointer, to)
  490. if err == nil || err.Error() != "返回类型不是结构指针" {
  491. t.Fatalf("%+v\n", errors.Errorf("没有检测出to参数必须是指针类型"))
  492. }
  493. err = assign.DefaultUsage(fromPointer, toPointer)
  494. if err == nil || err.Error() != "返回类型不是结构指针" {
  495. t.Fatalf("%+v\n", errors.Errorf("没有检测出to参数必须是指针类型"))
  496. }
  497. err = assign.DefaultUsage(from, &to)
  498. if err != nil {
  499. t.Fatalf("%+v\n", err)
  500. }
  501. to.checkFields(t, from)
  502. to = AssignTagTo{}
  503. toPointer = AssignTagToPointerField{}
  504. err = assign.DefaultUsage(from, &toPointer)
  505. if err != nil {
  506. t.Fatalf("%+v\n", err)
  507. }
  508. toPointer.checkFields(t, from)
  509. to = AssignTagTo{}
  510. toPointer = AssignTagToPointerField{}
  511. err = assign.DefaultUsage(fromPointer, &to)
  512. if err != nil {
  513. t.Fatalf("%+v\n", err)
  514. }
  515. to.checkFields(t, from)
  516. to = AssignTagTo{}
  517. toPointer = AssignTagToPointerField{}
  518. err = assign.DefaultUsage(fromPointer, &toPointer)
  519. if err != nil {
  520. t.Fatalf("%+v\n", err)
  521. }
  522. toPointer.checkFields(t, from)
  523. to = AssignTagTo{}
  524. toPointer = AssignTagToPointerField{}
  525. err = assign.DefaultUsage(&from, to)
  526. if err == nil || err.Error() != "返回类型不是结构指针" {
  527. t.Fatalf("%+v\n", errors.Errorf("没有检测出to参数必须是指针类型"))
  528. }
  529. err = assign.DefaultUsage(&from, toPointer)
  530. if err == nil || err.Error() != "返回类型不是结构指针" {
  531. t.Fatalf("%+v\n", errors.Errorf("没有检测出to参数必须是指针类型"))
  532. }
  533. err = assign.DefaultUsage(&fromPointer, to)
  534. if err == nil || err.Error() != "返回类型不是结构指针" {
  535. t.Fatalf("%+v\n", errors.Errorf("没有检测出to参数必须是指针类型"))
  536. }
  537. err = assign.DefaultUsage(&fromPointer, toPointer)
  538. if err == nil || err.Error() != "返回类型不是结构指针" {
  539. t.Fatalf("%+v\n", errors.Errorf("没有检测出to参数必须是指针类型"))
  540. }
  541. err = assign.DefaultUsage(&from, &to)
  542. if err != nil {
  543. t.Fatalf("%+v\n", err)
  544. }
  545. to.checkFields(t, from)
  546. to = AssignTagTo{}
  547. toPointer = AssignTagToPointerField{}
  548. err = assign.DefaultUsage(&from, &toPointer)
  549. if err != nil {
  550. t.Fatalf("%+v\n", err)
  551. }
  552. toPointer.checkFields(t, from)
  553. to = AssignTagTo{}
  554. toPointer = AssignTagToPointerField{}
  555. err = assign.DefaultUsage(&fromPointer, &to)
  556. if err != nil {
  557. t.Fatalf("%+v\n", err)
  558. }
  559. to.checkFields(t, from)
  560. to = AssignTagTo{}
  561. toPointer = AssignTagToPointerField{}
  562. err = assign.DefaultUsage(&fromPointer, &toPointer)
  563. if err != nil {
  564. t.Fatalf("%+v\n", err)
  565. }
  566. toPointer.checkFields(t, from)
  567. to = AssignTagTo{}
  568. toPointer = AssignTagToPointerField{}
  569. err = assign.DefaultUsage(fromPointerNil, &to)
  570. if err != nil {
  571. t.Fatalf("%+v\n", err)
  572. }
  573. to.checkNil(t)
  574. to = AssignTagTo{}
  575. toPointer = AssignTagToPointerField{}
  576. err = assign.DefaultUsage(fromPointerNil, &toPointer)
  577. if err != nil {
  578. t.Fatalf("%+v\n", err)
  579. }
  580. toPointer.checkNil(t)
  581. to = AssignTagTo{}
  582. toPointer = AssignTagToPointerField{}
  583. err = assign.DefaultUsage(&fromPointerNil, &to)
  584. if err != nil {
  585. t.Fatalf("%+v\n", err)
  586. }
  587. to.checkNil(t)
  588. to = AssignTagTo{}
  589. toPointer = AssignTagToPointerField{}
  590. err = assign.DefaultUsage(&fromPointerNil, &toPointer)
  591. if err != nil {
  592. t.Fatalf("%+v\n", err)
  593. }
  594. toPointer.checkNil(t)
  595. }
  596. type AssignTagFromSlice struct {
  597. BasicField string `assign:"toField:BasicField"`
  598. BasicSliceField []string `assign:"toField:BasicSliceField"`
  599. TimeSliceField []time.Time `assign:"toField:TimeSliceField"`
  600. StructSliceField []AssignTagFrom `assign:"toField:StructSliceField"`
  601. MapSliceField []map[string]string `assign:"toField:MapSliceField"`
  602. ChanSliceField []chan any `assign:"toField:ChanSliceField"`
  603. FuncSliceField []func() string `assign:"toField:FuncSliceField"`
  604. FromStringSliceToStringField []string `assign:"toField:FromStringSliceToStringField"`
  605. FromTimeToStringField []time.Time `assign:"toField:FromTimeToStringField"`
  606. FromStringToTimeField []string `assign:"toField:FromStringToTimeField"`
  607. BasicPointerSliceField []*string `assign:"toField:BasicPointerSliceField"`
  608. TimePointerSliceField []*time.Time `assign:"toField:TimePointerSliceField"`
  609. StructPointerSliceField []*AssignTagFrom `assign:"toField:StructPointerSliceField"`
  610. MapPointerSliceField []*map[string]string `assign:"toField:MapPointerSliceField"`
  611. ChanPointerSliceField []*chan any `assign:"toField:ChanPointerSliceField"`
  612. FuncPointerSliceField []*func() string `assign:"toField:FuncPointerSliceField"`
  613. FromStringSliceToStringPointerField []*string `assign:"toField:FromStringSliceToStringPointerField"`
  614. FromTimeToStringPointerField []*time.Time `assign:"toField:FromTimeToStringPointerField"`
  615. FromStringToTimePointerField []*string `assign:"toField:FromStringToTimePointerField"`
  616. }
  617. type AssignTagFromSlicePointerField struct {
  618. BasicField *string `assign:"toField:BasicField"`
  619. BasicSliceField *[]string `assign:"toField:BasicSliceField"`
  620. TimeSliceField *[]time.Time `assign:"toField:TimeSliceField"`
  621. StructSliceField *[]AssignTagFrom `assign:"toField:StructSliceField"`
  622. MapSliceField *[]map[string]string `assign:"toField:MapSliceField"`
  623. ChanSliceField *[]chan any `assign:"toField:ChanSliceField"`
  624. FuncSliceField *[]func() string `assign:"toField:FuncSliceField"`
  625. FromStringSliceToStringField *[]string `assign:"toField:FromStringSliceToStringField"`
  626. FromTimeToStringField *[]time.Time `assign:"toField:FromTimeToStringField"`
  627. FromStringToTimeField *[]string `assign:"toField:FromStringToTimeField"`
  628. BasicPointerSliceField *[]*string `assign:"toField:BasicPointerSliceField"`
  629. TimePointerSliceField *[]*time.Time `assign:"toField:TimePointerSliceField"`
  630. StructPointerSliceField *[]*AssignTagFrom `assign:"toField:StructPointerSliceField"`
  631. MapPointerSliceField *[]*map[string]string `assign:"toField:MapPointerSliceField"`
  632. ChanPointerSliceField *[]*chan any `assign:"toField:ChanPointerSliceField"`
  633. FuncPointerSliceField *[]*func() string `assign:"toField:FuncPointerSliceField"`
  634. FromStringSliceToStringPointerField *[]*string `assign:"toField:FromStringSliceToStringPointerField"`
  635. FromTimeToStringPointerField *[]*time.Time `assign:"toField:FromTimeToStringPointerField"`
  636. FromStringToTimePointerField *[]*string `assign:"toField:FromStringToTimePointerField"`
  637. }
  638. type AssignTagToSlice struct {
  639. BasicField string
  640. BasicSliceField []string
  641. TimeSliceField []time.Time
  642. StructSliceField []AssignTagTo
  643. MapSliceField []map[string]string
  644. ChanSliceField []chan any
  645. FuncSliceField []func() string
  646. FromStringSliceToStringField string
  647. FromTimeToStringField []string
  648. FromStringToTimeField []time.Time
  649. BasicPointerSliceField []*string
  650. TimePointerSliceField []*time.Time
  651. StructPointerSliceField []*AssignTagTo
  652. MapPointerSliceField []*map[string]string
  653. ChanPointerSliceField []*chan any
  654. FuncPointerSliceField []*func() string
  655. FromStringSliceToStringPointerField string
  656. FromTimeToStringPointerField []*string
  657. FromStringToTimePointerField []*time.Time
  658. }
  659. func (to AssignTagToSlice) checkFields(t *testing.T, from AssignTagFromSlice) {
  660. if from.BasicField != to.BasicField {
  661. t.Fatalf("%+v\n", errors.Errorf("BasicField not equal: from %v, to %v",
  662. from.BasicField, to.BasicField))
  663. }
  664. for i, value := range from.BasicSliceField {
  665. if value != to.BasicSliceField[i] {
  666. t.Fatalf("%+v\n", errors.Errorf("BasicSliceField not equal: from %v, to %v",
  667. value, to.BasicSliceField[i]))
  668. }
  669. }
  670. for i, value := range from.TimeSliceField {
  671. if !value.Equal(to.TimeSliceField[i]) {
  672. t.Fatalf("%+v\n", errors.Errorf("TimeSliceField not equal: from %v, to %v",
  673. value, to.TimeSliceField[i]))
  674. }
  675. }
  676. for i, value := range from.StructSliceField {
  677. to.StructSliceField[i].checkFields(t, value)
  678. }
  679. for i, value := range from.MapSliceField {
  680. for k, v := range value {
  681. if v != to.MapSliceField[i][k] {
  682. t.Fatalf("%+v\n", errors.Errorf("MapSliceField not equal: from %v, to %v",
  683. value, to.MapSliceField[i][k]))
  684. }
  685. }
  686. }
  687. for i, value := range from.ChanSliceField {
  688. if value != to.ChanSliceField[i] {
  689. t.Fatalf("%+v\n", errors.Errorf("ChanSliceField not equal: from %v, to %v",
  690. value, to.ChanSliceField[i]))
  691. }
  692. }
  693. for i, value := range from.FuncSliceField {
  694. if value() != to.FuncSliceField[i]() {
  695. t.Fatalf("%+v\n", errors.Errorf("FuncSliceField not equal: from %v, to %v",
  696. value(), to.FuncSliceField[i]()))
  697. }
  698. }
  699. if strings.Join(from.FromStringSliceToStringField, "::") != to.FromStringSliceToStringField {
  700. t.Fatalf("%+v\n", errors.Errorf("FromStringSliceToStringField not equal: from %v, to %v",
  701. strings.Join(from.FromStringSliceToStringField, "::"), to.FromStringSliceToStringField))
  702. }
  703. for i, value := range from.FromTimeToStringField {
  704. if value.Format(time.DateTime) != to.FromTimeToStringField[i] {
  705. t.Fatalf("%+v\n", errors.Errorf("FromTimeToStringField not equal: from %v, to %v",
  706. value.Format(time.DateTime), to.FromTimeToStringField[i]))
  707. }
  708. }
  709. for i, value := range from.FromStringToTimeField {
  710. if value != to.FromStringToTimeField[i].Format(time.DateTime) {
  711. t.Fatalf("%+v\n", errors.Errorf("FromStringToTimeField not equal: from %v, to %v",
  712. value, to.FromStringToTimeField[i].Format(time.DateTime)))
  713. }
  714. }
  715. for i, value := range from.BasicPointerSliceField {
  716. if *value != *to.BasicPointerSliceField[i] {
  717. t.Fatalf("%+v\n", errors.Errorf("BasicPointerSliceField not equal: from %v, to %v",
  718. value, to.BasicPointerSliceField[i]))
  719. }
  720. }
  721. for i, value := range from.TimePointerSliceField {
  722. if !value.Equal(*to.TimePointerSliceField[i]) {
  723. t.Fatalf("%+v\n", errors.Errorf("TimeSliceField not equal: from %v, to %v",
  724. value, *to.TimePointerSliceField[i]))
  725. }
  726. }
  727. for i, value := range from.StructPointerSliceField {
  728. to.StructSliceField[i].checkFields(t, *value)
  729. }
  730. for i, value := range from.MapPointerSliceField {
  731. for k, v := range *value {
  732. if v != (*to.MapPointerSliceField[i])[k] {
  733. t.Fatalf("%+v\n", errors.Errorf("MapPointerSliceField not equal: from %v, to %v",
  734. value, (*to.MapPointerSliceField[i])[k]))
  735. }
  736. }
  737. }
  738. for i, value := range from.ChanPointerSliceField {
  739. if value != to.ChanPointerSliceField[i] {
  740. t.Fatalf("%+v\n", errors.Errorf("ChanPointerSliceField not equal: from %v, to %v",
  741. value, to.ChanPointerSliceField[i]))
  742. }
  743. }
  744. for i, value := range from.FuncPointerSliceField {
  745. if (*value)() != (*to.FuncPointerSliceField[i])() {
  746. t.Fatalf("%+v\n", errors.Errorf("FuncPointerSliceField not equal: from %v, to %v",
  747. (*value)(), (*to.FuncPointerSliceField[i])()))
  748. }
  749. }
  750. toStringSliceToStringSlice := strings.Split(to.FromStringSliceToStringPointerField, "::")
  751. for i, value := range from.FromStringSliceToStringPointerField {
  752. if *value != toStringSliceToStringSlice[i] {
  753. t.Fatalf("%+v\n", errors.Errorf("FromStringSliceToStringPointerField not equal: from %v, to %v",
  754. *value, toStringSliceToStringSlice[i]))
  755. }
  756. }
  757. for i, value := range from.FromTimeToStringPointerField {
  758. if value.Format(time.DateTime) != *to.FromTimeToStringPointerField[i] {
  759. t.Fatalf("%+v\n", errors.Errorf("FromTimeToStringPointerField not equal: from %v, to %v",
  760. value.Format(time.DateTime), *to.FromTimeToStringPointerField[i]))
  761. }
  762. }
  763. for i, value := range from.FromStringToTimePointerField {
  764. if *value != (*to.FromStringToTimePointerField[i]).Format(time.DateTime) {
  765. t.Fatalf("%+v\n", errors.Errorf("FromStringToTimePointerField not equal: from %v, to %v",
  766. *value, (*to.FromStringToTimePointerField[i]).Format(time.DateTime)))
  767. }
  768. }
  769. }
  770. func (to AssignTagToSlice) checkNil(t *testing.T) {
  771. if to.BasicField != "" {
  772. t.Fatalf("%+v\n", errors.Errorf("BasicField not zero"))
  773. }
  774. if to.BasicSliceField != nil {
  775. t.Fatalf("%+v\n", errors.Errorf("BasicSliceField not nil"))
  776. }
  777. if to.TimeSliceField != nil {
  778. t.Fatalf("%+v\n", errors.Errorf("TimeSliceField not nil"))
  779. }
  780. if to.StructSliceField != nil {
  781. t.Fatalf("%+v\n", errors.Errorf("StructSliceField not nil"))
  782. }
  783. if to.MapSliceField != nil {
  784. t.Fatalf("%+v\n", errors.Errorf("MapSliceField not nil"))
  785. }
  786. if to.ChanSliceField != nil {
  787. t.Fatalf("%+v\n", errors.Errorf("ChanSliceField not nil"))
  788. }
  789. if to.FuncSliceField != nil {
  790. t.Fatalf("%+v\n", errors.Errorf("FuncSliceField not nil"))
  791. }
  792. if to.FromStringSliceToStringField != "" {
  793. t.Fatalf("%+v\n", errors.Errorf("FromStringSliceToStringField not zero"))
  794. }
  795. if to.FromTimeToStringField != nil {
  796. t.Fatalf("%+v\n", errors.Errorf("FromTimeToStringField not nil"))
  797. }
  798. if to.FromStringToTimeField != nil {
  799. t.Fatalf("%+v\n", errors.Errorf("FromStringToTimeField not nil"))
  800. }
  801. if to.BasicPointerSliceField != nil {
  802. t.Fatalf("%+v\n", errors.Errorf("BasicPointerSliceField not nil"))
  803. }
  804. if to.TimePointerSliceField != nil {
  805. t.Fatalf("%+v\n", errors.Errorf("TimePointerSliceField not nil"))
  806. }
  807. if to.StructPointerSliceField != nil {
  808. t.Fatalf("%+v\n", errors.Errorf("StructPointerSliceField not nil"))
  809. }
  810. if to.MapPointerSliceField != nil {
  811. t.Fatalf("%+v\n", errors.Errorf("MapPointerSliceField not nil"))
  812. }
  813. if to.ChanPointerSliceField != nil {
  814. t.Fatalf("%+v\n", errors.Errorf("ChanPointerSliceField not nil"))
  815. }
  816. if to.FuncPointerSliceField != nil {
  817. t.Fatalf("%+v\n", errors.Errorf("FuncPointerSliceField not nil"))
  818. }
  819. if to.FromStringSliceToStringPointerField != "" {
  820. t.Fatalf("%+v\n", errors.Errorf("FromStringSliceToStringPointerField not zero"))
  821. }
  822. if to.FromTimeToStringPointerField != nil {
  823. t.Fatalf("%+v\n", errors.Errorf("FromTimeToStringPointerField not nil"))
  824. }
  825. if to.FromStringToTimePointerField != nil {
  826. t.Fatalf("%+v\n", errors.Errorf("FromStringToTimePointerField not nil"))
  827. }
  828. }
  829. type AssignTagToSlicePointerField struct {
  830. BasicField *string
  831. BasicSliceField *[]string
  832. TimeSliceField *[]time.Time
  833. StructSliceField *[]AssignTagTo
  834. MapSliceField *[]map[string]string
  835. ChanSliceField *[]chan any
  836. FuncSliceField *[]func() string
  837. FromStringSliceToStringField *string
  838. FromTimeToStringField *[]string
  839. FromStringToTimeField *[]time.Time
  840. BasicPointerSliceField *[]*string
  841. TimePointerSliceField *[]*time.Time
  842. StructPointerSliceField *[]*AssignTagTo
  843. MapPointerSliceField *[]*map[string]string
  844. ChanPointerSliceField *[]*chan any
  845. FuncPointerSliceField *[]*func() string
  846. FromStringSliceToStringPointerField *string
  847. FromTimeToStringPointerField *[]*string
  848. FromStringToTimePointerField *[]*time.Time
  849. }
  850. func (to AssignTagToSlicePointerField) checkFields(t *testing.T, from AssignTagFromSlice) {
  851. if from.BasicField != *to.BasicField {
  852. t.Fatalf("%+v\n", errors.Errorf("BasicField not equal: from %v, to %v",
  853. from.BasicField, *to.BasicField))
  854. }
  855. for i, value := range from.BasicSliceField {
  856. if value != (*to.BasicSliceField)[i] {
  857. t.Fatalf("%+v\n", errors.Errorf("BasicSliceField not equal: from %v, to %v",
  858. value, (*to.BasicSliceField)[i]))
  859. }
  860. }
  861. for i, value := range from.TimeSliceField {
  862. if !value.Equal((*to.TimeSliceField)[i]) {
  863. t.Fatalf("%+v\n", errors.Errorf("TimeSliceField not equal: from %v, to %v",
  864. value, (*to.TimeSliceField)[i]))
  865. }
  866. }
  867. for i, value := range from.StructSliceField {
  868. (*to.StructSliceField)[i].checkFields(t, value)
  869. }
  870. for i, value := range from.MapSliceField {
  871. for k, v := range value {
  872. if v != (*to.MapSliceField)[i][k] {
  873. t.Fatalf("%+v\n", errors.Errorf("MapSliceField not equal: from %v, to %v",
  874. value, (*to.MapSliceField)[i][k]))
  875. }
  876. }
  877. }
  878. for i, value := range from.ChanSliceField {
  879. if value != (*to.ChanSliceField)[i] {
  880. t.Fatalf("%+v\n", errors.Errorf("ChanSliceField not equal: from %v, to %v",
  881. value, (*to.ChanSliceField)[i]))
  882. }
  883. }
  884. for i, value := range from.FuncSliceField {
  885. if value() != (*to.FuncSliceField)[i]() {
  886. t.Fatalf("%+v\n", errors.Errorf("FuncSliceField not equal: from %v, to %v",
  887. value(), (*to.FuncSliceField)[i]()))
  888. }
  889. }
  890. if strings.Join(from.FromStringSliceToStringField, "::") != *to.FromStringSliceToStringField {
  891. t.Fatalf("%+v\n", errors.Errorf("FromStringSliceToStringField not equal: from %v, to %v",
  892. strings.Join(from.FromStringSliceToStringField, "::"), *to.FromStringSliceToStringField))
  893. }
  894. for i, value := range from.FromTimeToStringField {
  895. if value.Format(time.DateTime) != (*to.FromTimeToStringField)[i] {
  896. t.Fatalf("%+v\n", errors.Errorf("FromTimeToStringField not equal: from %v, to %v",
  897. value.Format(time.DateTime), (*to.FromTimeToStringField)[i]))
  898. }
  899. }
  900. for i, value := range from.FromStringToTimeField {
  901. if value != (*to.FromStringToTimeField)[i].Format(time.DateTime) {
  902. t.Fatalf("%+v\n", errors.Errorf("FromStringToTimeField not equal: from %v, to %v",
  903. value, (*to.FromStringToTimeField)[i].Format(time.DateTime)))
  904. }
  905. }
  906. for i, value := range from.BasicPointerSliceField {
  907. if *value != *(*to.BasicPointerSliceField)[i] {
  908. t.Fatalf("%+v\n", errors.Errorf("BasicPointerSliceField not equal: from %v, to %v",
  909. value, *(*to.BasicPointerSliceField)[i]))
  910. }
  911. }
  912. for i, value := range from.TimePointerSliceField {
  913. if !value.Equal(*(*to.TimePointerSliceField)[i]) {
  914. t.Fatalf("%+v\n", errors.Errorf("TimeSliceField not equal: from %v, to %v",
  915. value, *(*to.TimePointerSliceField)[i]))
  916. }
  917. }
  918. for i, value := range from.StructPointerSliceField {
  919. (*to.StructSliceField)[i].checkFields(t, *value)
  920. }
  921. for i, value := range from.MapPointerSliceField {
  922. for k, v := range *value {
  923. if v != (*(*to.MapPointerSliceField)[i])[k] {
  924. t.Fatalf("%+v\n", errors.Errorf("MapPointerSliceField not equal: from %v, to %v",
  925. value, (*(*to.MapPointerSliceField)[i])[k]))
  926. }
  927. }
  928. }
  929. for i, value := range from.ChanPointerSliceField {
  930. if value != (*to.ChanPointerSliceField)[i] {
  931. t.Fatalf("%+v\n", errors.Errorf("ChanPointerSliceField not equal: from %v, to %v",
  932. value, (*to.ChanPointerSliceField)[i]))
  933. }
  934. }
  935. for i, value := range from.FuncPointerSliceField {
  936. if (*value)() != (*(*to.FuncPointerSliceField)[i])() {
  937. t.Fatalf("%+v\n", errors.Errorf("FuncPointerSliceField not equal: from %v, to %v",
  938. (*value)(), (*(*to.FuncPointerSliceField)[i])()))
  939. }
  940. }
  941. toStringSliceToStringSlice := strings.Split(*to.FromStringSliceToStringPointerField, "::")
  942. for i, value := range from.FromStringSliceToStringPointerField {
  943. if *value != toStringSliceToStringSlice[i] {
  944. t.Fatalf("%+v\n", errors.Errorf("FromStringSliceToStringPointerField not equal: from %v, to %v",
  945. *value, toStringSliceToStringSlice[i]))
  946. }
  947. }
  948. for i, value := range from.FromTimeToStringPointerField {
  949. if value.Format(time.DateTime) != *(*to.FromTimeToStringPointerField)[i] {
  950. t.Fatalf("%+v\n", errors.Errorf("FromTimeToStringPointerField not equal: from %v, to %v",
  951. value.Format(time.DateTime), *(*to.FromTimeToStringPointerField)[i]))
  952. }
  953. }
  954. for i, value := range from.FromStringToTimePointerField {
  955. if *value != (*to.FromStringToTimePointerField)[i].Format(time.DateTime) {
  956. t.Fatalf("%+v\n", errors.Errorf("FromStringToTimePointerField not equal: from %v, to %v",
  957. *value, (*to.FromStringToTimePointerField)[i].Format(time.DateTime)))
  958. }
  959. }
  960. }
  961. func (to AssignTagToSlicePointerField) checkNil(t *testing.T) {
  962. if to.BasicField != nil {
  963. t.Fatalf("%+v\n", errors.Errorf("BasicField not nil"))
  964. }
  965. if to.BasicSliceField != nil {
  966. t.Fatalf("%+v\n", errors.Errorf("BasicSliceField not nil"))
  967. }
  968. if to.TimeSliceField != nil {
  969. t.Fatalf("%+v\n", errors.Errorf("TimeSliceField not nil"))
  970. }
  971. if to.StructSliceField != nil {
  972. t.Fatalf("%+v\n", errors.Errorf("StructSliceField not nil"))
  973. }
  974. if to.MapSliceField != nil {
  975. t.Fatalf("%+v\n", errors.Errorf("MapSliceField not nil"))
  976. }
  977. if to.ChanSliceField != nil {
  978. t.Fatalf("%+v\n", errors.Errorf("ChanSliceField not nil"))
  979. }
  980. if to.FuncSliceField != nil {
  981. t.Fatalf("%+v\n", errors.Errorf("FuncSliceField not nil"))
  982. }
  983. if to.FromStringSliceToStringField != nil {
  984. t.Fatalf("%+v\n", errors.Errorf("FromStringSliceToStringField not nil"))
  985. }
  986. if to.FromTimeToStringField != nil {
  987. t.Fatalf("%+v\n", errors.Errorf("FromTimeToStringField not nil"))
  988. }
  989. if to.FromStringToTimeField != nil {
  990. t.Fatalf("%+v\n", errors.Errorf("FromStringToTimeField not nil"))
  991. }
  992. if to.BasicPointerSliceField != nil {
  993. t.Fatalf("%+v\n", errors.Errorf("BasicPointerSliceField not nil"))
  994. }
  995. if to.TimePointerSliceField != nil {
  996. t.Fatalf("%+v\n", errors.Errorf("TimePointerSliceField not nil"))
  997. }
  998. if to.StructPointerSliceField != nil {
  999. t.Fatalf("%+v\n", errors.Errorf("StructPointerSliceField not nil"))
  1000. }
  1001. if to.MapPointerSliceField != nil {
  1002. t.Fatalf("%+v\n", errors.Errorf("MapPointerSliceField not nil"))
  1003. }
  1004. if to.ChanPointerSliceField != nil {
  1005. t.Fatalf("%+v\n", errors.Errorf("ChanPointerSliceField not nil"))
  1006. }
  1007. if to.FuncPointerSliceField != nil {
  1008. t.Fatalf("%+v\n", errors.Errorf("FuncPointerSliceField not nil"))
  1009. }
  1010. if to.FromStringSliceToStringPointerField != nil {
  1011. t.Fatalf("%+v\n", errors.Errorf("FuncPointerSliceField not nil"))
  1012. }
  1013. if to.FromTimeToStringPointerField != nil {
  1014. t.Fatalf("%+v\n", errors.Errorf("FromTimeToStringPointerField not nil"))
  1015. }
  1016. if to.FromStringToTimePointerField != nil {
  1017. t.Fatalf("%+v\n", errors.Errorf("FromStringToTimePointerField not nil"))
  1018. }
  1019. }
  1020. func TestAssignTagDefaultUsageSlice(t *testing.T) {
  1021. retValue1 := strutils.SimpleUUID()
  1022. retValue2 := strutils.SimpleUUID()
  1023. str1 := strutils.SimpleUUID()
  1024. str2 := strutils.SimpleUUID()
  1025. time1 := time.Now()
  1026. time2 := time.Now().Add(-1 * time.Hour)
  1027. map1 := map[string]string{"name": strutils.SimpleUUID()}
  1028. map2 := map[string]string{"name": strutils.SimpleUUID()}
  1029. chan1 := make(chan any)
  1030. chan2 := make(chan any)
  1031. func1 := func() string { return retValue1 }
  1032. func2 := func() string { return retValue2 }
  1033. struct1 := AssignTagFrom{
  1034. StringField: strutils.SimpleUUID(),
  1035. BoolField: rand.Intn(2) == 0,
  1036. IntField: rand.Int(),
  1037. Int8Field: int8(rand.Int()),
  1038. Int16Field: int16(rand.Int()),
  1039. Int32Field: int32(rand.Int()),
  1040. Int64Field: int64(rand.Int()),
  1041. UintField: uint(rand.Int()),
  1042. Uint8Field: uint8(rand.Int()),
  1043. Uint16Field: uint16(rand.Int()),
  1044. Uint32Field: uint32(rand.Int()),
  1045. Uint64Field: uint64(rand.Int()),
  1046. Float32Field: rand.Float32(),
  1047. Float64Field: rand.Float64(),
  1048. MapField: map[string]string{strutils.SimpleUUID(): strutils.SimpleUUID()},
  1049. ChanField: make(chan any),
  1050. FuncField: func() string { return retValue1 },
  1051. StructField: struct{ ID string }{ID: strutils.SimpleUUID()},
  1052. FromTimeToStringField: time.Now().Local(),
  1053. FromTimeToTimeField: time.Now().Local(),
  1054. FromStringToTimeField: time.Now().Local().Format(time.DateTime),
  1055. }
  1056. struct2 := AssignTagFrom{
  1057. StringField: strutils.SimpleUUID(),
  1058. BoolField: rand.Intn(2) == 0,
  1059. IntField: rand.Int(),
  1060. Int8Field: int8(rand.Int()),
  1061. Int16Field: int16(rand.Int()),
  1062. Int32Field: int32(rand.Int()),
  1063. Int64Field: int64(rand.Int()),
  1064. UintField: uint(rand.Int()),
  1065. Uint8Field: uint8(rand.Int()),
  1066. Uint16Field: uint16(rand.Int()),
  1067. Uint32Field: uint32(rand.Int()),
  1068. Uint64Field: uint64(rand.Int()),
  1069. Float32Field: rand.Float32(),
  1070. Float64Field: rand.Float64(),
  1071. MapField: map[string]string{strutils.SimpleUUID(): strutils.SimpleUUID()},
  1072. ChanField: make(chan any),
  1073. FuncField: func() string { return retValue1 },
  1074. StructField: struct{ ID string }{ID: strutils.SimpleUUID()},
  1075. FromTimeToStringField: time.Now().Local(),
  1076. FromTimeToTimeField: time.Now().Local(),
  1077. FromStringToTimeField: time.Now().Local().Format(time.DateTime),
  1078. }
  1079. basicField := str1
  1080. basicSliceField := []string{str1, str2}
  1081. timeSliceField := []time.Time{time1, time2}
  1082. structSliceField := []AssignTagFrom{struct1, struct2}
  1083. mapSliceField := []map[string]string{map1, map2}
  1084. chanSliceField := []chan any{chan1, chan2}
  1085. funcSliceField := []func() string{func1, func2}
  1086. basicPointerSliceField := []*string{&str1, &str2}
  1087. timePointerSliceField := []*time.Time{&time1, &time2}
  1088. structPointerSliceField := []*AssignTagFrom{&struct1, &struct2}
  1089. mapPointerSliceField := []*map[string]string{&map1, &map2}
  1090. chanPointerSliceField := []*chan any{&chan1, &chan2}
  1091. funcPointerSliceField := []*func() string{&func1, &func2}
  1092. fromStringSliceToStringField := []string{str1, str2}
  1093. fromTimeToStringField := []time.Time{time1, time2}
  1094. fromStringToTimeField := []string{time1.Format(time.DateTime), time2.Format(time.DateTime)}
  1095. fromStringSliceToStringPointerField := []*string{&str1, &str2}
  1096. fromTimeToStringPointerField := []*time.Time{&time1, &time2}
  1097. from := AssignTagFromSlice{
  1098. BasicField: basicField,
  1099. BasicSliceField: basicSliceField,
  1100. TimeSliceField: timeSliceField,
  1101. StructSliceField: structSliceField,
  1102. MapSliceField: mapSliceField,
  1103. ChanSliceField: chanSliceField,
  1104. FuncSliceField: funcSliceField,
  1105. FromStringSliceToStringField: fromStringSliceToStringField,
  1106. FromTimeToStringField: fromTimeToStringField,
  1107. FromStringToTimeField: fromStringToTimeField,
  1108. BasicPointerSliceField: basicPointerSliceField,
  1109. TimePointerSliceField: timePointerSliceField,
  1110. StructPointerSliceField: structPointerSliceField,
  1111. MapPointerSliceField: mapPointerSliceField,
  1112. ChanPointerSliceField: chanPointerSliceField,
  1113. FuncPointerSliceField: funcPointerSliceField,
  1114. FromStringSliceToStringPointerField: fromStringSliceToStringPointerField,
  1115. FromTimeToStringPointerField: fromTimeToStringPointerField,
  1116. }
  1117. fromPointer := AssignTagFromSlicePointerField{
  1118. BasicField: &basicField,
  1119. BasicSliceField: &basicSliceField,
  1120. TimeSliceField: &timeSliceField,
  1121. StructSliceField: &structSliceField,
  1122. MapSliceField: &mapSliceField,
  1123. ChanSliceField: &chanSliceField,
  1124. FuncSliceField: &funcSliceField,
  1125. FromStringSliceToStringField: &fromStringSliceToStringField,
  1126. FromTimeToStringField: &fromTimeToStringField,
  1127. FromStringToTimeField: &fromStringToTimeField,
  1128. BasicPointerSliceField: &basicPointerSliceField,
  1129. TimePointerSliceField: &timePointerSliceField,
  1130. StructPointerSliceField: &structPointerSliceField,
  1131. MapPointerSliceField: &mapPointerSliceField,
  1132. ChanPointerSliceField: &chanPointerSliceField,
  1133. FuncPointerSliceField: &funcPointerSliceField,
  1134. FromStringSliceToStringPointerField: &fromStringSliceToStringPointerField,
  1135. FromTimeToStringPointerField: &fromTimeToStringPointerField,
  1136. }
  1137. fromPointerNil := AssignTagFromPointerField{}
  1138. to := AssignTagToSlice{}
  1139. toPointer := AssignTagToSlicePointerField{}
  1140. err := assign.DefaultUsage(from, to)
  1141. if err == nil || err.Error() != "返回类型不是结构指针" {
  1142. t.Fatalf("%+v\n", errors.Errorf("没有检测出to参数必须是指针类型"))
  1143. }
  1144. err = assign.DefaultUsage(from, toPointer)
  1145. if err == nil || err.Error() != "返回类型不是结构指针" {
  1146. t.Fatalf("%+v\n", errors.Errorf("没有检测出to参数必须是指针类型"))
  1147. }
  1148. err = assign.DefaultUsage(fromPointer, to)
  1149. if err == nil || err.Error() != "返回类型不是结构指针" {
  1150. t.Fatalf("%+v\n", errors.Errorf("没有检测出to参数必须是指针类型"))
  1151. }
  1152. err = assign.DefaultUsage(fromPointer, toPointer)
  1153. if err == nil || err.Error() != "返回类型不是结构指针" {
  1154. t.Fatalf("%+v\n", errors.Errorf("没有检测出to参数必须是指针类型"))
  1155. }
  1156. err = assign.DefaultUsage(from, &to)
  1157. if err != nil {
  1158. t.Fatalf("%+v\n", err)
  1159. }
  1160. to.checkFields(t, from)
  1161. to = AssignTagToSlice{}
  1162. toPointer = AssignTagToSlicePointerField{}
  1163. err = assign.DefaultUsage(from, &toPointer)
  1164. if err != nil {
  1165. t.Fatalf("%+v\n", err)
  1166. }
  1167. toPointer.checkFields(t, from)
  1168. to = AssignTagToSlice{}
  1169. toPointer = AssignTagToSlicePointerField{}
  1170. err = assign.DefaultUsage(fromPointer, &to)
  1171. if err != nil {
  1172. t.Fatalf("%+v\n", err)
  1173. }
  1174. to.checkFields(t, from)
  1175. to = AssignTagToSlice{}
  1176. toPointer = AssignTagToSlicePointerField{}
  1177. err = assign.DefaultUsage(fromPointer, &toPointer)
  1178. if err != nil {
  1179. t.Fatalf("%+v\n", err)
  1180. }
  1181. toPointer.checkFields(t, from)
  1182. to = AssignTagToSlice{}
  1183. toPointer = AssignTagToSlicePointerField{}
  1184. err = assign.DefaultUsage(&from, to)
  1185. if err == nil || err.Error() != "返回类型不是结构指针" {
  1186. t.Fatalf("%+v\n", errors.Errorf("没有检测出to参数必须是指针类型"))
  1187. }
  1188. err = assign.DefaultUsage(&from, toPointer)
  1189. if err == nil || err.Error() != "返回类型不是结构指针" {
  1190. t.Fatalf("%+v\n", errors.Errorf("没有检测出to参数必须是指针类型"))
  1191. }
  1192. err = assign.DefaultUsage(&fromPointer, to)
  1193. if err == nil || err.Error() != "返回类型不是结构指针" {
  1194. t.Fatalf("%+v\n", errors.Errorf("没有检测出to参数必须是指针类型"))
  1195. }
  1196. err = assign.DefaultUsage(&fromPointer, toPointer)
  1197. if err == nil || err.Error() != "返回类型不是结构指针" {
  1198. t.Fatalf("%+v\n", errors.Errorf("没有检测出to参数必须是指针类型"))
  1199. }
  1200. to = AssignTagToSlice{}
  1201. toPointer = AssignTagToSlicePointerField{}
  1202. err = assign.DefaultUsage(&from, &to)
  1203. if err != nil {
  1204. t.Fatalf("%+v\n", err)
  1205. }
  1206. to.checkFields(t, from)
  1207. to = AssignTagToSlice{}
  1208. toPointer = AssignTagToSlicePointerField{}
  1209. err = assign.DefaultUsage(&from, &toPointer)
  1210. if err != nil {
  1211. t.Fatalf("%+v\n", err)
  1212. }
  1213. toPointer.checkFields(t, from)
  1214. to = AssignTagToSlice{}
  1215. toPointer = AssignTagToSlicePointerField{}
  1216. err = assign.DefaultUsage(&fromPointer, &to)
  1217. if err != nil {
  1218. t.Fatalf("%+v\n", err)
  1219. }
  1220. to.checkFields(t, from)
  1221. to = AssignTagToSlice{}
  1222. toPointer = AssignTagToSlicePointerField{}
  1223. err = assign.DefaultUsage(&fromPointer, &toPointer)
  1224. if err != nil {
  1225. t.Fatalf("%+v\n", err)
  1226. }
  1227. toPointer.checkFields(t, from)
  1228. to = AssignTagToSlice{}
  1229. toPointer = AssignTagToSlicePointerField{}
  1230. err = assign.DefaultUsage(fromPointerNil, &to)
  1231. if err != nil {
  1232. t.Fatalf("%+v\n", err)
  1233. }
  1234. to.checkNil(t)
  1235. to = AssignTagToSlice{}
  1236. toPointer = AssignTagToSlicePointerField{}
  1237. err = assign.DefaultUsage(fromPointerNil, &toPointer)
  1238. if err != nil {
  1239. t.Fatalf("%+v\n", err)
  1240. }
  1241. toPointer.checkNil(t)
  1242. to = AssignTagToSlice{}
  1243. toPointer = AssignTagToSlicePointerField{}
  1244. err = assign.DefaultUsage(&fromPointerNil, &to)
  1245. if err != nil {
  1246. t.Fatalf("%+v\n", err)
  1247. }
  1248. to.checkNil(t)
  1249. to = AssignTagToSlice{}
  1250. toPointer = AssignTagToSlicePointerField{}
  1251. err = assign.DefaultUsage(&fromPointerNil, &toPointer)
  1252. if err != nil {
  1253. t.Fatalf("%+v\n", err)
  1254. }
  1255. toPointer.checkNil(t)
  1256. }