go-simpler.org/musttag@v0.12.2/musttag_test.go (about) 1 package musttag 2 3 import ( 4 "io" 5 "os" 6 "os/exec" 7 "path/filepath" 8 "testing" 9 10 "go-simpler.org/assert" 11 . "go-simpler.org/assert/EF" 12 "golang.org/x/tools/go/analysis/analysistest" 13 ) 14 15 func TestAnalyzer(t *testing.T) { 16 testdata := analysistest.TestData() 17 setupModules(t, testdata) 18 19 t.Run("tests", func(t *testing.T) { 20 analyzer := New( 21 Func{Name: "example.com/custom.Marshal", Tag: "custom", ArgPos: 0}, 22 Func{Name: "example.com/custom.Unmarshal", Tag: "custom", ArgPos: 1}, 23 ) 24 analysistest.Run(t, testdata, analyzer, "tests") 25 }) 26 27 t.Run("bad Func.ArgPos", func(t *testing.T) { 28 analyzer := New( 29 Func{Name: "encoding/json.Marshal", Tag: "json", ArgPos: 10}, 30 ) 31 err := analysistest.Run(nopT{}, testdata, analyzer, "tests")[0].Err 32 assert.Equal[E](t, err.Error(), "musttag: Func.ArgPos cannot be 10: encoding/json.Marshal accepts only 1 argument(s)") 33 }) 34 } 35 36 func TestFlags(t *testing.T) { 37 analyzer := New() 38 analyzer.Flags.Usage = func() {} 39 analyzer.Flags.SetOutput(io.Discard) 40 41 t.Run("ok", func(t *testing.T) { 42 err := analyzer.Flags.Parse([]string{"-fn=test.Test:test:0"}) 43 assert.NoErr[E](t, err) 44 }) 45 46 t.Run("invalid format", func(t *testing.T) { 47 err := analyzer.Flags.Parse([]string{"-fn=test.Test"}) 48 assert.Equal[E](t, err.Error(), `invalid value "test.Test" for flag -fn: invalid syntax`) 49 }) 50 51 t.Run("non-number argument position", func(t *testing.T) { 52 err := analyzer.Flags.Parse([]string{"-fn=test.Test:test:-"}) 53 assert.Equal[E](t, err.Error(), `invalid value "test.Test:test:-" for flag -fn: strconv.Atoi: parsing "-": invalid syntax`) 54 }) 55 } 56 57 type nopT struct{} 58 59 func (nopT) Errorf(string, ...any) {} 60 61 // NOTE: analysistest does not yet support modules; 62 // see https://github.com/golang/go/issues/37054 for details. 63 func setupModules(t *testing.T, testdata string) { 64 t.Helper() 65 66 err := os.Chdir(filepath.Join(testdata, "src")) 67 assert.NoErr[F](t, err) 68 69 err = exec.Command("go", "work", "vendor").Run() 70 assert.NoErr[F](t, err) 71 }