github.com/mdomke/git-semver@v1.0.1-0.20200406193518-c0566816580f/version/version_test.go (about)

     1  package version
     2  
     3  import (
     4  	"testing"
     5  
     6  	"github.com/stretchr/testify/assert"
     7  )
     8  
     9  func TestParseVersion(t *testing.T) {
    10  	assert := assert.New(t)
    11  	v := Version{}
    12  	err := parseVersion("1.2.3", &v)
    13  	assert.NoError(err)
    14  	assert.Equal(Version{Major: 1, Minor: 2, Patch: 3}, v)
    15  }
    16  
    17  func TestParseVersionInvalid(t *testing.T) {
    18  	assert := assert.New(t)
    19  	for _, s := range []string{
    20  		"1.2",
    21  		"1.2.a",
    22  		"1.a.3",
    23  		"a.2.3",
    24  	} {
    25  		v := Version{}
    26  		err := parseVersion(s, &v)
    27  		assert.Error(err)
    28  	}
    29  }
    30  
    31  func TestParse(t *testing.T) {
    32  	assert := assert.New(t)
    33  
    34  	for _, test := range []struct {
    35  		s     string
    36  		v     Version
    37  		strip string
    38  	}{
    39  		{
    40  			"1.2.3-4-fcf2c8f",
    41  			Version{Major: 1, Minor: 2, Patch: 3, Commits: 4, Hash: "fcf2c8f"},
    42  			"",
    43  		},
    44  		{
    45  			"0.0.0-0-",
    46  			Version{},
    47  			"",
    48  		},
    49  		{
    50  			"1.2.3-rc1",
    51  			Version{Major: 1, Minor: 2, Patch: 3, preRelease: "rc1"},
    52  			"",
    53  		},
    54  		{
    55  			"1.2.3-rc1-2-gd92f0b2",
    56  			Version{Major: 1, Minor: 2, Patch: 3, preRelease: "rc1", Commits: 2, Hash: "gd92f0b2"},
    57  			"",
    58  		},
    59  		{
    60  			"3.2.1",
    61  			Version{Major: 3, Minor: 2, Patch: 1},
    62  			"",
    63  		},
    64  		{
    65  			"v3.2.1",
    66  			Version{Major: 3, Minor: 2, Patch: 1},
    67  			"v",
    68  		},
    69  	} {
    70  		v := Version{}
    71  		err := parse(test.s, &v, test.strip)
    72  		assert.NoError(err)
    73  		assert.Equal(test.v, v)
    74  	}
    75  }
    76  
    77  func TestParseInvalid(t *testing.T) {
    78  	for _, s := range []string{
    79  		"1.2.3-rc1-14-gd92f0b2-foo", // too many parts
    80  		"1.2.3-rc1-foo-gd92f0b2",    // invalid commit count
    81  	} {
    82  		v := Version{}
    83  		err := parse(s, &v)
    84  		assert.Error(t, err)
    85  	}
    86  }
    87  
    88  func TestString(t *testing.T) {
    89  	assert := assert.New(t)
    90  	for _, test := range []struct {
    91  		v Version
    92  		s string
    93  	}{
    94  		{
    95  			Version{Major: 1, Minor: 2, Patch: 3, Commits: 10, Hash: "fcf2c8f"},
    96  			"1.2.4-dev10+fcf2c8f",
    97  		},
    98  		{
    99  			Version{Major: 0, Minor: 3, Patch: 1},
   100  			"0.3.1",
   101  		},
   102  		{
   103  			Version{Major: 1, Minor: 3, Patch: 0, preRelease: "rc3"},
   104  			"1.3.0-rc3",
   105  		},
   106  		{
   107  			Version{Major: 2, Minor: 5, Patch: 0, preRelease: "rc3", Commits: 3},
   108  			"2.5.0-rc4.dev3",
   109  		},
   110  	} {
   111  		assert.Equal(test.s, test.v.String())
   112  	}
   113  
   114  }
   115  
   116  func TestFormat(t *testing.T) {
   117  	assert := assert.New(t)
   118  	v := Version{Major: 1, Minor: 2, Patch: 3, Commits: 10, Hash: "fcf2c8f"}
   119  	for _, test := range []struct {
   120  		f string
   121  		p string
   122  		s string
   123  	}{
   124  		{
   125  			FullFormat,
   126  			"",
   127  			"1.2.4-dev10+fcf2c8f",
   128  		},
   129  		{
   130  			NoMetaFormat,
   131  			"",
   132  			"1.2.4-dev10",
   133  		},
   134  		{
   135  			NoPreFormat,
   136  			"",
   137  			"1.2.4",
   138  		},
   139  		{
   140  			NoPatchFormat,
   141  			"",
   142  			"1.2",
   143  		},
   144  		{
   145  			NoMinorFormat,
   146  			"v",
   147  			"v1",
   148  		},
   149  		{
   150  			"x.y-p",
   151  			"v",
   152  			"v1.2-dev10",
   153  		},
   154  	} {
   155  		s, err := v.Format(test.f, test.p)
   156  		assert.NoError(err)
   157  		assert.Equal(test.s, s)
   158  	}
   159  }
   160  
   161  func TestInvalidFormat(t *testing.T) {
   162  	v := Version{Major: 1, Minor: 2, Patch: 3}
   163  	s, err := v.Format("q", "")
   164  	assert.EqualError(t, err, "invalid format: q")
   165  	assert.Equal(t, "", s)
   166  }
   167  
   168  func TestNextPreRelease(t *testing.T) {
   169  	assert := assert.New(t)
   170  	assert.Equal("rc2", nextPreRelease("rc1"))
   171  	assert.Equal("alpha1", nextPreRelease("alpha0"))
   172  	assert.Equal("beta10", nextPreRelease("beta9"))
   173  	assert.Equal("foo", nextPreRelease("foo"))
   174  }
   175  
   176  type gitFaker struct {
   177  	s string
   178  }
   179  
   180  func (g gitFaker) Describe() string    { return g.s }
   181  func (g gitFaker) CommitCount() string { return "" }
   182  
   183  func TestDerive(t *testing.T) {
   184  	for _, test := range []struct {
   185  		s string
   186  		v Version
   187  	}{
   188  		{
   189  			"3.2.1-rc3-10-ge6c3c44",
   190  			Version{Major: 3, Minor: 2, Patch: 1, preRelease: "rc3", Commits: 10, Hash: "ge6c3c44"},
   191  		},
   192  	} {
   193  		git = gitFaker{test.s}
   194  		Derive()
   195  	}
   196  }