10c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yiimport ConfigParser
20c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yiimport StringIO
30c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yiimport os
40c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yiimport unittest
50c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yiimport UserDict
60c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
70c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yifrom test import test_support
80c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
90c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
100c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yiclass SortedDict(UserDict.UserDict):
110c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    def items(self):
120c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        result = self.data.items()
130c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        result.sort()
140c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        return result
150c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
160c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    def keys(self):
170c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        result = self.data.keys()
180c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        result.sort()
190c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        return result
200c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
210c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    def values(self):
220c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        # XXX never used?
230c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        result = self.items()
240c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        return [i[1] for i in result]
250c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
260c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    def iteritems(self): return iter(self.items())
270c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    def iterkeys(self): return iter(self.keys())
280c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    __iter__ = iterkeys
290c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    def itervalues(self): return iter(self.values())
300c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
310c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
320c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yiclass TestCaseBase(unittest.TestCase):
330c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    allow_no_value = False
340c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
350c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    def newconfig(self, defaults=None):
360c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        if defaults is None:
370c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            self.cf = self.config_class(allow_no_value=self.allow_no_value)
380c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        else:
390c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            self.cf = self.config_class(defaults,
400c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi                                        allow_no_value=self.allow_no_value)
410c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        return self.cf
420c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
430c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    def fromstring(self, string, defaults=None):
440c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        cf = self.newconfig(defaults)
450c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        sio = StringIO.StringIO(string)
460c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        cf.readfp(sio)
470c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        return cf
480c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
490c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    def test_basic(self):
500c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        config_string = (
510c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            "[Foo Bar]\n"
520c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            "foo=bar\n"
530c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            "[Spacey Bar]\n"
540c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            "foo = bar\n"
550c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            "[Commented Bar]\n"
560c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            "foo: bar ; comment\n"
570c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            "[Long Line]\n"
580c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            "foo: this line is much, much longer than my editor\n"
590c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            "   likes it.\n"
600c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            "[Section\\with$weird%characters[\t]\n"
610c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            "[Internationalized Stuff]\n"
620c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            "foo[bg]: Bulgarian\n"
630c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            "foo=Default\n"
640c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            "foo[en]=English\n"
650c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            "foo[de]=Deutsch\n"
660c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            "[Spaces]\n"
670c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            "key with spaces : value\n"
680c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            "another with spaces = splat!\n"
690c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            )
700c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        if self.allow_no_value:
710c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            config_string += (
720c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi                "[NoValue]\n"
730c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi                "option-without-value\n"
740c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi                )
750c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
760c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        cf = self.fromstring(config_string)
770c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        L = cf.sections()
780c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        L.sort()
790c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        E = [r'Commented Bar',
800c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi             r'Foo Bar',
810c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi             r'Internationalized Stuff',
820c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi             r'Long Line',
830c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi             r'Section\with$weird%characters[' '\t',
840c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi             r'Spaces',
850c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi             r'Spacey Bar',
860c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi             ]
870c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        if self.allow_no_value:
880c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            E.append(r'NoValue')
890c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        E.sort()
900c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        eq = self.assertEqual
910c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        eq(L, E)
920c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
930c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        # The use of spaces in the section names serves as a
940c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        # regression test for SourceForge bug #583248:
950c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        # http://www.python.org/sf/583248
960c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        eq(cf.get('Foo Bar', 'foo'), 'bar')
970c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        eq(cf.get('Spacey Bar', 'foo'), 'bar')
980c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        eq(cf.get('Commented Bar', 'foo'), 'bar')
990c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        eq(cf.get('Spaces', 'key with spaces'), 'value')
1000c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        eq(cf.get('Spaces', 'another with spaces'), 'splat!')
1010c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        if self.allow_no_value:
1020c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            eq(cf.get('NoValue', 'option-without-value'), None)
1030c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
1040c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        self.assertNotIn('__name__', cf.options("Foo Bar"),
1050c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi                         '__name__ "option" should not be exposed by the API!')
1060c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
1070c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        # Make sure the right things happen for remove_option();
1080c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        # added to include check for SourceForge bug #123324:
1090c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        self.assertTrue(cf.remove_option('Foo Bar', 'foo'),
1100c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi                        "remove_option() failed to report existence of option")
1110c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        self.assertFalse(cf.has_option('Foo Bar', 'foo'),
1120c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi                    "remove_option() failed to remove option")
1130c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        self.assertFalse(cf.remove_option('Foo Bar', 'foo'),
1140c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi                    "remove_option() failed to report non-existence of option"
1150c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi                    " that was removed")
1160c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
1170c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        self.assertRaises(ConfigParser.NoSectionError,
1180c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi                          cf.remove_option, 'No Such Section', 'foo')
1190c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
1200c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        eq(cf.get('Long Line', 'foo'),
1210c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi           'this line is much, much longer than my editor\nlikes it.')
1220c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
1230c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    def test_case_sensitivity(self):
1240c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        cf = self.newconfig()
1250c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        cf.add_section("A")
1260c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        cf.add_section("a")
1270c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        L = cf.sections()
1280c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        L.sort()
1290c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        eq = self.assertEqual
1300c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        eq(L, ["A", "a"])
1310c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        cf.set("a", "B", "value")
1320c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        eq(cf.options("a"), ["b"])
1330c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        eq(cf.get("a", "b"), "value",
1340c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi           "could not locate option, expecting case-insensitive option names")
1350c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        self.assertTrue(cf.has_option("a", "b"))
1360c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        cf.set("A", "A-B", "A-B value")
1370c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        for opt in ("a-b", "A-b", "a-B", "A-B"):
1380c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            self.assertTrue(
1390c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi                cf.has_option("A", opt),
1400c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi                "has_option() returned false for option which should exist")
1410c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        eq(cf.options("A"), ["a-b"])
1420c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        eq(cf.options("a"), ["b"])
1430c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        cf.remove_option("a", "B")
1440c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        eq(cf.options("a"), [])
1450c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
1460c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        # SF bug #432369:
1470c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        cf = self.fromstring(
1480c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            "[MySection]\nOption: first line\n\tsecond line\n")
1490c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        eq(cf.options("MySection"), ["option"])
1500c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        eq(cf.get("MySection", "Option"), "first line\nsecond line")
1510c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
1520c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        # SF bug #561822:
1530c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        cf = self.fromstring("[section]\nnekey=nevalue\n",
1540c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi                             defaults={"key":"value"})
1550c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        self.assertTrue(cf.has_option("section", "Key"))
1560c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
1570c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
1580c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    def test_default_case_sensitivity(self):
1590c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        cf = self.newconfig({"foo": "Bar"})
1600c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        self.assertEqual(
1610c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            cf.get("DEFAULT", "Foo"), "Bar",
1620c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            "could not locate option, expecting case-insensitive option names")
1630c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        cf = self.newconfig({"Foo": "Bar"})
1640c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        self.assertEqual(
1650c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            cf.get("DEFAULT", "Foo"), "Bar",
1660c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            "could not locate option, expecting case-insensitive defaults")
1670c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
1680c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    def test_parse_errors(self):
1690c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        self.newconfig()
1700c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        self.parse_error(ConfigParser.ParsingError,
1710c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi                         "[Foo]\n  extra-spaces: splat\n")
1720c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        self.parse_error(ConfigParser.ParsingError,
1730c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi                         "[Foo]\n  extra-spaces= splat\n")
1740c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        self.parse_error(ConfigParser.ParsingError,
1750c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi                         "[Foo]\n:value-without-option-name\n")
1760c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        self.parse_error(ConfigParser.ParsingError,
1770c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi                         "[Foo]\n=value-without-option-name\n")
1780c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        self.parse_error(ConfigParser.MissingSectionHeaderError,
1790c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi                         "No Section!\n")
1800c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
1810c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    def parse_error(self, exc, src):
1820c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        sio = StringIO.StringIO(src)
1830c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        self.assertRaises(exc, self.cf.readfp, sio)
1840c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
1850c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    def test_query_errors(self):
1860c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        cf = self.newconfig()
1870c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        self.assertEqual(cf.sections(), [],
1880c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi                         "new ConfigParser should have no defined sections")
1890c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        self.assertFalse(cf.has_section("Foo"),
1900c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi                         "new ConfigParser should have no acknowledged "
1910c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi                         "sections")
1920c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        self.assertRaises(ConfigParser.NoSectionError,
1930c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi                          cf.options, "Foo")
1940c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        self.assertRaises(ConfigParser.NoSectionError,
1950c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi                          cf.set, "foo", "bar", "value")
1960c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        self.get_error(ConfigParser.NoSectionError, "foo", "bar")
1970c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        cf.add_section("foo")
1980c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        self.get_error(ConfigParser.NoOptionError, "foo", "bar")
1990c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
2000c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    def get_error(self, exc, section, option):
2010c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        try:
2020c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            self.cf.get(section, option)
2030c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        except exc, e:
2040c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            return e
2050c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        else:
2060c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            self.fail("expected exception type %s.%s"
2070c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi                      % (exc.__module__, exc.__name__))
2080c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
2090c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    def test_boolean(self):
2100c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        cf = self.fromstring(
2110c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            "[BOOLTEST]\n"
2120c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            "T1=1\n"
2130c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            "T2=TRUE\n"
2140c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            "T3=True\n"
2150c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            "T4=oN\n"
2160c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            "T5=yes\n"
2170c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            "F1=0\n"
2180c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            "F2=FALSE\n"
2190c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            "F3=False\n"
2200c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            "F4=oFF\n"
2210c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            "F5=nO\n"
2220c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            "E1=2\n"
2230c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            "E2=foo\n"
2240c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            "E3=-1\n"
2250c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            "E4=0.1\n"
2260c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            "E5=FALSE AND MORE"
2270c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            )
2280c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        for x in range(1, 5):
2290c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            self.assertTrue(cf.getboolean('BOOLTEST', 't%d' % x))
2300c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            self.assertFalse(cf.getboolean('BOOLTEST', 'f%d' % x))
2310c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            self.assertRaises(ValueError,
2320c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi                              cf.getboolean, 'BOOLTEST', 'e%d' % x)
2330c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
2340c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    def test_weird_errors(self):
2350c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        cf = self.newconfig()
2360c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        cf.add_section("Foo")
2370c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        self.assertRaises(ConfigParser.DuplicateSectionError,
2380c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi                          cf.add_section, "Foo")
2390c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
2400c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    def test_write(self):
2410c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        config_string = (
2420c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            "[Long Line]\n"
2430c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            "foo: this line is much, much longer than my editor\n"
2440c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            "   likes it.\n"
2450c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            "[DEFAULT]\n"
2460c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            "foo: another very\n"
2470c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            " long line\n"
2480c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            )
2490c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        if self.allow_no_value:
2500c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            config_string += (
2510c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            "[Valueless]\n"
2520c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            "option-without-value\n"
2530c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            )
2540c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
2550c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        cf = self.fromstring(config_string)
2560c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        output = StringIO.StringIO()
2570c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        cf.write(output)
2580c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        expect_string = (
2590c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            "[DEFAULT]\n"
2600c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            "foo = another very\n"
2610c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            "\tlong line\n"
2620c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            "\n"
2630c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            "[Long Line]\n"
2640c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            "foo = this line is much, much longer than my editor\n"
2650c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            "\tlikes it.\n"
2660c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            "\n"
2670c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            )
2680c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        if self.allow_no_value:
2690c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            expect_string += (
2700c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi                "[Valueless]\n"
2710c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi                "option-without-value\n"
2720c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi                "\n"
2730c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi                )
2740c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        self.assertEqual(output.getvalue(), expect_string)
2750c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
2760c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    def test_set_string_types(self):
2770c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        cf = self.fromstring("[sect]\n"
2780c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi                             "option1=foo\n")
2790c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        # Check that we don't get an exception when setting values in
2800c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        # an existing section using strings:
2810c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        class mystr(str):
2820c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            pass
2830c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        cf.set("sect", "option1", "splat")
2840c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        cf.set("sect", "option1", mystr("splat"))
2850c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        cf.set("sect", "option2", "splat")
2860c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        cf.set("sect", "option2", mystr("splat"))
2870c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        try:
2880c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            unicode
2890c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        except NameError:
2900c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            pass
2910c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        else:
2920c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            cf.set("sect", "option1", unicode("splat"))
2930c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            cf.set("sect", "option2", unicode("splat"))
2940c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
2950c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    def test_read_returns_file_list(self):
2960c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        file1 = test_support.findfile("cfgparser.1")
2970c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        # check when we pass a mix of readable and non-readable files:
2980c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        cf = self.newconfig()
2990c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        parsed_files = cf.read([file1, "nonexistent-file"])
3000c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        self.assertEqual(parsed_files, [file1])
3010c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        self.assertEqual(cf.get("Foo Bar", "foo"), "newbar")
3020c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        # check when we pass only a filename:
3030c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        cf = self.newconfig()
3040c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        parsed_files = cf.read(file1)
3050c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        self.assertEqual(parsed_files, [file1])
3060c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        self.assertEqual(cf.get("Foo Bar", "foo"), "newbar")
3070c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        # check when we pass only missing files:
3080c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        cf = self.newconfig()
3090c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        parsed_files = cf.read(["nonexistent-file"])
3100c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        self.assertEqual(parsed_files, [])
3110c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        # check when we pass no files:
3120c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        cf = self.newconfig()
3130c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        parsed_files = cf.read([])
3140c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        self.assertEqual(parsed_files, [])
3150c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
3160c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    # shared by subclasses
3170c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    def get_interpolation_config(self):
3180c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        return self.fromstring(
3190c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            "[Foo]\n"
3200c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            "bar=something %(with1)s interpolation (1 step)\n"
3210c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            "bar9=something %(with9)s lots of interpolation (9 steps)\n"
3220c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            "bar10=something %(with10)s lots of interpolation (10 steps)\n"
3230c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            "bar11=something %(with11)s lots of interpolation (11 steps)\n"
3240c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            "with11=%(with10)s\n"
3250c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            "with10=%(with9)s\n"
3260c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            "with9=%(with8)s\n"
3270c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            "with8=%(With7)s\n"
3280c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            "with7=%(WITH6)s\n"
3290c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            "with6=%(with5)s\n"
3300c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            "With5=%(with4)s\n"
3310c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            "WITH4=%(with3)s\n"
3320c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            "with3=%(with2)s\n"
3330c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            "with2=%(with1)s\n"
3340c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            "with1=with\n"
3350c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            "\n"
3360c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            "[Mutual Recursion]\n"
3370c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            "foo=%(bar)s\n"
3380c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            "bar=%(foo)s\n"
3390c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            "\n"
3400c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            "[Interpolation Error]\n"
3410c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            "name=%(reference)s\n",
3420c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            # no definition for 'reference'
3430c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            defaults={"getname": "%(__name__)s"})
3440c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
3450c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    def check_items_config(self, expected):
3460c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        cf = self.fromstring(
3470c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            "[section]\n"
3480c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            "name = value\n"
3490c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            "key: |%(name)s| \n"
3500c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            "getdefault: |%(default)s|\n"
3510c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            "getname: |%(__name__)s|",
3520c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            defaults={"default": "<default>"})
3530c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        L = list(cf.items("section"))
3540c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        L.sort()
3550c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        self.assertEqual(L, expected)
3560c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
3570c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
3580c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yiclass ConfigParserTestCase(TestCaseBase):
3590c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    config_class = ConfigParser.ConfigParser
3600c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    allow_no_value = True
3610c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
3620c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    def test_interpolation(self):
3630c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        rawval = {
3640c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            ConfigParser.ConfigParser: ("something %(with11)s "
3650c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi                                        "lots of interpolation (11 steps)"),
3660c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            ConfigParser.SafeConfigParser: "%(with1)s",
3670c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        }
3680c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        cf = self.get_interpolation_config()
3690c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        eq = self.assertEqual
3700c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        eq(cf.get("Foo", "getname"), "Foo")
3710c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        eq(cf.get("Foo", "bar"), "something with interpolation (1 step)")
3720c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        eq(cf.get("Foo", "bar9"),
3730c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi           "something with lots of interpolation (9 steps)")
3740c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        eq(cf.get("Foo", "bar10"),
3750c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi           "something with lots of interpolation (10 steps)")
3760c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        self.get_error(ConfigParser.InterpolationDepthError, "Foo", "bar11")
3770c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
3780c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    def test_interpolation_missing_value(self):
3790c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        self.get_interpolation_config()
3800c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        e = self.get_error(ConfigParser.InterpolationError,
3810c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi                           "Interpolation Error", "name")
3820c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        self.assertEqual(e.reference, "reference")
3830c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        self.assertEqual(e.section, "Interpolation Error")
3840c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        self.assertEqual(e.option, "name")
3850c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
3860c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    def test_items(self):
3870c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        self.check_items_config([('default', '<default>'),
3880c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi                                 ('getdefault', '|<default>|'),
3890c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi                                 ('getname', '|section|'),
3900c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi                                 ('key', '|value|'),
3910c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi                                 ('name', 'value')])
3920c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
3930c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    def test_set_nonstring_types(self):
3940c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        cf = self.newconfig()
3950c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        cf.add_section('non-string')
3960c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        cf.set('non-string', 'int', 1)
3970c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        cf.set('non-string', 'list', [0, 1, 1, 2, 3, 5, 8, 13, '%('])
3980c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        cf.set('non-string', 'dict', {'pi': 3.14159, '%(': 1,
3990c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi                                      '%(list)': '%(list)'})
4000c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        cf.set('non-string', 'string_with_interpolation', '%(list)s')
4010c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        cf.set('non-string', 'no-value')
4020c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        self.assertEqual(cf.get('non-string', 'int', raw=True), 1)
4030c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        self.assertRaises(TypeError, cf.get, 'non-string', 'int')
4040c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        self.assertEqual(cf.get('non-string', 'list', raw=True),
4050c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi                         [0, 1, 1, 2, 3, 5, 8, 13, '%('])
4060c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        self.assertRaises(TypeError, cf.get, 'non-string', 'list')
4070c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        self.assertEqual(cf.get('non-string', 'dict', raw=True),
4080c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi                         {'pi': 3.14159, '%(': 1, '%(list)': '%(list)'})
4090c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        self.assertRaises(TypeError, cf.get, 'non-string', 'dict')
4100c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        self.assertEqual(cf.get('non-string', 'string_with_interpolation',
4110c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi                                raw=True), '%(list)s')
4120c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        self.assertRaises(ValueError, cf.get, 'non-string',
4130c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi                          'string_with_interpolation', raw=False)
4140c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        self.assertEqual(cf.get('non-string', 'no-value'), None)
4150c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
4160c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yiclass MultilineValuesTestCase(TestCaseBase):
4170c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    config_class = ConfigParser.ConfigParser
4180c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    wonderful_spam = ("I'm having spam spam spam spam "
4190c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi                      "spam spam spam beaked beans spam "
4200c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi                      "spam spam and spam!").replace(' ', '\t\n')
4210c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
4220c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    def setUp(self):
4230c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        cf = self.newconfig()
4240c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        for i in range(100):
4250c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            s = 'section{}'.format(i)
4260c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            cf.add_section(s)
4270c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            for j in range(10):
4280c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi                cf.set(s, 'lovely_spam{}'.format(j), self.wonderful_spam)
4290c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        with open(test_support.TESTFN, 'w') as f:
4300c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            cf.write(f)
4310c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
4320c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    def tearDown(self):
4330c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        os.unlink(test_support.TESTFN)
4340c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
4350c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    def test_dominating_multiline_values(self):
4360c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        # we're reading from file because this is where the code changed
4370c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        # during performance updates in Python 3.2
4380c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        cf_from_file = self.newconfig()
4390c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        with open(test_support.TESTFN) as f:
4400c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            cf_from_file.readfp(f)
4410c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        self.assertEqual(cf_from_file.get('section8', 'lovely_spam4'),
4420c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi                         self.wonderful_spam.replace('\t\n', '\n'))
4430c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
4440c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yiclass RawConfigParserTestCase(TestCaseBase):
4450c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    config_class = ConfigParser.RawConfigParser
4460c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
4470c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    def test_interpolation(self):
4480c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        cf = self.get_interpolation_config()
4490c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        eq = self.assertEqual
4500c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        eq(cf.get("Foo", "getname"), "%(__name__)s")
4510c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        eq(cf.get("Foo", "bar"),
4520c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi           "something %(with1)s interpolation (1 step)")
4530c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        eq(cf.get("Foo", "bar9"),
4540c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi           "something %(with9)s lots of interpolation (9 steps)")
4550c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        eq(cf.get("Foo", "bar10"),
4560c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi           "something %(with10)s lots of interpolation (10 steps)")
4570c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        eq(cf.get("Foo", "bar11"),
4580c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi           "something %(with11)s lots of interpolation (11 steps)")
4590c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
4600c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    def test_items(self):
4610c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        self.check_items_config([('default', '<default>'),
4620c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi                                 ('getdefault', '|%(default)s|'),
4630c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi                                 ('getname', '|%(__name__)s|'),
4640c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi                                 ('key', '|%(name)s|'),
4650c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi                                 ('name', 'value')])
4660c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
4670c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    def test_set_nonstring_types(self):
4680c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        cf = self.newconfig()
4690c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        cf.add_section('non-string')
4700c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        cf.set('non-string', 'int', 1)
4710c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        cf.set('non-string', 'list', [0, 1, 1, 2, 3, 5, 8, 13])
4720c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        cf.set('non-string', 'dict', {'pi': 3.14159})
4730c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        self.assertEqual(cf.get('non-string', 'int'), 1)
4740c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        self.assertEqual(cf.get('non-string', 'list'),
4750c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi                         [0, 1, 1, 2, 3, 5, 8, 13])
4760c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        self.assertEqual(cf.get('non-string', 'dict'), {'pi': 3.14159})
4770c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
4780c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
4790c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yiclass SafeConfigParserTestCase(ConfigParserTestCase):
4800c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    config_class = ConfigParser.SafeConfigParser
4810c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
4820c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    def test_safe_interpolation(self):
4830c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        # See http://www.python.org/sf/511737
4840c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        cf = self.fromstring("[section]\n"
4850c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi                             "option1=xxx\n"
4860c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi                             "option2=%(option1)s/xxx\n"
4870c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi                             "ok=%(option1)s/%%s\n"
4880c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi                             "not_ok=%(option2)s/%%s")
4890c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        self.assertEqual(cf.get("section", "ok"), "xxx/%s")
4900c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        self.assertEqual(cf.get("section", "not_ok"), "xxx/xxx/%s")
4910c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
4920c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    def test_set_malformatted_interpolation(self):
4930c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        cf = self.fromstring("[sect]\n"
4940c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi                             "option1=foo\n")
4950c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
4960c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        self.assertEqual(cf.get('sect', "option1"), "foo")
4970c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
4980c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        self.assertRaises(ValueError, cf.set, "sect", "option1", "%foo")
4990c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        self.assertRaises(ValueError, cf.set, "sect", "option1", "foo%")
5000c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        self.assertRaises(ValueError, cf.set, "sect", "option1", "f%oo")
5010c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
5020c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        self.assertEqual(cf.get('sect', "option1"), "foo")
5030c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
5040c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        # bug #5741: double percents are *not* malformed
5050c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        cf.set("sect", "option2", "foo%%bar")
5060c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        self.assertEqual(cf.get("sect", "option2"), "foo%bar")
5070c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
5080c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    def test_set_nonstring_types(self):
5090c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        cf = self.fromstring("[sect]\n"
5100c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi                             "option1=foo\n")
5110c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        # Check that we get a TypeError when setting non-string values
5120c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        # in an existing section:
5130c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        self.assertRaises(TypeError, cf.set, "sect", "option1", 1)
5140c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        self.assertRaises(TypeError, cf.set, "sect", "option1", 1.0)
5150c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        self.assertRaises(TypeError, cf.set, "sect", "option1", object())
5160c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        self.assertRaises(TypeError, cf.set, "sect", "option2", 1)
5170c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        self.assertRaises(TypeError, cf.set, "sect", "option2", 1.0)
5180c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        self.assertRaises(TypeError, cf.set, "sect", "option2", object())
5190c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
5200c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    def test_add_section_default_1(self):
5210c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        cf = self.newconfig()
5220c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        self.assertRaises(ValueError, cf.add_section, "default")
5230c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
5240c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    def test_add_section_default_2(self):
5250c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        cf = self.newconfig()
5260c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        self.assertRaises(ValueError, cf.add_section, "DEFAULT")
5270c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
5280c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
5290c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yiclass SafeConfigParserTestCaseNoValue(SafeConfigParserTestCase):
5300c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    allow_no_value = True
5310c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
5320c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yiclass TestChainMap(unittest.TestCase):
5330c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    def test_issue_12717(self):
5340c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        d1 = dict(red=1, green=2)
5350c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        d2 = dict(green=3, blue=4)
5360c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        dcomb = d2.copy()
5370c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        dcomb.update(d1)
5380c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        cm = ConfigParser._Chainmap(d1, d2)
5390c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        self.assertIsInstance(cm.keys(), list)
5400c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        self.assertEqual(set(cm.keys()), set(dcomb.keys()))      # keys()
5410c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        self.assertEqual(set(cm.values()), set(dcomb.values()))  # values()
5420c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        self.assertEqual(set(cm.items()), set(dcomb.items()))    # items()
5430c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        self.assertEqual(set(cm), set(dcomb))                    # __iter__ ()
5440c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        self.assertEqual(cm, dcomb)                              # __eq__()
5450c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        self.assertEqual([cm[k] for k in dcomb], dcomb.values()) # __getitem__()
5460c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        klist = 'red green blue black brown'.split()
5470c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        self.assertEqual([cm.get(k, 10) for k in klist],
5480c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi                         [dcomb.get(k, 10) for k in klist])      # get()
5490c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        self.assertEqual([k in cm for k in klist],
5500c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi                         [k in dcomb for k in klist])            # __contains__()
5510c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        with test_support.check_py3k_warnings():
5520c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            self.assertEqual([cm.has_key(k) for k in klist],
5530c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi                             [dcomb.has_key(k) for k in klist])  # has_key()
5540c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
5550c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yiclass Issue7005TestCase(unittest.TestCase):
5560c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    """Test output when None is set() as a value and allow_no_value == False.
5570c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
5580c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    http://bugs.python.org/issue7005
5590c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
5600c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    """
5610c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
5620c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    expected_output = "[section]\noption = None\n\n"
5630c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
5640c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    def prepare(self, config_class):
5650c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        # This is the default, but that's the point.
5660c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        cp = config_class(allow_no_value=False)
5670c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        cp.add_section("section")
5680c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        cp.set("section", "option", None)
5690c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        sio = StringIO.StringIO()
5700c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        cp.write(sio)
5710c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        return sio.getvalue()
5720c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
5730c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    def test_none_as_value_stringified(self):
5740c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        output = self.prepare(ConfigParser.ConfigParser)
5750c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        self.assertEqual(output, self.expected_output)
5760c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
5770c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    def test_none_as_value_stringified_raw(self):
5780c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        output = self.prepare(ConfigParser.RawConfigParser)
5790c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        self.assertEqual(output, self.expected_output)
5800c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
5810c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
5820c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yiclass SortedTestCase(RawConfigParserTestCase):
5830c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    def newconfig(self, defaults=None):
5840c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        self.cf = self.config_class(defaults=defaults, dict_type=SortedDict)
5850c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        return self.cf
5860c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
5870c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    def test_sorted(self):
5880c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        self.fromstring("[b]\n"
5890c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi                        "o4=1\n"
5900c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi                        "o3=2\n"
5910c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi                        "o2=3\n"
5920c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi                        "o1=4\n"
5930c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi                        "[a]\n"
5940c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi                        "k=v\n")
5950c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        output = StringIO.StringIO()
5960c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        self.cf.write(output)
5970c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        self.assertEqual(output.getvalue(),
5980c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi                         "[a]\n"
5990c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi                         "k = v\n\n"
6000c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi                         "[b]\n"
6010c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi                         "o1 = 4\n"
6020c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi                         "o2 = 3\n"
6030c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi                         "o3 = 2\n"
6040c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi                         "o4 = 1\n\n")
6050c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
6060c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
6070c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yiclass ExceptionPicklingTestCase(unittest.TestCase):
6080c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    """Tests for issue #13760: ConfigParser exceptions are not picklable."""
6090c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
6100c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    def test_error(self):
6110c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        import pickle
6120c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        e1 = ConfigParser.Error('value')
6130c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        pickled = pickle.dumps(e1)
6140c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        e2 = pickle.loads(pickled)
6150c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        self.assertEqual(e1.message, e2.message)
6160c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        self.assertEqual(repr(e1), repr(e2))
6170c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
6180c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    def test_nosectionerror(self):
6190c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        import pickle
6200c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        e1 = ConfigParser.NoSectionError('section')
6210c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        pickled = pickle.dumps(e1)
6220c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        e2 = pickle.loads(pickled)
6230c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        self.assertEqual(e1.message, e2.message)
6240c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        self.assertEqual(e1.args, e2.args)
6250c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        self.assertEqual(e1.section, e2.section)
6260c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        self.assertEqual(repr(e1), repr(e2))
6270c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
6280c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    def test_nooptionerror(self):
6290c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        import pickle
6300c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        e1 = ConfigParser.NoOptionError('option', 'section')
6310c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        pickled = pickle.dumps(e1)
6320c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        e2 = pickle.loads(pickled)
6330c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        self.assertEqual(e1.message, e2.message)
6340c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        self.assertEqual(e1.args, e2.args)
6350c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        self.assertEqual(e1.section, e2.section)
6360c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        self.assertEqual(e1.option, e2.option)
6370c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        self.assertEqual(repr(e1), repr(e2))
6380c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
6390c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    def test_duplicatesectionerror(self):
6400c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        import pickle
6410c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        e1 = ConfigParser.DuplicateSectionError('section')
6420c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        pickled = pickle.dumps(e1)
6430c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        e2 = pickle.loads(pickled)
6440c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        self.assertEqual(e1.message, e2.message)
6450c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        self.assertEqual(e1.args, e2.args)
6460c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        self.assertEqual(e1.section, e2.section)
6470c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        self.assertEqual(repr(e1), repr(e2))
6480c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
6490c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    def test_interpolationerror(self):
6500c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        import pickle
6510c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        e1 = ConfigParser.InterpolationError('option', 'section', 'msg')
6520c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        pickled = pickle.dumps(e1)
6530c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        e2 = pickle.loads(pickled)
6540c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        self.assertEqual(e1.message, e2.message)
6550c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        self.assertEqual(e1.args, e2.args)
6560c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        self.assertEqual(e1.section, e2.section)
6570c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        self.assertEqual(e1.option, e2.option)
6580c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        self.assertEqual(repr(e1), repr(e2))
6590c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
6600c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    def test_interpolationmissingoptionerror(self):
6610c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        import pickle
6620c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        e1 = ConfigParser.InterpolationMissingOptionError('option', 'section',
6630c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            'rawval', 'reference')
6640c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        pickled = pickle.dumps(e1)
6650c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        e2 = pickle.loads(pickled)
6660c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        self.assertEqual(e1.message, e2.message)
6670c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        self.assertEqual(e1.args, e2.args)
6680c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        self.assertEqual(e1.section, e2.section)
6690c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        self.assertEqual(e1.option, e2.option)
6700c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        self.assertEqual(e1.reference, e2.reference)
6710c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        self.assertEqual(repr(e1), repr(e2))
6720c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
6730c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    def test_interpolationsyntaxerror(self):
6740c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        import pickle
6750c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        e1 = ConfigParser.InterpolationSyntaxError('option', 'section', 'msg')
6760c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        pickled = pickle.dumps(e1)
6770c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        e2 = pickle.loads(pickled)
6780c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        self.assertEqual(e1.message, e2.message)
6790c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        self.assertEqual(e1.args, e2.args)
6800c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        self.assertEqual(e1.section, e2.section)
6810c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        self.assertEqual(e1.option, e2.option)
6820c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        self.assertEqual(repr(e1), repr(e2))
6830c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
6840c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    def test_interpolationdeptherror(self):
6850c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        import pickle
6860c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        e1 = ConfigParser.InterpolationDepthError('option', 'section',
6870c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            'rawval')
6880c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        pickled = pickle.dumps(e1)
6890c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        e2 = pickle.loads(pickled)
6900c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        self.assertEqual(e1.message, e2.message)
6910c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        self.assertEqual(e1.args, e2.args)
6920c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        self.assertEqual(e1.section, e2.section)
6930c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        self.assertEqual(e1.option, e2.option)
6940c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        self.assertEqual(repr(e1), repr(e2))
6950c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
6960c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    def test_parsingerror(self):
6970c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        import pickle
6980c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        e1 = ConfigParser.ParsingError('source')
6990c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        e1.append(1, 'line1')
7000c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        e1.append(2, 'line2')
7010c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        e1.append(3, 'line3')
7020c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        pickled = pickle.dumps(e1)
7030c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        e2 = pickle.loads(pickled)
7040c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        self.assertEqual(e1.message, e2.message)
7050c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        self.assertEqual(e1.args, e2.args)
7060c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        self.assertEqual(e1.filename, e2.filename)
7070c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        self.assertEqual(e1.errors, e2.errors)
7080c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        self.assertEqual(repr(e1), repr(e2))
7090c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
7100c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    def test_missingsectionheadererror(self):
7110c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        import pickle
7120c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        e1 = ConfigParser.MissingSectionHeaderError('filename', 123, 'line')
7130c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        pickled = pickle.dumps(e1)
7140c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        e2 = pickle.loads(pickled)
7150c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        self.assertEqual(e1.message, e2.message)
7160c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        self.assertEqual(e1.args, e2.args)
7170c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        self.assertEqual(e1.line, e2.line)
7180c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        self.assertEqual(e1.filename, e2.filename)
7190c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        self.assertEqual(e1.lineno, e2.lineno)
7200c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        self.assertEqual(repr(e1), repr(e2))
7210c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
7220c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
7230c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yidef test_main():
7240c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    test_support.run_unittest(
7250c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        ConfigParserTestCase,
7260c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        MultilineValuesTestCase,
7270c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        RawConfigParserTestCase,
7280c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        SafeConfigParserTestCase,
7290c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        SafeConfigParserTestCaseNoValue,
7300c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        SortedTestCase,
7310c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        Issue7005TestCase,
7320c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        TestChainMap,
7330c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        ExceptionPicklingTestCase,
7340c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        )
7350c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
7360c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
7370c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yiif __name__ == "__main__":
7380c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    test_main()
739