semver_test.py 7.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185
  1. # -*- coding: utf-8 -*-
  2. import unittest
  3. from unittest import TestCase
  4. from semver import compare
  5. from semver import match
  6. from semver import parse
  7. from semver import format_version
  8. from semver import bump_major
  9. from semver import bump_minor
  10. from semver import bump_patch
  11. from semver import bump_prerelease
  12. from semver import bump_build
  13. from semver import min_ver
  14. from semver import max_ver
  15. class TestSemver(TestCase):
  16. def test_should_parse_version(self):
  17. self.assertEqual(
  18. parse("1.2.3-alpha.1.2+build.11.e0f985a"),
  19. {'major': 1,
  20. 'minor': 2,
  21. 'patch': 3,
  22. 'prerelease': 'alpha.1.2',
  23. 'build': 'build.11.e0f985a'})
  24. self.assertEqual(
  25. parse("1.2.3-alpha-1+build.11.e0f985a"),
  26. {'major': 1,
  27. 'minor': 2,
  28. 'patch': 3,
  29. 'prerelease': 'alpha-1',
  30. 'build': 'build.11.e0f985a'})
  31. def test_should_get_less(self):
  32. self.assertEqual(
  33. compare("1.0.0", "2.0.0"),
  34. -1)
  35. def test_should_get_greater(self):
  36. self.assertEqual(
  37. compare("2.0.0", "1.0.0"),
  38. 1)
  39. def test_should_match_simple(self):
  40. self.assertEqual(
  41. match("2.3.7", ">=2.3.6"),
  42. True)
  43. def test_should_no_match_simple(self):
  44. self.assertEqual(
  45. match("2.3.7", ">=2.3.8"),
  46. False)
  47. def test_should_raise_value_error_for_zero_prefixed_versions(self):
  48. self.assertRaises(ValueError, parse, "01.2.3")
  49. self.assertRaises(ValueError, parse, "1.02.3")
  50. self.assertRaises(ValueError, parse, "1.2.03")
  51. def test_should_raise_value_error_for_invalid_value(self):
  52. self.assertRaises(ValueError, compare, 'foo', 'bar')
  53. self.assertRaises(ValueError, compare, '1.0', '1.0.0')
  54. self.assertRaises(ValueError, compare, '1.x', '1.0.0')
  55. def test_should_raise_value_error_for_invalid_match_expression(self):
  56. self.assertRaises(ValueError, match, '1.0.0', '')
  57. self.assertRaises(ValueError, match, '1.0.0', '!')
  58. self.assertRaises(ValueError, match, '1.0.0', '1.0.0')
  59. def test_should_follow_specification_comparison(self):
  60. # produce comparsion chain:
  61. # 1.0.0-alpha < 1.0.0-alpha.1 < 1.0.0-beta.2 < 1.0.0-beta.11
  62. # < 1.0.0-rc.1 < 1.0.0-rc.1+build.1 < 1.0.0 < 1.0.0+0.3.7 < 1.3.7+build
  63. # < 1.3.7+build.2.b8f12d7 < 1.3.7+build.11.e0f985a
  64. # and in backward too.
  65. chain = ['1.0.0-alpha', '1.0.0-alpha.1', '1.0.0-beta.2',
  66. '1.0.0-beta.11', '1.0.0-rc.1',
  67. '1.0.0', '1.3.7+build']
  68. versions = zip(chain[:-1], chain[1:])
  69. for low_version, high_version in versions:
  70. self.assertEqual(
  71. compare(low_version, high_version), -1,
  72. '%s should be lesser than %s' % (low_version, high_version))
  73. self.assertEqual(
  74. compare(high_version, low_version), 1,
  75. '%s should be higher than %s' % (high_version, low_version))
  76. def test_should_compare_rc_builds(self):
  77. self.assertEqual(compare('1.0.0-beta.2', '1.0.0-beta.11'), -1)
  78. def test_should_compare_release_candidate_with_release(self):
  79. self.assertEqual(compare('1.0.0-rc.1+build.1', '1.0.0'), -1)
  80. def test_should_say_equal_versions_are_equal(self):
  81. self.assertEqual(compare('2.0.0', '2.0.0'), 0)
  82. self.assertEqual(compare('1.1.9-rc.1', '1.1.9-rc.1'), 0)
  83. self.assertEqual(compare('1.1.9+build.1', '1.1.9+build.1'), 0)
  84. self.assertEqual(compare('1.1.9-rc.1+build.1', '1.1.9-rc.1+build.1'), 0)
  85. def test_should_compare_versions_with_build_and_release(self):
  86. self.assertEqual(compare('1.1.9-rc.1', '1.1.9-rc.1+build.1'), -1)
  87. self.assertEqual(compare('1.1.9-rc.1', '1.1.9+build.1'), 1)
  88. def test_should_correctly_format_version(self):
  89. self.assertEqual(format_version(3, 4, 5), '3.4.5')
  90. self.assertEqual(format_version(3, 4, 5, 'rc.1'), '3.4.5-rc.1')
  91. self.assertEqual(format_version(3, 4, 5, prerelease='rc.1'), '3.4.5-rc.1')
  92. self.assertEqual(format_version(3, 4, 5, build='build.4'), '3.4.5+build.4')
  93. self.assertEqual(format_version(3, 4, 5, 'rc.1', 'build.4'), '3.4.5-rc.1+build.4')
  94. def test_should_bump_major(self):
  95. self.assertEqual(bump_major('3.4.5'), '4.0.0')
  96. def test_should_bump_minor(self):
  97. self.assertEqual(bump_minor('3.4.5'), '3.5.0')
  98. def test_should_bump_patch(self):
  99. self.assertEqual(bump_patch('3.4.5'), '3.4.6')
  100. def test_should_ignore_extensions_for_bump(self):
  101. self.assertEqual(bump_patch('3.4.5-rc1+build4'), '3.4.6')
  102. def test_should_get_max(self):
  103. self.assertEqual(max_ver('3.4.5', '4.0.2'), '4.0.2')
  104. def test_should_get_min(self):
  105. self.assertEqual(min_ver('3.4.5', '4.0.2'), '3.4.5')
  106. def test_should_get_min_same(self):
  107. self.assertEqual(min_ver('3.4.5', '3.4.5'), '3.4.5')
  108. def test_should_get_more_rc1(self):
  109. self.assertEqual(
  110. compare("1.0.0-rc1", "1.0.0-rc0"),
  111. 1)
  112. def test_prerelease_order(self):
  113. self.assertEqual(min_ver('1.2.3-rc.2', '1.2.3-rc.10'),
  114. '1.2.3-rc.2')
  115. self.assertEqual(min_ver('1.2.3-rc2', '1.2.3-rc10'),
  116. '1.2.3-rc10')
  117. # identifiers with letters or hyphens are compared lexically in ASCII sort order.
  118. self.assertEqual(min_ver('1.2.3-Rc10', '1.2.3-rc10'),
  119. '1.2.3-Rc10')
  120. # Numeric identifiers always have lower precedence than non-numeric identifiers.
  121. self.assertEqual(min_ver('1.2.3-2', '1.2.3-rc'),
  122. '1.2.3-rc')
  123. # A larger set of pre-release fields has a higher precedence than a smaller set,
  124. # if all of the preceding identifiers are equal.
  125. self.assertEqual(min_ver('1.2.3-rc.2.1', '1.2.3-rc.2'),
  126. '1.2.3-rc.2')
  127. # When major, minor, and patch are equal, a pre-release version has lower precedence
  128. # than a normal version.
  129. self.assertEqual(min_ver('1.2.3', '1.2.3-1'),
  130. '1.2.3-1')
  131. self.assertEqual(min_ver('1.0.0-alpha', '1.0.0-alpha.1'),
  132. '1.0.0-alpha')
  133. def test_should_bump_prerelease(self):
  134. self.assertEqual(bump_prerelease('3.4.5-rc.9'),
  135. '3.4.5-rc.10')
  136. self.assertEqual(bump_prerelease('3.4.5-0009.dev'),
  137. '3.4.5-0010.dev')
  138. self.assertEqual(bump_prerelease('3.4.5'),
  139. '3.4.5-rc.1')
  140. def test_should_ignore_build_on_prerelease_bump(self):
  141. self.assertEqual(bump_prerelease('3.4.5-rc.1+build.4'),
  142. '3.4.5-rc.2')
  143. def test_should_bump_build(self):
  144. self.assertEqual(bump_build('3.4.5-rc.1+build.9'),
  145. '3.4.5-rc.1+build.10')
  146. self.assertEqual(bump_build('3.4.5-rc.1+0009.dev'),
  147. '3.4.5-rc.1+0010.dev')
  148. self.assertEqual(bump_build('3.4.5-rc.1'),
  149. '3.4.5-rc.1+build.1')
  150. self.assertEqual(bump_build('3.4.5'),
  151. '3.4.5+build.1')
  152. if __name__ == '__main__':
  153. unittest.main()