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  }