type_test.go 12 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467
  1. package test
  2. import (
  3. "testing"
  4. "git.i2edu.net/i2/go-zero/tools/goctl/api/parser/g4/ast"
  5. "git.i2edu.net/i2/go-zero/tools/goctl/api/parser/g4/gen/api"
  6. "github.com/stretchr/testify/assert"
  7. )
  8. var fieldAccept = func(p *api.ApiParserParser, visitor *ast.ApiVisitor) interface{} {
  9. return p.Field().Accept(visitor)
  10. }
  11. func TestField(t *testing.T) {
  12. t.Run("anonymous", func(t *testing.T) {
  13. v, err := parser.Accept(fieldAccept, `User`)
  14. assert.Nil(t, err)
  15. f := v.(*ast.TypeField)
  16. assert.True(t, f.Equal(&ast.TypeField{
  17. IsAnonymous: true,
  18. DataType: &ast.Literal{Literal: ast.NewTextExpr("User")},
  19. }))
  20. v, err = parser.Accept(fieldAccept, `*User`)
  21. assert.Nil(t, err)
  22. f = v.(*ast.TypeField)
  23. assert.True(t, f.Equal(&ast.TypeField{
  24. IsAnonymous: true,
  25. DataType: &ast.Pointer{
  26. PointerExpr: ast.NewTextExpr("*User"),
  27. Star: ast.NewTextExpr("*"),
  28. Name: ast.NewTextExpr("User"),
  29. },
  30. }))
  31. v, err = parser.Accept(fieldAccept, `
  32. // anonymous user
  33. *User // pointer type`)
  34. assert.Nil(t, err)
  35. f = v.(*ast.TypeField)
  36. assert.True(t, f.Equal(&ast.TypeField{
  37. IsAnonymous: true,
  38. DataType: &ast.Pointer{
  39. PointerExpr: ast.NewTextExpr("*User"),
  40. Star: ast.NewTextExpr("*"),
  41. Name: ast.NewTextExpr("User"),
  42. },
  43. DocExpr: []ast.Expr{
  44. ast.NewTextExpr("// anonymous user"),
  45. },
  46. CommentExpr: ast.NewTextExpr("// pointer type"),
  47. }))
  48. _, err = parser.Accept(fieldAccept, `interface`)
  49. assert.Error(t, err)
  50. _, err = parser.Accept(fieldAccept, `map`)
  51. assert.Error(t, err)
  52. })
  53. t.Run("normal", func(t *testing.T) {
  54. v, err := parser.Accept(fieldAccept, `User int`)
  55. assert.Nil(t, err)
  56. f := v.(*ast.TypeField)
  57. assert.True(t, f.Equal(&ast.TypeField{
  58. Name: ast.NewTextExpr("User"),
  59. DataType: &ast.Literal{Literal: ast.NewTextExpr("int")},
  60. }))
  61. v, err = parser.Accept(fieldAccept, `Foo Bar`)
  62. assert.Nil(t, err)
  63. f = v.(*ast.TypeField)
  64. assert.True(t, f.Equal(&ast.TypeField{
  65. Name: ast.NewTextExpr("Foo"),
  66. DataType: &ast.Literal{Literal: ast.NewTextExpr("Bar")},
  67. }))
  68. v, err = parser.Accept(fieldAccept, `Foo map[int]Bar`)
  69. assert.Nil(t, err)
  70. f = v.(*ast.TypeField)
  71. assert.True(t, f.Equal(&ast.TypeField{
  72. Name: ast.NewTextExpr("Foo"),
  73. DataType: &ast.Map{
  74. MapExpr: ast.NewTextExpr("map[int]Bar"),
  75. Map: ast.NewTextExpr("map"),
  76. LBrack: ast.NewTextExpr("["),
  77. RBrack: ast.NewTextExpr("]"),
  78. Key: ast.NewTextExpr("int"),
  79. Value: &ast.Literal{Literal: ast.NewTextExpr("Bar")},
  80. },
  81. }))
  82. })
  83. }
  84. func TestDataType_ID(t *testing.T) {
  85. dt := func(p *api.ApiParserParser, visitor *ast.ApiVisitor) interface{} {
  86. return p.DataType().Accept(visitor)
  87. }
  88. t.Run("Struct", func(t *testing.T) {
  89. v, err := parser.Accept(dt, `Foo`)
  90. assert.Nil(t, err)
  91. id := v.(ast.DataType)
  92. assert.True(t, id.Equal(&ast.Literal{Literal: ast.NewTextExpr("Foo")}))
  93. })
  94. t.Run("basic", func(t *testing.T) {
  95. v, err := parser.Accept(dt, `int`)
  96. assert.Nil(t, err)
  97. id := v.(ast.DataType)
  98. assert.True(t, id.Equal(&ast.Literal{Literal: ast.NewTextExpr("int")}))
  99. })
  100. t.Run("wrong", func(t *testing.T) {
  101. _, err := parser.Accept(dt, `map`)
  102. assert.Error(t, err)
  103. })
  104. }
  105. func TestDataType_Map(t *testing.T) {
  106. dt := func(p *api.ApiParserParser, visitor *ast.ApiVisitor) interface{} {
  107. return p.MapType().Accept(visitor)
  108. }
  109. t.Run("basicKey", func(t *testing.T) {
  110. v, err := parser.Accept(dt, `map[int]Bar`)
  111. assert.Nil(t, err)
  112. m := v.(ast.DataType)
  113. assert.True(t, m.Equal(&ast.Map{
  114. MapExpr: ast.NewTextExpr("map[int]Bar"),
  115. Map: ast.NewTextExpr("map"),
  116. LBrack: ast.NewTextExpr("["),
  117. RBrack: ast.NewTextExpr("]"),
  118. Key: ast.NewTextExpr("int"),
  119. Value: &ast.Literal{Literal: ast.NewTextExpr("Bar")},
  120. }))
  121. })
  122. t.Run("wrong", func(t *testing.T) {
  123. _, err := parser.Accept(dt, `map[var]Bar`)
  124. assert.Error(t, err)
  125. _, err = parser.Accept(dt, `map[*User]Bar`)
  126. assert.Error(t, err)
  127. _, err = parser.Accept(dt, `map[User]Bar`)
  128. assert.Error(t, err)
  129. })
  130. }
  131. func TestDataType_Array(t *testing.T) {
  132. dt := func(p *api.ApiParserParser, visitor *ast.ApiVisitor) interface{} {
  133. return p.ArrayType().Accept(visitor)
  134. }
  135. t.Run("basic", func(t *testing.T) {
  136. v, err := parser.Accept(dt, `[]int`)
  137. assert.Nil(t, err)
  138. array := v.(ast.DataType)
  139. assert.True(t, array.Equal(&ast.Array{
  140. ArrayExpr: ast.NewTextExpr("[]int"),
  141. LBrack: ast.NewTextExpr("["),
  142. RBrack: ast.NewTextExpr("]"),
  143. Literal: &ast.Literal{Literal: ast.NewTextExpr("int")},
  144. }))
  145. })
  146. t.Run("pointer", func(t *testing.T) {
  147. v, err := parser.Accept(dt, `[]*User`)
  148. assert.Nil(t, err)
  149. array := v.(ast.DataType)
  150. assert.True(t, array.Equal(&ast.Array{
  151. ArrayExpr: ast.NewTextExpr("[]*User"),
  152. LBrack: ast.NewTextExpr("["),
  153. RBrack: ast.NewTextExpr("]"),
  154. Literal: &ast.Pointer{
  155. PointerExpr: ast.NewTextExpr("*User"),
  156. Star: ast.NewTextExpr("*"),
  157. Name: ast.NewTextExpr("User"),
  158. },
  159. }))
  160. })
  161. t.Run("interface{}", func(t *testing.T) {
  162. v, err := parser.Accept(dt, `[]interface{}`)
  163. assert.Nil(t, err)
  164. array := v.(ast.DataType)
  165. assert.True(t, array.Equal(&ast.Array{
  166. ArrayExpr: ast.NewTextExpr("[]interface{}"),
  167. LBrack: ast.NewTextExpr("["),
  168. RBrack: ast.NewTextExpr("]"),
  169. Literal: &ast.Interface{Literal: ast.NewTextExpr("interface{}")},
  170. }))
  171. })
  172. t.Run("wrong", func(t *testing.T) {
  173. _, err := parser.Accept(dt, `[]var`)
  174. assert.Error(t, err)
  175. _, err = parser.Accept(dt, `[]interface`)
  176. assert.Error(t, err)
  177. })
  178. }
  179. func TestDataType_Interface(t *testing.T) {
  180. dt := func(p *api.ApiParserParser, visitor *ast.ApiVisitor) interface{} {
  181. return p.DataType().Accept(visitor)
  182. }
  183. t.Run("normal", func(t *testing.T) {
  184. v, err := parser.Accept(dt, `interface{}`)
  185. assert.Nil(t, err)
  186. inter := v.(ast.DataType)
  187. assert.True(t, inter.Equal(&ast.Interface{Literal: ast.NewTextExpr("interface{}")}))
  188. })
  189. t.Run("wrong", func(t *testing.T) {
  190. _, err := parser.Accept(dt, `interface`)
  191. assert.Error(t, err)
  192. })
  193. t.Run("wrong", func(t *testing.T) {
  194. _, err := parser.Accept(dt, `interface{`)
  195. assert.Error(t, err)
  196. })
  197. }
  198. func TestDataType_Time(t *testing.T) {
  199. dt := func(p *api.ApiParserParser, visitor *ast.ApiVisitor) interface{} {
  200. return p.DataType().Accept(visitor)
  201. }
  202. t.Run("normal", func(t *testing.T) {
  203. _, err := parser.Accept(dt, `time.Time`)
  204. assert.Error(t, err)
  205. })
  206. }
  207. func TestDataType_Pointer(t *testing.T) {
  208. dt := func(p *api.ApiParserParser, visitor *ast.ApiVisitor) interface{} {
  209. return p.PointerType().Accept(visitor)
  210. }
  211. t.Run("normal", func(t *testing.T) {
  212. v, err := parser.Accept(dt, `*int`)
  213. assert.Nil(t, err)
  214. assert.True(t, v.(ast.DataType).Equal(&ast.Pointer{
  215. PointerExpr: ast.NewTextExpr("*int"),
  216. Star: ast.NewTextExpr("*"),
  217. Name: ast.NewTextExpr("int"),
  218. }))
  219. })
  220. t.Run("wrong", func(t *testing.T) {
  221. _, err := parser.Accept(dt, `int`)
  222. assert.Error(t, err)
  223. })
  224. }
  225. func TestAlias(t *testing.T) {
  226. fn := func(p *api.ApiParserParser, visitor *ast.ApiVisitor) interface{} {
  227. return p.TypeAlias().Accept(visitor)
  228. }
  229. t.Run("normal", func(t *testing.T) {
  230. _, err := parser.Accept(fn, `Foo int`)
  231. assert.Error(t, err)
  232. _, err = parser.Accept(fn, `Foo=int`)
  233. assert.Error(t, err)
  234. _, err = parser.Accept(fn, `
  235. Foo int // comment`)
  236. assert.Error(t, err)
  237. _, err = parser.Accept(fn, `
  238. Foo int /**comment*/`)
  239. assert.Error(t, err)
  240. })
  241. t.Run("wrong", func(t *testing.T) {
  242. _, err := parser.Accept(fn, `Foo var`)
  243. assert.Error(t, err)
  244. _, err = parser.Accept(fn, `Foo 2`)
  245. assert.Error(t, err)
  246. })
  247. }
  248. func TestTypeStruct(t *testing.T) {
  249. fn := func(p *api.ApiParserParser, visitor *ast.ApiVisitor) interface{} {
  250. return p.TypeStruct().Accept(visitor)
  251. }
  252. t.Run("normal", func(t *testing.T) {
  253. v, err := parser.Accept(fn, "Foo {\n\t\t\tFoo string\n\t\t\tBar int `json:\"bar\"``\n\t\t}")
  254. assert.Nil(t, err)
  255. s := v.(*ast.TypeStruct)
  256. assert.True(t, s.Equal(&ast.TypeStruct{
  257. Name: ast.NewTextExpr("Foo"),
  258. LBrace: ast.NewTextExpr("{"),
  259. RBrace: ast.NewTextExpr("}"),
  260. Fields: []*ast.TypeField{
  261. {
  262. Name: ast.NewTextExpr("Foo"),
  263. DataType: &ast.Literal{Literal: ast.NewTextExpr("string")},
  264. },
  265. {
  266. Name: ast.NewTextExpr("Bar"),
  267. DataType: &ast.Literal{Literal: ast.NewTextExpr("int")},
  268. Tag: ast.NewTextExpr("`json:\"bar\"`"),
  269. },
  270. },
  271. }))
  272. v, err = parser.Accept(fn, "Foo struct{\n\t\t\tFoo string\n\t\t\tBar int `json:\"bar\"``\n\t\t}")
  273. assert.Nil(t, err)
  274. s = v.(*ast.TypeStruct)
  275. assert.True(t, s.Equal(&ast.TypeStruct{
  276. Name: ast.NewTextExpr("Foo"),
  277. LBrace: ast.NewTextExpr("{"),
  278. RBrace: ast.NewTextExpr("}"),
  279. Struct: ast.NewTextExpr("struct"),
  280. Fields: []*ast.TypeField{
  281. {
  282. Name: ast.NewTextExpr("Foo"),
  283. DataType: &ast.Literal{Literal: ast.NewTextExpr("string")},
  284. },
  285. {
  286. Name: ast.NewTextExpr("Bar"),
  287. DataType: &ast.Literal{Literal: ast.NewTextExpr("int")},
  288. Tag: ast.NewTextExpr("`json:\"bar\"`"),
  289. },
  290. },
  291. }))
  292. })
  293. }
  294. func TestTypeBlock(t *testing.T) {
  295. fn := func(p *api.ApiParserParser, visitor *ast.ApiVisitor) interface{} {
  296. return p.TypeBlock().Accept(visitor)
  297. }
  298. t.Run("normal", func(t *testing.T) {
  299. _, err := parser.Accept(fn, `type(
  300. // doc
  301. Foo int
  302. )`)
  303. assert.Error(t, err)
  304. v, err := parser.Accept(fn, `type (
  305. // doc
  306. Foo {
  307. Bar int
  308. }
  309. )`)
  310. assert.Nil(t, err)
  311. st := v.([]ast.TypeExpr)
  312. assert.True(t, st[0].Equal(&ast.TypeStruct{
  313. Name: ast.NewTextExpr("Foo"),
  314. LBrace: ast.NewTextExpr("{"),
  315. RBrace: ast.NewTextExpr("}"),
  316. DocExpr: []ast.Expr{
  317. ast.NewTextExpr("// doc"),
  318. },
  319. Fields: []*ast.TypeField{
  320. {
  321. Name: ast.NewTextExpr("Bar"),
  322. DataType: &ast.Literal{Literal: ast.NewTextExpr("int")},
  323. },
  324. },
  325. }))
  326. })
  327. }
  328. func TestTypeLit(t *testing.T) {
  329. fn := func(p *api.ApiParserParser, visitor *ast.ApiVisitor) interface{} {
  330. return p.TypeLit().Accept(visitor)
  331. }
  332. t.Run("normal", func(t *testing.T) {
  333. _, err := parser.Accept(fn, `type Foo int`)
  334. assert.Error(t, err)
  335. _, err = parser.Accept(fn, `type Foo = int`)
  336. assert.Error(t, err)
  337. _, err = parser.Accept(fn, `
  338. // doc
  339. type Foo = int // comment`)
  340. assert.Error(t, err)
  341. v, err := parser.Accept(fn, `
  342. // doc
  343. type Foo {// comment
  344. Bar int
  345. }`)
  346. assert.Nil(t, err)
  347. st := v.(*ast.TypeStruct)
  348. assert.True(t, st.Equal(&ast.TypeStruct{
  349. Name: ast.NewTextExpr("Foo"),
  350. Fields: []*ast.TypeField{
  351. {
  352. Name: ast.NewTextExpr("Bar"),
  353. DataType: &ast.Literal{Literal: ast.NewTextExpr("int")},
  354. DocExpr: []ast.Expr{
  355. ast.NewTextExpr("// comment"),
  356. },
  357. },
  358. },
  359. DocExpr: []ast.Expr{
  360. ast.NewTextExpr("// doc"),
  361. },
  362. }))
  363. v, err = parser.Accept(fn, `
  364. // doc
  365. type Foo {// comment
  366. Bar
  367. }`)
  368. assert.Nil(t, err)
  369. st = v.(*ast.TypeStruct)
  370. assert.True(t, st.Equal(&ast.TypeStruct{
  371. Name: ast.NewTextExpr("Foo"),
  372. Fields: []*ast.TypeField{
  373. {
  374. IsAnonymous: true,
  375. DataType: &ast.Literal{Literal: ast.NewTextExpr("Bar")},
  376. DocExpr: []ast.Expr{
  377. ast.NewTextExpr("// comment"),
  378. },
  379. },
  380. },
  381. DocExpr: []ast.Expr{
  382. ast.NewTextExpr("// doc"),
  383. },
  384. }))
  385. })
  386. t.Run("wrong", func(t *testing.T) {
  387. _, err := parser.Accept(fn, `type Foo`)
  388. assert.Error(t, err)
  389. })
  390. }
  391. func TestTypeUnExported(t *testing.T) {
  392. fn := func(p *api.ApiParserParser, visitor *ast.ApiVisitor) interface{} {
  393. return p.TypeSpec().Accept(visitor)
  394. }
  395. t.Run("type", func(t *testing.T) {
  396. _, err := parser.Accept(fn, `type foo {}`)
  397. assert.Nil(t, err)
  398. })
  399. t.Run("field", func(t *testing.T) {
  400. _, err := parser.Accept(fn, `type Foo {
  401. name int
  402. }`)
  403. assert.Nil(t, err)
  404. _, err = parser.Accept(fn, `type Foo {
  405. Name int
  406. }`)
  407. assert.Nil(t, err)
  408. })
  409. t.Run("filedDataType", func(t *testing.T) {
  410. _, err := parser.Accept(fn, `type Foo {
  411. Foo *foo
  412. Bar []bar
  413. FooBar map[int]fooBar
  414. }`)
  415. assert.Nil(t, err)
  416. })
  417. }