123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899 |
- package ast
- import (
- "io/ioutil"
- "os"
- "path/filepath"
- "testing"
- "github.com/stretchr/testify/assert"
- "github.com/stretchr/testify/require"
- "github.com/zeromicro/go-zero/tools/goctl/util/pathx"
- )
- func Test_ImportCycle(t *testing.T) {
- const (
- mainFilename = "main.api"
- subAFilename = "a.api"
- subBFilename = "b.api"
- mainSrc = `import "./a.api"`
- subASrc = `import "./b.api"`
- subBSrc = `import "./a.api"`
- )
- var err error
- dir := pathx.MustTempDir()
- defer os.RemoveAll(dir)
- mainPath := filepath.Join(dir, mainFilename)
- err = ioutil.WriteFile(mainPath, []byte(mainSrc), 0o777)
- require.NoError(t, err)
- subAPath := filepath.Join(dir, subAFilename)
- err = ioutil.WriteFile(subAPath, []byte(subASrc), 0o777)
- require.NoError(t, err)
- subBPath := filepath.Join(dir, subBFilename)
- err = ioutil.WriteFile(subBPath, []byte(subBSrc), 0o777)
- require.NoError(t, err)
- _, err = NewParser().Parse(mainPath)
- assert.ErrorIs(t, err, ErrImportCycleNotAllowed)
- }
- func Test_MultiImportedShouldAllowed(t *testing.T) {
- const (
- mainFilename = "main.api"
- subAFilename = "a.api"
- subBFilename = "b.api"
- mainSrc = "import \"./b.api\"\n" +
- "import \"./a.api\"\n" +
- "type Main { b B `json:\"b\"`}"
- subASrc = "import \"./b.api\"\n" +
- "type A { b B `json:\"b\"`}\n"
- subBSrc = `type B{}`
- )
- var err error
- dir := pathx.MustTempDir()
- defer os.RemoveAll(dir)
- mainPath := filepath.Join(dir, mainFilename)
- err = ioutil.WriteFile(mainPath, []byte(mainSrc), 0o777)
- require.NoError(t, err)
- subAPath := filepath.Join(dir, subAFilename)
- err = ioutil.WriteFile(subAPath, []byte(subASrc), 0o777)
- require.NoError(t, err)
- subBPath := filepath.Join(dir, subBFilename)
- err = ioutil.WriteFile(subBPath, []byte(subBSrc), 0o777)
- require.NoError(t, err)
- _, err = NewParser().Parse(mainPath)
- assert.NoError(t, err)
- }
- func Test_RedundantDeclarationShouldNotBeAllowed(t *testing.T) {
- const (
- mainFilename = "main.api"
- subAFilename = "a.api"
- subBFilename = "b.api"
- mainSrc = "import \"./a.api\"\n" +
- "import \"./b.api\"\n"
- subASrc = `import "./b.api"
- type A{}`
- subBSrc = `type A{}`
- )
- var err error
- dir := pathx.MustTempDir()
- defer os.RemoveAll(dir)
- mainPath := filepath.Join(dir, mainFilename)
- err = ioutil.WriteFile(mainPath, []byte(mainSrc), 0o777)
- require.NoError(t, err)
- subAPath := filepath.Join(dir, subAFilename)
- err = ioutil.WriteFile(subAPath, []byte(subASrc), 0o777)
- require.NoError(t, err)
- subBPath := filepath.Join(dir, subBFilename)
- err = ioutil.WriteFile(subBPath, []byte(subBSrc), 0o777)
- require.NoError(t, err)
- _, err = NewParser().Parse(mainPath)
- assert.Error(t, err)
- assert.Contains(t, err.Error(), "duplicate type declaration")
- }
|