test_eu_ecnumber.doctest - more detailed doctests for the stdnum.eu.ecnumber module

Copyright (C) 2023 Daniel Weber

This library is free software; you can redistribute it and/or
modify it under the terms of the GNU Lesser General Public
License as published by the Free Software Foundation; either
version 2.1 of the License, or (at your option) any later version.

This library is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
Lesser General Public License for more details.

You should have received a copy of the GNU Lesser General Public
License along with this library; if not, write to the Free Software
Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
02110-1301 USA


This file contains more detailed doctests for the stdnum.eu.ecnumber module. It
contains some corner case tests and tries to validate numbers that have been
found online.

>>> from stdnum.eu import ecnumber
>>> from stdnum.exceptions import *


EC Numbers always include separators and will be introduced if they are not
present. Validation will fail if separators are in the incorrect place.

>>> ecnumber.validate('200-112-1')
'200-112-1'
>>> ecnumber.validate('2001121')
'200-112-1'
>>> ecnumber.validate('20-0112-1')
Traceback (most recent call last):
    ...
InvalidFormat: ...
>>> ecnumber.validate('2000112-1')
Traceback (most recent call last):
    ...
InvalidFormat: ...


The number should only have two separators.

>>> ecnumber.validate('20--112-1')
Traceback (most recent call last):
    ...
InvalidFormat: ...


Only numeric characters between separators.

>>> ecnumber.validate('20A-112-1')
Traceback (most recent call last):
    ...
InvalidFormat: ...


EC Numbers are always nine characters long (including hyphens).

>>> ecnumber.validate('2000-112-1')
Traceback (most recent call last):
    ...
InvalidLength: ...
>>> ecnumber.validate('20001121')
Traceback (most recent call last):
    ...
InvalidLength: ...
>>> ecnumber.validate('201121')
Traceback (most recent call last):
    ...
InvalidLength: ...


The final character must have the correct check digit.

>>> ecnumber.validate('200-112-2')
Traceback (most recent call last):
    ...
InvalidChecksum: ...
>>> ecnumber.validate('2001122')
Traceback (most recent call last):
    ...
InvalidChecksum: ...


These are randomly selected from the EC Inventory should be valid EC Numbers.

>>> numbers = '''
...
... 200-662-2
... 200-897-0
... 203-499-5
... 204-282-8
... 206-777-4
... 207-296-2
... 207-631-2
... 207-952-8
... 211-043-1
... 212-948-4
... 215-429-0
... 216-155-4
... 217-593-9
... 217-931-5
... 219-941-5
... 220-575-3
... 221-531-6
... 222-700-7
... 222-729-5
... 223-550-5
... 226-307-1
... 228-426-4
... 233-748-3
... 235-556-5
... 236-325-1
... 238-475-3
... 238-769-1
... 239-367-9
... 239-530-4
... 241-289-5
... 242-807-2
... 243-154-6
... 244-556-4
... 244-886-9
... 245-704-0
... 247-214-2
... 248-170-7
... 249-213-2
... 249-244-1
... 249-469-5
... 250-046-2
... 250-140-3
... 250-478-1
... 251-186-7
... 251-412-4
... 252-552-9
... 252-796-6
... 254-323-9
... 254-324-4
... 255-524-4
... 255-597-2
... 256-980-7
... 257-228-0
... 257-308-5
... 259-660-5
... 262-758-0
... 263-157-6
... 263-543-4
... 266-556-3
... 266-597-7
... 266-708-9
... 267-064-1
... 271-104-3
... 271-556-1
... 273-972-9
... 274-112-5
... 274-741-5
... 274-747-8
... 276-796-0
... 280-279-5
... 280-851-4
... 280-947-6
... 281-719-9
... 281-919-6
... 282-848-3
... 282-944-5
... 284-690-0
... 286-712-4
... 287-761-4
... 287-900-9
... 288-360-7
... 295-191-2
... 296-057-6
... 297-119-5
... 297-362-7
... 300-706-1
... 301-691-4
... 301-916-6
... 302-175-1
... 302-331-9
... 304-512-8
... 304-902-8
... 307-269-6
... 307-415-9
... 307-692-6
... 310-159-0
... 414-380-4
... 421-750-9
... 424-870-1
... 500-464-9
...
... '''
>>> [x for x in numbers.splitlines() if x and not ecnumber.is_valid(x)]
[]