1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027102810291030103110321033103410351036103710381039104010411042104310441045104610471048104910501051105210531054105510561057105810591060106110621063106410651066106710681069107010711072107310741075107610771078107910801081108210831084108510861087108810891090109110921093109410951096109710981099110011011102110311041105110611071108110911101111111211131114111511161117111811191120112111221123112411251126112711281129113011311132113311341135113611371138113911401141114211431144114511461147114811491150115111521153115411551156115711581159116011611162116311641165116611671168116911701171117211731174117511761177117811791180118111821183118411851186118711881189119011911192119311941195119611971198119912001201120212031204120512061207120812091210121112121213121412151216121712181219122012211222122312241225122612271228122912301231123212331234123512361237123812391240124112421243124412451246124712481249125012511252125312541255125612571258125912601261126212631264126512661267126812691270127112721273127412751276127712781279128012811282128312841285128612871288128912901291129212931294129512961297129812991300130113021303130413051306130713081309131013111312131313141315131613171318131913201321132213231324132513261327132813291330133113321333133413351336133713381339134013411342134313441345134613471348134913501351135213531354135513561357135813591360136113621363136413651366136713681369137013711372137313741375137613771378137913801381138213831384138513861387138813891390139113921393139413951396139713981399140014011402140314041405140614071408140914101411141214131414141514161417141814191420142114221423142414251426142714281429143014311432143314341435143614371438143914401441144214431444144514461447144814491450145114521453145414551456145714581459146014611462146314641465146614671468146914701471147214731474147514761477147814791480148114821483148414851486148714881489149014911492149314941495149614971498149915001501150215031504150515061507150815091510 |
- package format
- import (
- "bytes"
- _ "embed"
- "os"
- "strings"
- "testing"
- "github.com/stretchr/testify/assert"
- "github.com/zeromicro/go-zero/tools/goctl/pkg/parser/api/assertx"
- "github.com/zeromicro/go-zero/tools/goctl/pkg/parser/api/parser"
- )
- type formatData struct {
- input string
- expected string
- converter formatResultConvert
- }
- type formatResultConvert func(s string) string
- // EXPERIMENTAL: just for view format code.
- func TestFormat(t *testing.T) {
- assert.NoError(t, File("testdata/test_format.api"))
- }
- //go:embed testdata/test_type_struct_lit.api
- var testStructLitData string
- //go:embed testdata/expected_type_struct_lit.api
- var expectedStructLitData string
- func TestFormat_ImportLiteralStmt(t *testing.T) {
- testRun(t, []formatData{
- {
- input: `import ""`,
- expected: ``,
- },
- {
- input: `import"aa"`,
- expected: `import "aa"`,
- },
- {
- input: `/*aa*/import "aa"`,
- expected: `/*aa*/
- import "aa"`,
- },
- {
- input: `/*aa*/import /*bb*/"aa"`,
- expected: `/*aa*/
- import "aa"`,
- },
- {
- input: `/*aa*/import /*bb*/"aa"// cc`,
- expected: `/*aa*/
- import "aa" // cc`,
- },
- })
- }
- func TestFormat_ImportGroupStmt(t *testing.T) {
- testRun(t, []formatData{
- {
- input: `import()`,
- expected: ``,
- },
- {
- input: `import("aa")`,
- expected: `import (
- "aa"
- )`,
- },
- {
- input: `import(
- "aa")`,
- expected: `import (
- "aa"
- )`,
- },
- {
- input: `import(
- "aa"
- )`,
- expected: `import (
- "aa"
- )`,
- },
- {
- input: `import("aa""bb")`,
- expected: `import (
- "aa"
- "bb"
- )`,
- },
- {
- input: `/*aa*/import("aa""bb")`,
- expected: `/*aa*/
- import (
- "aa"
- "bb"
- )`,
- },
- {
- input: `/*aa*/import("aa""bb")// bb`,
- expected: `/*aa*/
- import (
- "aa"
- "bb"
- ) // bb`,
- },
- {
- input: `/*aa*/import(// bb
- "aa""bb")// cc`,
- expected: `/*aa*/
- import ( // bb
- "aa"
- "bb"
- ) // cc`,
- },
- {
- input: `import(// aa
- "aa" // bb
- "bb" // cc
- )// dd`,
- expected: `import ( // aa
- "aa" // bb
- "bb" // cc
- ) // dd`,
- },
- {
- input: `import (// aa
- /*bb*/
- "aa" // cc
- /*dd*/
- "bb" // ee
- ) // ff`,
- expected: `import ( // aa
- /*bb*/
- "aa" // cc
- /*dd*/
- "bb" // ee
- ) // ff`,
- },
- })
- }
- func TestFormat_InfoStmt(t *testing.T) {
- testRun(t, []formatData{
- {
- input: `info()`,
- expected: ``,
- },
- {
- input: `info(foo:"foo")`,
- expected: `info (
- foo: "foo"
- )`,
- },
- {
- input: `info(foo:"foo" bar:"bar")`,
- expected: `info (
- foo: "foo"
- bar: "bar"
- )`,
- },
- {
- input: `info(foo:"foo" bar:"bar" quux:"quux")`,
- expected: `info (
- foo: "foo"
- bar: "bar"
- quux: "quux"
- )`,
- },
- {
- input: `info(foo:"foo"
- bar: "bar")`,
- expected: `info (
- foo: "foo"
- bar: "bar"
- )`,
- },
- {
- input: `info(foo:"foo"// aa
- bar: "bar"// bb
- )`,
- expected: `info (
- foo: "foo" // aa
- bar: "bar" // bb
- )`,
- },
- {
- input: `info(// aa
- foo:"foo"// bb
- bar: "bar"// cc
- )`,
- expected: `info ( // aa
- foo: "foo" // bb
- bar: "bar" // cc
- )`,
- },
- {
- input: `/*aa*/info(// bb
- foo:"foo"// cc
- bar: "bar"// dd
- )`,
- expected: `/*aa*/
- info ( // bb
- foo: "foo" // cc
- bar: "bar" // dd
- )`,
- },
- {
- input: `/*aa*/
- info(// bb
- foo:"foo"// cc
- bar: "bar"// dd
- )// ee`,
- expected: `/*aa*/
- info ( // bb
- foo: "foo" // cc
- bar: "bar" // dd
- ) // ee`,
- },
- {
- input: `/*aa*/
- info ( // bb
- /*cc*/foo: "foo" // dd
- /*ee*/bar: "bar" // ff
- ) // gg`,
- expected: `/*aa*/
- info ( // bb
- /*cc*/
- foo: "foo" // dd
- /*ee*/
- bar: "bar" // ff
- ) // gg`,
- },
- {
- input: `/*aa*/
- info/*xx*/( // bb
- /*cc*/foo:/*xx*/ "foo" // dd
- /*ee*/bar:/*xx*/ "bar" // ff
- ) // gg`,
- expected: `/*aa*/
- info ( // bb
- /*cc*/
- foo: "foo" // dd
- /*ee*/
- bar: "bar" // ff
- ) // gg`,
- },
- })
- }
- func TestFormat_SyntaxStmt(t *testing.T) {
- testRun(t, []formatData{
- {
- input: `syntax="v1"`,
- expected: `syntax = "v1"`,
- },
- {
- input: `syntax="v1"// aa`,
- expected: `syntax = "v1" // aa`,
- },
- {
- input: `syntax
- ="v1"// aa`,
- expected: `syntax = "v1" // aa`,
- },
- {
- input: `syntax=
- "v1"// aa`,
- expected: `syntax = "v1" // aa`,
- },
- {
- input: `/*aa*/syntax="v1"// bb`,
- expected: `/*aa*/
- syntax = "v1" // bb`,
- },
- {
- input: `/*aa*/
- syntax="v1"// bb`,
- expected: `/*aa*/
- syntax = "v1" // bb`,
- },
- {
- input: `syntax/*xx*/=/*xx*/"v1"// bb`,
- expected: `syntax = "v1" // bb`,
- },
- })
- }
- func TestFormat_TypeLiteralStmt(t *testing.T) {
- t.Run("any", func(t *testing.T) {
- testRun(t, []formatData{
- {
- input: `type Any any`,
- expected: `type Any any`,
- },
- {
- input: `type
- Any
- any
- `,
- expected: `type Any any`,
- },
- {
- input: `type Any=any`,
- expected: `type Any = any`,
- },
- {
- input: `
- type
- Any
- =
- any
- `,
- expected: `type Any = any`,
- },
- {
- input: `type // aa
- Any // bb
- any // cc
- `,
- expected: `type // aa
- Any // bb
- any // cc`,
- },
- {
- input: `
- type
- Any
- =
- any`,
- expected: `type Any = any`,
- },
- {
- input: `
- type
- Any
- =
- any
- `,
- expected: `type Any = any`,
- },
- {
- input: `type Any any// aa`,
- expected: `type Any any // aa`,
- },
- {
- input: `type Any=any// aa`,
- expected: `type Any = any // aa`,
- },
- {
- input: `type Any any/*aa*/// bb`,
- expected: `type Any any /*aa*/ // bb`,
- },
- {
- input: `type Any = any/*aa*/// bb`,
- expected: `type Any = any /*aa*/ // bb`,
- },
- {
- input: `type Any/*aa*/ =/*bb*/ any/*cc*/// dd`,
- expected: `type Any /*aa*/ = /*bb*/ any /*cc*/ // dd`,
- },
- {
- input: `/*aa*/type Any any/*bb*/// cc`,
- expected: `/*aa*/
- type Any any /*bb*/ // cc`,
- },
- {
- input: `/*aa*/
- type
- /*bb*/
- Any
- /*cc*/
- any/*dd*/// ee`,
- expected: `/*aa*/
- type
- /*bb*/
- Any
- /*cc*/
- any /*dd*/ // ee`,
- },
- })
- })
- t.Run("array", func(t *testing.T) {
- testRun(t, []formatData{
- {
- input: `type A [2]int`,
- expected: `type A [2]int`,
- },
- {
- input: `type
- A
- [2]int
- `,
- expected: `type A [2]int`,
- },
- {
- input: `type A=[2]int`,
- expected: `type A = [2]int`,
- },
- {
- input: `type
- A
- =
- [2]int
- `,
- expected: `type A = [2]int`,
- },
- {
- input: `type A [/*xx*/2/*xx*/]/*xx*/int// aa`,
- expected: `type A [2]int // aa`,
- },
- {
- input: `/*aa*/type/*bb*/A/*cc*/[/*xx*/2/*xx*/]/*xx*/int// dd`,
- expected: `/*aa*/
- type /*bb*/ A /*cc*/ [2]int // dd`,
- },
- {
- input: `/*aa*/type
- /*bb*/A
- /*cc*/[/*xx*/2/*xx*/]/*xx*/int// dd`,
- expected: `/*aa*/
- type
- /*bb*/
- A
- /*cc*/
- [2]int // dd`,
- },
- {
- input: `type A [ 2 ] int`,
- expected: `type A [2]int`,
- },
- {
- input: `type A [
- 2
- ]
- int`,
- expected: `type A [2]int`,
- },
- {
- input: `type A [// aa
- 2 // bb
- ] // cc
- int`,
- expected: `type A [2]int`,
- },
- {
- input: `type A [// aa
- /*xx*/
- 2 // bb
- /*xx*/
- ] // cc
- /*xx*/
- int`,
- expected: `type A [2]int`,
- },
- {
- input: `type A [...]int`,
- expected: `type A [...]int`,
- },
- {
- input: `type A=[...]int`,
- expected: `type A = [...]int`,
- },
- {
- input: `type A/*aa*/[/*xx*/.../*xx*/]/*xx*/int// bb`,
- expected: `type A /*aa*/ [...]int // bb`,
- },
- {
- input: `/*aa*/
- // bb
- type /*cc*/
- // dd
- A /*ee*/
- // ff
- [/*xx*/.../*xx*/]/*xx*/int// bb`,
- expected: `/*aa*/
- // bb
- type /*cc*/
- // dd
- A /*ee*/
- // ff
- [...]int // bb`,
- },
- {
- input: `type A [2][2]int`,
- expected: `type A [2][2]int`,
- },
- {
- input: `type A=[2][2]int`,
- expected: `type A = [2][2]int`,
- },
- {
- input: `type A [2][]int`,
- expected: `type A [2][]int`,
- },
- {
- input: `type A=[2][]int`,
- expected: `type A = [2][]int`,
- },
- })
- })
- t.Run("base", func(t *testing.T) {
- testRun(t, []formatData{
- // base
- {
- input: `type A int`,
- expected: `type A int`,
- },
- {
- input: `type A =int`,
- expected: `type A = int`,
- },
- {
- input: `type/*aa*/A/*bb*/ int// cc`,
- expected: `type /*aa*/ A /*bb*/ int // cc`,
- },
- {
- input: `type/*aa*/A/*bb*/ =int// cc`,
- expected: `type /*aa*/ A /*bb*/ = int // cc`,
- },
- {
- input: `type A int// aa`,
- expected: `type A int // aa`,
- },
- {
- input: `type A=int// aa`,
- expected: `type A = int // aa`,
- },
- {
- input: `/*aa*/type A int`,
- expected: `/*aa*/
- type A int`,
- },
- {
- input: `/*aa*/type A = int`,
- expected: `/*aa*/
- type A = int`,
- },
- {
- input: `/*aa*/type/*bb*/ A/*cc*/ int// dd`,
- expected: `/*aa*/
- type /*bb*/ A /*cc*/ int // dd`,
- },
- {
- input: `/*aa*/type/*bb*/ A/*cc*/ = /*dd*/int// ee`,
- expected: `/*aa*/
- type /*bb*/ A /*cc*/ = /*dd*/ int // ee`,
- },
- {
- input: `/*aa*/
- type
- /*bb*/
- A
- /*cc*/
- int`,
- expected: `/*aa*/
- type
- /*bb*/
- A
- /*cc*/
- int`,
- },
- })
- })
- t.Run("interface", func(t *testing.T) {
- testRun(t, []formatData{
- {
- input: `type any interface{}`,
- expected: `type any interface{}`,
- },
- {
- input: `type any=interface{}`,
- expected: `type any = interface{}`,
- },
- {
- input: `type
- any
- interface{}
- `,
- expected: `type any interface{}`,
- },
- {
- input: `/*aa*/type /*bb*/any /*cc*/interface{} // dd`,
- expected: `/*aa*/
- type /*bb*/ any /*cc*/ interface{} // dd`,
- },
- {
- input: `/*aa*/type
- /*bb*/any
- /*cc*/interface{} // dd`,
- expected: `/*aa*/
- type
- /*bb*/
- any
- /*cc*/
- interface{} // dd`,
- },
- {
- input: `/*aa*/type
- // bb
- any
- // cc
- interface{} // dd`,
- expected: `/*aa*/
- type
- // bb
- any
- // cc
- interface{} // dd`,
- },
- })
- })
- t.Run("map", func(t *testing.T) {
- testRun(t, []formatData{
- {
- input: `type M map[int]int`,
- expected: `type M map[int]int`,
- },
- {
- input: `type M map [ int ] int`,
- expected: `type M map[int]int`,
- },
- {
- input: `type M map [/*xx*/int/*xx*/]/*xx*/int // aa`,
- expected: `type M map[int]int // aa`,
- },
- {
- input: `/*aa*/type /*bb*/ M/*cc*/map[int]int // dd`,
- expected: `/*aa*/
- type /*bb*/ M /*cc*/ map[int]int // dd`,
- },
- {
- input: `/*aa*/type// bb
- // cc
- M // dd
- // ee
- map // ff
- [int]// gg
- // hh
- int // dd`,
- expected: `/*aa*/
- type // bb
- // cc
- M // dd
- // ee
- map[int]int // dd`,
- },
- {
- input: `type M map[string][2]int // aa`,
- expected: `type M map[string][2]int // aa`,
- },
- {
- input: `type M map[string]any`,
- expected: `type M map[string]any`,
- },
- {
- input: `type M /*aa*/map/*xx*/[/*xx*/string/*xx*/]/*xx*/[/*xx*/2/*xx*/]/*xx*/int// bb`,
- expected: `type M /*aa*/ map[string][2]int // bb`,
- },
- {
- input: `type M /*aa*/
- // bb
- map/*xx*/
- //
- [/*xx*/
- //
- string/*xx*/
- //
- ]/*xx*/
- //
- [/*xx*/
- //
- 2/*xx*/
- //
- ]/*xx*/
- //
- int// bb`,
- expected: `type M /*aa*/
- // bb
- map[string][2]int // bb`,
- },
- {
- input: `type M map[int]map[string]int`,
- expected: `type M map[int]map[string]int`,
- },
- {
- input: `type M map/*xx*/[/*xx*/int/*xx*/]/*xx*/map/*xx*/[/*xx*/string/*xx*/]/*xx*/int// aa`,
- expected: `type M map[int]map[string]int // aa`,
- },
- {
- input: `type M map/*xx*/[/*xx*/map/*xx*/[/*xx*/string/*xx*/]/*xx*/int/*xx*/]/*xx*/string // aa`,
- expected: `type M map[map[string]int]string // aa`,
- },
- {
- input: `type M map[[2]int]int`,
- expected: `type M map[[2]int]int`,
- },
- {
- input: `type M map/*xx*/[/*xx*/[/*xx*/2/*xx*/]/*xx*/int/*xx*/]/*xx*/int// aa`,
- expected: `type M map[[2]int]int // aa`,
- },
- })
- })
- t.Run("pointer", func(t *testing.T) {
- testRun(t, []formatData{
- {
- input: `type P *int`,
- expected: `type P *int`,
- },
- {
- input: `type P=*int`,
- expected: `type P = *int`,
- },
- {
- input: `type
- P
- *int
- `,
- expected: `type P *int`,
- },
- {
- input: `/*aa*/type // bb
- /*cc*/
- P // dd
- /*ee*/
- */*ff*/int // gg
- `,
- expected: `/*aa*/
- type // bb
- /*cc*/
- P // dd
- /*ee*/
- *int // gg`,
- },
- {
- input: `type P *bool`,
- expected: `type P *bool`,
- },
- {
- input: `type P *[2]int`,
- expected: `type P *[2]int`,
- },
- {
- input: `type P=*[2]int`,
- expected: `type P = *[2]int`,
- },
- {
- input: `/*aa*/type /*bb*/P /*cc*/*/*xx*/[/*xx*/2/*xx*/]/*xx*/int // dd`,
- expected: `/*aa*/
- type /*bb*/ P /*cc*/ *[2]int // dd`,
- },
- {
- input: `type P *[...]int`,
- expected: `type P *[...]int`,
- },
- {
- input: `type P=*[...]int`,
- expected: `type P = *[...]int`,
- },
- {
- input: `/*aa*/type /*bb*/P /*cc*/*/*xx*/[/*xx*/.../*xx*/]/*xx*/int // dd`,
- expected: `/*aa*/
- type /*bb*/ P /*cc*/ *[...]int // dd`,
- },
- {
- input: `type P *map[string]int`,
- expected: `type P *map[string]int`,
- },
- {
- input: `type P=*map[string]int`,
- expected: `type P = *map[string]int`,
- },
- {
- input: `type P /*aa*/*/*xx*/map/*xx*/[/*xx*/string/*xx*/]/*xx*/int// bb`,
- expected: `type P /*aa*/ *map[string]int // bb`,
- },
- {
- input: `type P *interface{}`,
- expected: `type P *interface{}`,
- },
- {
- input: `type P=*interface{}`,
- expected: `type P = *interface{}`,
- },
- {
- input: `type P /*aa*/*/*xx*/interface{}// bb`,
- expected: `type P /*aa*/ *interface{} // bb`,
- },
- {
- input: `type P *any`,
- expected: `type P *any`,
- },
- {
- input: `type P=*any`,
- expected: `type P = *any`,
- },
- {
- input: `type P *map[int][2]int`,
- expected: `type P *map[int][2]int`,
- },
- {
- input: `type P=*map[int][2]int`,
- expected: `type P = *map[int][2]int`,
- },
- {
- input: `type P /*aa*/*/*xx*/map/*xx*/[/*xx*/int/*xx*/]/*xx*/[/*xx*/2/*xx*/]/*xx*/int// bb`,
- expected: `type P /*aa*/ *map[int][2]int // bb`,
- },
- {
- input: `type P *map[[2]int]int`,
- expected: `type P *map[[2]int]int`,
- },
- {
- input: `type P=*map[[2]int]int`,
- expected: `type P = *map[[2]int]int`,
- },
- {
- input: `type P /*aa*/*/*xx*/map/*xx*/[/*xx*/[/*xx*/2/*xx*/]/*xx*/int/*xx*/]/*xx*/int// bb`,
- expected: `type P /*aa*/ *map[[2]int]int // bb`,
- },
- })
- })
- t.Run("slice", func(t *testing.T) {
- testRun(t, []formatData{
- {
- input: `type S []int`,
- expected: `type S []int`,
- },
- {
- input: `type S=[]int`,
- expected: `type S = []int`,
- },
- {
- input: `type S [ ] int `,
- expected: `type S []int`,
- },
- {
- input: `type S [ /*xx*/ ] /*xx*/ int `,
- expected: `type S []int`,
- },
- {
- input: `type S [][]int`,
- expected: `type S [][]int`,
- },
- {
- input: `type S=[][]int`,
- expected: `type S = [][]int`,
- },
- {
- input: `type S [ ] [ ] int`,
- expected: `type S [][]int`,
- },
- {
- input: `type S [/*xx*/]/*xx*/[/*xx*/]/*xx*/int`,
- expected: `type S [][]int`,
- },
- {
- input: `type S [//
- ]//
- [//
- ]//
- int`,
- expected: `type S [][]int`,
- },
- {
- input: `type S []map[string]int`,
- expected: `type S []map[string]int`,
- },
- {
- input: `type S=[]map[string]int`,
- expected: `type S = []map[string]int`,
- },
- {
- input: `type S [ ]
- map [ string ]
- int`,
- expected: `type S []map[string]int`,
- },
- {
- input: `type S [/*xx*/]/*xx*/map/*xx*/[/*xx*/string/*xx*/]/*xx*/int`,
- expected: `type S []map[string]int`,
- },
- {
- input: `/*aa*/type// bb
- // cc
- S// dd
- // ff
- /*gg*/[ // hh
- /*xx*/] // ii
- /*xx*/map// jj
- /*xx*/[/*xx*/string/*xx*/]/*xx*/int// mm`,
- expected: `/*aa*/
- type // bb
- // cc
- S // dd
- // ff
- /*gg*/
- []map[string]int // mm`,
- },
- {
- input: `type S []map[[2]int]int`,
- expected: `type S []map[[2]int]int`,
- },
- {
- input: `type S=[]map[[2]int]int`,
- expected: `type S = []map[[2]int]int`,
- },
- {
- input: `type S [/*xx*/]/*xx*/map/*xx*/[/*xx*/[/*xx*/2/*xx*/]/*xx*/int/*xx*/]/*xx*/int`,
- expected: `type S []map[[2]int]int`,
- },
- {
- input: `/*aa*/type// bb
- // cc
- /*dd*/S// ee
- // ff
- /*gg*/[//
- /*xx*/]//
- /*xx*/map//
- /*xx*/[//
- /*xx*/[//
- /*xx*/2//
- /*xx*/]//
- /*xx*/int//
- /*xx*/]//
- /*xx*/int // hh`,
- expected: `/*aa*/
- type // bb
- // cc
- /*dd*/
- S // ee
- // ff
- /*gg*/
- []map[[2]int]int // hh`,
- },
- {
- input: `type S []map[[2]int]map[int]string`,
- expected: `type S []map[[2]int]map[int]string`,
- },
- {
- input: `type S=[]map[[2]int]map[int]string`,
- expected: `type S = []map[[2]int]map[int]string`,
- },
- {
- input: `type S [/*xx*/]/*xx*/map/*xx*/[/*xx*/[/*xx*/2/*xx*/]/*xx*/int/*xx*/]/*xx*/map/*xx*/[/*xx*/int/*xx*/]/*xx*/string`,
- expected: `type S []map[[2]int]map[int]string`,
- },
- {
- input: `/*aa*/type// bb
- // cc
- /*dd*/S// ee
- /*ff*/[//
- /*xx*/]//
- /*xx*/map
- /*xx*/[//
- /*xx*/[//
- /*xx*/2//
- /*xx*/]//
- /*xx*/int//
- /*xx*/]//
- /*xx*/map//
- /*xx*/[//
- /*xx*/int//
- /*xx*/]//
- /*xx*/string// gg`,
- expected: `/*aa*/
- type // bb
- // cc
- /*dd*/
- S // ee
- /*ff*/
- []map[[2]int]map[int]string // gg`,
- },
- {
- input: `type S []*P`,
- expected: `type S []*P`,
- },
- {
- input: `type S=[]*P`,
- expected: `type S = []*P`,
- },
- {
- input: `type S [/*xx*/]/*xx*/*/*xx*/P`,
- expected: `type S []*P`,
- },
- {
- input: `/*aa*/type// bb
- // cc
- /*dd*/S// ee
- /*ff*/[//
- /*xx*/]//
- /*xx*/*//
- /*xx*/P // gg`,
- expected: `/*aa*/
- type // bb
- // cc
- /*dd*/
- S // ee
- /*ff*/
- []*P // gg`,
- },
- {
- input: `type S []*[]int`,
- expected: `type S []*[]int`,
- },
- {
- input: `type S=[]*[]int`,
- expected: `type S = []*[]int`,
- },
- {
- input: `type S [/*xx*/]/*xx*/*/*xx*/[/*xx*/]/*xx*/int`,
- expected: `type S []*[]int`,
- },
- {
- input: `/*aa*/
- type // bb
- // cc
- /*dd*/S// ee
- /*ff*/[//
- /*xx*/]//
- /*xx*/*//
- /*xx*/[//
- /*xx*/]//
- /*xx*/int // gg`,
- expected: `/*aa*/
- type // bb
- // cc
- /*dd*/
- S // ee
- /*ff*/
- []*[]int // gg`,
- },
- })
- })
- t.Run("struct", func(t *testing.T) {
- testRun(t, []formatData{
- {
- input: `type T {}`,
- expected: `type T {}`,
- },
- {
- input: `type T {
- } `,
- expected: `type T {}`,
- },
- {
- input: `type T={}`,
- expected: `type T = {}`,
- },
- {
- input: `type T /*aa*/{/*xx*/}// cc`,
- expected: `type T /*aa*/ {} // cc`,
- },
- {
- input: `/*aa*/type// bb
- // cc
- /*dd*/T // ee
- /*ff*/{//
- /*xx*/}// cc`,
- expected: `/*aa*/
- type // bb
- // cc
- /*dd*/
- T // ee
- /*ff*/
- {} // cc`,
- },
- {
- input: `type T {
- Name string
- }`,
- expected: `type T {
- Name string
- }`,
- },
- {
- input: `type T {
- Foo
- }`,
- expected: `type T {
- Foo
- }`,
- },
- {
- input: `type T {
- *Foo
- }`,
- expected: `type T {
- *Foo
- }`,
- },
- {
- input: testStructLitData,
- expected: expectedStructLitData,
- converter: func(s string) string {
- return strings.ReplaceAll(s, "\t", " ")
- },
- },
- })
- })
- }
- //go:embed testdata/test_type_struct_group.api
- var testStructGroupData string
- //go:embed testdata/expected_type_struct_group.api
- var expectedStructgroupData string
- func TestFormat_TypeGroupStmt(t *testing.T) {
- testRun(t, []formatData{
- {
- input: testStructGroupData,
- expected: expectedStructgroupData,
- converter: func(s string) string {
- return strings.ReplaceAll(s, "\t", " ")
- },
- },
- })
- }
- func TestFormat_AtServerStmt(t *testing.T) {
- testRunStmt(t, []formatData{
- {
- input: `@server()`,
- expected: ``,
- },
- {
- input: `@server(foo:foo)`,
- expected: `@server (
- foo: foo
- )`,
- },
- {
- input: `@server(foo:foo quux:quux)`,
- expected: `@server (
- foo: foo
- quux: quux
- )`,
- },
- {
- input: `@server(
- foo:
- foo
- quux:
- quux
- )`,
- expected: `@server (
- foo: foo
- quux: quux
- )`,
- },
- {
- input: `/*aa*/@server/*bb*/(/*cc*/foo:/**/foo /*dd*/quux:/**/quux/*ee*/)`,
- expected: `/*aa*/
- @server ( /*cc*/
- foo: foo /*dd*/
- quux: quux /*ee*/
- )`,
- },
- {
- input: `/*aa*/
- @server
- /*bb*/(// cc
- /*dd*/foo:/**/foo// ee
- /*ff*/quux:/**/quux// gg
- )`,
- expected: `/*aa*/
- @server
- /*bb*/
- ( // cc
- /*dd*/
- foo: foo // ee
- /*ff*/
- quux: quux // gg
- )`,
- },
- })
- }
- func TestFormat_AtDocStmt(t *testing.T) {
- t.Run("AtDocLiteralStmt", func(t *testing.T) {
- testRunStmt(t, []formatData{
- {
- input: `@doc ""`,
- expected: ``,
- },
- {
- input: `@doc "foo"`,
- expected: `@doc "foo"`,
- },
- {
- input: `@doc "foo"`,
- expected: `@doc "foo"`,
- },
- {
- input: `@doc"foo"`,
- expected: `@doc "foo"`,
- },
- {
- input: `/*aa*/@doc/**/"foo"// bb`,
- expected: `/*aa*/
- @doc "foo" // bb`,
- },
- {
- input: `/*aa*/
- /*bb*/@doc // cc
- "foo"// ee`,
- expected: `/*aa*/
- /*bb*/
- @doc "foo" // ee`,
- },
- })
- })
- t.Run("AtDocGroupStmt", func(t *testing.T) {
- testRunStmt(t, []formatData{
- {
- input: `@doc()`,
- expected: ``,
- },
- {
- input: `@doc(foo:"foo")`,
- expected: `@doc (
- foo: "foo"
- )`,
- },
- {
- input: `@doc(foo:"foo" bar:"bar")`,
- expected: `@doc (
- foo: "foo"
- bar: "bar"
- )`,
- },
- {
- input: `@doc(foo:"foo" bar:"bar" quux:"quux")`,
- expected: `@doc (
- foo: "foo"
- bar: "bar"
- quux: "quux"
- )`,
- },
- {
- input: `@doc(foo:"foo"
- bar: "bar")`,
- expected: `@doc (
- foo: "foo"
- bar: "bar"
- )`,
- },
- {
- input: `@doc(foo:"foo"// aa
- bar: "bar"// bb
- )`,
- expected: `@doc (
- foo: "foo" // aa
- bar: "bar" // bb
- )`,
- },
- {
- input: `@doc(// aa
- foo:"foo"// bb
- bar: "bar"// cc
- )`,
- expected: `@doc ( // aa
- foo: "foo" // bb
- bar: "bar" // cc
- )`,
- },
- {
- input: `/*aa*/@doc(// bb
- foo:"foo"// cc
- bar: "bar"// dd
- )`,
- expected: `/*aa*/
- @doc ( // bb
- foo: "foo" // cc
- bar: "bar" // dd
- )`,
- },
- {
- input: `/*aa*/
- @doc(// bb
- foo:"foo"// cc
- bar: "bar"// dd
- )// ee`,
- expected: `/*aa*/
- @doc ( // bb
- foo: "foo" // cc
- bar: "bar" // dd
- ) // ee`,
- },
- {
- input: `/*aa*/
- @doc ( // bb
- /*cc*/foo: "foo" // dd
- /*ee*/bar: "bar" // ff
- ) // gg`,
- expected: `/*aa*/
- @doc ( // bb
- /*cc*/
- foo: "foo" // dd
- /*ee*/
- bar: "bar" // ff
- ) // gg`,
- },
- {
- input: `/*aa*/
- @doc/*xx*/( // bb
- /*cc*/foo:/*xx*/ "foo" // dd
- /*ee*/bar:/*xx*/ "bar" // ff
- ) // gg`,
- expected: `/*aa*/
- @doc ( // bb
- /*cc*/
- foo: "foo" // dd
- /*ee*/
- bar: "bar" // ff
- ) // gg`,
- },
- })
- })
- }
- func TestFormat_AtHandlerStmt(t *testing.T) {
- testRunStmt(t, []formatData{
- {
- input: `@handler foo`,
- expected: `@handler foo`,
- },
- {
- input: `@handler foo`,
- expected: `@handler foo`,
- },
- {
- input: `/*aa*/@handler/**/foo// bb`,
- expected: `/*aa*/
- @handler foo // bb`,
- },
- {
- input: `/*aa*/
- /*bb*/@handler // cc
- foo// ee`,
- expected: `/*aa*/
- /*bb*/
- @handler foo // ee`,
- },
- })
- }
- //go:embed testdata/test_service.api
- var testServiceData string
- //go:embed testdata/expected_service.api
- var expectedServiceData string
- func TestFormat_ServiceStmt(t *testing.T) {
- testRun(t, []formatData{
- {
- input: `service foo{}`,
- expected: `service foo {}`,
- },
- {
- input: `service foo { }`,
- expected: `service foo {}`,
- },
- {
- input: `@server()service foo { }`,
- expected: `service foo {}`,
- },
- {
- input: `@server(foo:foo quux:quux)service foo { }`,
- expected: `@server (
- foo: foo
- quux: quux
- )
- service foo {}`,
- },
- {
- input: `service foo-api { }`,
- expected: `service foo-api {}`,
- },
- {
- input: `service foo-api {
- @doc "foo"
- @handler foo
- post /ping
- }`,
- expected: `service foo-api {
- @doc "foo"
- @handler foo
- post /ping
- }`,
- },
- {
- input: `service foo-api {
- @doc(foo: "foo" bar: "bar")
- @handler foo
- post /ping
- }`,
- expected: `service foo-api {
- @doc (
- foo: "foo"
- bar: "bar"
- )
- @handler foo
- post /ping
- }`,
- },
- {
- input: `service foo-api {
- @doc(foo: "foo" bar: "bar"
- quux: "quux"
- )
- @handler foo
- post /ping
- }`,
- expected: `service foo-api {
- @doc (
- foo: "foo"
- bar: "bar"
- quux: "quux"
- )
- @handler foo
- post /ping
- }`,
- },
- {
- input: `service
- foo-api
- {
- @doc
- (foo: "foo" bar: "bar"
- quux: "quux"
- )
- @handler
- foo
- post
- /aa/:bb/cc-dd/ee
- @handler bar
- get /bar () returns (Bar);
- @handler baz
- get /bar (Baz) returns ();
- }`,
- expected: `service foo-api {
- @doc (
- foo: "foo"
- bar: "bar"
- quux: "quux"
- )
- @handler foo
- post /aa/:bb/cc-dd/ee
- @handler bar
- get /bar returns (Bar)
- @handler baz
- get /bar (Baz)
- }`,
- },
- {
- input: testServiceData,
- expected: expectedServiceData,
- converter: func(s string) string {
- return strings.ReplaceAll(s, "\t", " ")
- },
- },
- })
- }
- func TestFormat_error(t *testing.T) {
- err := Source([]byte("aaa"), os.Stdout)
- assertx.Error(t, err)
- }
- func testRun(t *testing.T, testData []formatData) {
- for _, v := range testData {
- buffer := bytes.NewBuffer(nil)
- err := formatForUnitTest([]byte(v.input), buffer)
- assert.NoError(t, err)
- var result = buffer.String()
- if v.converter != nil {
- result = v.converter(result)
- }
- assert.Equal(t, v.expected, result)
- }
- }
- func testRunStmt(t *testing.T, testData []formatData) {
- for _, v := range testData {
- p := parser.New("foo.api", v.input)
- ast := p.ParseForUintTest()
- assert.NoError(t, p.CheckErrors())
- assert.True(t, len(ast.Stmts) > 0)
- one := ast.Stmts[0]
- actual := one.Format()
- if v.converter != nil {
- actual = v.converter(actual)
- }
- assert.Equal(t, v.expected, actual)
- }
- }
|