assign_tag_test.go 21 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561
  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. SliceField []string `assign:"toField:SliceField"`
  27. MapField map[string]string `assign:"toField:MapField"`
  28. ChanField chan any `assign:"toField:ChanField"`
  29. FuncField func() string `assign:"toField:FuncField"`
  30. StructField struct{ ID string } `assign:"toField:StructField"`
  31. FromStringSliceToStringField []string `assign:"toField:FromStringSliceToStringField"`
  32. FromTimeToStringField time.Time `assign:"toField:FromTimeToStringField"`
  33. FromTimeToTimeField time.Time `assign:"toField:FromTimeToTimeField"`
  34. FromStringToTimeField string `assign:"toField:FromStringToTimeField"`
  35. }
  36. type AssignTagFromPointerField struct {
  37. StringField *string `assign:"toField:StringField"`
  38. BoolField *bool `assign:"toField:BoolField"`
  39. IntField *int `assign:"toField:IntField"`
  40. Int8Field *int8 `assign:"toField:Int8Field"`
  41. Int16Field *int16 `assign:"toField:Int16Field"`
  42. Int32Field *int32 `assign:"toField:Int32Field"`
  43. Int64Field *int64 `assign:"toField:Int64Field"`
  44. UintField *uint `assign:"toField:UintField"`
  45. Uint8Field *uint8 `assign:"toField:Uint8Field"`
  46. Uint16Field *uint16 `assign:"toField:Uint16Field"`
  47. Uint32Field *uint32 `assign:"toField:Uint32Field"`
  48. Uint64Field *uint64 `assign:"toField:Uint64Field"`
  49. Float32Field *float32 `assign:"toField:Float32Field"`
  50. Float64Field *float64 `assign:"toField:Float64Field"`
  51. SliceField *[]string `assign:"toField:SliceField"`
  52. MapField *map[string]string `assign:"toField:MapField"`
  53. ChanField *chan any `assign:"toField:ChanField"`
  54. FuncField *func() string `assign:"toField:FuncField"`
  55. StructField *struct{ ID string } `assign:"toField:StructField"`
  56. FromStringSliceToStringField *[]string `assign:"toField:FromStringSliceToStringField"`
  57. FromTimeToStringField *time.Time `assign:"toField:FromTimeToStringField"`
  58. FromTimeToTimeField *time.Time `assign:"toField:FromTimeToTimeField"`
  59. FromStringToTimeField *string `assign:"toField:FromStringToTimeField"`
  60. }
  61. type AssignTagTo struct {
  62. StringField string
  63. BoolField bool
  64. IntField int
  65. Int8Field int8
  66. Int16Field int16
  67. Int32Field int32
  68. Int64Field int64
  69. UintField uint
  70. Uint8Field uint8
  71. Uint16Field uint16
  72. Uint32Field uint32
  73. Uint64Field uint64
  74. Float32Field float32
  75. Float64Field float64
  76. SliceField []string
  77. MapField map[string]string
  78. ChanField chan any
  79. FuncField func() string
  80. StructField struct{ ID string }
  81. FromStringSliceToStringField string
  82. FromTimeToStringField string
  83. FromTimeToTimeField time.Time
  84. FromStringToTimeField time.Time
  85. }
  86. func (to AssignTagTo) checkFields(t *testing.T, from AssignTagFrom) {
  87. if from.StringField != to.StringField {
  88. t.Fatalf("%+v\n", errors.Errorf("StringField not equal: from %v, to %v",
  89. from.StringField, to.StringField))
  90. }
  91. if from.BoolField != to.BoolField {
  92. t.Fatalf("%+v\n", errors.Errorf("BoolField not equal: from %v, to %v",
  93. from.BoolField, to.BoolField))
  94. }
  95. if from.IntField != to.IntField {
  96. t.Fatalf("%+v\n", errors.Errorf("IntField not equal: from %v, to %v",
  97. from.IntField, to.IntField))
  98. }
  99. if from.Int8Field != to.Int8Field {
  100. t.Fatalf("%+v\n", errors.Errorf("Int8Field not equal: from %v, to %v",
  101. from.Int8Field, to.Int8Field))
  102. }
  103. if from.Int16Field != to.Int16Field {
  104. t.Fatalf("%+v\n", errors.Errorf("Int16Field not equal: from %v, to %v",
  105. from.Int16Field, to.Int16Field))
  106. }
  107. if from.Int32Field != to.Int32Field {
  108. t.Fatalf("%+v\n", errors.Errorf("Int32Field not equal: from %v, to %v",
  109. from.Int32Field, to.Int32Field))
  110. }
  111. if from.Int64Field != to.Int64Field {
  112. t.Fatalf("%+v\n", errors.Errorf("Int64Field not equal: from %v, to %v",
  113. from.Int64Field, to.Int64Field))
  114. }
  115. if from.UintField != to.UintField {
  116. t.Fatalf("%+v\n", errors.Errorf("UintField not equal: from %v, to %v",
  117. from.UintField, to.UintField))
  118. }
  119. if from.Uint8Field != to.Uint8Field {
  120. t.Fatalf("%+v\n", errors.Errorf("Uint8Field not equal: from %v, to %v",
  121. from.Uint8Field, to.Uint8Field))
  122. }
  123. if from.Uint16Field != to.Uint16Field {
  124. t.Fatalf("%+v\n", errors.Errorf("Uint16Field not equal: from %v, to %v",
  125. from.Uint16Field, to.Uint16Field))
  126. }
  127. if from.Uint32Field != to.Uint32Field {
  128. t.Fatalf("%+v\n", errors.Errorf("Uint32Field not equal: from %v, to %v",
  129. from.Uint32Field, to.Uint32Field))
  130. }
  131. if from.Uint64Field != to.Uint64Field {
  132. t.Fatalf("%+v\n", errors.Errorf("Uint64Field not equal: from %v, to %v",
  133. from.Uint64Field, to.Uint64Field))
  134. }
  135. if from.Float32Field != to.Float32Field {
  136. t.Fatalf("%+v\n", errors.Errorf("Float32Field not equal: from %v, to %v",
  137. from.Float32Field, to.Float32Field))
  138. }
  139. if from.Float64Field != to.Float64Field {
  140. t.Fatalf("%+v\n", errors.Errorf("Float64Field not equal: from %v, to %v",
  141. from.Float64Field, to.Float64Field))
  142. }
  143. for i, value := range from.SliceField {
  144. if value != to.SliceField[i] {
  145. t.Fatalf("%+v\n", errors.Errorf("SliceField not equal: from %v, to %v",
  146. value, to.SliceField[i]))
  147. }
  148. }
  149. for key, value := range from.MapField {
  150. if value != to.MapField[key] {
  151. t.Fatalf("%+v\n", errors.Errorf("MapField not equal: from %v, to %v",
  152. value, to.MapField[key]))
  153. }
  154. }
  155. if from.ChanField != to.ChanField {
  156. t.Fatalf("%+v\n", errors.Errorf("ChanField not equal: from %v, to %v",
  157. from.ChanField, to.ChanField))
  158. }
  159. if from.FuncField() != to.FuncField() {
  160. t.Fatalf("%+v\n", errors.Errorf("FuncField not equal: from %v, to %v",
  161. from.FuncField(), to.FuncField()))
  162. }
  163. if from.StructField.ID != to.StructField.ID {
  164. t.Fatalf("%+v\n", errors.Errorf("StructField not equal: from %v, to %v",
  165. from.StructField.ID, to.StructField.ID))
  166. }
  167. if strings.Join(from.FromStringSliceToStringField, "::") != to.FromStringSliceToStringField {
  168. t.Fatalf("%+v\n", errors.Errorf("FromStringSliceToStringField not equal: from %v, to %v",
  169. strings.Join(from.FromStringSliceToStringField, "::"), to.FromStringSliceToStringField))
  170. }
  171. if from.FromTimeToStringField.Format(time.DateTime) != to.FromTimeToStringField {
  172. t.Fatalf("%+v\n", errors.Errorf("FromTimeToStringField not equal: from %v, to %v",
  173. from.FromTimeToStringField.Format(time.DateTime), to.FromTimeToStringField))
  174. }
  175. if from.FromTimeToTimeField.Format(time.DateTime) != to.FromTimeToTimeField.Format(time.DateTime) {
  176. t.Fatalf("%+v\n", errors.Errorf("FromTimeToTimeField not equal: from %v, to %v",
  177. from.FromTimeToTimeField.Format(time.DateTime), to.FromTimeToTimeField.Format(time.DateTime)))
  178. }
  179. if from.FromStringToTimeField != to.FromStringToTimeField.Format(time.DateTime) {
  180. t.Fatalf("%+v\n", errors.Errorf("FromStringToTimeField not equal: from %v, to %v",
  181. from.FromStringToTimeField, to.FromStringToTimeField.Format(time.DateTime)))
  182. }
  183. }
  184. type AssignTagToPointerField struct {
  185. StringField *string
  186. BoolField *bool
  187. IntField *int
  188. Int8Field *int8
  189. Int16Field *int16
  190. Int32Field *int32
  191. Int64Field *int64
  192. UintField *uint
  193. Uint8Field *uint8
  194. Uint16Field *uint16
  195. Uint32Field *uint32
  196. Uint64Field *uint64
  197. Float32Field *float32
  198. Float64Field *float64
  199. SliceField *[]string
  200. MapField *map[string]string
  201. ChanField *chan any
  202. FuncField *func() string
  203. StructField *struct{ ID string }
  204. FromStringSliceToStringField *string
  205. FromTimeToStringField *string
  206. FromTimeToTimeField *time.Time
  207. FromStringToTimeField *time.Time
  208. }
  209. func (to AssignTagToPointerField) checkFields(t *testing.T, from AssignTagFrom) {
  210. if from.StringField != *to.StringField {
  211. t.Fatalf("%+v\n", errors.Errorf("StringField not equal: from %v, to %v",
  212. from.StringField, *to.StringField))
  213. }
  214. if from.BoolField != *to.BoolField {
  215. t.Fatalf("%+v\n", errors.Errorf("BoolField not equal: from %v, to %v",
  216. from.BoolField, *to.BoolField))
  217. }
  218. if from.IntField != *to.IntField {
  219. t.Fatalf("%+v\n", errors.Errorf("IntField not equal: from %v, to %v",
  220. from.IntField, *to.IntField))
  221. }
  222. if from.Int8Field != *to.Int8Field {
  223. t.Fatalf("%+v\n", errors.Errorf("Int8Field not equal: from %v, to %v",
  224. from.Int8Field, *to.Int8Field))
  225. }
  226. if from.Int16Field != *to.Int16Field {
  227. t.Fatalf("%+v\n", errors.Errorf("Int16Field not equal: from %v, to %v",
  228. from.Int16Field, *to.Int16Field))
  229. }
  230. if from.Int32Field != *to.Int32Field {
  231. t.Fatalf("%+v\n", errors.Errorf("Int32Field not equal: from %v, to %v",
  232. from.Int32Field, *to.Int32Field))
  233. }
  234. if from.Int64Field != *to.Int64Field {
  235. t.Fatalf("%+v\n", errors.Errorf("Int64Field not equal: from %v, to %v",
  236. from.Int64Field, *to.Int64Field))
  237. }
  238. if from.UintField != *to.UintField {
  239. t.Fatalf("%+v\n", errors.Errorf("UintField not equal: from %v, to %v",
  240. from.UintField, *to.UintField))
  241. }
  242. if from.Uint8Field != *to.Uint8Field {
  243. t.Fatalf("%+v\n", errors.Errorf("Uint8Field not equal: from %v, to %v",
  244. from.Uint8Field, *to.Uint8Field))
  245. }
  246. if from.Uint16Field != *to.Uint16Field {
  247. t.Fatalf("%+v\n", errors.Errorf("Uint16Field not equal: from %v, to %v",
  248. from.Uint16Field, *to.Uint16Field))
  249. }
  250. if from.Uint32Field != *to.Uint32Field {
  251. t.Fatalf("%+v\n", errors.Errorf("Uint32Field not equal: from %v, to %v",
  252. from.Uint32Field, *to.Uint32Field))
  253. }
  254. if from.Uint64Field != *to.Uint64Field {
  255. t.Fatalf("%+v\n", errors.Errorf("Uint64Field not equal: from %v, to %v",
  256. from.Uint64Field, *to.Uint64Field))
  257. }
  258. if from.Float32Field != *to.Float32Field {
  259. t.Fatalf("%+v\n", errors.Errorf("Float32Field not equal: from %v, to %v",
  260. from.Float32Field, *to.Float32Field))
  261. }
  262. if from.Float64Field != *to.Float64Field {
  263. t.Fatalf("%+v\n", errors.Errorf("Float64Field not equal: from %v, to %v",
  264. from.Float64Field, *to.Float64Field))
  265. }
  266. for i, value := range from.SliceField {
  267. if value != (*to.SliceField)[i] {
  268. t.Fatalf("%+v\n", errors.Errorf("SliceField not equal: from %v, to %v",
  269. value, (*to.SliceField)[i]))
  270. }
  271. }
  272. for key, value := range from.MapField {
  273. if value != (*to.MapField)[key] {
  274. t.Fatalf("%+v\n", errors.Errorf("MapField not equal: from %v, to %v",
  275. value, (*to.MapField)[key]))
  276. }
  277. }
  278. if from.ChanField != *to.ChanField {
  279. t.Fatalf("%+v\n", errors.Errorf("ChanField not equal: from %v, to %v",
  280. from.ChanField, *to.ChanField))
  281. }
  282. if from.FuncField() != (*to.FuncField)() {
  283. t.Fatalf("%+v\n", errors.Errorf("FuncField not equal: from %v, to %v",
  284. from.FuncField(), (*to.FuncField)()))
  285. }
  286. if from.StructField.ID != (*to.StructField).ID {
  287. t.Fatalf("%+v\n", errors.Errorf("StructField not equal: from %v, to %v",
  288. from.StructField.ID, (*to.StructField).ID))
  289. }
  290. if strings.Join(from.FromStringSliceToStringField, "::") != *to.FromStringSliceToStringField {
  291. t.Fatalf("%+v\n", errors.Errorf("FromStringSliceToStringField not equal: from %v, to %v",
  292. strings.Join(from.FromStringSliceToStringField, "::"), to.FromStringSliceToStringField))
  293. }
  294. if from.FromTimeToStringField.Format(time.DateTime) != *to.FromTimeToStringField {
  295. t.Fatalf("%+v\n", errors.Errorf("FromTimeToStringField not equal: from %v, to %v",
  296. from.FromTimeToStringField.Format(time.DateTime), to.FromTimeToStringField))
  297. }
  298. if from.FromTimeToTimeField.Format(time.DateTime) != (*to.FromTimeToTimeField).Format(time.DateTime) {
  299. t.Fatalf("%+v\n", errors.Errorf("FromTimeToTimeField not equal: from %v, to %v",
  300. from.FromTimeToTimeField.Format(time.DateTime), (*to.FromTimeToTimeField).Format(time.DateTime)))
  301. }
  302. if from.FromStringToTimeField != (*to.FromStringToTimeField).Format(time.DateTime) {
  303. t.Fatalf("%+v\n", errors.Errorf("FromStringToTimeField not equal: from %v, to %v",
  304. from.FromStringToTimeField, (*to.FromStringToTimeField).Format(time.DateTime)))
  305. }
  306. }
  307. func TestAssignTagDefaultUsage(t *testing.T) {
  308. stringField := strutils.SimpleUUID()
  309. boolField := rand.Intn(2) == 0
  310. intField := rand.Int()
  311. int8Field := int8(rand.Int())
  312. int16Field := int16(rand.Int())
  313. int32Field := int32(rand.Int())
  314. int64Field := int64(rand.Int())
  315. uintField := uint(rand.Int())
  316. uint8Field := uint8(rand.Int())
  317. uint16Field := uint16(rand.Int())
  318. uint32Field := uint32(rand.Int())
  319. uint64Field := uint64(rand.Int())
  320. float32Field := rand.Float32()
  321. float64Field := rand.Float64()
  322. sliceField := []string{strutils.SimpleUUID(), strutils.SimpleUUID()}
  323. mapField := map[string]string{strutils.SimpleUUID(): strutils.SimpleUUID()}
  324. chanField := make(chan any)
  325. returnValue := strutils.SimpleUUID()
  326. funcField := func() string { return returnValue }
  327. structField := struct{ ID string }{ID: strutils.SimpleUUID()}
  328. fromStringSliceToStringField := []string{strutils.SimpleUUID(), strutils.SimpleUUID()}
  329. fromTimeToStringField := time.Now().Local()
  330. fromTimeToTimeField := time.Now().Local()
  331. fromStringToTimeField := time.Now().Local().Format(time.DateTime)
  332. from := AssignTagFrom{
  333. StringField: stringField,
  334. BoolField: boolField,
  335. IntField: intField,
  336. Int8Field: int8Field,
  337. Int16Field: int16Field,
  338. Int32Field: int32Field,
  339. Int64Field: int64Field,
  340. UintField: uintField,
  341. Uint8Field: uint8Field,
  342. Uint16Field: uint16Field,
  343. Uint32Field: uint32Field,
  344. Uint64Field: uint64Field,
  345. Float32Field: float32Field,
  346. Float64Field: float64Field,
  347. SliceField: sliceField,
  348. MapField: mapField,
  349. ChanField: chanField,
  350. FuncField: funcField,
  351. StructField: structField,
  352. FromStringSliceToStringField: fromStringSliceToStringField,
  353. FromTimeToStringField: fromTimeToStringField,
  354. FromTimeToTimeField: fromTimeToTimeField,
  355. FromStringToTimeField: fromStringToTimeField,
  356. }
  357. fromPointer := AssignTagFromPointerField{
  358. StringField: &stringField,
  359. BoolField: &boolField,
  360. IntField: &intField,
  361. Int8Field: &int8Field,
  362. Int16Field: &int16Field,
  363. Int32Field: &int32Field,
  364. Int64Field: &int64Field,
  365. UintField: &uintField,
  366. Uint8Field: &uint8Field,
  367. Uint16Field: &uint16Field,
  368. Uint32Field: &uint32Field,
  369. Uint64Field: &uint64Field,
  370. Float32Field: &float32Field,
  371. Float64Field: &float64Field,
  372. SliceField: &sliceField,
  373. MapField: &mapField,
  374. ChanField: &chanField,
  375. FuncField: &funcField,
  376. StructField: &structField,
  377. FromStringSliceToStringField: &fromStringSliceToStringField,
  378. FromTimeToStringField: &fromTimeToStringField,
  379. FromTimeToTimeField: &fromTimeToTimeField,
  380. FromStringToTimeField: &fromStringToTimeField,
  381. }
  382. fromPointerNil := AssignTagFromPointerField{}
  383. to := AssignTagTo{}
  384. toPointer := AssignTagToPointerField{}
  385. err := assign.DefaultUsage(from, to)
  386. if err == nil || err.Error() != "返回类型不是结构指针" {
  387. t.Fatalf("%+v\n", errors.Errorf("没有检测出to参数必须是指针类型"))
  388. }
  389. err = assign.DefaultUsage(from, toPointer)
  390. if err == nil || err.Error() != "返回类型不是结构指针" {
  391. t.Fatalf("%+v\n", errors.Errorf("没有检测出to参数必须是指针类型"))
  392. }
  393. err = assign.DefaultUsage(fromPointer, to)
  394. if err == nil || err.Error() != "返回类型不是结构指针" {
  395. t.Fatalf("%+v\n", errors.Errorf("没有检测出to参数必须是指针类型"))
  396. }
  397. err = assign.DefaultUsage(fromPointer, toPointer)
  398. if err == nil || err.Error() != "返回类型不是结构指针" {
  399. t.Fatalf("%+v\n", errors.Errorf("没有检测出to参数必须是指针类型"))
  400. }
  401. err = assign.DefaultUsage(from, &to)
  402. if err != nil {
  403. t.Fatalf("%+v\n", err)
  404. }
  405. to.checkFields(t, from)
  406. err = assign.DefaultUsage(from, &toPointer)
  407. if err != nil {
  408. t.Fatalf("%+v\n", err)
  409. }
  410. toPointer.checkFields(t, from)
  411. err = assign.DefaultUsage(fromPointer, &to)
  412. if err != nil {
  413. t.Fatalf("%+v\n", err)
  414. }
  415. to.checkFields(t, from)
  416. err = assign.DefaultUsage(fromPointer, &toPointer)
  417. if err != nil {
  418. t.Fatalf("%+v\n", err)
  419. }
  420. toPointer.checkFields(t, from)
  421. err = assign.DefaultUsage(&from, to)
  422. if err == nil || err.Error() != "返回类型不是结构指针" {
  423. t.Fatalf("%+v\n", errors.Errorf("没有检测出to参数必须是指针类型"))
  424. }
  425. err = assign.DefaultUsage(&from, toPointer)
  426. if err == nil || err.Error() != "返回类型不是结构指针" {
  427. t.Fatalf("%+v\n", errors.Errorf("没有检测出to参数必须是指针类型"))
  428. }
  429. err = assign.DefaultUsage(&fromPointer, to)
  430. if err == nil || err.Error() != "返回类型不是结构指针" {
  431. t.Fatalf("%+v\n", errors.Errorf("没有检测出to参数必须是指针类型"))
  432. }
  433. err = assign.DefaultUsage(&fromPointer, toPointer)
  434. if err == nil || err.Error() != "返回类型不是结构指针" {
  435. t.Fatalf("%+v\n", errors.Errorf("没有检测出to参数必须是指针类型"))
  436. }
  437. err = assign.DefaultUsage(&from, &to)
  438. if err != nil {
  439. t.Fatalf("%+v\n", err)
  440. }
  441. to.checkFields(t, from)
  442. err = assign.DefaultUsage(&from, &toPointer)
  443. if err != nil {
  444. t.Fatalf("%+v\n", err)
  445. }
  446. toPointer.checkFields(t, from)
  447. err = assign.DefaultUsage(&fromPointer, &to)
  448. if err != nil {
  449. t.Fatalf("%+v\n", err)
  450. }
  451. to.checkFields(t, from)
  452. err = assign.DefaultUsage(&fromPointer, &toPointer)
  453. if err != nil {
  454. t.Fatalf("%+v\n", err)
  455. }
  456. toPointer.checkFields(t, from)
  457. err = assign.DefaultUsage(fromPointerNil, &to)
  458. if err == nil || err.Error() != "无法设置值,请检查是否传递的是非指针结构变量且字段为nil" {
  459. t.Fatalf("%+v\n", errors.Errorf("没有检测出from如果有nil字段,必须使用指针结构变量"))
  460. }
  461. err = assign.DefaultUsage(fromPointerNil, &toPointer)
  462. if err == nil || err.Error() != "无法设置值,请检查是否传递的是非指针结构变量且字段为nil" {
  463. t.Fatalf("%+v\n", errors.Errorf("没有检测出from如果有nil字段,必须使用指针结构变量"))
  464. }
  465. err = assign.DefaultUsage(&fromPointerNil, &to)
  466. if err != nil {
  467. t.Fatalf("%+v\n", err)
  468. }
  469. to.checkFields(t, from)
  470. err = assign.DefaultUsage(&fromPointerNil, &toPointer)
  471. if err != nil {
  472. t.Fatalf("%+v\n", err)
  473. }
  474. toPointer.checkFields(t, from)
  475. }