14adfde8bc82dd39f59e0445588c3e599ada477dJosh Gaoimport ConfigParser
24adfde8bc82dd39f59e0445588c3e599ada477dJosh Gaoimport StringIO
34adfde8bc82dd39f59e0445588c3e599ada477dJosh Gaoimport os
44adfde8bc82dd39f59e0445588c3e599ada477dJosh Gaoimport unittest
54adfde8bc82dd39f59e0445588c3e599ada477dJosh Gaoimport UserDict
64adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
74adfde8bc82dd39f59e0445588c3e599ada477dJosh Gaofrom test import test_support
84adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
94adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
104adfde8bc82dd39f59e0445588c3e599ada477dJosh Gaoclass SortedDict(UserDict.UserDict):
114adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    def items(self):
124adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        result = self.data.items()
134adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        result.sort()
144adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        return result
154adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
164adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    def keys(self):
174adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        result = self.data.keys()
184adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        result.sort()
194adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        return result
204adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
214adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    def values(self):
224adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        # XXX never used?
234adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        result = self.items()
244adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        return [i[1] for i in result]
254adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
264adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    def iteritems(self): return iter(self.items())
274adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    def iterkeys(self): return iter(self.keys())
284adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    __iter__ = iterkeys
294adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    def itervalues(self): return iter(self.values())
304adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
314adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
324adfde8bc82dd39f59e0445588c3e599ada477dJosh Gaoclass TestCaseBase(unittest.TestCase):
334adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    allow_no_value = False
344adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
354adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    def newconfig(self, defaults=None):
364adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        if defaults is None:
374adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            self.cf = self.config_class(allow_no_value=self.allow_no_value)
384adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        else:
394adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            self.cf = self.config_class(defaults,
404adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                                        allow_no_value=self.allow_no_value)
414adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        return self.cf
424adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
434adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    def fromstring(self, string, defaults=None):
444adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        cf = self.newconfig(defaults)
454adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        sio = StringIO.StringIO(string)
464adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        cf.readfp(sio)
474adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        return cf
484adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
494adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    def test_basic(self):
504adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        config_string = (
514adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            "[Foo Bar]\n"
524adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            "foo=bar\n"
534adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            "[Spacey Bar]\n"
544adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            "foo = bar\n"
554adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            "[Commented Bar]\n"
564adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            "foo: bar ; comment\n"
574adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            "[Long Line]\n"
584adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            "foo: this line is much, much longer than my editor\n"
594adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            "   likes it.\n"
604adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            "[Section\\with$weird%characters[\t]\n"
614adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            "[Internationalized Stuff]\n"
624adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            "foo[bg]: Bulgarian\n"
634adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            "foo=Default\n"
644adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            "foo[en]=English\n"
654adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            "foo[de]=Deutsch\n"
664adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            "[Spaces]\n"
674adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            "key with spaces : value\n"
684adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            "another with spaces = splat!\n"
694adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            )
704adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        if self.allow_no_value:
714adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            config_string += (
724adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                "[NoValue]\n"
734adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                "option-without-value\n"
744adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                )
754adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
764adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        cf = self.fromstring(config_string)
774adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        L = cf.sections()
784adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        L.sort()
794adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        E = [r'Commented Bar',
804adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao             r'Foo Bar',
814adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao             r'Internationalized Stuff',
824adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao             r'Long Line',
834adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao             r'Section\with$weird%characters[' '\t',
844adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao             r'Spaces',
854adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao             r'Spacey Bar',
864adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao             ]
874adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        if self.allow_no_value:
884adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            E.append(r'NoValue')
894adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        E.sort()
904adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        eq = self.assertEqual
914adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        eq(L, E)
924adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
934adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        # The use of spaces in the section names serves as a
944adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        # regression test for SourceForge bug #583248:
954adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        # http://www.python.org/sf/583248
964adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        eq(cf.get('Foo Bar', 'foo'), 'bar')
974adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        eq(cf.get('Spacey Bar', 'foo'), 'bar')
984adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        eq(cf.get('Commented Bar', 'foo'), 'bar')
994adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        eq(cf.get('Spaces', 'key with spaces'), 'value')
1004adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        eq(cf.get('Spaces', 'another with spaces'), 'splat!')
1014adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        if self.allow_no_value:
1024adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            eq(cf.get('NoValue', 'option-without-value'), None)
1034adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
1044adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertNotIn('__name__', cf.options("Foo Bar"),
1054adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                         '__name__ "option" should not be exposed by the API!')
1064adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
1074adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        # Make sure the right things happen for remove_option();
1084adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        # added to include check for SourceForge bug #123324:
1094adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertTrue(cf.remove_option('Foo Bar', 'foo'),
1104adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                        "remove_option() failed to report existence of option")
1114adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertFalse(cf.has_option('Foo Bar', 'foo'),
1124adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                    "remove_option() failed to remove option")
1134adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertFalse(cf.remove_option('Foo Bar', 'foo'),
1144adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                    "remove_option() failed to report non-existence of option"
1154adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                    " that was removed")
1164adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
1174adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertRaises(ConfigParser.NoSectionError,
1184adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                          cf.remove_option, 'No Such Section', 'foo')
1194adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
1204adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        eq(cf.get('Long Line', 'foo'),
1214adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao           'this line is much, much longer than my editor\nlikes it.')
1224adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
1234adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    def test_case_sensitivity(self):
1244adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        cf = self.newconfig()
1254adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        cf.add_section("A")
1264adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        cf.add_section("a")
1274adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        L = cf.sections()
1284adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        L.sort()
1294adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        eq = self.assertEqual
1304adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        eq(L, ["A", "a"])
1314adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        cf.set("a", "B", "value")
1324adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        eq(cf.options("a"), ["b"])
1334adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        eq(cf.get("a", "b"), "value",
1344adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao           "could not locate option, expecting case-insensitive option names")
1354adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertTrue(cf.has_option("a", "b"))
1364adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        cf.set("A", "A-B", "A-B value")
1374adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        for opt in ("a-b", "A-b", "a-B", "A-B"):
1384adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            self.assertTrue(
1394adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                cf.has_option("A", opt),
1404adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                "has_option() returned false for option which should exist")
1414adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        eq(cf.options("A"), ["a-b"])
1424adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        eq(cf.options("a"), ["b"])
1434adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        cf.remove_option("a", "B")
1444adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        eq(cf.options("a"), [])
1454adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
1464adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        # SF bug #432369:
1474adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        cf = self.fromstring(
1484adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            "[MySection]\nOption: first line\n\tsecond line\n")
1494adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        eq(cf.options("MySection"), ["option"])
1504adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        eq(cf.get("MySection", "Option"), "first line\nsecond line")
1514adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
1524adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        # SF bug #561822:
1534adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        cf = self.fromstring("[section]\nnekey=nevalue\n",
1544adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                             defaults={"key":"value"})
1554adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertTrue(cf.has_option("section", "Key"))
1564adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
1574adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
1584adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    def test_default_case_sensitivity(self):
1594adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        cf = self.newconfig({"foo": "Bar"})
1604adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertEqual(
1614adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            cf.get("DEFAULT", "Foo"), "Bar",
1624adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            "could not locate option, expecting case-insensitive option names")
1634adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        cf = self.newconfig({"Foo": "Bar"})
1644adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertEqual(
1654adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            cf.get("DEFAULT", "Foo"), "Bar",
1664adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            "could not locate option, expecting case-insensitive defaults")
1674adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
1684adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    def test_parse_errors(self):
1694adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.newconfig()
1704adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.parse_error(ConfigParser.ParsingError,
1714adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                         "[Foo]\n  extra-spaces: splat\n")
1724adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.parse_error(ConfigParser.ParsingError,
1734adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                         "[Foo]\n  extra-spaces= splat\n")
1744adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.parse_error(ConfigParser.ParsingError,
1754adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                         "[Foo]\n:value-without-option-name\n")
1764adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.parse_error(ConfigParser.ParsingError,
1774adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                         "[Foo]\n=value-without-option-name\n")
1784adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.parse_error(ConfigParser.MissingSectionHeaderError,
1794adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                         "No Section!\n")
1804adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
1814adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    def parse_error(self, exc, src):
1824adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        sio = StringIO.StringIO(src)
1834adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertRaises(exc, self.cf.readfp, sio)
1844adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
1854adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    def test_query_errors(self):
1864adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        cf = self.newconfig()
1874adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertEqual(cf.sections(), [],
1884adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                         "new ConfigParser should have no defined sections")
1894adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertFalse(cf.has_section("Foo"),
1904adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                         "new ConfigParser should have no acknowledged "
1914adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                         "sections")
1924adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertRaises(ConfigParser.NoSectionError,
1934adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                          cf.options, "Foo")
1944adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertRaises(ConfigParser.NoSectionError,
1954adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                          cf.set, "foo", "bar", "value")
1964adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.get_error(ConfigParser.NoSectionError, "foo", "bar")
1974adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        cf.add_section("foo")
1984adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.get_error(ConfigParser.NoOptionError, "foo", "bar")
1994adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
2004adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    def get_error(self, exc, section, option):
2014adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        try:
2024adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            self.cf.get(section, option)
2034adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        except exc, e:
2044adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            return e
2054adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        else:
2064adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            self.fail("expected exception type %s.%s"
2074adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                      % (exc.__module__, exc.__name__))
2084adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
2094adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    def test_boolean(self):
2104adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        cf = self.fromstring(
2114adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            "[BOOLTEST]\n"
2124adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            "T1=1\n"
2134adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            "T2=TRUE\n"
2144adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            "T3=True\n"
2154adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            "T4=oN\n"
2164adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            "T5=yes\n"
2174adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            "F1=0\n"
2184adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            "F2=FALSE\n"
2194adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            "F3=False\n"
2204adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            "F4=oFF\n"
2214adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            "F5=nO\n"
2224adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            "E1=2\n"
2234adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            "E2=foo\n"
2244adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            "E3=-1\n"
2254adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            "E4=0.1\n"
2264adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            "E5=FALSE AND MORE"
2274adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            )
2284adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        for x in range(1, 5):
2294adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            self.assertTrue(cf.getboolean('BOOLTEST', 't%d' % x))
2304adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            self.assertFalse(cf.getboolean('BOOLTEST', 'f%d' % x))
2314adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            self.assertRaises(ValueError,
2324adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                              cf.getboolean, 'BOOLTEST', 'e%d' % x)
2334adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
2344adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    def test_weird_errors(self):
2354adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        cf = self.newconfig()
2364adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        cf.add_section("Foo")
2374adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertRaises(ConfigParser.DuplicateSectionError,
2384adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                          cf.add_section, "Foo")
2394adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
2404adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    def test_write(self):
2414adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        config_string = (
2424adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            "[Long Line]\n"
2434adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            "foo: this line is much, much longer than my editor\n"
2444adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            "   likes it.\n"
2454adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            "[DEFAULT]\n"
2464adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            "foo: another very\n"
2474adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            " long line\n"
2484adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            )
2494adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        if self.allow_no_value:
2504adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            config_string += (
2514adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            "[Valueless]\n"
2524adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            "option-without-value\n"
2534adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            )
2544adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
2554adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        cf = self.fromstring(config_string)
2564adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        output = StringIO.StringIO()
2574adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        cf.write(output)
2584adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        expect_string = (
2594adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            "[DEFAULT]\n"
2604adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            "foo = another very\n"
2614adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            "\tlong line\n"
2624adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            "\n"
2634adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            "[Long Line]\n"
2644adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            "foo = this line is much, much longer than my editor\n"
2654adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            "\tlikes it.\n"
2664adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            "\n"
2674adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            )
2684adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        if self.allow_no_value:
2694adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            expect_string += (
2704adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                "[Valueless]\n"
2714adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                "option-without-value\n"
2724adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                "\n"
2734adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                )
2744adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertEqual(output.getvalue(), expect_string)
2754adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
2764adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    def test_set_string_types(self):
2774adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        cf = self.fromstring("[sect]\n"
2784adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                             "option1=foo\n")
2794adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        # Check that we don't get an exception when setting values in
2804adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        # an existing section using strings:
2814adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        class mystr(str):
2824adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            pass
2834adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        cf.set("sect", "option1", "splat")
2844adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        cf.set("sect", "option1", mystr("splat"))
2854adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        cf.set("sect", "option2", "splat")
2864adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        cf.set("sect", "option2", mystr("splat"))
2874adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        try:
2884adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            unicode
2894adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        except NameError:
2904adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            pass
2914adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        else:
2924adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            cf.set("sect", "option1", unicode("splat"))
2934adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            cf.set("sect", "option2", unicode("splat"))
2944adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
2954adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    def test_read_returns_file_list(self):
2964adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        file1 = test_support.findfile("cfgparser.1")
2974adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        # check when we pass a mix of readable and non-readable files:
2984adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        cf = self.newconfig()
2994adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        parsed_files = cf.read([file1, "nonexistent-file"])
3004adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertEqual(parsed_files, [file1])
3014adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertEqual(cf.get("Foo Bar", "foo"), "newbar")
3024adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        # check when we pass only a filename:
3034adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        cf = self.newconfig()
3044adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        parsed_files = cf.read(file1)
3054adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertEqual(parsed_files, [file1])
3064adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertEqual(cf.get("Foo Bar", "foo"), "newbar")
3074adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        # check when we pass only missing files:
3084adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        cf = self.newconfig()
3094adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        parsed_files = cf.read(["nonexistent-file"])
3104adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertEqual(parsed_files, [])
3114adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        # check when we pass no files:
3124adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        cf = self.newconfig()
3134adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        parsed_files = cf.read([])
3144adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertEqual(parsed_files, [])
3154adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
3164adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    # shared by subclasses
3174adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    def get_interpolation_config(self):
3184adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        return self.fromstring(
3194adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            "[Foo]\n"
3204adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            "bar=something %(with1)s interpolation (1 step)\n"
3214adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            "bar9=something %(with9)s lots of interpolation (9 steps)\n"
3224adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            "bar10=something %(with10)s lots of interpolation (10 steps)\n"
3234adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            "bar11=something %(with11)s lots of interpolation (11 steps)\n"
3244adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            "with11=%(with10)s\n"
3254adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            "with10=%(with9)s\n"
3264adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            "with9=%(with8)s\n"
3274adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            "with8=%(With7)s\n"
3284adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            "with7=%(WITH6)s\n"
3294adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            "with6=%(with5)s\n"
3304adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            "With5=%(with4)s\n"
3314adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            "WITH4=%(with3)s\n"
3324adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            "with3=%(with2)s\n"
3334adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            "with2=%(with1)s\n"
3344adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            "with1=with\n"
3354adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            "\n"
3364adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            "[Mutual Recursion]\n"
3374adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            "foo=%(bar)s\n"
3384adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            "bar=%(foo)s\n"
3394adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            "\n"
3404adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            "[Interpolation Error]\n"
3414adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            "name=%(reference)s\n",
3424adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            # no definition for 'reference'
3434adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            defaults={"getname": "%(__name__)s"})
3444adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
3454adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    def check_items_config(self, expected):
3464adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        cf = self.fromstring(
3474adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            "[section]\n"
3484adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            "name = value\n"
3494adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            "key: |%(name)s| \n"
3504adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            "getdefault: |%(default)s|\n"
3514adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            "getname: |%(__name__)s|",
3524adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            defaults={"default": "<default>"})
3534adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        L = list(cf.items("section"))
3544adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        L.sort()
3554adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertEqual(L, expected)
3564adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
3574adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
3584adfde8bc82dd39f59e0445588c3e599ada477dJosh Gaoclass ConfigParserTestCase(TestCaseBase):
3594adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    config_class = ConfigParser.ConfigParser
3604adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    allow_no_value = True
3614adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
3624adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    def test_interpolation(self):
3634adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        rawval = {
3644adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            ConfigParser.ConfigParser: ("something %(with11)s "
3654adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                                        "lots of interpolation (11 steps)"),
3664adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            ConfigParser.SafeConfigParser: "%(with1)s",
3674adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        }
3684adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        cf = self.get_interpolation_config()
3694adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        eq = self.assertEqual
3704adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        eq(cf.get("Foo", "getname"), "Foo")
3714adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        eq(cf.get("Foo", "bar"), "something with interpolation (1 step)")
3724adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        eq(cf.get("Foo", "bar9"),
3734adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao           "something with lots of interpolation (9 steps)")
3744adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        eq(cf.get("Foo", "bar10"),
3754adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao           "something with lots of interpolation (10 steps)")
3764adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.get_error(ConfigParser.InterpolationDepthError, "Foo", "bar11")
3774adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
3784adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    def test_interpolation_missing_value(self):
3794adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.get_interpolation_config()
3804adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        e = self.get_error(ConfigParser.InterpolationError,
3814adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                           "Interpolation Error", "name")
3824adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertEqual(e.reference, "reference")
3834adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertEqual(e.section, "Interpolation Error")
3844adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertEqual(e.option, "name")
3854adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
3864adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    def test_items(self):
3874adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.check_items_config([('default', '<default>'),
3884adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                                 ('getdefault', '|<default>|'),
3894adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                                 ('getname', '|section|'),
3904adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                                 ('key', '|value|'),
3914adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                                 ('name', 'value')])
3924adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
3934adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    def test_set_nonstring_types(self):
3944adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        cf = self.newconfig()
3954adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        cf.add_section('non-string')
3964adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        cf.set('non-string', 'int', 1)
3974adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        cf.set('non-string', 'list', [0, 1, 1, 2, 3, 5, 8, 13, '%('])
3984adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        cf.set('non-string', 'dict', {'pi': 3.14159, '%(': 1,
3994adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                                      '%(list)': '%(list)'})
4004adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        cf.set('non-string', 'string_with_interpolation', '%(list)s')
4014adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        cf.set('non-string', 'no-value')
4024adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertEqual(cf.get('non-string', 'int', raw=True), 1)
4034adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertRaises(TypeError, cf.get, 'non-string', 'int')
4044adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertEqual(cf.get('non-string', 'list', raw=True),
4054adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                         [0, 1, 1, 2, 3, 5, 8, 13, '%('])
4064adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertRaises(TypeError, cf.get, 'non-string', 'list')
4074adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertEqual(cf.get('non-string', 'dict', raw=True),
4084adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                         {'pi': 3.14159, '%(': 1, '%(list)': '%(list)'})
4094adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertRaises(TypeError, cf.get, 'non-string', 'dict')
4104adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertEqual(cf.get('non-string', 'string_with_interpolation',
4114adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                                raw=True), '%(list)s')
4124adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertRaises(ValueError, cf.get, 'non-string',
4134adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                          'string_with_interpolation', raw=False)
4144adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertEqual(cf.get('non-string', 'no-value'), None)
4154adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
4164adfde8bc82dd39f59e0445588c3e599ada477dJosh Gaoclass MultilineValuesTestCase(TestCaseBase):
4174adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    config_class = ConfigParser.ConfigParser
4184adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    wonderful_spam = ("I'm having spam spam spam spam "
4194adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                      "spam spam spam beaked beans spam "
4204adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                      "spam spam and spam!").replace(' ', '\t\n')
4214adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
4224adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    def setUp(self):
4234adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        cf = self.newconfig()
4244adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        for i in range(100):
4254adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            s = 'section{}'.format(i)
4264adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            cf.add_section(s)
4274adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            for j in range(10):
4284adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                cf.set(s, 'lovely_spam{}'.format(j), self.wonderful_spam)
4294adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        with open(test_support.TESTFN, 'w') as f:
4304adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            cf.write(f)
4314adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
4324adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    def tearDown(self):
4334adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        os.unlink(test_support.TESTFN)
4344adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
4354adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    def test_dominating_multiline_values(self):
4364adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        # we're reading from file because this is where the code changed
4374adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        # during performance updates in Python 3.2
4384adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        cf_from_file = self.newconfig()
4394adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        with open(test_support.TESTFN) as f:
4404adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            cf_from_file.readfp(f)
4414adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertEqual(cf_from_file.get('section8', 'lovely_spam4'),
4424adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                         self.wonderful_spam.replace('\t\n', '\n'))
4434adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
4444adfde8bc82dd39f59e0445588c3e599ada477dJosh Gaoclass RawConfigParserTestCase(TestCaseBase):
4454adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    config_class = ConfigParser.RawConfigParser
4464adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
4474adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    def test_interpolation(self):
4484adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        cf = self.get_interpolation_config()
4494adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        eq = self.assertEqual
4504adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        eq(cf.get("Foo", "getname"), "%(__name__)s")
4514adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        eq(cf.get("Foo", "bar"),
4524adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao           "something %(with1)s interpolation (1 step)")
4534adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        eq(cf.get("Foo", "bar9"),
4544adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao           "something %(with9)s lots of interpolation (9 steps)")
4554adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        eq(cf.get("Foo", "bar10"),
4564adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao           "something %(with10)s lots of interpolation (10 steps)")
4574adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        eq(cf.get("Foo", "bar11"),
4584adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao           "something %(with11)s lots of interpolation (11 steps)")
4594adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
4604adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    def test_items(self):
4614adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.check_items_config([('default', '<default>'),
4624adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                                 ('getdefault', '|%(default)s|'),
4634adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                                 ('getname', '|%(__name__)s|'),
4644adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                                 ('key', '|%(name)s|'),
4654adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                                 ('name', 'value')])
4664adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
4674adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    def test_set_nonstring_types(self):
4684adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        cf = self.newconfig()
4694adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        cf.add_section('non-string')
4704adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        cf.set('non-string', 'int', 1)
4714adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        cf.set('non-string', 'list', [0, 1, 1, 2, 3, 5, 8, 13])
4724adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        cf.set('non-string', 'dict', {'pi': 3.14159})
4734adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertEqual(cf.get('non-string', 'int'), 1)
4744adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertEqual(cf.get('non-string', 'list'),
4754adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                         [0, 1, 1, 2, 3, 5, 8, 13])
4764adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertEqual(cf.get('non-string', 'dict'), {'pi': 3.14159})
4774adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
4784adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
4794adfde8bc82dd39f59e0445588c3e599ada477dJosh Gaoclass SafeConfigParserTestCase(ConfigParserTestCase):
4804adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    config_class = ConfigParser.SafeConfigParser
4814adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
4824adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    def test_safe_interpolation(self):
4834adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        # See http://www.python.org/sf/511737
4844adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        cf = self.fromstring("[section]\n"
4854adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                             "option1=xxx\n"
4864adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                             "option2=%(option1)s/xxx\n"
4874adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                             "ok=%(option1)s/%%s\n"
4884adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                             "not_ok=%(option2)s/%%s")
4894adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertEqual(cf.get("section", "ok"), "xxx/%s")
4904adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertEqual(cf.get("section", "not_ok"), "xxx/xxx/%s")
4914adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
4924adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    def test_set_malformatted_interpolation(self):
4934adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        cf = self.fromstring("[sect]\n"
4944adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                             "option1=foo\n")
4954adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
4964adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertEqual(cf.get('sect', "option1"), "foo")
4974adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
4984adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertRaises(ValueError, cf.set, "sect", "option1", "%foo")
4994adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertRaises(ValueError, cf.set, "sect", "option1", "foo%")
5004adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertRaises(ValueError, cf.set, "sect", "option1", "f%oo")
5014adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
5024adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertEqual(cf.get('sect', "option1"), "foo")
5034adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
5044adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        # bug #5741: double percents are *not* malformed
5054adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        cf.set("sect", "option2", "foo%%bar")
5064adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertEqual(cf.get("sect", "option2"), "foo%bar")
5074adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
5084adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    def test_set_nonstring_types(self):
5094adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        cf = self.fromstring("[sect]\n"
5104adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                             "option1=foo\n")
5114adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        # Check that we get a TypeError when setting non-string values
5124adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        # in an existing section:
5134adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertRaises(TypeError, cf.set, "sect", "option1", 1)
5144adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertRaises(TypeError, cf.set, "sect", "option1", 1.0)
5154adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertRaises(TypeError, cf.set, "sect", "option1", object())
5164adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertRaises(TypeError, cf.set, "sect", "option2", 1)
5174adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertRaises(TypeError, cf.set, "sect", "option2", 1.0)
5184adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertRaises(TypeError, cf.set, "sect", "option2", object())
5194adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
5204adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    def test_add_section_default_1(self):
5214adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        cf = self.newconfig()
5224adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertRaises(ValueError, cf.add_section, "default")
5234adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
5244adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    def test_add_section_default_2(self):
5254adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        cf = self.newconfig()
5264adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertRaises(ValueError, cf.add_section, "DEFAULT")
5274adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
5284adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
5294adfde8bc82dd39f59e0445588c3e599ada477dJosh Gaoclass SafeConfigParserTestCaseNoValue(SafeConfigParserTestCase):
5304adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    allow_no_value = True
5314adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
5324adfde8bc82dd39f59e0445588c3e599ada477dJosh Gaoclass TestChainMap(unittest.TestCase):
5334adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    def test_issue_12717(self):
5344adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        d1 = dict(red=1, green=2)
5354adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        d2 = dict(green=3, blue=4)
5364adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        dcomb = d2.copy()
5374adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        dcomb.update(d1)
5384adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        cm = ConfigParser._Chainmap(d1, d2)
5394adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertIsInstance(cm.keys(), list)
5404adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertEqual(set(cm.keys()), set(dcomb.keys()))      # keys()
5414adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertEqual(set(cm.values()), set(dcomb.values()))  # values()
5424adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertEqual(set(cm.items()), set(dcomb.items()))    # items()
5434adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertEqual(set(cm), set(dcomb))                    # __iter__ ()
5444adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertEqual(cm, dcomb)                              # __eq__()
5454adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertEqual([cm[k] for k in dcomb], dcomb.values()) # __getitem__()
5464adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        klist = 'red green blue black brown'.split()
5474adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertEqual([cm.get(k, 10) for k in klist],
5484adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                         [dcomb.get(k, 10) for k in klist])      # get()
5494adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertEqual([k in cm for k in klist],
5504adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                         [k in dcomb for k in klist])            # __contains__()
5514adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        with test_support.check_py3k_warnings():
5524adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            self.assertEqual([cm.has_key(k) for k in klist],
5534adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                             [dcomb.has_key(k) for k in klist])  # has_key()
5544adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
5554adfde8bc82dd39f59e0445588c3e599ada477dJosh Gaoclass Issue7005TestCase(unittest.TestCase):
5564adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    """Test output when None is set() as a value and allow_no_value == False.
5574adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
5584adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    http://bugs.python.org/issue7005
5594adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
5604adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    """
5614adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
5624adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    expected_output = "[section]\noption = None\n\n"
5634adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
5644adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    def prepare(self, config_class):
5654adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        # This is the default, but that's the point.
5664adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        cp = config_class(allow_no_value=False)
5674adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        cp.add_section("section")
5684adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        cp.set("section", "option", None)
5694adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        sio = StringIO.StringIO()
5704adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        cp.write(sio)
5714adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        return sio.getvalue()
5724adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
5734adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    def test_none_as_value_stringified(self):
5744adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        output = self.prepare(ConfigParser.ConfigParser)
5754adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertEqual(output, self.expected_output)
5764adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
5774adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    def test_none_as_value_stringified_raw(self):
5784adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        output = self.prepare(ConfigParser.RawConfigParser)
5794adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertEqual(output, self.expected_output)
5804adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
5814adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
5824adfde8bc82dd39f59e0445588c3e599ada477dJosh Gaoclass SortedTestCase(RawConfigParserTestCase):
5834adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    def newconfig(self, defaults=None):
5844adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.cf = self.config_class(defaults=defaults, dict_type=SortedDict)
5854adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        return self.cf
5864adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
5874adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    def test_sorted(self):
5884adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.fromstring("[b]\n"
5894adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                        "o4=1\n"
5904adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                        "o3=2\n"
5914adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                        "o2=3\n"
5924adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                        "o1=4\n"
5934adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                        "[a]\n"
5944adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                        "k=v\n")
5954adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        output = StringIO.StringIO()
5964adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.cf.write(output)
5974adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertEqual(output.getvalue(),
5984adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                         "[a]\n"
5994adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                         "k = v\n\n"
6004adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                         "[b]\n"
6014adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                         "o1 = 4\n"
6024adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                         "o2 = 3\n"
6034adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                         "o3 = 2\n"
6044adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                         "o4 = 1\n\n")
6054adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
6064adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
6074adfde8bc82dd39f59e0445588c3e599ada477dJosh Gaoclass ExceptionPicklingTestCase(unittest.TestCase):
6084adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    """Tests for issue #13760: ConfigParser exceptions are not picklable."""
6094adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
6104adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    def test_error(self):
6114adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        import pickle
6124adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        e1 = ConfigParser.Error('value')
6134adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        pickled = pickle.dumps(e1)
6144adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        e2 = pickle.loads(pickled)
6154adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertEqual(e1.message, e2.message)
6164adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertEqual(repr(e1), repr(e2))
6174adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
6184adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    def test_nosectionerror(self):
6194adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        import pickle
6204adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        e1 = ConfigParser.NoSectionError('section')
6214adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        pickled = pickle.dumps(e1)
6224adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        e2 = pickle.loads(pickled)
6234adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertEqual(e1.message, e2.message)
6244adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertEqual(e1.args, e2.args)
6254adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertEqual(e1.section, e2.section)
6264adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertEqual(repr(e1), repr(e2))
6274adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
6284adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    def test_nooptionerror(self):
6294adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        import pickle
6304adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        e1 = ConfigParser.NoOptionError('option', 'section')
6314adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        pickled = pickle.dumps(e1)
6324adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        e2 = pickle.loads(pickled)
6334adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertEqual(e1.message, e2.message)
6344adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertEqual(e1.args, e2.args)
6354adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertEqual(e1.section, e2.section)
6364adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertEqual(e1.option, e2.option)
6374adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertEqual(repr(e1), repr(e2))
6384adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
6394adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    def test_duplicatesectionerror(self):
6404adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        import pickle
6414adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        e1 = ConfigParser.DuplicateSectionError('section')
6424adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        pickled = pickle.dumps(e1)
6434adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        e2 = pickle.loads(pickled)
6444adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertEqual(e1.message, e2.message)
6454adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertEqual(e1.args, e2.args)
6464adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertEqual(e1.section, e2.section)
6474adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertEqual(repr(e1), repr(e2))
6484adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
6494adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    def test_interpolationerror(self):
6504adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        import pickle
6514adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        e1 = ConfigParser.InterpolationError('option', 'section', 'msg')
6524adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        pickled = pickle.dumps(e1)
6534adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        e2 = pickle.loads(pickled)
6544adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertEqual(e1.message, e2.message)
6554adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertEqual(e1.args, e2.args)
6564adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertEqual(e1.section, e2.section)
6574adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertEqual(e1.option, e2.option)
6584adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertEqual(repr(e1), repr(e2))
6594adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
6604adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    def test_interpolationmissingoptionerror(self):
6614adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        import pickle
6624adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        e1 = ConfigParser.InterpolationMissingOptionError('option', 'section',
6634adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            'rawval', 'reference')
6644adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        pickled = pickle.dumps(e1)
6654adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        e2 = pickle.loads(pickled)
6664adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertEqual(e1.message, e2.message)
6674adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertEqual(e1.args, e2.args)
6684adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertEqual(e1.section, e2.section)
6694adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertEqual(e1.option, e2.option)
6704adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertEqual(e1.reference, e2.reference)
6714adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertEqual(repr(e1), repr(e2))
6724adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
6734adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    def test_interpolationsyntaxerror(self):
6744adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        import pickle
6754adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        e1 = ConfigParser.InterpolationSyntaxError('option', 'section', 'msg')
6764adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        pickled = pickle.dumps(e1)
6774adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        e2 = pickle.loads(pickled)
6784adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertEqual(e1.message, e2.message)
6794adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertEqual(e1.args, e2.args)
6804adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertEqual(e1.section, e2.section)
6814adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertEqual(e1.option, e2.option)
6824adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertEqual(repr(e1), repr(e2))
6834adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
6844adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    def test_interpolationdeptherror(self):
6854adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        import pickle
6864adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        e1 = ConfigParser.InterpolationDepthError('option', 'section',
6874adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            'rawval')
6884adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        pickled = pickle.dumps(e1)
6894adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        e2 = pickle.loads(pickled)
6904adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertEqual(e1.message, e2.message)
6914adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertEqual(e1.args, e2.args)
6924adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertEqual(e1.section, e2.section)
6934adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertEqual(e1.option, e2.option)
6944adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertEqual(repr(e1), repr(e2))
6954adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
6964adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    def test_parsingerror(self):
6974adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        import pickle
6984adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        e1 = ConfigParser.ParsingError('source')
6994adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        e1.append(1, 'line1')
7004adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        e1.append(2, 'line2')
7014adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        e1.append(3, 'line3')
7024adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        pickled = pickle.dumps(e1)
7034adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        e2 = pickle.loads(pickled)
7044adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertEqual(e1.message, e2.message)
7054adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertEqual(e1.args, e2.args)
7064adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertEqual(e1.filename, e2.filename)
7074adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertEqual(e1.errors, e2.errors)
7084adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertEqual(repr(e1), repr(e2))
7094adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
7104adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    def test_missingsectionheadererror(self):
7114adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        import pickle
7124adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        e1 = ConfigParser.MissingSectionHeaderError('filename', 123, 'line')
7134adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        pickled = pickle.dumps(e1)
7144adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        e2 = pickle.loads(pickled)
7154adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertEqual(e1.message, e2.message)
7164adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertEqual(e1.args, e2.args)
7174adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertEqual(e1.line, e2.line)
7184adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertEqual(e1.filename, e2.filename)
7194adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertEqual(e1.lineno, e2.lineno)
7204adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertEqual(repr(e1), repr(e2))
7214adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
7224adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
7234adfde8bc82dd39f59e0445588c3e599ada477dJosh Gaodef test_main():
7244adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    test_support.run_unittest(
7254adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        ConfigParserTestCase,
7264adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        MultilineValuesTestCase,
7274adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        RawConfigParserTestCase,
7284adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        SafeConfigParserTestCase,
7294adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        SafeConfigParserTestCaseNoValue,
7304adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        SortedTestCase,
7314adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        Issue7005TestCase,
7324adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        TestChainMap,
7334adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        ExceptionPicklingTestCase,
7344adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        )
7354adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
7364adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
7374adfde8bc82dd39f59e0445588c3e599ada477dJosh Gaoif __name__ == "__main__":
7384adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    test_main()
739