python-semantic_version/tests/scripts/test_spec.py

157 lines
5.6 KiB
Python
Raw Normal View History

#!/usr/bin/env python
# -*- coding: utf-8 -*-
# Copyright (c) The python-semanticversion project
# This code is distributed under the two-clause BSD License.
"""Test conformance to the specs."""
from .compat import unittest, is_python2
import semantic_version
# shortcut
Version = semantic_version.Version
class FormatTests(unittest.TestCase):
"""Tests proper version validation."""
def test_major_minor_patch(self):
### SPEC:
# A normal version number MUST take the form X.Y.Z
with self.assertRaises(ValueError):
Version('1')
with self.assertRaises(ValueError):
Version('1.1')
# Doesn't raise
Version('1.2.3')
with self.assertRaises(ValueError):
Version('1.2.3.4')
### SPEC:
# Where X, Y, and Z are non-negative integers,
with self.assertRaises(ValueError):
Version('1.2.A')
with self.assertRaises(ValueError):
Version('1.-2.3')
# Valid
v = Version('1.2.3')
self.assertEqual(1, v.major)
self.assertEqual(2, v.minor)
self.assertEqual(3, v.patch)
### Spec:
# And MUST NOT contain leading zeroes
with self.assertRaises(ValueError):
Version('1.2.01')
with self.assertRaises(ValueError):
Version('1.02.1')
with self.assertRaises(ValueError):
Version('01.2.1')
# Valid
v = Version('0.0.0')
self.assertEqual(0, v.major)
self.assertEqual(0, v.minor)
self.assertEqual(0, v.patch)
def test_prerelease(self):
### SPEC:
# A pre-release version MAY be denoted by appending a hyphen and a
# series of dot separated identifiers immediately following the patch
# version.
with self.assertRaises(ValueError):
Version('1.2.3 -23')
# Valid
v = Version('1.2.3-23')
self.assertEqual(('23',), v.prerelease)
### SPEC:
# Identifiers MUST comprise only ASCII alphanumerics and hyphen.
# Identifiers MUST NOT be empty
with self.assertRaises(ValueError):
Version('1.2.3-a,')
with self.assertRaises(ValueError):
Version('1.2.3-..')
### SPEC:
# Numeric identifiers MUST NOT include leading zeroes.
with self.assertRaises(ValueError):
Version('1.2.3-a0.01')
with self.assertRaises(ValueError):
Version('1.2.3-00')
# Valid
v = Version('1.2.3-0a.0.000zz')
self.assertEqual(('0a', '0', '000zz'), v.prerelease)
def test_build(self):
### SPEC:
# Build metadata MAY be denoted by appending a plus sign and a series of
# dot separated identifiers immediately following the patch or
# pre-release version
v = Version('1.2.3')
self.assertEqual((), v.build)
with self.assertRaises(ValueError):
Version('1.2.3 +4')
### SPEC:
# Identifiers MUST comprise only ASCII alphanumerics and hyphen.
# Identifiers MUST NOT be empty
with self.assertRaises(ValueError):
Version('1.2.3+a,')
with self.assertRaises(ValueError):
Version('1.2.3+..')
# Leading zeroes allowed
v = Version('1.2.3+0.0a.01')
self.assertEqual(('0', '0a', '01'), v.build)
def test_precedence(self):
### SPEC:
# Precedence is determined by the first difference when comparing from
# left to right as follows: Major, minor, and patch versions are always
# compared numerically.
# Example: 1.0.0 < 2.0.0 < 2.1.0 < 2.1.1
self.assertLess(Version('1.0.0'), Version('2.0.0'))
self.assertLess(Version('2.0.0'), Version('2.1.0'))
self.assertLess(Version('2.1.0'), Version('2.1.1'))
### SPEC:
# When major, minor, and patch are equal, a pre-release version has
# lower precedence than a normal version.
# Example: 1.0.0-alpha < 1.0.0
self.assertLess(Version('1.0.0-alpha'), Version('1.0.0'))
### SPEC:
# Precedence for two pre-release versions with the same major, minor,
# and patch version MUST be determined by comparing each dot separated
# identifier from left to right until a difference is found as follows:
# identifiers consisting of only digits are compared numerically
self.assertLess(Version('1.0.0-1'), Version('1.0.0-2'))
# and identifiers with letters or hyphens are compared lexically in
# ASCII sort order.
self.assertLess(Version('1.0.0-aa'), Version('1.0.0-ab'))
# Numeric identifiers always have lower precedence than
# non-numeric identifiers.
self.assertLess(Version('1.0.0-9'), Version('1.0.0-a'))
# A larger set of pre-release fields has a higher precedence than a
# smaller set, if all of the preceding identifiers are equal.
self.assertLess(Version('1.0.0-a.b.c'), Version('1.0.0-a.b.c.0'))
# Example: 1.0.0-alpha < 1.0.0-alpha.1 < 1.0.0-alpha.beta < 1.0.0-beta < 1.0.0-beta.2 < 1.0.0-beta.11 < 1.0.0-rc.1 < 1.0.0.
self.assertLess(Version('1.0.0-alpha'), Version('1.0.0-alpha.1'))
self.assertLess(Version('1.0.0-alpha.1'), Version('1.0.0-alpha.beta'))
self.assertLess(Version('1.0.0-alpha.beta'), Version('1.0.0-beta'))
self.assertLess(Version('1.0.0-beta'), Version('1.0.0-beta.2'))
self.assertLess(Version('1.0.0-beta.2'), Version('1.0.0-beta.11'))
self.assertLess(Version('1.0.0-beta.11'), Version('1.0.0-rc.1'))
self.assertLess(Version('1.0.0-rc.1'), Version('1.0.0'))