Test the ``version_string`` function, which converts
version tuples into strings suitable for regexp matching
against distribution filenames. Raises ``ValueError``
for an invalid tuple.

    >>> from plib.utils import version
    >>> version.version_string((0, 2))
    '0.2'
    >>> version.version_string((0, 2, 1))
    '0.2.1'
    >>> version.version_string((0, 2, 1, None))
    '0.2.1'
    >>> version.version_string((0, 2, None))
    '0.2'
    >>> version.version_string((0, 0))
    '0.0'
    >>> version.version_string((1, 2, 'a'))
    Traceback (most recent call last):
    ...
    ValueError: Version tuple (1, 2, 'a') is invalid.
    >>> version.version_string((1, 2, None, ('a', 3)))
    '1.2a3'
    >>> version.version_string((1, 2, 4, ('a', 3)))
    '1.2.4a3'
    >>> version.version_string((1, 2, 4, ('b', 5)))
    '1.2.4b5'
    >>> version.version_string((1, 2, 4, ('c', 6)))
    Traceback (most recent call last):
    ...
    ValueError: Version tuple (1, 2, 4, ('c', 6)) is invalid.
    >>> version.version_string((1, 2, 4, ('c',)))
    Traceback (most recent call last):
    ...
    ValueError: Version tuple (1, 2, 4, ('c',)) is invalid.
    >>> version.version_string((1, 2, 4, ('c', 'd')))
    Traceback (most recent call last):
    ...
    ValueError: Version tuple (1, 2, 4, ('c', 'd')) is invalid.
    >>> version.version_string((1, 2, 4, ('c', 5, 0)))
    Traceback (most recent call last):
    ...
    ValueError: Version tuple (1, 2, 4, ('c', 5, 0)) is invalid.
    >>> version.version_string((None, 0))
    Traceback (most recent call last):
    ...
    ValueError: Version tuple (None, 0) is invalid.
