version_test.go 9.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185
  1. package version
  2. import (
  3. "testing"
  4. )
  5. func TestVersion_String(t *testing.T) {
  6. type TestCase struct {
  7. Expected string // Expected
  8. Input Version // Input
  9. }
  10. testCases := []TestCase{
  11. {Expected: "0.0.0", Input: Version{}},
  12. {Expected: "1.0.0", Input: Version{Major: 1}},
  13. {Expected: "0.1.0", Input: Version{Minor: 1}},
  14. {Expected: "0.0.1", Input: Version{Patch: 1}},
  15. {Expected: "10.20.30", Input: Version{Major: 10, Minor: 20, Patch: 30}},
  16. {Expected: "27.31.15", Input: Version{Major: 27, Minor: 31, Patch: 15}},
  17. {Expected: "v1.2.3", Input: Version{Major: 1, Minor: 2, Patch: 3, Text: "v1.2.3"}},
  18. {Expected: "v1.2.3", Input: Version{Text: "v1.2.3"}},
  19. {Expected: "v1.2.0a", Input: Version{Major: 1, Minor: 2, Extension: "a", Text: "v1.2.0a"}},
  20. {Expected: "v1-alpha2", Input: Version{Major: 1, Extension: "-alpha2", Text: "v1-alpha2"}},
  21. }
  22. for i, testCase := range testCases {
  23. actual := testCase.Input.String()
  24. if actual != testCase.Expected {
  25. t.Errorf("test %d failed (expected %s, actual %s)", i, testCase.Expected, actual)
  26. } else {
  27. t.Logf("test %d passed with %s\n", i, actual)
  28. }
  29. }
  30. }
  31. func TestVersion_Compare(t *testing.T) {
  32. type TestCase struct {
  33. A *Version
  34. B *Version
  35. Expected int
  36. }
  37. testCases := []TestCase{
  38. {A: MustParse("0.0.1"), B: MustParse("0.0.1"), Expected: 0},
  39. {A: MustParse("0.1.0"), B: MustParse("0.1.0"), Expected: 0},
  40. {A: MustParse("1.0.0"), B: MustParse("1.0.0"), Expected: 0},
  41. {A: MustParse("1.0.0"), B: MustParse("0.1.0"), Expected: 1},
  42. {A: MustParse("1.0.0"), B: MustParse("0.0.1"), Expected: 1},
  43. {A: MustParse("1.0.0"), B: MustParse("1.1.0"), Expected: -1},
  44. {A: MustParse("1.0.0"), B: MustParse("1.0.1"), Expected: -1},
  45. {A: MustParse("1.0.0"), B: MustParse("2.0.0"), Expected: -1},
  46. {A: MustParse("1.1.0"), B: MustParse("1.2.0"), Expected: -1},
  47. {A: MustParse("1.1.1"), B: MustParse("1.2.0"), Expected: -1},
  48. {A: MustParse("1.20.0"), B: MustParse("1.2.0"), Expected: 1},
  49. {A: MustParse("1.20.0"), B: MustParse("1.2.20"), Expected: 1},
  50. {A: MustParse("1.20.0"), B: MustParse("1.20.1"), Expected: -1},
  51. {A: MustParse("1.0.0"), Expected: 1},
  52. {B: MustParse("1.0.0"), Expected: -1},
  53. {Expected: 0},
  54. }
  55. for i, testCase := range testCases {
  56. actual := testCase.A.Compare(testCase.B)
  57. if actual != testCase.Expected {
  58. t.Errorf("test %d failed (expected %d, actual %d)", i, testCase.Expected, actual)
  59. } else {
  60. t.Logf("test %d passed with %d", i, actual)
  61. }
  62. }
  63. }
  64. func TestVersion_Less(t *testing.T) {
  65. type TestCase struct {
  66. A *Version
  67. B *Version
  68. Expected bool
  69. }
  70. testCases := []TestCase{
  71. {A: MustParse("0.0.1"), B: MustParse("0.0.1"), Expected: false},
  72. {A: MustParse("0.1.0"), B: MustParse("0.1.0"), Expected: false},
  73. {A: MustParse("1.0.0"), B: MustParse("1.0.0"), Expected: false},
  74. {A: MustParse("1.0.0"), B: MustParse("0.1.0"), Expected: false},
  75. {A: MustParse("1.0.0"), B: MustParse("0.0.1"), Expected: false},
  76. {A: MustParse("1.0.0"), B: MustParse("1.1.0"), Expected: true},
  77. {A: MustParse("1.0.0"), B: MustParse("1.0.1"), Expected: true},
  78. {A: MustParse("1.0.0"), B: MustParse("2.0.0"), Expected: true},
  79. {A: MustParse("1.1.0"), B: MustParse("1.2.0"), Expected: true},
  80. {A: MustParse("1.1.1"), B: MustParse("1.2.0"), Expected: true},
  81. {A: MustParse("1.20.0"), B: MustParse("1.2.0"), Expected: false},
  82. {A: MustParse("1.20.0"), B: MustParse("1.2.20"), Expected: false},
  83. {A: MustParse("1.20.0"), B: MustParse("1.20.1"), Expected: true},
  84. }
  85. for i, testCase := range testCases {
  86. actual := testCase.A.Less(testCase.B)
  87. if actual != testCase.Expected {
  88. t.Errorf("test %d failed (expected %v, actual %v)", i, testCase.Expected, actual)
  89. } else {
  90. t.Logf("test %d passed with %v", i, actual)
  91. }
  92. }
  93. }
  94. func TestVersion_Match(t *testing.T) {
  95. type TestCase struct {
  96. V *Version
  97. C *Constraint
  98. Expected bool
  99. }
  100. testCases := []TestCase{
  101. {V: MustParse("1.0.0"), Expected: true},
  102. {V: MustParse("1.0.0"), C: &Constraint{Gt: MustParse("0.1.0")}, Expected: true},
  103. {V: MustParse("1.0.0"), C: &Constraint{Gt: MustParse("1.0.0")}, Expected: false},
  104. {V: MustParse("1.0.0"), C: &Constraint{Gt: MustParse("1.1.0")}, Expected: false},
  105. {V: MustParse("1.0.0"), C: &Constraint{Gte: MustParse("0.1.0")}, Expected: true},
  106. {V: MustParse("1.0.0"), C: &Constraint{Gte: MustParse("1.0.0")}, Expected: true},
  107. {V: MustParse("1.0.0"), C: &Constraint{Gte: MustParse("1.1.0")}, Expected: false},
  108. {V: MustParse("1.0.0"), C: &Constraint{Lt: MustParse("0.1.0")}, Expected: false},
  109. {V: MustParse("1.0.0"), C: &Constraint{Lt: MustParse("1.0.0")}, Expected: false},
  110. {V: MustParse("1.0.0"), C: &Constraint{Lt: MustParse("1.1.0")}, Expected: true},
  111. {V: MustParse("1.0.0"), C: &Constraint{Lte: MustParse("0.1.0")}, Expected: false},
  112. {V: MustParse("1.0.0"), C: &Constraint{Lte: MustParse("1.0.0")}, Expected: true},
  113. {V: MustParse("1.0.0"), C: &Constraint{Lte: MustParse("1.1.0")}, Expected: true},
  114. {V: MustParse("1.0.0"), C: &Constraint{Gt: MustParse("0.1.0"), Lt: MustParse("0.1.0")}, Expected: false},
  115. {V: MustParse("1.0.0"), C: &Constraint{Gt: MustParse("0.1.0"), Lt: MustParse("1.0.0")}, Expected: false},
  116. {V: MustParse("1.0.0"), C: &Constraint{Gt: MustParse("0.1.0"), Lt: MustParse("1.1.0")}, Expected: true},
  117. {V: MustParse("1.0.0"), C: &Constraint{Gt: MustParse("1.0.0"), Lt: MustParse("0.1.0")}, Expected: false},
  118. {V: MustParse("1.0.0"), C: &Constraint{Gt: MustParse("1.0.0"), Lt: MustParse("1.0.0")}, Expected: false},
  119. {V: MustParse("1.0.0"), C: &Constraint{Gt: MustParse("1.0.0"), Lt: MustParse("1.1.0")}, Expected: false},
  120. {V: MustParse("1.0.0"), C: &Constraint{Gt: MustParse("1.1.0"), Lt: MustParse("0.1.0")}, Expected: false},
  121. {V: MustParse("1.0.0"), C: &Constraint{Gt: MustParse("1.1.0"), Lt: MustParse("1.0.0")}, Expected: false},
  122. {V: MustParse("1.0.0"), C: &Constraint{Gt: MustParse("1.1.0"), Lt: MustParse("1.1.0")}, Expected: false},
  123. {V: MustParse("1.0.0"), C: &Constraint{Gt: MustParse("0.1.0"), Lte: MustParse("0.1.0")}, Expected: false},
  124. {V: MustParse("1.0.0"), C: &Constraint{Gt: MustParse("0.1.0"), Lte: MustParse("1.0.0")}, Expected: true},
  125. {V: MustParse("1.0.0"), C: &Constraint{Gt: MustParse("0.1.0"), Lte: MustParse("1.1.0")}, Expected: true},
  126. {V: MustParse("1.0.0"), C: &Constraint{Gt: MustParse("1.0.0"), Lte: MustParse("0.1.0")}, Expected: false},
  127. {V: MustParse("1.0.0"), C: &Constraint{Gt: MustParse("1.0.0"), Lte: MustParse("1.0.0")}, Expected: false},
  128. {V: MustParse("1.0.0"), C: &Constraint{Gt: MustParse("1.0.0"), Lte: MustParse("1.1.0")}, Expected: false},
  129. {V: MustParse("1.0.0"), C: &Constraint{Gt: MustParse("1.1.0"), Lte: MustParse("0.1.0")}, Expected: false},
  130. {V: MustParse("1.0.0"), C: &Constraint{Gt: MustParse("1.1.0"), Lte: MustParse("1.0.0")}, Expected: false},
  131. {V: MustParse("1.0.0"), C: &Constraint{Gt: MustParse("1.1.0"), Lte: MustParse("1.1.0")}, Expected: false},
  132. {V: MustParse("1.0.0"), C: &Constraint{Gte: MustParse("0.1.0"), Lt: MustParse("0.1.0")}, Expected: false},
  133. {V: MustParse("1.0.0"), C: &Constraint{Gte: MustParse("0.1.0"), Lt: MustParse("1.0.0")}, Expected: false},
  134. {V: MustParse("1.0.0"), C: &Constraint{Gte: MustParse("0.1.0"), Lt: MustParse("1.1.0")}, Expected: true},
  135. {V: MustParse("1.0.0"), C: &Constraint{Gte: MustParse("1.0.0"), Lt: MustParse("0.1.0")}, Expected: false},
  136. {V: MustParse("1.0.0"), C: &Constraint{Gte: MustParse("1.0.0"), Lt: MustParse("1.0.0")}, Expected: false},
  137. {V: MustParse("1.0.0"), C: &Constraint{Gte: MustParse("1.0.0"), Lt: MustParse("1.1.0")}, Expected: true},
  138. {V: MustParse("1.0.0"), C: &Constraint{Gte: MustParse("1.1.0"), Lt: MustParse("0.1.0")}, Expected: false},
  139. {V: MustParse("1.0.0"), C: &Constraint{Gte: MustParse("1.1.0"), Lt: MustParse("1.0.0")}, Expected: false},
  140. {V: MustParse("1.0.0"), C: &Constraint{Gte: MustParse("1.1.0"), Lt: MustParse("1.1.0")}, Expected: false},
  141. {V: MustParse("1.0.0"), C: &Constraint{Gte: MustParse("0.1.0"), Lte: MustParse("0.1.0")}, Expected: false},
  142. {V: MustParse("1.0.0"), C: &Constraint{Gte: MustParse("0.1.0"), Lte: MustParse("1.0.0")}, Expected: true},
  143. {V: MustParse("1.0.0"), C: &Constraint{Gte: MustParse("0.1.0"), Lte: MustParse("1.1.0")}, Expected: true},
  144. {V: MustParse("1.0.0"), C: &Constraint{Gte: MustParse("1.0.0"), Lte: MustParse("0.1.0")}, Expected: false},
  145. {V: MustParse("1.0.0"), C: &Constraint{Gte: MustParse("1.0.0"), Lte: MustParse("1.0.0")}, Expected: true},
  146. {V: MustParse("1.0.0"), C: &Constraint{Gte: MustParse("1.0.0"), Lte: MustParse("1.1.0")}, Expected: true},
  147. {V: MustParse("1.0.0"), C: &Constraint{Gte: MustParse("1.1.0"), Lte: MustParse("0.1.0")}, Expected: false},
  148. {V: MustParse("1.0.0"), C: &Constraint{Gte: MustParse("1.1.0"), Lte: MustParse("1.0.0")}, Expected: false},
  149. {V: MustParse("1.0.0"), C: &Constraint{Gte: MustParse("1.1.0"), Lte: MustParse("1.1.0")}, Expected: false},
  150. {V: MustParse("1.0.0"), C: &Constraint{Gt: MustParse("1.0.0"), Gte: MustParse("1.0.0")}, Expected: false},
  151. {V: MustParse("1.0.0"), C: &Constraint{Gt: MustParse("0.1.0"), Gte: MustParse("1.1.0")}, Expected: true},
  152. {V: MustParse("1.0.0"), C: &Constraint{Gt: MustParse("1.1.0"), Gte: MustParse("0.1.0")}, Expected: false},
  153. {V: MustParse("1.0.0"), C: &Constraint{Lt: MustParse("1.0.0"), Lte: MustParse("1.0.0")}, Expected: false},
  154. {V: MustParse("1.0.0"), C: &Constraint{Lt: MustParse("0.1.0"), Lte: MustParse("1.1.0")}, Expected: false},
  155. {V: MustParse("1.0.0"), C: &Constraint{Lt: MustParse("1.1.0"), Lte: MustParse("0.1.0")}, Expected: true},
  156. }
  157. for i, testCase := range testCases {
  158. actual := testCase.V.Match(testCase.C)
  159. if actual != testCase.Expected {
  160. t.Errorf("test %d failed (expected %v, actual %v)", i, testCase.Expected, actual)
  161. } else {
  162. t.Logf("test %d passed with %v", i, actual)
  163. }
  164. }
  165. }