From aa05224dba4f77a9e30454245fa59db9038f597c Mon Sep 17 00:00:00 2001
From: Alex Gaynor <alex.gaynor@gmail.com>
Date: Sun, 12 Dec 2010 04:33:38 +0000
Subject: [PATCH] Converted the Argentina localflavor doctests to unittests. 
 We have always been at war with doctests.  Thanks to Idan Gazit for the
 patch.

git-svn-id: http://code.djangoproject.com/svn/django/trunk@14872 bcc190cf-cafb-0310-a4f2-bffc1f526a37
---
 tests/regressiontests/forms/localflavor/ar.py | 381 +++++-------------
 .../regressiontests/forms/localflavortests.py |  10 +-
 2 files changed, 98 insertions(+), 293 deletions(-)

diff --git a/tests/regressiontests/forms/localflavor/ar.py b/tests/regressiontests/forms/localflavor/ar.py
index c7967c84da..9c672690ce 100644
--- a/tests/regressiontests/forms/localflavor/ar.py
+++ b/tests/regressiontests/forms/localflavor/ar.py
@@ -1,294 +1,99 @@
-# -*- coding: utf-8 -*-
-# Tests for the contrib/localflavor/ AR form fields.
+from django.contrib.localflavor.ar.forms import (ARProvinceSelect,
+    ARPostalCodeField, ARDNIField, ARCUITField)
 
-tests = r"""
-# ARProvinceField #############################################################
+from utils import LocalFlavorTestCase
 
->>> from django.contrib.localflavor.ar.forms import ARProvinceSelect
->>> f = ARProvinceSelect()
->>> f.render('provincias', 'A')
-u'<select name="provincias">\n<option value="B">Buenos Aires</option>\n<option value="K">Catamarca</option>\n<option value="H">Chaco</option>\n<option value="U">Chubut</option>\n<option value="C">Ciudad Aut\xf3noma de Buenos Aires</option>\n<option value="X">C\xf3rdoba</option>\n<option value="W">Corrientes</option>\n<option value="E">Entre R\xedos</option>\n<option value="P">Formosa</option>\n<option value="Y">Jujuy</option>\n<option value="L">La Pampa</option>\n<option value="F">La Rioja</option>\n<option value="M">Mendoza</option>\n<option value="N">Misiones</option>\n<option value="Q">Neuqu\xe9n</option>\n<option value="R">R\xedo Negro</option>\n<option value="A" selected="selected">Salta</option>\n<option value="J">San Juan</option>\n<option value="D">San Luis</option>\n<option value="Z">Santa Cruz</option>\n<option value="S">Santa Fe</option>\n<option value="G">Santiago del Estero</option>\n<option value="V">Tierra del Fuego, Ant\xe1rtida e Islas del Atl\xe1ntico Sur</option>\n<option value="T">Tucum\xe1n</option>\n</select>'
 
-# ARPostalCodeField ###########################################################
+class ARLocalFlavorTests(LocalFlavorTestCase):
+    def test_ARProvinceSelect(self):
+        f = ARProvinceSelect()
+        out = u'''<select name="provincias">
+<option value="B">Buenos Aires</option>
+<option value="K">Catamarca</option>
+<option value="H">Chaco</option>
+<option value="U">Chubut</option>
+<option value="C">Ciudad Aut\xf3noma de Buenos Aires</option>
+<option value="X">C\xf3rdoba</option>
+<option value="W">Corrientes</option>
+<option value="E">Entre R\xedos</option>
+<option value="P">Formosa</option>
+<option value="Y">Jujuy</option>
+<option value="L">La Pampa</option>
+<option value="F">La Rioja</option>
+<option value="M">Mendoza</option>
+<option value="N">Misiones</option>
+<option value="Q">Neuqu\xe9n</option>
+<option value="R">R\xedo Negro</option>
+<option value="A" selected="selected">Salta</option>
+<option value="J">San Juan</option>
+<option value="D">San Luis</option>
+<option value="Z">Santa Cruz</option>
+<option value="S">Santa Fe</option>
+<option value="G">Santiago del Estero</option>
+<option value="V">Tierra del Fuego, Ant\xe1rtida e Islas del Atl\xe1ntico Sur</option>
+<option value="T">Tucum\xe1n</option>
+</select>'''
+        self.assertEqual(f.render('provincias', 'A'), out)
 
->>> from django.contrib.localflavor.ar.forms import ARPostalCodeField
->>> f = ARPostalCodeField()
->>> f.clean('5000')
-u'5000'
->>> f.clean('C1064AAB')
-u'C1064AAB'
->>> f.clean('c1064AAB')
-u'C1064AAB'
->>> f.clean('C1064aab')
-u'C1064AAB'
->>> f.clean(u'4400')
-u'4400'
->>> f.clean(u'C1064AAB')
-u'C1064AAB'
->>> f.clean('C1064AABB')
-Traceback (most recent call last):
-...
-ValidationError: [u'Ensure this value has at most 8 characters (it has 9).', u'Enter a postal code in the format NNNN or ANNNNAAA.']
->>> f.clean('C1064AA')
-Traceback (most recent call last):
-...
-ValidationError: [u'Enter a postal code in the format NNNN or ANNNNAAA.']
->>> f.clean('C106AAB')
-Traceback (most recent call last):
-...
-ValidationError: [u'Enter a postal code in the format NNNN or ANNNNAAA.']
->>> f.clean('106AAB')
-Traceback (most recent call last):
-...
-ValidationError: [u'Enter a postal code in the format NNNN or ANNNNAAA.']
->>> f.clean('500')
-Traceback (most recent call last):
-...
-ValidationError: [u'Ensure this value has at least 4 characters (it has 3).', u'Enter a postal code in the format NNNN or ANNNNAAA.']
->>> f.clean('5PPP')
-Traceback (most recent call last):
-...
-ValidationError: [u'Enter a postal code in the format NNNN or ANNNNAAA.']
->>> f.clean(None)
-Traceback (most recent call last):
-...
-ValidationError: [u'This field is required.']
->>> f.clean('')
-Traceback (most recent call last):
-...
-ValidationError: [u'This field is required.']
->>> f.clean(u'')
-Traceback (most recent call last):
-...
-ValidationError: [u'This field is required.']
+    def test_ARPostalCodeField(self):
+        error_format = [u'Enter a postal code in the format NNNN or ANNNNAAA.']
+        error_atmost = [u'Ensure this value has at most 8 characters (it has 9).']
+        error_atleast = [u'Ensure this value has at least 4 characters (it has 3).']
+        valid = {
+            '5000': '5000',
+            'C1064AAB': 'C1064AAB',
+            'c1064AAB': 'C1064AAB',
+            'C1064aab': 'C1064AAB',
+            '4400': '4400',
+            u'C1064AAB': 'C1064AAB',
+        }
+        invalid = {
+            'C1064AABB': error_atmost + error_format,
+            'C1064AA': error_format,
+            'C1064AB': error_format,
+            '106AAB': error_format,
+            '500': error_atleast + error_format,
+            '5PPP': error_format,
+        }
+        self.assertFieldOutput(ARPostalCodeField, valid, invalid)
 
->>> f = ARPostalCodeField(required=False)
->>> f.clean('5000')
-u'5000'
->>> f.clean('C1064AAB')
-u'C1064AAB'
->>> f.clean('c1064AAB')
-u'C1064AAB'
->>> f.clean('C1064aab')
-u'C1064AAB'
->>> f.clean(u'4400')
-u'4400'
->>> f.clean(u'C1064AAB')
-u'C1064AAB'
->>> f.clean('C1064AABB')
-Traceback (most recent call last):
-...
-ValidationError: [u'Ensure this value has at most 8 characters (it has 9).', u'Enter a postal code in the format NNNN or ANNNNAAA.']
->>> f.clean('C1064AA')
-Traceback (most recent call last):
-...
-ValidationError: [u'Enter a postal code in the format NNNN or ANNNNAAA.']
->>> f.clean('C106AAB')
-Traceback (most recent call last):
-...
-ValidationError: [u'Enter a postal code in the format NNNN or ANNNNAAA.']
->>> f.clean('106AAB')
-Traceback (most recent call last):
-...
-ValidationError: [u'Enter a postal code in the format NNNN or ANNNNAAA.']
->>> f.clean('500')
-Traceback (most recent call last):
-...
-ValidationError: [u'Ensure this value has at least 4 characters (it has 3).', u'Enter a postal code in the format NNNN or ANNNNAAA.']
->>> f.clean('5PPP')
-Traceback (most recent call last):
-...
-ValidationError: [u'Enter a postal code in the format NNNN or ANNNNAAA.']
->>> f.clean(None)
-u''
->>> f.clean('')
-u''
->>> f.clean(u'')
-u''
+    def test_ARDNIField(self):
+        error_length = [u'This field requires 7 or 8 digits.']
+        error_digitsonly = [u'This field requires only numbers.']
+        valid = {
+            '20123456': '20123456',
+            '20.123.456': '20123456',
+            u'20123456': '20123456',
+            u'20.123.456': '20123456',
+            '20.123456': '20123456',
+            '9123456': '9123456',
+            '9.123.456': '9123456',
+        }
+        invalid = {
+            '101234566': error_length,
+            'W0123456': error_digitsonly,
+            '10,123,456': error_digitsonly,
+        }
+        self.assertFieldOutput(ARDNIField, valid, invalid)
 
-# ARDNIField ##################################################################
-
->>> from django.contrib.localflavor.ar.forms import ARDNIField
->>> f = ARDNIField()
->>> f.clean('20123456')
-u'20123456'
->>> f.clean('20.123.456')
-u'20123456'
->>> f.clean('9123456')
-u'9123456'
->>> f.clean('9.123.456')
-u'9123456'
->>> f.clean(u'20123456')
-u'20123456'
->>> f.clean(u'20.123.456')
-u'20123456'
->>> f.clean('20.123456')
-u'20123456'
->>> f.clean('101234566')
-Traceback (most recent call last):
-...
-ValidationError: [u'This field requires 7 or 8 digits.']
->>> f.clean('W0123456')
-Traceback (most recent call last):
-...
-ValidationError: [u'This field requires only numbers.']
->>> f.clean('10,123,456')
-Traceback (most recent call last):
-...
-ValidationError: [u'This field requires only numbers.']
->>> f.clean(None)
-Traceback (most recent call last):
-...
-ValidationError: [u'This field is required.']
->>> f.clean('')
-Traceback (most recent call last):
-...
-ValidationError: [u'This field is required.']
->>> f.clean(u'')
-Traceback (most recent call last):
-...
-ValidationError: [u'This field is required.']
-
->>> f = ARDNIField(required=False)
->>> f.clean('20123456')
-u'20123456'
->>> f.clean('20.123.456')
-u'20123456'
->>> f.clean('9123456')
-u'9123456'
->>> f.clean('9.123.456')
-u'9123456'
->>> f.clean(u'20123456')
-u'20123456'
->>> f.clean(u'20.123.456')
-u'20123456'
->>> f.clean('20.123456')
-u'20123456'
->>> f.clean('101234566')
-Traceback (most recent call last):
-...
-ValidationError: [u'This field requires 7 or 8 digits.']
->>> f.clean('W0123456')
-Traceback (most recent call last):
-...
-ValidationError: [u'This field requires only numbers.']
->>> f.clean('10,123,456')
-Traceback (most recent call last):
-...
-ValidationError: [u'This field requires only numbers.']
->>> f.clean(None)
-u''
->>> f.clean('')
-u''
->>> f.clean(u'')
-u''
-
-# ARCUITField #################################################################
-
->>> from django.contrib.localflavor.ar.forms import ARCUITField
->>> f = ARCUITField()
->>> f.clean('20-10123456-9')
-u'20-10123456-9'
->>> f.clean(u'20-10123456-9')
-u'20-10123456-9'
->>> f.clean('27-10345678-4')
-u'27-10345678-4'
->>> f.clean('20101234569')
-u'20-10123456-9'
->>> f.clean('27103456784')
-u'27-10345678-4'
->>> f.clean('2-10123456-9')
-Traceback (most recent call last):
-...
-ValidationError: [u'Enter a valid CUIT in XX-XXXXXXXX-X or XXXXXXXXXXXX format.']
->>> f.clean('210123456-9')
-Traceback (most recent call last):
-...
-ValidationError: [u'Enter a valid CUIT in XX-XXXXXXXX-X or XXXXXXXXXXXX format.']
->>> f.clean('20-10123456')
-Traceback (most recent call last):
-...
-ValidationError: [u'Enter a valid CUIT in XX-XXXXXXXX-X or XXXXXXXXXXXX format.']
->>> f.clean('20-10123456-')
-Traceback (most recent call last):
-...
-ValidationError: [u'Enter a valid CUIT in XX-XXXXXXXX-X or XXXXXXXXXXXX format.']
->>> f.clean('20-10123456-5')
-Traceback (most recent call last):
-...
-ValidationError: [u'Invalid CUIT.']
->>> f.clean(u'2-10123456-9')
-Traceback (most recent call last):
-...
-ValidationError: [u'Enter a valid CUIT in XX-XXXXXXXX-X or XXXXXXXXXXXX format.']
->>> f.clean('27-10345678-1')
-Traceback (most recent call last):
-...
-ValidationError: [u'Invalid CUIT.']
->>> f.clean(u'27-10345678-1')
-Traceback (most recent call last):
-...
-ValidationError: [u'Invalid CUIT.']
->>> f.clean(None)
-Traceback (most recent call last):
-...
-ValidationError: [u'This field is required.']
->>> f.clean('')
-Traceback (most recent call last):
-...
-ValidationError: [u'This field is required.']
->>> f.clean(u'')
-Traceback (most recent call last):
-...
-ValidationError: [u'This field is required.']
-
->>> f = ARCUITField(required=False)
->>> f.clean('20-10123456-9')
-u'20-10123456-9'
->>> f.clean(u'20-10123456-9')
-u'20-10123456-9'
->>> f.clean('27-10345678-4')
-u'27-10345678-4'
->>> f.clean('20101234569')
-u'20-10123456-9'
->>> f.clean('27103456784')
-u'27-10345678-4'
->>> f.clean('2-10123456-9')
-Traceback (most recent call last):
-...
-ValidationError: [u'Enter a valid CUIT in XX-XXXXXXXX-X or XXXXXXXXXXXX format.']
->>> f.clean('210123456-9')
-Traceback (most recent call last):
-...
-ValidationError: [u'Enter a valid CUIT in XX-XXXXXXXX-X or XXXXXXXXXXXX format.']
->>> f.clean('20-10123456')
-Traceback (most recent call last):
-...
-ValidationError: [u'Enter a valid CUIT in XX-XXXXXXXX-X or XXXXXXXXXXXX format.']
->>> f.clean('20-10123456-')
-Traceback (most recent call last):
-...
-ValidationError: [u'Enter a valid CUIT in XX-XXXXXXXX-X or XXXXXXXXXXXX format.']
->>> f.clean('20-10123456-5')
-Traceback (most recent call last):
-...
-ValidationError: [u'Invalid CUIT.']
->>> f.clean(u'2-10123456-9')
-Traceback (most recent call last):
-...
-ValidationError: [u'Enter a valid CUIT in XX-XXXXXXXX-X or XXXXXXXXXXXX format.']
->>> f.clean('27-10345678-1')
-Traceback (most recent call last):
-...
-ValidationError: [u'Invalid CUIT.']
->>> f.clean(u'27-10345678-1')
-Traceback (most recent call last):
-...
-ValidationError: [u'Invalid CUIT.']
->>> f.clean(None)
-u''
->>> f.clean('')
-u''
->>> f.clean(u'')
-u''
-"""
+    def test_ARCUITField(self):
+        error_format = [u'Enter a valid CUIT in XX-XXXXXXXX-X or XXXXXXXXXXXX format.']
+        error_invalid = [u'Invalid CUIT.']
+        valid = {
+            '20-10123456-9': '20-10123456-9',
+            u'20-10123456-9': '20-10123456-9',
+            '27-10345678-4': '27-10345678-4',
+            '20101234569': '20-10123456-9',
+            '27103456784': '27-10345678-4',
+        }
+        invalid = {
+            '2-10123456-9': error_format,
+            '210123456-9': error_format,
+            '20-10123456': error_format,
+            '20-10123456-': error_format,
+             '20-10123456-5': error_invalid,
+            '2-10123456-9': error_format,
+             '27-10345678-1': error_invalid,
+             u'27-10345678-1': error_invalid,
+        }
+        self.assertFieldOutput(ARCUITField, valid, invalid)
diff --git a/tests/regressiontests/forms/localflavortests.py b/tests/regressiontests/forms/localflavortests.py
index 0d6ff2658c..7087cf0eb8 100644
--- a/tests/regressiontests/forms/localflavortests.py
+++ b/tests/regressiontests/forms/localflavortests.py
@@ -1,5 +1,4 @@
 # -*- coding: utf-8 -*-
-from localflavor.ar import tests as localflavor_ar_tests
 from localflavor.at import tests as localflavor_at_tests
 from localflavor.au import tests as localflavor_au_tests
 from localflavor.br import tests as localflavor_br_tests
@@ -7,14 +6,12 @@ from localflavor.ca import tests as localflavor_ca_tests
 from localflavor.ch import tests as localflavor_ch_tests
 from localflavor.cl import tests as localflavor_cl_tests
 from localflavor.cz import tests as localflavor_cz_tests
-from localflavor.de import DELocalFlavorTests
 from localflavor.es import tests as localflavor_es_tests
 from localflavor.fi import tests as localflavor_fi_tests
 from localflavor.fr import tests as localflavor_fr_tests
 from localflavor.generic import tests as localflavor_generic_tests
 from localflavor.id import tests as localflavor_id_tests
 from localflavor.ie import tests as localflavor_ie_tests
-from localflavor.il import ILLocalFlavorTests
 from localflavor.is_ import tests as localflavor_is_tests
 from localflavor.it import tests as localflavor_it_tests
 from localflavor.jp import tests as localflavor_jp_tests
@@ -25,16 +22,19 @@ from localflavor.pt import tests as localflavor_pt_tests
 from localflavor.ro import tests as localflavor_ro_tests
 from localflavor.se import tests as localflavor_se_tests
 from localflavor.sk import tests as localflavor_sk_tests
-from localflavor.tr import TRLocalFlavorTests
 from localflavor.uk import tests as localflavor_uk_tests
 from localflavor.us import tests as localflavor_us_tests
 from localflavor.uy import tests as localflavor_uy_tests
 from localflavor.za import tests as localflavor_za_tests
 
+from localflavor.ar import ARLocalFlavorTests
+from localflavor.de import DELocalFlavorTests
 from localflavor.be import BELocalFlavorTests
+from localflavor.il import ILLocalFlavorTests
+from localflavor.tr import TRLocalFlavorTests
+
 
 __test__ = {
-    'localflavor_ar_tests': localflavor_ar_tests,
     'localflavor_at_tests': localflavor_at_tests,
     'localflavor_au_tests': localflavor_au_tests,
     'localflavor_br_tests': localflavor_br_tests,