123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467 |
- package test
- import (
- "testing"
- "git.i2edu.net/i2/go-zero/tools/goctl/api/parser/g4/ast"
- "git.i2edu.net/i2/go-zero/tools/goctl/api/parser/g4/gen/api"
- "github.com/stretchr/testify/assert"
- )
- var fieldAccept = func(p *api.ApiParserParser, visitor *ast.ApiVisitor) interface{} {
- return p.Field().Accept(visitor)
- }
- func TestField(t *testing.T) {
- t.Run("anonymous", func(t *testing.T) {
- v, err := parser.Accept(fieldAccept, `User`)
- assert.Nil(t, err)
- f := v.(*ast.TypeField)
- assert.True(t, f.Equal(&ast.TypeField{
- IsAnonymous: true,
- DataType: &ast.Literal{Literal: ast.NewTextExpr("User")},
- }))
- v, err = parser.Accept(fieldAccept, `*User`)
- assert.Nil(t, err)
- f = v.(*ast.TypeField)
- assert.True(t, f.Equal(&ast.TypeField{
- IsAnonymous: true,
- DataType: &ast.Pointer{
- PointerExpr: ast.NewTextExpr("*User"),
- Star: ast.NewTextExpr("*"),
- Name: ast.NewTextExpr("User"),
- },
- }))
- v, err = parser.Accept(fieldAccept, `
- // anonymous user
- *User // pointer type`)
- assert.Nil(t, err)
- f = v.(*ast.TypeField)
- assert.True(t, f.Equal(&ast.TypeField{
- IsAnonymous: true,
- DataType: &ast.Pointer{
- PointerExpr: ast.NewTextExpr("*User"),
- Star: ast.NewTextExpr("*"),
- Name: ast.NewTextExpr("User"),
- },
- DocExpr: []ast.Expr{
- ast.NewTextExpr("// anonymous user"),
- },
- CommentExpr: ast.NewTextExpr("// pointer type"),
- }))
- _, err = parser.Accept(fieldAccept, `interface`)
- assert.Error(t, err)
- _, err = parser.Accept(fieldAccept, `map`)
- assert.Error(t, err)
- })
- t.Run("normal", func(t *testing.T) {
- v, err := parser.Accept(fieldAccept, `User int`)
- assert.Nil(t, err)
- f := v.(*ast.TypeField)
- assert.True(t, f.Equal(&ast.TypeField{
- Name: ast.NewTextExpr("User"),
- DataType: &ast.Literal{Literal: ast.NewTextExpr("int")},
- }))
- v, err = parser.Accept(fieldAccept, `Foo Bar`)
- assert.Nil(t, err)
- f = v.(*ast.TypeField)
- assert.True(t, f.Equal(&ast.TypeField{
- Name: ast.NewTextExpr("Foo"),
- DataType: &ast.Literal{Literal: ast.NewTextExpr("Bar")},
- }))
- v, err = parser.Accept(fieldAccept, `Foo map[int]Bar`)
- assert.Nil(t, err)
- f = v.(*ast.TypeField)
- assert.True(t, f.Equal(&ast.TypeField{
- Name: ast.NewTextExpr("Foo"),
- DataType: &ast.Map{
- MapExpr: ast.NewTextExpr("map[int]Bar"),
- Map: ast.NewTextExpr("map"),
- LBrack: ast.NewTextExpr("["),
- RBrack: ast.NewTextExpr("]"),
- Key: ast.NewTextExpr("int"),
- Value: &ast.Literal{Literal: ast.NewTextExpr("Bar")},
- },
- }))
- })
- }
- func TestDataType_ID(t *testing.T) {
- dt := func(p *api.ApiParserParser, visitor *ast.ApiVisitor) interface{} {
- return p.DataType().Accept(visitor)
- }
- t.Run("Struct", func(t *testing.T) {
- v, err := parser.Accept(dt, `Foo`)
- assert.Nil(t, err)
- id := v.(ast.DataType)
- assert.True(t, id.Equal(&ast.Literal{Literal: ast.NewTextExpr("Foo")}))
- })
- t.Run("basic", func(t *testing.T) {
- v, err := parser.Accept(dt, `int`)
- assert.Nil(t, err)
- id := v.(ast.DataType)
- assert.True(t, id.Equal(&ast.Literal{Literal: ast.NewTextExpr("int")}))
- })
- t.Run("wrong", func(t *testing.T) {
- _, err := parser.Accept(dt, `map`)
- assert.Error(t, err)
- })
- }
- func TestDataType_Map(t *testing.T) {
- dt := func(p *api.ApiParserParser, visitor *ast.ApiVisitor) interface{} {
- return p.MapType().Accept(visitor)
- }
- t.Run("basicKey", func(t *testing.T) {
- v, err := parser.Accept(dt, `map[int]Bar`)
- assert.Nil(t, err)
- m := v.(ast.DataType)
- assert.True(t, m.Equal(&ast.Map{
- MapExpr: ast.NewTextExpr("map[int]Bar"),
- Map: ast.NewTextExpr("map"),
- LBrack: ast.NewTextExpr("["),
- RBrack: ast.NewTextExpr("]"),
- Key: ast.NewTextExpr("int"),
- Value: &ast.Literal{Literal: ast.NewTextExpr("Bar")},
- }))
- })
- t.Run("wrong", func(t *testing.T) {
- _, err := parser.Accept(dt, `map[var]Bar`)
- assert.Error(t, err)
- _, err = parser.Accept(dt, `map[*User]Bar`)
- assert.Error(t, err)
- _, err = parser.Accept(dt, `map[User]Bar`)
- assert.Error(t, err)
- })
- }
- func TestDataType_Array(t *testing.T) {
- dt := func(p *api.ApiParserParser, visitor *ast.ApiVisitor) interface{} {
- return p.ArrayType().Accept(visitor)
- }
- t.Run("basic", func(t *testing.T) {
- v, err := parser.Accept(dt, `[]int`)
- assert.Nil(t, err)
- array := v.(ast.DataType)
- assert.True(t, array.Equal(&ast.Array{
- ArrayExpr: ast.NewTextExpr("[]int"),
- LBrack: ast.NewTextExpr("["),
- RBrack: ast.NewTextExpr("]"),
- Literal: &ast.Literal{Literal: ast.NewTextExpr("int")},
- }))
- })
- t.Run("pointer", func(t *testing.T) {
- v, err := parser.Accept(dt, `[]*User`)
- assert.Nil(t, err)
- array := v.(ast.DataType)
- assert.True(t, array.Equal(&ast.Array{
- ArrayExpr: ast.NewTextExpr("[]*User"),
- LBrack: ast.NewTextExpr("["),
- RBrack: ast.NewTextExpr("]"),
- Literal: &ast.Pointer{
- PointerExpr: ast.NewTextExpr("*User"),
- Star: ast.NewTextExpr("*"),
- Name: ast.NewTextExpr("User"),
- },
- }))
- })
- t.Run("interface{}", func(t *testing.T) {
- v, err := parser.Accept(dt, `[]interface{}`)
- assert.Nil(t, err)
- array := v.(ast.DataType)
- assert.True(t, array.Equal(&ast.Array{
- ArrayExpr: ast.NewTextExpr("[]interface{}"),
- LBrack: ast.NewTextExpr("["),
- RBrack: ast.NewTextExpr("]"),
- Literal: &ast.Interface{Literal: ast.NewTextExpr("interface{}")},
- }))
- })
- t.Run("wrong", func(t *testing.T) {
- _, err := parser.Accept(dt, `[]var`)
- assert.Error(t, err)
- _, err = parser.Accept(dt, `[]interface`)
- assert.Error(t, err)
- })
- }
- func TestDataType_Interface(t *testing.T) {
- dt := func(p *api.ApiParserParser, visitor *ast.ApiVisitor) interface{} {
- return p.DataType().Accept(visitor)
- }
- t.Run("normal", func(t *testing.T) {
- v, err := parser.Accept(dt, `interface{}`)
- assert.Nil(t, err)
- inter := v.(ast.DataType)
- assert.True(t, inter.Equal(&ast.Interface{Literal: ast.NewTextExpr("interface{}")}))
- })
- t.Run("wrong", func(t *testing.T) {
- _, err := parser.Accept(dt, `interface`)
- assert.Error(t, err)
- })
- t.Run("wrong", func(t *testing.T) {
- _, err := parser.Accept(dt, `interface{`)
- assert.Error(t, err)
- })
- }
- func TestDataType_Time(t *testing.T) {
- dt := func(p *api.ApiParserParser, visitor *ast.ApiVisitor) interface{} {
- return p.DataType().Accept(visitor)
- }
- t.Run("normal", func(t *testing.T) {
- _, err := parser.Accept(dt, `time.Time`)
- assert.Error(t, err)
- })
- }
- func TestDataType_Pointer(t *testing.T) {
- dt := func(p *api.ApiParserParser, visitor *ast.ApiVisitor) interface{} {
- return p.PointerType().Accept(visitor)
- }
- t.Run("normal", func(t *testing.T) {
- v, err := parser.Accept(dt, `*int`)
- assert.Nil(t, err)
- assert.True(t, v.(ast.DataType).Equal(&ast.Pointer{
- PointerExpr: ast.NewTextExpr("*int"),
- Star: ast.NewTextExpr("*"),
- Name: ast.NewTextExpr("int"),
- }))
- })
- t.Run("wrong", func(t *testing.T) {
- _, err := parser.Accept(dt, `int`)
- assert.Error(t, err)
- })
- }
- func TestAlias(t *testing.T) {
- fn := func(p *api.ApiParserParser, visitor *ast.ApiVisitor) interface{} {
- return p.TypeAlias().Accept(visitor)
- }
- t.Run("normal", func(t *testing.T) {
- _, err := parser.Accept(fn, `Foo int`)
- assert.Error(t, err)
- _, err = parser.Accept(fn, `Foo=int`)
- assert.Error(t, err)
- _, err = parser.Accept(fn, `
- Foo int // comment`)
- assert.Error(t, err)
- _, err = parser.Accept(fn, `
- Foo int /**comment*/`)
- assert.Error(t, err)
- })
- t.Run("wrong", func(t *testing.T) {
- _, err := parser.Accept(fn, `Foo var`)
- assert.Error(t, err)
- _, err = parser.Accept(fn, `Foo 2`)
- assert.Error(t, err)
- })
- }
- func TestTypeStruct(t *testing.T) {
- fn := func(p *api.ApiParserParser, visitor *ast.ApiVisitor) interface{} {
- return p.TypeStruct().Accept(visitor)
- }
- t.Run("normal", func(t *testing.T) {
- v, err := parser.Accept(fn, "Foo {\n\t\t\tFoo string\n\t\t\tBar int `json:\"bar\"``\n\t\t}")
- assert.Nil(t, err)
- s := v.(*ast.TypeStruct)
- assert.True(t, s.Equal(&ast.TypeStruct{
- Name: ast.NewTextExpr("Foo"),
- LBrace: ast.NewTextExpr("{"),
- RBrace: ast.NewTextExpr("}"),
- Fields: []*ast.TypeField{
- {
- Name: ast.NewTextExpr("Foo"),
- DataType: &ast.Literal{Literal: ast.NewTextExpr("string")},
- },
- {
- Name: ast.NewTextExpr("Bar"),
- DataType: &ast.Literal{Literal: ast.NewTextExpr("int")},
- Tag: ast.NewTextExpr("`json:\"bar\"`"),
- },
- },
- }))
- v, err = parser.Accept(fn, "Foo struct{\n\t\t\tFoo string\n\t\t\tBar int `json:\"bar\"``\n\t\t}")
- assert.Nil(t, err)
- s = v.(*ast.TypeStruct)
- assert.True(t, s.Equal(&ast.TypeStruct{
- Name: ast.NewTextExpr("Foo"),
- LBrace: ast.NewTextExpr("{"),
- RBrace: ast.NewTextExpr("}"),
- Struct: ast.NewTextExpr("struct"),
- Fields: []*ast.TypeField{
- {
- Name: ast.NewTextExpr("Foo"),
- DataType: &ast.Literal{Literal: ast.NewTextExpr("string")},
- },
- {
- Name: ast.NewTextExpr("Bar"),
- DataType: &ast.Literal{Literal: ast.NewTextExpr("int")},
- Tag: ast.NewTextExpr("`json:\"bar\"`"),
- },
- },
- }))
- })
- }
- func TestTypeBlock(t *testing.T) {
- fn := func(p *api.ApiParserParser, visitor *ast.ApiVisitor) interface{} {
- return p.TypeBlock().Accept(visitor)
- }
- t.Run("normal", func(t *testing.T) {
- _, err := parser.Accept(fn, `type(
- // doc
- Foo int
- )`)
- assert.Error(t, err)
- v, err := parser.Accept(fn, `type (
- // doc
- Foo {
- Bar int
- }
- )`)
- assert.Nil(t, err)
- st := v.([]ast.TypeExpr)
- assert.True(t, st[0].Equal(&ast.TypeStruct{
- Name: ast.NewTextExpr("Foo"),
- LBrace: ast.NewTextExpr("{"),
- RBrace: ast.NewTextExpr("}"),
- DocExpr: []ast.Expr{
- ast.NewTextExpr("// doc"),
- },
- Fields: []*ast.TypeField{
- {
- Name: ast.NewTextExpr("Bar"),
- DataType: &ast.Literal{Literal: ast.NewTextExpr("int")},
- },
- },
- }))
- })
- }
- func TestTypeLit(t *testing.T) {
- fn := func(p *api.ApiParserParser, visitor *ast.ApiVisitor) interface{} {
- return p.TypeLit().Accept(visitor)
- }
- t.Run("normal", func(t *testing.T) {
- _, err := parser.Accept(fn, `type Foo int`)
- assert.Error(t, err)
- _, err = parser.Accept(fn, `type Foo = int`)
- assert.Error(t, err)
- _, err = parser.Accept(fn, `
- // doc
- type Foo = int // comment`)
- assert.Error(t, err)
- v, err := parser.Accept(fn, `
- // doc
- type Foo {// comment
- Bar int
- }`)
- assert.Nil(t, err)
- st := v.(*ast.TypeStruct)
- assert.True(t, st.Equal(&ast.TypeStruct{
- Name: ast.NewTextExpr("Foo"),
- Fields: []*ast.TypeField{
- {
- Name: ast.NewTextExpr("Bar"),
- DataType: &ast.Literal{Literal: ast.NewTextExpr("int")},
- DocExpr: []ast.Expr{
- ast.NewTextExpr("// comment"),
- },
- },
- },
- DocExpr: []ast.Expr{
- ast.NewTextExpr("// doc"),
- },
- }))
- v, err = parser.Accept(fn, `
- // doc
- type Foo {// comment
- Bar
- }`)
- assert.Nil(t, err)
- st = v.(*ast.TypeStruct)
- assert.True(t, st.Equal(&ast.TypeStruct{
- Name: ast.NewTextExpr("Foo"),
- Fields: []*ast.TypeField{
- {
- IsAnonymous: true,
- DataType: &ast.Literal{Literal: ast.NewTextExpr("Bar")},
- DocExpr: []ast.Expr{
- ast.NewTextExpr("// comment"),
- },
- },
- },
- DocExpr: []ast.Expr{
- ast.NewTextExpr("// doc"),
- },
- }))
- })
- t.Run("wrong", func(t *testing.T) {
- _, err := parser.Accept(fn, `type Foo`)
- assert.Error(t, err)
- })
- }
- func TestTypeUnExported(t *testing.T) {
- fn := func(p *api.ApiParserParser, visitor *ast.ApiVisitor) interface{} {
- return p.TypeSpec().Accept(visitor)
- }
- t.Run("type", func(t *testing.T) {
- _, err := parser.Accept(fn, `type foo {}`)
- assert.Nil(t, err)
- })
- t.Run("field", func(t *testing.T) {
- _, err := parser.Accept(fn, `type Foo {
- name int
- }`)
- assert.Nil(t, err)
- _, err = parser.Accept(fn, `type Foo {
- Name int
- }`)
- assert.Nil(t, err)
- })
- t.Run("filedDataType", func(t *testing.T) {
- _, err := parser.Accept(fn, `type Foo {
- Foo *foo
- Bar []bar
- FooBar map[int]fooBar
- }`)
- assert.Nil(t, err)
- })
- }
|