Merged revisions 78232 via svnmerge from

svn+ssh://pythondev@svn.python.org/python/trunk

........
  r78232 | fred.drake | 2010-02-19 00:24:30 -0500 (Fri, 19 Feb 2010) | 3 lines

  - apply patch from issue 7005
  - add corresponding documentation
........
This commit is contained in:
Fred Drake 2010-02-19 06:08:41 +00:00
parent 2c2dc37e58
commit 03c44a30a3
3 changed files with 156 additions and 42 deletions

View file

@ -6,6 +6,7 @@ import collections
from test import support
class SortedDict(collections.UserDict):
def items(self):
return sorted(self.data.items())
@ -20,12 +21,16 @@ class SortedDict(collections.UserDict):
__iter__ = iterkeys
def itervalues(self): return iter(self.values())
class TestCaseBase(unittest.TestCase):
allow_no_value = False
def newconfig(self, defaults=None):
if defaults is None:
self.cf = self.config_class()
self.cf = self.config_class(allow_no_value=self.allow_no_value)
else:
self.cf = self.config_class(defaults)
self.cf = self.config_class(defaults,
allow_no_value=self.allow_no_value)
return self.cf
def fromstring(self, string, defaults=None):
@ -35,7 +40,7 @@ class TestCaseBase(unittest.TestCase):
return cf
def test_basic(self):
cf = self.fromstring(
config_string = (
"[Foo Bar]\n"
"foo=bar\n"
"[Spacey Bar]\n"
@ -55,17 +60,28 @@ class TestCaseBase(unittest.TestCase):
"key with spaces : value\n"
"another with spaces = splat!\n"
)
if self.allow_no_value:
config_string += (
"[NoValue]\n"
"option-without-value\n"
)
cf = self.fromstring(config_string)
L = cf.sections()
L.sort()
E = [r'Commented Bar',
r'Foo Bar',
r'Internationalized Stuff',
r'Long Line',
r'Section\with$weird%characters[' '\t',
r'Spaces',
r'Spacey Bar',
]
if self.allow_no_value:
E.append(r'NoValue')
E.sort()
eq = self.assertEqual
eq(L, [r'Commented Bar',
r'Foo Bar',
r'Internationalized Stuff',
r'Long Line',
r'Section\with$weird%characters[' '\t',
r'Spaces',
r'Spacey Bar',
])
eq(L, E)
# The use of spaces in the section names serves as a
# regression test for SourceForge bug #583248:
@ -75,6 +91,8 @@ class TestCaseBase(unittest.TestCase):
eq(cf.get('Commented Bar', 'foo'), 'bar')
eq(cf.get('Spaces', 'key with spaces'), 'value')
eq(cf.get('Spaces', 'another with spaces'), 'splat!')
if self.allow_no_value:
eq(cf.get('NoValue', 'option-without-value'), None)
self.assertNotIn('__name__', cf.options("Foo Bar"),
'__name__ "option" should not be exposed by the API!')
@ -146,8 +164,6 @@ class TestCaseBase(unittest.TestCase):
"[Foo]\n extra-spaces: splat\n")
self.parse_error(configparser.ParsingError,
"[Foo]\n extra-spaces= splat\n")
self.parse_error(configparser.ParsingError,
"[Foo]\noption-without-value\n")
self.parse_error(configparser.ParsingError,
"[Foo]\n:value-without-option-name\n")
self.parse_error(configparser.ParsingError,
@ -214,18 +230,24 @@ class TestCaseBase(unittest.TestCase):
cf.add_section, "Foo")
def test_write(self):
cf = self.fromstring(
config_string = (
"[Long Line]\n"
"foo: this line is much, much longer than my editor\n"
" likes it.\n"
"[DEFAULT]\n"
"foo: another very\n"
" long line"
" long line\n"
)
if self.allow_no_value:
config_string += (
"[Valueless]\n"
"option-without-value\n"
)
cf = self.fromstring(config_string)
output = io.StringIO()
cf.write(output)
self.assertEqual(
output.getvalue(),
expect_string = (
"[DEFAULT]\n"
"foo = another very\n"
"\tlong line\n"
@ -235,6 +257,13 @@ class TestCaseBase(unittest.TestCase):
"\tlikes it.\n"
"\n"
)
if self.allow_no_value:
expect_string += (
"[Valueless]\n"
"option-without-value\n"
"\n"
)
self.assertEqual(output.getvalue(), expect_string)
def test_set_string_types(self):
cf = self.fromstring("[sect]\n"
@ -328,7 +357,7 @@ class ConfigParserTestCase(TestCaseBase):
self.get_error(configparser.InterpolationDepthError, "Foo", "bar11")
def test_interpolation_missing_value(self):
cf = self.get_interpolation_config()
self.get_interpolation_config()
e = self.get_error(configparser.InterpolationError,
"Interpolation Error", "name")
self.assertEqual(e.reference, "reference")
@ -448,6 +477,11 @@ class SafeConfigParserTestCase(ConfigParserTestCase):
cf = self.newconfig()
self.assertRaises(ValueError, cf.add_section, "DEFAULT")
class SafeConfigParserTestCaseNoValue(SafeConfigParserTestCase):
allow_no_value = True
class SortedTestCase(RawConfigParserTestCase):
def newconfig(self, defaults=None):
self.cf = self.config_class(defaults=defaults, dict_type=SortedDict)
@ -472,13 +506,16 @@ class SortedTestCase(RawConfigParserTestCase):
"o3 = 2\n"
"o4 = 1\n\n")
def test_main():
support.run_unittest(
ConfigParserTestCase,
RawConfigParserTestCase,
SafeConfigParserTestCase,
SortedTestCase
)
SortedTestCase,
SafeConfigParserTestCaseNoValue,
)
if __name__ == "__main__":
test_main()