diff --git a/tagalign_test.go b/tagalign_test.go index 06bdcde..ee08b59 100644 --- a/tagalign_test.go +++ b/tagalign_test.go @@ -9,26 +9,42 @@ import ( "golang.org/x/tools/go/analysis/analysistest" ) -func TestAnalyzer(t *testing.T) { - // unsort example +func Test_alignOnly(t *testing.T) { + // only align a := NewAnalyzer() - unsort, err := filepath.Abs("testdata/unsort") + unsort, err := filepath.Abs("testdata/align") assert.NoError(t, err) analysistest.Run(t, unsort, a) } -func TestAnalyzerWithOrder(t *testing.T) { - // sort with fixed order - a := NewAnalyzer(WithSort("json", "yaml", "xml")) + +func Test_sortOnly(t *testing.T) { + a := NewAnalyzer(WithAlign(false), WithSort(nil...)) sort, err := filepath.Abs("testdata/sort") assert.NoError(t, err) analysistest.Run(t, sort, a) } + +func Test_sortWithOrder(t *testing.T) { + // test disable align but enable sort + a := NewAnalyzer(WithAlign(false), WithSort("xml", "json", "yaml")) + sort, err := filepath.Abs("testdata/sortorder") + assert.NoError(t, err) + analysistest.Run(t, sort, a) +} + +func Test_alignAndSortWithOrder(t *testing.T) { + // align and sort with fixed order + a := NewAnalyzer(WithSort("json", "yaml", "xml")) + sort, err := filepath.Abs("testdata/alignsortorder") + assert.NoError(t, err) + analysistest.Run(t, sort, a) +} func TestSprintf(t *testing.T) { format := alignFormat(20) assert.Equal(t, "%-20s", format) } -func Test_sortByFixedOrder(t *testing.T) { +func Test_sortBy(t *testing.T) { tags, err := structtag.Parse(`zip:"foo" json:"foo,omitempty" yaml:"bar" binding:"required" xml:"baz" gorm:"column:foo"`) assert.NoError(t, err) @@ -40,11 +56,3 @@ func Test_sortByFixedOrder(t *testing.T) { assert.Equal(t, "gorm", tags.Tags()[4].Key) assert.Equal(t, "zip", tags.Tags()[5].Key) } - -func Test_disableAlign(t *testing.T) { - // test disable align but enable sort - a := NewAnalyzer(WithAlign(false), WithSort("xml", "json", "yaml")) - sort, err := filepath.Abs("testdata/noalign") - assert.NoError(t, err) - analysistest.Run(t, sort, a) -} diff --git a/testdata/unsort/example.go b/testdata/align/example.go similarity index 100% rename from testdata/unsort/example.go rename to testdata/align/example.go diff --git a/testdata/alignsortorder/example.go b/testdata/alignsortorder/example.go new file mode 100644 index 0000000..1e110f1 --- /dev/null +++ b/testdata/alignsortorder/example.go @@ -0,0 +1,13 @@ +package alignsortorder + +type AlignAndSortWithOrderExample struct { + Foo int `json:"foo,omitempty" yaml:"bar" xml:"baz" binding:"required" gorm:"column:foo" zip:"foo" validate:"required"` // want `tag is not aligned, should be: json:"foo,omitempty" yaml:"bar" xml:"baz" binding:"required" gorm:"column:foo" validate:"required" zip:"foo"` + Bar int `validate:"required" yaml:"foo" xml:"bar" binding:"required" json:"bar,omitempty" gorm:"column:bar" zip:"bar" ` // want `tag is not aligned, should be: json:"bar,omitempty" yaml:"foo" xml:"bar" binding:"required" gorm:"column:bar" validate:"required" zip:"bar"` + FooBar int `gorm:"column:bar" validate:"required" xml:"bar" binding:"required" json:"bar,omitempty" zip:"bar" yaml:"foo"` // want `tag is not aligned, should be: json:"bar,omitempty" yaml:"foo" xml:"bar" binding:"required" gorm:"column:bar" validate:"required" zip:"bar"` +} + +type AlignAndSortWithOrderExample2 struct { + Foo int ` xml:"baz" json:"foo,omitempty" yaml:"bar" zip:"foo" binding:"required" gorm:"column:foo" validate:"required"` // want `tag is not aligned , should be: json:"foo,omitempty" yaml:"bar" xml:"baz" binding:"required" gorm:"column:foo" validate:"required" zip:"foo"` + + Bar int `validate:"required" gorm:"column:bar" yaml:"foo" xml:"bar" binding:"required" json:"bar,omitempty" zip:"bar" ` // want `tag is not aligned , should be: json:"bar,omitempty" yaml:"foo" xml:"bar" binding:"required" gorm:"column:bar" validate:"required" zip:"bar"` +} diff --git a/testdata/sort/example.go b/testdata/sort/example.go index f5ee527..d298a14 100644 --- a/testdata/sort/example.go +++ b/testdata/sort/example.go @@ -1,13 +1,13 @@ -package testdata +package sort -type SortExample struct { - Foo int `json:"foo,omitempty" yaml:"bar" xml:"baz" binding:"required" gorm:"column:foo" zip:"foo" validate:"required"` // want `tag is not aligned, should be: json:"foo,omitempty" yaml:"bar" xml:"baz" binding:"required" gorm:"column:foo" validate:"required" zip:"foo"` - Bar int `validate:"required" yaml:"foo" xml:"bar" binding:"required" json:"bar,omitempty" gorm:"column:bar" zip:"bar" ` // want `tag is not aligned, should be: json:"bar,omitempty" yaml:"foo" xml:"bar" binding:"required" gorm:"column:bar" validate:"required" zip:"bar"` - FooBar int `gorm:"column:bar" validate:"required" xml:"bar" binding:"required" json:"bar,omitempty" zip:"bar" yaml:"foo"` // want `tag is not aligned, should be: json:"bar,omitempty" yaml:"foo" xml:"bar" binding:"required" gorm:"column:bar" validate:"required" zip:"bar"` -} +import "time" -type SortExample2 struct { - Foo int ` xml:"baz" json:"foo,omitempty" yaml:"bar" zip:"foo" binding:"required" gorm:"column:foo" validate:"required"` // want `tag is not aligned , should be: json:"foo,omitempty" yaml:"bar" xml:"baz" binding:"required" gorm:"column:foo" validate:"required" zip:"foo"` +type TagAlignExampleSortOnlyKO struct { + Foo time.Time `xml:"foo" json:"foo,omitempty" yaml:"foo" gorm:"column:foo" validate:"required" zip:"foo"` // want `gorm:"column:foo" json:"foo,omitempty" validate:"required" xml:"foo" yaml:"foo" zip:"foo"` + FooBar struct{} `gorm:"column:fooBar" validate:"required" zip:"fooBar" xml:"fooBar" json:"fooBar,omitempty" yaml:"fooBar"` // want `gorm:"column:fooBar" json:"fooBar,omitempty" validate:"required" xml:"fooBar" yaml:"fooBar" zip:"fooBar"` +} - Bar int `validate:"required" gorm:"column:bar" yaml:"foo" xml:"bar" binding:"required" json:"bar,omitempty" zip:"bar" ` // want `tag is not aligned , should be: json:"bar,omitempty" yaml:"foo" xml:"bar" binding:"required" gorm:"column:bar" validate:"required" zip:"bar"` +type TagAlignExampleSortOnlyOK struct { + Foo time.Time `gorm:"column:foo" json:"foo,omitempty" validate:"required" xml:"foo" yaml:"foo" zip:"foo"` + FooBar struct{} `gorm:"column:fooBar" json:"fooBar,omitempty" validate:"required" xml:"fooBar" yaml:"fooBar" zip:"fooBar"` } diff --git a/testdata/noalign/example.go b/testdata/sortorder/example.go similarity index 94% rename from testdata/noalign/example.go rename to testdata/sortorder/example.go index c00f167..7befbf1 100644 --- a/testdata/noalign/example.go +++ b/testdata/sortorder/example.go @@ -1,6 +1,6 @@ -package noalign +package sortorder -type SortOnlyExample struct { +type SortWithOrderExample struct { // not aligned but sorted, should not be reported Foo int `xml:"baz" json:"foo,omitempty" yaml:"bar" binding:"required" gorm:"column:foo" validate:"required" zip:"foo" ` Bar int `xml:"bar" json:"bar,omitempty" yaml:"foo" gorm:"column:bar" validate:"required" zip:"bar" `