1392c6fc02d90f211dadc72448a07d9281260cb70Georg Brandlimport ConfigParser
28ef6767e004267ccb4bbbe0a7762d8d69a8c62c6Fred Drakeimport StringIO
3e4334b4949be3cbb1e8602291deb650bb04642abBrian Curtinimport os
4c6f2891af8e8900a92384ad140402bef894a5ca1Fred Drakeimport unittest
5a00bcac00382be7f99ef30e24ec029268efa0cbfMartin v. Löwisimport UserDict
68ef6767e004267ccb4bbbe0a7762d8d69a8c62c6Fred Drake
7c6f2891af8e8900a92384ad140402bef894a5ca1Fred Drakefrom test import test_support
83d5f7e83c74c1c2fa20cf23d38020bbefb69916eFred Drake
9cc43b56960b46734e0d0e19521376d5fdb6af587Fred Drake
10a00bcac00382be7f99ef30e24ec029268efa0cbfMartin v. Löwisclass SortedDict(UserDict.UserDict):
11a00bcac00382be7f99ef30e24ec029268efa0cbfMartin v. Löwis    def items(self):
12a00bcac00382be7f99ef30e24ec029268efa0cbfMartin v. Löwis        result = self.data.items()
13a00bcac00382be7f99ef30e24ec029268efa0cbfMartin v. Löwis        result.sort()
14a00bcac00382be7f99ef30e24ec029268efa0cbfMartin v. Löwis        return result
15a00bcac00382be7f99ef30e24ec029268efa0cbfMartin v. Löwis
16a00bcac00382be7f99ef30e24ec029268efa0cbfMartin v. Löwis    def keys(self):
17a00bcac00382be7f99ef30e24ec029268efa0cbfMartin v. Löwis        result = self.data.keys()
18a00bcac00382be7f99ef30e24ec029268efa0cbfMartin v. Löwis        result.sort()
19a00bcac00382be7f99ef30e24ec029268efa0cbfMartin v. Löwis        return result
20f733abb7831d6566cb0fccd0550d58ec3b7f05a4Tim Peters
21a00bcac00382be7f99ef30e24ec029268efa0cbfMartin v. Löwis    def values(self):
22cd4a21bb8ea184c32d33d534d42bc08b57b405fbGeorg Brandl        # XXX never used?
23a00bcac00382be7f99ef30e24ec029268efa0cbfMartin v. Löwis        result = self.items()
24cd4a21bb8ea184c32d33d534d42bc08b57b405fbGeorg Brandl        return [i[1] for i in result]
25a00bcac00382be7f99ef30e24ec029268efa0cbfMartin v. Löwis
26a00bcac00382be7f99ef30e24ec029268efa0cbfMartin v. Löwis    def iteritems(self): return iter(self.items())
27a00bcac00382be7f99ef30e24ec029268efa0cbfMartin v. Löwis    def iterkeys(self): return iter(self.keys())
28a00bcac00382be7f99ef30e24ec029268efa0cbfMartin v. Löwis    __iter__ = iterkeys
29a00bcac00382be7f99ef30e24ec029268efa0cbfMartin v. Löwis    def itervalues(self): return iter(self.values())
303d5f7e83c74c1c2fa20cf23d38020bbefb69916eFred Drake
31cc43b56960b46734e0d0e19521376d5fdb6af587Fred Drake
32c6f2891af8e8900a92384ad140402bef894a5ca1Fred Drakeclass TestCaseBase(unittest.TestCase):
33cc43b56960b46734e0d0e19521376d5fdb6af587Fred Drake    allow_no_value = False
34cc43b56960b46734e0d0e19521376d5fdb6af587Fred Drake
35c6f2891af8e8900a92384ad140402bef894a5ca1Fred Drake    def newconfig(self, defaults=None):
36c6f2891af8e8900a92384ad140402bef894a5ca1Fred Drake        if defaults is None:
37cc43b56960b46734e0d0e19521376d5fdb6af587Fred Drake            self.cf = self.config_class(allow_no_value=self.allow_no_value)
38c6f2891af8e8900a92384ad140402bef894a5ca1Fred Drake        else:
39cc43b56960b46734e0d0e19521376d5fdb6af587Fred Drake            self.cf = self.config_class(defaults,
40cc43b56960b46734e0d0e19521376d5fdb6af587Fred Drake                                        allow_no_value=self.allow_no_value)
41c6f2891af8e8900a92384ad140402bef894a5ca1Fred Drake        return self.cf
423d5f7e83c74c1c2fa20cf23d38020bbefb69916eFred Drake
43c6f2891af8e8900a92384ad140402bef894a5ca1Fred Drake    def fromstring(self, string, defaults=None):
44c6f2891af8e8900a92384ad140402bef894a5ca1Fred Drake        cf = self.newconfig(defaults)
45c6f2891af8e8900a92384ad140402bef894a5ca1Fred Drake        sio = StringIO.StringIO(string)
46c6f2891af8e8900a92384ad140402bef894a5ca1Fred Drake        cf.readfp(sio)
47c6f2891af8e8900a92384ad140402bef894a5ca1Fred Drake        return cf
48c6f2891af8e8900a92384ad140402bef894a5ca1Fred Drake
49c6f2891af8e8900a92384ad140402bef894a5ca1Fred Drake    def test_basic(self):
50cc43b56960b46734e0d0e19521376d5fdb6af587Fred Drake        config_string = (
51c6f2891af8e8900a92384ad140402bef894a5ca1Fred Drake            "[Foo Bar]\n"
52c6f2891af8e8900a92384ad140402bef894a5ca1Fred Drake            "foo=bar\n"
53c6f2891af8e8900a92384ad140402bef894a5ca1Fred Drake            "[Spacey Bar]\n"
54c6f2891af8e8900a92384ad140402bef894a5ca1Fred Drake            "foo = bar\n"
55c6f2891af8e8900a92384ad140402bef894a5ca1Fred Drake            "[Commented Bar]\n"
56c6f2891af8e8900a92384ad140402bef894a5ca1Fred Drake            "foo: bar ; comment\n"
57c6f2891af8e8900a92384ad140402bef894a5ca1Fred Drake            "[Long Line]\n"
58c6f2891af8e8900a92384ad140402bef894a5ca1Fred Drake            "foo: this line is much, much longer than my editor\n"
59c6f2891af8e8900a92384ad140402bef894a5ca1Fred Drake            "   likes it.\n"
60c6f2891af8e8900a92384ad140402bef894a5ca1Fred Drake            "[Section\\with$weird%characters[\t]\n"
61c6f2891af8e8900a92384ad140402bef894a5ca1Fred Drake            "[Internationalized Stuff]\n"
62c6f2891af8e8900a92384ad140402bef894a5ca1Fred Drake            "foo[bg]: Bulgarian\n"
63c6f2891af8e8900a92384ad140402bef894a5ca1Fred Drake            "foo=Default\n"
64c6f2891af8e8900a92384ad140402bef894a5ca1Fred Drake            "foo[en]=English\n"
65c6f2891af8e8900a92384ad140402bef894a5ca1Fred Drake            "foo[de]=Deutsch\n"
66c6f2891af8e8900a92384ad140402bef894a5ca1Fred Drake            "[Spaces]\n"
67c6f2891af8e8900a92384ad140402bef894a5ca1Fred Drake            "key with spaces : value\n"
68c6f2891af8e8900a92384ad140402bef894a5ca1Fred Drake            "another with spaces = splat!\n"
69c6f2891af8e8900a92384ad140402bef894a5ca1Fred Drake            )
70cc43b56960b46734e0d0e19521376d5fdb6af587Fred Drake        if self.allow_no_value:
71cc43b56960b46734e0d0e19521376d5fdb6af587Fred Drake            config_string += (
72cc43b56960b46734e0d0e19521376d5fdb6af587Fred Drake                "[NoValue]\n"
73cc43b56960b46734e0d0e19521376d5fdb6af587Fred Drake                "option-without-value\n"
74cc43b56960b46734e0d0e19521376d5fdb6af587Fred Drake                )
75cc43b56960b46734e0d0e19521376d5fdb6af587Fred Drake
76cc43b56960b46734e0d0e19521376d5fdb6af587Fred Drake        cf = self.fromstring(config_string)
77c6f2891af8e8900a92384ad140402bef894a5ca1Fred Drake        L = cf.sections()
78c6f2891af8e8900a92384ad140402bef894a5ca1Fred Drake        L.sort()
79cc43b56960b46734e0d0e19521376d5fdb6af587Fred Drake        E = [r'Commented Bar',
80cc43b56960b46734e0d0e19521376d5fdb6af587Fred Drake             r'Foo Bar',
81cc43b56960b46734e0d0e19521376d5fdb6af587Fred Drake             r'Internationalized Stuff',
82cc43b56960b46734e0d0e19521376d5fdb6af587Fred Drake             r'Long Line',
83cc43b56960b46734e0d0e19521376d5fdb6af587Fred Drake             r'Section\with$weird%characters[' '\t',
84cc43b56960b46734e0d0e19521376d5fdb6af587Fred Drake             r'Spaces',
85cc43b56960b46734e0d0e19521376d5fdb6af587Fred Drake             r'Spacey Bar',
86cc43b56960b46734e0d0e19521376d5fdb6af587Fred Drake             ]
87cc43b56960b46734e0d0e19521376d5fdb6af587Fred Drake        if self.allow_no_value:
88cc43b56960b46734e0d0e19521376d5fdb6af587Fred Drake            E.append(r'NoValue')
89cc43b56960b46734e0d0e19521376d5fdb6af587Fred Drake        E.sort()
90c6f2891af8e8900a92384ad140402bef894a5ca1Fred Drake        eq = self.assertEqual
91cc43b56960b46734e0d0e19521376d5fdb6af587Fred Drake        eq(L, E)
92c6f2891af8e8900a92384ad140402bef894a5ca1Fred Drake
93c6f2891af8e8900a92384ad140402bef894a5ca1Fred Drake        # The use of spaces in the section names serves as a
94c6f2891af8e8900a92384ad140402bef894a5ca1Fred Drake        # regression test for SourceForge bug #583248:
95c6f2891af8e8900a92384ad140402bef894a5ca1Fred Drake        # http://www.python.org/sf/583248
96c6f2891af8e8900a92384ad140402bef894a5ca1Fred Drake        eq(cf.get('Foo Bar', 'foo'), 'bar')
97c6f2891af8e8900a92384ad140402bef894a5ca1Fred Drake        eq(cf.get('Spacey Bar', 'foo'), 'bar')
98c6f2891af8e8900a92384ad140402bef894a5ca1Fred Drake        eq(cf.get('Commented Bar', 'foo'), 'bar')
99c6f2891af8e8900a92384ad140402bef894a5ca1Fred Drake        eq(cf.get('Spaces', 'key with spaces'), 'value')
100c6f2891af8e8900a92384ad140402bef894a5ca1Fred Drake        eq(cf.get('Spaces', 'another with spaces'), 'splat!')
101cc43b56960b46734e0d0e19521376d5fdb6af587Fred Drake        if self.allow_no_value:
102cc43b56960b46734e0d0e19521376d5fdb6af587Fred Drake            eq(cf.get('NoValue', 'option-without-value'), None)
103c6f2891af8e8900a92384ad140402bef894a5ca1Fred Drake
104aa98058cc44ba20f35c106d20918c6196b737561Ezio Melotti        self.assertNotIn('__name__', cf.options("Foo Bar"),
105aa98058cc44ba20f35c106d20918c6196b737561Ezio Melotti                         '__name__ "option" should not be exposed by the API!')
106c6f2891af8e8900a92384ad140402bef894a5ca1Fred Drake
107c6f2891af8e8900a92384ad140402bef894a5ca1Fred Drake        # Make sure the right things happen for remove_option();
108c6f2891af8e8900a92384ad140402bef894a5ca1Fred Drake        # added to include check for SourceForge bug #123324:
1095c8da86f3a515ce1a6d5f27fd15e3c5f4d8e931eBenjamin Peterson        self.assertTrue(cf.remove_option('Foo Bar', 'foo'),
1103e4caeb3bf2b2579861e9f3379e3508fbb30549cMark Dickinson                        "remove_option() failed to report existence of option")
1115c8da86f3a515ce1a6d5f27fd15e3c5f4d8e931eBenjamin Peterson        self.assertFalse(cf.has_option('Foo Bar', 'foo'),
112c6f2891af8e8900a92384ad140402bef894a5ca1Fred Drake                    "remove_option() failed to remove option")
1135c8da86f3a515ce1a6d5f27fd15e3c5f4d8e931eBenjamin Peterson        self.assertFalse(cf.remove_option('Foo Bar', 'foo'),
1143e4caeb3bf2b2579861e9f3379e3508fbb30549cMark Dickinson                    "remove_option() failed to report non-existence of option"
115c6f2891af8e8900a92384ad140402bef894a5ca1Fred Drake                    " that was removed")
116c6f2891af8e8900a92384ad140402bef894a5ca1Fred Drake
117392c6fc02d90f211dadc72448a07d9281260cb70Georg Brandl        self.assertRaises(ConfigParser.NoSectionError,
118c6f2891af8e8900a92384ad140402bef894a5ca1Fred Drake                          cf.remove_option, 'No Such Section', 'foo')
119c6f2891af8e8900a92384ad140402bef894a5ca1Fred Drake
120c6f2891af8e8900a92384ad140402bef894a5ca1Fred Drake        eq(cf.get('Long Line', 'foo'),
1211bf71172f8e1acfce05d8443e3998c425974aeefAndrew M. Kuchling           'this line is much, much longer than my editor\nlikes it.')
1223d5f7e83c74c1c2fa20cf23d38020bbefb69916eFred Drake
123c6f2891af8e8900a92384ad140402bef894a5ca1Fred Drake    def test_case_sensitivity(self):
124c6f2891af8e8900a92384ad140402bef894a5ca1Fred Drake        cf = self.newconfig()
125c6f2891af8e8900a92384ad140402bef894a5ca1Fred Drake        cf.add_section("A")
126c6f2891af8e8900a92384ad140402bef894a5ca1Fred Drake        cf.add_section("a")
127c6f2891af8e8900a92384ad140402bef894a5ca1Fred Drake        L = cf.sections()
128c6f2891af8e8900a92384ad140402bef894a5ca1Fred Drake        L.sort()
129c6f2891af8e8900a92384ad140402bef894a5ca1Fred Drake        eq = self.assertEqual
130c6f2891af8e8900a92384ad140402bef894a5ca1Fred Drake        eq(L, ["A", "a"])
131c6f2891af8e8900a92384ad140402bef894a5ca1Fred Drake        cf.set("a", "B", "value")
132c6f2891af8e8900a92384ad140402bef894a5ca1Fred Drake        eq(cf.options("a"), ["b"])
133c6f2891af8e8900a92384ad140402bef894a5ca1Fred Drake        eq(cf.get("a", "b"), "value",
1343c823aa4b64653043ac8cdcb858b4042087862b0Fred Drake           "could not locate option, expecting case-insensitive option names")
1355c8da86f3a515ce1a6d5f27fd15e3c5f4d8e931eBenjamin Peterson        self.assertTrue(cf.has_option("a", "b"))
136c6f2891af8e8900a92384ad140402bef894a5ca1Fred Drake        cf.set("A", "A-B", "A-B value")
137c6f2891af8e8900a92384ad140402bef894a5ca1Fred Drake        for opt in ("a-b", "A-b", "a-B", "A-B"):
1385c8da86f3a515ce1a6d5f27fd15e3c5f4d8e931eBenjamin Peterson            self.assertTrue(
139c6f2891af8e8900a92384ad140402bef894a5ca1Fred Drake                cf.has_option("A", opt),
140c6f2891af8e8900a92384ad140402bef894a5ca1Fred Drake                "has_option() returned false for option which should exist")
141c6f2891af8e8900a92384ad140402bef894a5ca1Fred Drake        eq(cf.options("A"), ["a-b"])
142c6f2891af8e8900a92384ad140402bef894a5ca1Fred Drake        eq(cf.options("a"), ["b"])
143c6f2891af8e8900a92384ad140402bef894a5ca1Fred Drake        cf.remove_option("a", "B")
144c6f2891af8e8900a92384ad140402bef894a5ca1Fred Drake        eq(cf.options("a"), [])
145c6f2891af8e8900a92384ad140402bef894a5ca1Fred Drake
146c6f2891af8e8900a92384ad140402bef894a5ca1Fred Drake        # SF bug #432369:
147c6f2891af8e8900a92384ad140402bef894a5ca1Fred Drake        cf = self.fromstring(
148c6f2891af8e8900a92384ad140402bef894a5ca1Fred Drake            "[MySection]\nOption: first line\n\tsecond line\n")
149c6f2891af8e8900a92384ad140402bef894a5ca1Fred Drake        eq(cf.options("MySection"), ["option"])
150c6f2891af8e8900a92384ad140402bef894a5ca1Fred Drake        eq(cf.get("MySection", "Option"), "first line\nsecond line")
151c6f2891af8e8900a92384ad140402bef894a5ca1Fred Drake
152c6f2891af8e8900a92384ad140402bef894a5ca1Fred Drake        # SF bug #561822:
153c6f2891af8e8900a92384ad140402bef894a5ca1Fred Drake        cf = self.fromstring("[section]\nnekey=nevalue\n",
154c6f2891af8e8900a92384ad140402bef894a5ca1Fred Drake                             defaults={"key":"value"})
1555c8da86f3a515ce1a6d5f27fd15e3c5f4d8e931eBenjamin Peterson        self.assertTrue(cf.has_option("section", "Key"))
156c6f2891af8e8900a92384ad140402bef894a5ca1Fred Drake
157c6f2891af8e8900a92384ad140402bef894a5ca1Fred Drake
15868a1abdadec2377fd3e8d2211cb3cc119de77a28David Goodger    def test_default_case_sensitivity(self):
15968a1abdadec2377fd3e8d2211cb3cc119de77a28David Goodger        cf = self.newconfig({"foo": "Bar"})
16068a1abdadec2377fd3e8d2211cb3cc119de77a28David Goodger        self.assertEqual(
16168a1abdadec2377fd3e8d2211cb3cc119de77a28David Goodger            cf.get("DEFAULT", "Foo"), "Bar",
16268a1abdadec2377fd3e8d2211cb3cc119de77a28David Goodger            "could not locate option, expecting case-insensitive option names")
16368a1abdadec2377fd3e8d2211cb3cc119de77a28David Goodger        cf = self.newconfig({"Foo": "Bar"})
16468a1abdadec2377fd3e8d2211cb3cc119de77a28David Goodger        self.assertEqual(
16568a1abdadec2377fd3e8d2211cb3cc119de77a28David Goodger            cf.get("DEFAULT", "Foo"), "Bar",
16668a1abdadec2377fd3e8d2211cb3cc119de77a28David Goodger            "could not locate option, expecting case-insensitive defaults")
16768a1abdadec2377fd3e8d2211cb3cc119de77a28David Goodger
168c6f2891af8e8900a92384ad140402bef894a5ca1Fred Drake    def test_parse_errors(self):
169c6f2891af8e8900a92384ad140402bef894a5ca1Fred Drake        self.newconfig()
170392c6fc02d90f211dadc72448a07d9281260cb70Georg Brandl        self.parse_error(ConfigParser.ParsingError,
171c6f2891af8e8900a92384ad140402bef894a5ca1Fred Drake                         "[Foo]\n  extra-spaces: splat\n")
172392c6fc02d90f211dadc72448a07d9281260cb70Georg Brandl        self.parse_error(ConfigParser.ParsingError,
173c6f2891af8e8900a92384ad140402bef894a5ca1Fred Drake                         "[Foo]\n  extra-spaces= splat\n")
174392c6fc02d90f211dadc72448a07d9281260cb70Georg Brandl        self.parse_error(ConfigParser.ParsingError,
175c6f2891af8e8900a92384ad140402bef894a5ca1Fred Drake                         "[Foo]\n:value-without-option-name\n")
176392c6fc02d90f211dadc72448a07d9281260cb70Georg Brandl        self.parse_error(ConfigParser.ParsingError,
177c6f2891af8e8900a92384ad140402bef894a5ca1Fred Drake                         "[Foo]\n=value-without-option-name\n")
178392c6fc02d90f211dadc72448a07d9281260cb70Georg Brandl        self.parse_error(ConfigParser.MissingSectionHeaderError,
179c6f2891af8e8900a92384ad140402bef894a5ca1Fred Drake                         "No Section!\n")
180c6f2891af8e8900a92384ad140402bef894a5ca1Fred Drake
181c6f2891af8e8900a92384ad140402bef894a5ca1Fred Drake    def parse_error(self, exc, src):
182c6f2891af8e8900a92384ad140402bef894a5ca1Fred Drake        sio = StringIO.StringIO(src)
183c6f2891af8e8900a92384ad140402bef894a5ca1Fred Drake        self.assertRaises(exc, self.cf.readfp, sio)
184c6f2891af8e8900a92384ad140402bef894a5ca1Fred Drake
185c6f2891af8e8900a92384ad140402bef894a5ca1Fred Drake    def test_query_errors(self):
186c6f2891af8e8900a92384ad140402bef894a5ca1Fred Drake        cf = self.newconfig()
187c6f2891af8e8900a92384ad140402bef894a5ca1Fred Drake        self.assertEqual(cf.sections(), [],
188c6f2891af8e8900a92384ad140402bef894a5ca1Fred Drake                         "new ConfigParser should have no defined sections")
1895c8da86f3a515ce1a6d5f27fd15e3c5f4d8e931eBenjamin Peterson        self.assertFalse(cf.has_section("Foo"),
190e4334b4949be3cbb1e8602291deb650bb04642abBrian Curtin                         "new ConfigParser should have no acknowledged "
191e4334b4949be3cbb1e8602291deb650bb04642abBrian Curtin                         "sections")
192392c6fc02d90f211dadc72448a07d9281260cb70Georg Brandl        self.assertRaises(ConfigParser.NoSectionError,
193c6f2891af8e8900a92384ad140402bef894a5ca1Fred Drake                          cf.options, "Foo")
194392c6fc02d90f211dadc72448a07d9281260cb70Georg Brandl        self.assertRaises(ConfigParser.NoSectionError,
195c6f2891af8e8900a92384ad140402bef894a5ca1Fred Drake                          cf.set, "foo", "bar", "value")
196392c6fc02d90f211dadc72448a07d9281260cb70Georg Brandl        self.get_error(ConfigParser.NoSectionError, "foo", "bar")
197c6f2891af8e8900a92384ad140402bef894a5ca1Fred Drake        cf.add_section("foo")
198392c6fc02d90f211dadc72448a07d9281260cb70Georg Brandl        self.get_error(ConfigParser.NoOptionError, "foo", "bar")
199c6f2891af8e8900a92384ad140402bef894a5ca1Fred Drake
200c6f2891af8e8900a92384ad140402bef894a5ca1Fred Drake    def get_error(self, exc, section, option):
2015478219e11ccd8230c07be731b4079832bd67c20Fred Drake        try:
2025478219e11ccd8230c07be731b4079832bd67c20Fred Drake            self.cf.get(section, option)
2035478219e11ccd8230c07be731b4079832bd67c20Fred Drake        except exc, e:
2045478219e11ccd8230c07be731b4079832bd67c20Fred Drake            return e
2055478219e11ccd8230c07be731b4079832bd67c20Fred Drake        else:
2065478219e11ccd8230c07be731b4079832bd67c20Fred Drake            self.fail("expected exception type %s.%s"
2075478219e11ccd8230c07be731b4079832bd67c20Fred Drake                      % (exc.__module__, exc.__name__))
208c6f2891af8e8900a92384ad140402bef894a5ca1Fred Drake
209c6f2891af8e8900a92384ad140402bef894a5ca1Fred Drake    def test_boolean(self):
210c6f2891af8e8900a92384ad140402bef894a5ca1Fred Drake        cf = self.fromstring(
211c6f2891af8e8900a92384ad140402bef894a5ca1Fred Drake            "[BOOLTEST]\n"
212c6f2891af8e8900a92384ad140402bef894a5ca1Fred Drake            "T1=1\n"
213c6f2891af8e8900a92384ad140402bef894a5ca1Fred Drake            "T2=TRUE\n"
214c6f2891af8e8900a92384ad140402bef894a5ca1Fred Drake            "T3=True\n"
215c6f2891af8e8900a92384ad140402bef894a5ca1Fred Drake            "T4=oN\n"
216c6f2891af8e8900a92384ad140402bef894a5ca1Fred Drake            "T5=yes\n"
217c6f2891af8e8900a92384ad140402bef894a5ca1Fred Drake            "F1=0\n"
218c6f2891af8e8900a92384ad140402bef894a5ca1Fred Drake            "F2=FALSE\n"
219c6f2891af8e8900a92384ad140402bef894a5ca1Fred Drake            "F3=False\n"
220c6f2891af8e8900a92384ad140402bef894a5ca1Fred Drake            "F4=oFF\n"
221c6f2891af8e8900a92384ad140402bef894a5ca1Fred Drake            "F5=nO\n"
222c6f2891af8e8900a92384ad140402bef894a5ca1Fred Drake            "E1=2\n"
223c6f2891af8e8900a92384ad140402bef894a5ca1Fred Drake            "E2=foo\n"
224c6f2891af8e8900a92384ad140402bef894a5ca1Fred Drake            "E3=-1\n"
225c6f2891af8e8900a92384ad140402bef894a5ca1Fred Drake            "E4=0.1\n"
226c6f2891af8e8900a92384ad140402bef894a5ca1Fred Drake            "E5=FALSE AND MORE"
227c6f2891af8e8900a92384ad140402bef894a5ca1Fred Drake            )
228c6f2891af8e8900a92384ad140402bef894a5ca1Fred Drake        for x in range(1, 5):
2295c8da86f3a515ce1a6d5f27fd15e3c5f4d8e931eBenjamin Peterson            self.assertTrue(cf.getboolean('BOOLTEST', 't%d' % x))
2305c8da86f3a515ce1a6d5f27fd15e3c5f4d8e931eBenjamin Peterson            self.assertFalse(cf.getboolean('BOOLTEST', 'f%d' % x))
231c6f2891af8e8900a92384ad140402bef894a5ca1Fred Drake            self.assertRaises(ValueError,
232c6f2891af8e8900a92384ad140402bef894a5ca1Fred Drake                              cf.getboolean, 'BOOLTEST', 'e%d' % x)
233c6f2891af8e8900a92384ad140402bef894a5ca1Fred Drake
234c6f2891af8e8900a92384ad140402bef894a5ca1Fred Drake    def test_weird_errors(self):
235c6f2891af8e8900a92384ad140402bef894a5ca1Fred Drake        cf = self.newconfig()
2368ef6767e004267ccb4bbbe0a7762d8d69a8c62c6Fred Drake        cf.add_section("Foo")
237392c6fc02d90f211dadc72448a07d9281260cb70Georg Brandl        self.assertRaises(ConfigParser.DuplicateSectionError,
238c6f2891af8e8900a92384ad140402bef894a5ca1Fred Drake                          cf.add_section, "Foo")
239c6f2891af8e8900a92384ad140402bef894a5ca1Fred Drake
240c6f2891af8e8900a92384ad140402bef894a5ca1Fred Drake    def test_write(self):
241cc43b56960b46734e0d0e19521376d5fdb6af587Fred Drake        config_string = (
242c6f2891af8e8900a92384ad140402bef894a5ca1Fred Drake            "[Long Line]\n"
243c6f2891af8e8900a92384ad140402bef894a5ca1Fred Drake            "foo: this line is much, much longer than my editor\n"
244c6f2891af8e8900a92384ad140402bef894a5ca1Fred Drake            "   likes it.\n"
245c6f2891af8e8900a92384ad140402bef894a5ca1Fred Drake            "[DEFAULT]\n"
246c6f2891af8e8900a92384ad140402bef894a5ca1Fred Drake            "foo: another very\n"
247cc43b56960b46734e0d0e19521376d5fdb6af587Fred Drake            " long line\n"
248cc43b56960b46734e0d0e19521376d5fdb6af587Fred Drake            )
249cc43b56960b46734e0d0e19521376d5fdb6af587Fred Drake        if self.allow_no_value:
250cc43b56960b46734e0d0e19521376d5fdb6af587Fred Drake            config_string += (
251cc43b56960b46734e0d0e19521376d5fdb6af587Fred Drake            "[Valueless]\n"
252cc43b56960b46734e0d0e19521376d5fdb6af587Fred Drake            "option-without-value\n"
253c6f2891af8e8900a92384ad140402bef894a5ca1Fred Drake            )
254cc43b56960b46734e0d0e19521376d5fdb6af587Fred Drake
255cc43b56960b46734e0d0e19521376d5fdb6af587Fred Drake        cf = self.fromstring(config_string)
256c6f2891af8e8900a92384ad140402bef894a5ca1Fred Drake        output = StringIO.StringIO()
257c6f2891af8e8900a92384ad140402bef894a5ca1Fred Drake        cf.write(output)
258cc43b56960b46734e0d0e19521376d5fdb6af587Fred Drake        expect_string = (
259c6f2891af8e8900a92384ad140402bef894a5ca1Fred Drake            "[DEFAULT]\n"
260c6f2891af8e8900a92384ad140402bef894a5ca1Fred Drake            "foo = another very\n"
261c6f2891af8e8900a92384ad140402bef894a5ca1Fred Drake            "\tlong line\n"
262c6f2891af8e8900a92384ad140402bef894a5ca1Fred Drake            "\n"
263c6f2891af8e8900a92384ad140402bef894a5ca1Fred Drake            "[Long Line]\n"
264c6f2891af8e8900a92384ad140402bef894a5ca1Fred Drake            "foo = this line is much, much longer than my editor\n"
265c6f2891af8e8900a92384ad140402bef894a5ca1Fred Drake            "\tlikes it.\n"
266c6f2891af8e8900a92384ad140402bef894a5ca1Fred Drake            "\n"
267c6f2891af8e8900a92384ad140402bef894a5ca1Fred Drake            )
268cc43b56960b46734e0d0e19521376d5fdb6af587Fred Drake        if self.allow_no_value:
269cc43b56960b46734e0d0e19521376d5fdb6af587Fred Drake            expect_string += (
270cc43b56960b46734e0d0e19521376d5fdb6af587Fred Drake                "[Valueless]\n"
271cc43b56960b46734e0d0e19521376d5fdb6af587Fred Drake                "option-without-value\n"
272cc43b56960b46734e0d0e19521376d5fdb6af587Fred Drake                "\n"
273cc43b56960b46734e0d0e19521376d5fdb6af587Fred Drake                )
274cc43b56960b46734e0d0e19521376d5fdb6af587Fred Drake        self.assertEqual(output.getvalue(), expect_string)
275c6f2891af8e8900a92384ad140402bef894a5ca1Fred Drake
276abc086fb0df915b702f14fa3d44e79e0a8b8f11fFred Drake    def test_set_string_types(self):
277abc086fb0df915b702f14fa3d44e79e0a8b8f11fFred Drake        cf = self.fromstring("[sect]\n"
278abc086fb0df915b702f14fa3d44e79e0a8b8f11fFred Drake                             "option1=foo\n")
279abc086fb0df915b702f14fa3d44e79e0a8b8f11fFred Drake        # Check that we don't get an exception when setting values in
280abc086fb0df915b702f14fa3d44e79e0a8b8f11fFred Drake        # an existing section using strings:
281abc086fb0df915b702f14fa3d44e79e0a8b8f11fFred Drake        class mystr(str):
282abc086fb0df915b702f14fa3d44e79e0a8b8f11fFred Drake            pass
283abc086fb0df915b702f14fa3d44e79e0a8b8f11fFred Drake        cf.set("sect", "option1", "splat")
284abc086fb0df915b702f14fa3d44e79e0a8b8f11fFred Drake        cf.set("sect", "option1", mystr("splat"))
285abc086fb0df915b702f14fa3d44e79e0a8b8f11fFred Drake        cf.set("sect", "option2", "splat")
286abc086fb0df915b702f14fa3d44e79e0a8b8f11fFred Drake        cf.set("sect", "option2", mystr("splat"))
2871f70221b861a3714735251d57695b2f472d0599bZachary Ware
2881f70221b861a3714735251d57695b2f472d0599bZachary Ware    def test_set_unicode(self):
289abc086fb0df915b702f14fa3d44e79e0a8b8f11fFred Drake        try:
290abc086fb0df915b702f14fa3d44e79e0a8b8f11fFred Drake            unicode
291abc086fb0df915b702f14fa3d44e79e0a8b8f11fFred Drake        except NameError:
2921f70221b861a3714735251d57695b2f472d0599bZachary Ware            self.skipTest('no unicode support')
2931f70221b861a3714735251d57695b2f472d0599bZachary Ware
2941f70221b861a3714735251d57695b2f472d0599bZachary Ware        cf = self.fromstring("[sect]\n"
2951f70221b861a3714735251d57695b2f472d0599bZachary Ware                             "option1=foo\n")
2961f70221b861a3714735251d57695b2f472d0599bZachary Ware        cf.set("sect", "option1", unicode("splat"))
2971f70221b861a3714735251d57695b2f472d0599bZachary Ware        cf.set("sect", "option2", unicode("splat"))
298abc086fb0df915b702f14fa3d44e79e0a8b8f11fFred Drake
29982903148a8b4d7f27c5b3180331efd98600b21e1Fred Drake    def test_read_returns_file_list(self):
30082903148a8b4d7f27c5b3180331efd98600b21e1Fred Drake        file1 = test_support.findfile("cfgparser.1")
30182903148a8b4d7f27c5b3180331efd98600b21e1Fred Drake        # check when we pass a mix of readable and non-readable files:
30282903148a8b4d7f27c5b3180331efd98600b21e1Fred Drake        cf = self.newconfig()
3033e4caeb3bf2b2579861e9f3379e3508fbb30549cMark Dickinson        parsed_files = cf.read([file1, "nonexistent-file"])
30482903148a8b4d7f27c5b3180331efd98600b21e1Fred Drake        self.assertEqual(parsed_files, [file1])
30582903148a8b4d7f27c5b3180331efd98600b21e1Fred Drake        self.assertEqual(cf.get("Foo Bar", "foo"), "newbar")
30682903148a8b4d7f27c5b3180331efd98600b21e1Fred Drake        # check when we pass only a filename:
30782903148a8b4d7f27c5b3180331efd98600b21e1Fred Drake        cf = self.newconfig()
30882903148a8b4d7f27c5b3180331efd98600b21e1Fred Drake        parsed_files = cf.read(file1)
30982903148a8b4d7f27c5b3180331efd98600b21e1Fred Drake        self.assertEqual(parsed_files, [file1])
31082903148a8b4d7f27c5b3180331efd98600b21e1Fred Drake        self.assertEqual(cf.get("Foo Bar", "foo"), "newbar")
31182903148a8b4d7f27c5b3180331efd98600b21e1Fred Drake        # check when we pass only missing files:
31282903148a8b4d7f27c5b3180331efd98600b21e1Fred Drake        cf = self.newconfig()
3133e4caeb3bf2b2579861e9f3379e3508fbb30549cMark Dickinson        parsed_files = cf.read(["nonexistent-file"])
31482903148a8b4d7f27c5b3180331efd98600b21e1Fred Drake        self.assertEqual(parsed_files, [])
31582903148a8b4d7f27c5b3180331efd98600b21e1Fred Drake        # check when we pass no files:
31682903148a8b4d7f27c5b3180331efd98600b21e1Fred Drake        cf = self.newconfig()
31782903148a8b4d7f27c5b3180331efd98600b21e1Fred Drake        parsed_files = cf.read([])
31882903148a8b4d7f27c5b3180331efd98600b21e1Fred Drake        self.assertEqual(parsed_files, [])
31982903148a8b4d7f27c5b3180331efd98600b21e1Fred Drake
320c6f2891af8e8900a92384ad140402bef894a5ca1Fred Drake    # shared by subclasses
321c6f2891af8e8900a92384ad140402bef894a5ca1Fred Drake    def get_interpolation_config(self):
322c6f2891af8e8900a92384ad140402bef894a5ca1Fred Drake        return self.fromstring(
323c6f2891af8e8900a92384ad140402bef894a5ca1Fred Drake            "[Foo]\n"
324c6f2891af8e8900a92384ad140402bef894a5ca1Fred Drake            "bar=something %(with1)s interpolation (1 step)\n"
325c6f2891af8e8900a92384ad140402bef894a5ca1Fred Drake            "bar9=something %(with9)s lots of interpolation (9 steps)\n"
326c6f2891af8e8900a92384ad140402bef894a5ca1Fred Drake            "bar10=something %(with10)s lots of interpolation (10 steps)\n"
327c6f2891af8e8900a92384ad140402bef894a5ca1Fred Drake            "bar11=something %(with11)s lots of interpolation (11 steps)\n"
328c6f2891af8e8900a92384ad140402bef894a5ca1Fred Drake            "with11=%(with10)s\n"
329c6f2891af8e8900a92384ad140402bef894a5ca1Fred Drake            "with10=%(with9)s\n"
330c6f2891af8e8900a92384ad140402bef894a5ca1Fred Drake            "with9=%(with8)s\n"
331bc12b01d8349e185c8a52a0f2539e830dfae9adbFred Drake            "with8=%(With7)s\n"
332bc12b01d8349e185c8a52a0f2539e830dfae9adbFred Drake            "with7=%(WITH6)s\n"
333c6f2891af8e8900a92384ad140402bef894a5ca1Fred Drake            "with6=%(with5)s\n"
334bc12b01d8349e185c8a52a0f2539e830dfae9adbFred Drake            "With5=%(with4)s\n"
335bc12b01d8349e185c8a52a0f2539e830dfae9adbFred Drake            "WITH4=%(with3)s\n"
336c6f2891af8e8900a92384ad140402bef894a5ca1Fred Drake            "with3=%(with2)s\n"
337c6f2891af8e8900a92384ad140402bef894a5ca1Fred Drake            "with2=%(with1)s\n"
338c6f2891af8e8900a92384ad140402bef894a5ca1Fred Drake            "with1=with\n"
339c6f2891af8e8900a92384ad140402bef894a5ca1Fred Drake            "\n"
340c6f2891af8e8900a92384ad140402bef894a5ca1Fred Drake            "[Mutual Recursion]\n"
341c6f2891af8e8900a92384ad140402bef894a5ca1Fred Drake            "foo=%(bar)s\n"
3425478219e11ccd8230c07be731b4079832bd67c20Fred Drake            "bar=%(foo)s\n"
3435478219e11ccd8230c07be731b4079832bd67c20Fred Drake            "\n"
3445478219e11ccd8230c07be731b4079832bd67c20Fred Drake            "[Interpolation Error]\n"
3455478219e11ccd8230c07be731b4079832bd67c20Fred Drake            "name=%(reference)s\n",
3465478219e11ccd8230c07be731b4079832bd67c20Fred Drake            # no definition for 'reference'
347c6f2891af8e8900a92384ad140402bef894a5ca1Fred Drake            defaults={"getname": "%(__name__)s"})
348c6f2891af8e8900a92384ad140402bef894a5ca1Fred Drake
34998e3b29b5969b7738c4c2e1e21fea47357ea6aa0Fred Drake    def check_items_config(self, expected):
35098e3b29b5969b7738c4c2e1e21fea47357ea6aa0Fred Drake        cf = self.fromstring(
35198e3b29b5969b7738c4c2e1e21fea47357ea6aa0Fred Drake            "[section]\n"
35298e3b29b5969b7738c4c2e1e21fea47357ea6aa0Fred Drake            "name = value\n"
35398e3b29b5969b7738c4c2e1e21fea47357ea6aa0Fred Drake            "key: |%(name)s| \n"
35498e3b29b5969b7738c4c2e1e21fea47357ea6aa0Fred Drake            "getdefault: |%(default)s|\n"
35598e3b29b5969b7738c4c2e1e21fea47357ea6aa0Fred Drake            "getname: |%(__name__)s|",
35698e3b29b5969b7738c4c2e1e21fea47357ea6aa0Fred Drake            defaults={"default": "<default>"})
35798e3b29b5969b7738c4c2e1e21fea47357ea6aa0Fred Drake        L = list(cf.items("section"))
35898e3b29b5969b7738c4c2e1e21fea47357ea6aa0Fred Drake        L.sort()
35998e3b29b5969b7738c4c2e1e21fea47357ea6aa0Fred Drake        self.assertEqual(L, expected)
36098e3b29b5969b7738c4c2e1e21fea47357ea6aa0Fred Drake
361c6f2891af8e8900a92384ad140402bef894a5ca1Fred Drake
362c6f2891af8e8900a92384ad140402bef894a5ca1Fred Drakeclass ConfigParserTestCase(TestCaseBase):
363392c6fc02d90f211dadc72448a07d9281260cb70Georg Brandl    config_class = ConfigParser.ConfigParser
3640a1fa0e8b1fc888ae9978003c836e5a1953daef5Fred Drake    allow_no_value = True
365c6f2891af8e8900a92384ad140402bef894a5ca1Fred Drake
366c6f2891af8e8900a92384ad140402bef894a5ca1Fred Drake    def test_interpolation(self):
367e4334b4949be3cbb1e8602291deb650bb04642abBrian Curtin        rawval = {
368e4334b4949be3cbb1e8602291deb650bb04642abBrian Curtin            ConfigParser.ConfigParser: ("something %(with11)s "
369e4334b4949be3cbb1e8602291deb650bb04642abBrian Curtin                                        "lots of interpolation (11 steps)"),
370e4334b4949be3cbb1e8602291deb650bb04642abBrian Curtin            ConfigParser.SafeConfigParser: "%(with1)s",
371e4334b4949be3cbb1e8602291deb650bb04642abBrian Curtin        }
372c6f2891af8e8900a92384ad140402bef894a5ca1Fred Drake        cf = self.get_interpolation_config()
373c6f2891af8e8900a92384ad140402bef894a5ca1Fred Drake        eq = self.assertEqual
374c6f2891af8e8900a92384ad140402bef894a5ca1Fred Drake        eq(cf.get("Foo", "getname"), "Foo")
375c6f2891af8e8900a92384ad140402bef894a5ca1Fred Drake        eq(cf.get("Foo", "bar"), "something with interpolation (1 step)")
376c6f2891af8e8900a92384ad140402bef894a5ca1Fred Drake        eq(cf.get("Foo", "bar9"),
377c6f2891af8e8900a92384ad140402bef894a5ca1Fred Drake           "something with lots of interpolation (9 steps)")
378c6f2891af8e8900a92384ad140402bef894a5ca1Fred Drake        eq(cf.get("Foo", "bar10"),
379c6f2891af8e8900a92384ad140402bef894a5ca1Fred Drake           "something with lots of interpolation (10 steps)")
380392c6fc02d90f211dadc72448a07d9281260cb70Georg Brandl        self.get_error(ConfigParser.InterpolationDepthError, "Foo", "bar11")
381c6f2891af8e8900a92384ad140402bef894a5ca1Fred Drake
3825478219e11ccd8230c07be731b4079832bd67c20Fred Drake    def test_interpolation_missing_value(self):
383cc43b56960b46734e0d0e19521376d5fdb6af587Fred Drake        self.get_interpolation_config()
384392c6fc02d90f211dadc72448a07d9281260cb70Georg Brandl        e = self.get_error(ConfigParser.InterpolationError,
3855478219e11ccd8230c07be731b4079832bd67c20Fred Drake                           "Interpolation Error", "name")
3865478219e11ccd8230c07be731b4079832bd67c20Fred Drake        self.assertEqual(e.reference, "reference")
3875478219e11ccd8230c07be731b4079832bd67c20Fred Drake        self.assertEqual(e.section, "Interpolation Error")
3885478219e11ccd8230c07be731b4079832bd67c20Fred Drake        self.assertEqual(e.option, "name")
3895478219e11ccd8230c07be731b4079832bd67c20Fred Drake
39098e3b29b5969b7738c4c2e1e21fea47357ea6aa0Fred Drake    def test_items(self):
39198e3b29b5969b7738c4c2e1e21fea47357ea6aa0Fred Drake        self.check_items_config([('default', '<default>'),
39298e3b29b5969b7738c4c2e1e21fea47357ea6aa0Fred Drake                                 ('getdefault', '|<default>|'),
39398e3b29b5969b7738c4c2e1e21fea47357ea6aa0Fred Drake                                 ('getname', '|section|'),
39498e3b29b5969b7738c4c2e1e21fea47357ea6aa0Fred Drake                                 ('key', '|value|'),
39598e3b29b5969b7738c4c2e1e21fea47357ea6aa0Fred Drake                                 ('name', 'value')])
39698e3b29b5969b7738c4c2e1e21fea47357ea6aa0Fred Drake
3971cbf206d322ad1fac12b4bb5a64d501ca021a61dDavid Goodger    def test_set_nonstring_types(self):
3981cbf206d322ad1fac12b4bb5a64d501ca021a61dDavid Goodger        cf = self.newconfig()
3991cbf206d322ad1fac12b4bb5a64d501ca021a61dDavid Goodger        cf.add_section('non-string')
4001cbf206d322ad1fac12b4bb5a64d501ca021a61dDavid Goodger        cf.set('non-string', 'int', 1)
4011cbf206d322ad1fac12b4bb5a64d501ca021a61dDavid Goodger        cf.set('non-string', 'list', [0, 1, 1, 2, 3, 5, 8, 13, '%('])
4021cbf206d322ad1fac12b4bb5a64d501ca021a61dDavid Goodger        cf.set('non-string', 'dict', {'pi': 3.14159, '%(': 1,
4031cbf206d322ad1fac12b4bb5a64d501ca021a61dDavid Goodger                                      '%(list)': '%(list)'})
4041cbf206d322ad1fac12b4bb5a64d501ca021a61dDavid Goodger        cf.set('non-string', 'string_with_interpolation', '%(list)s')
4050a1fa0e8b1fc888ae9978003c836e5a1953daef5Fred Drake        cf.set('non-string', 'no-value')
4061cbf206d322ad1fac12b4bb5a64d501ca021a61dDavid Goodger        self.assertEqual(cf.get('non-string', 'int', raw=True), 1)
4071cbf206d322ad1fac12b4bb5a64d501ca021a61dDavid Goodger        self.assertRaises(TypeError, cf.get, 'non-string', 'int')
4081cbf206d322ad1fac12b4bb5a64d501ca021a61dDavid Goodger        self.assertEqual(cf.get('non-string', 'list', raw=True),
4091cbf206d322ad1fac12b4bb5a64d501ca021a61dDavid Goodger                         [0, 1, 1, 2, 3, 5, 8, 13, '%('])
4101cbf206d322ad1fac12b4bb5a64d501ca021a61dDavid Goodger        self.assertRaises(TypeError, cf.get, 'non-string', 'list')
4111cbf206d322ad1fac12b4bb5a64d501ca021a61dDavid Goodger        self.assertEqual(cf.get('non-string', 'dict', raw=True),
4121cbf206d322ad1fac12b4bb5a64d501ca021a61dDavid Goodger                         {'pi': 3.14159, '%(': 1, '%(list)': '%(list)'})
4131cbf206d322ad1fac12b4bb5a64d501ca021a61dDavid Goodger        self.assertRaises(TypeError, cf.get, 'non-string', 'dict')
4141cbf206d322ad1fac12b4bb5a64d501ca021a61dDavid Goodger        self.assertEqual(cf.get('non-string', 'string_with_interpolation',
4151cbf206d322ad1fac12b4bb5a64d501ca021a61dDavid Goodger                                raw=True), '%(list)s')
4161cbf206d322ad1fac12b4bb5a64d501ca021a61dDavid Goodger        self.assertRaises(ValueError, cf.get, 'non-string',
4171cbf206d322ad1fac12b4bb5a64d501ca021a61dDavid Goodger                          'string_with_interpolation', raw=False)
4180a1fa0e8b1fc888ae9978003c836e5a1953daef5Fred Drake        self.assertEqual(cf.get('non-string', 'no-value'), None)
4191cbf206d322ad1fac12b4bb5a64d501ca021a61dDavid Goodger
420e4334b4949be3cbb1e8602291deb650bb04642abBrian Curtinclass MultilineValuesTestCase(TestCaseBase):
421e4334b4949be3cbb1e8602291deb650bb04642abBrian Curtin    config_class = ConfigParser.ConfigParser
422e4334b4949be3cbb1e8602291deb650bb04642abBrian Curtin    wonderful_spam = ("I'm having spam spam spam spam "
423e4334b4949be3cbb1e8602291deb650bb04642abBrian Curtin                      "spam spam spam beaked beans spam "
424e4334b4949be3cbb1e8602291deb650bb04642abBrian Curtin                      "spam spam and spam!").replace(' ', '\t\n')
425e4334b4949be3cbb1e8602291deb650bb04642abBrian Curtin
426e4334b4949be3cbb1e8602291deb650bb04642abBrian Curtin    def setUp(self):
427e4334b4949be3cbb1e8602291deb650bb04642abBrian Curtin        cf = self.newconfig()
428e4334b4949be3cbb1e8602291deb650bb04642abBrian Curtin        for i in range(100):
429e4334b4949be3cbb1e8602291deb650bb04642abBrian Curtin            s = 'section{}'.format(i)
430e4334b4949be3cbb1e8602291deb650bb04642abBrian Curtin            cf.add_section(s)
431e4334b4949be3cbb1e8602291deb650bb04642abBrian Curtin            for j in range(10):
432e4334b4949be3cbb1e8602291deb650bb04642abBrian Curtin                cf.set(s, 'lovely_spam{}'.format(j), self.wonderful_spam)
433e4334b4949be3cbb1e8602291deb650bb04642abBrian Curtin        with open(test_support.TESTFN, 'w') as f:
434e4334b4949be3cbb1e8602291deb650bb04642abBrian Curtin            cf.write(f)
435e4334b4949be3cbb1e8602291deb650bb04642abBrian Curtin
436e4334b4949be3cbb1e8602291deb650bb04642abBrian Curtin    def tearDown(self):
437e4334b4949be3cbb1e8602291deb650bb04642abBrian Curtin        os.unlink(test_support.TESTFN)
438e4334b4949be3cbb1e8602291deb650bb04642abBrian Curtin
439e4334b4949be3cbb1e8602291deb650bb04642abBrian Curtin    def test_dominating_multiline_values(self):
440e4334b4949be3cbb1e8602291deb650bb04642abBrian Curtin        # we're reading from file because this is where the code changed
441e4334b4949be3cbb1e8602291deb650bb04642abBrian Curtin        # during performance updates in Python 3.2
442e4334b4949be3cbb1e8602291deb650bb04642abBrian Curtin        cf_from_file = self.newconfig()
443e4334b4949be3cbb1e8602291deb650bb04642abBrian Curtin        with open(test_support.TESTFN) as f:
444e4334b4949be3cbb1e8602291deb650bb04642abBrian Curtin            cf_from_file.readfp(f)
445e4334b4949be3cbb1e8602291deb650bb04642abBrian Curtin        self.assertEqual(cf_from_file.get('section8', 'lovely_spam4'),
446e4334b4949be3cbb1e8602291deb650bb04642abBrian Curtin                         self.wonderful_spam.replace('\t\n', '\n'))
447c6f2891af8e8900a92384ad140402bef894a5ca1Fred Drake
448c6f2891af8e8900a92384ad140402bef894a5ca1Fred Drakeclass RawConfigParserTestCase(TestCaseBase):
449392c6fc02d90f211dadc72448a07d9281260cb70Georg Brandl    config_class = ConfigParser.RawConfigParser
450c6f2891af8e8900a92384ad140402bef894a5ca1Fred Drake
451c6f2891af8e8900a92384ad140402bef894a5ca1Fred Drake    def test_interpolation(self):
452c6f2891af8e8900a92384ad140402bef894a5ca1Fred Drake        cf = self.get_interpolation_config()
453c6f2891af8e8900a92384ad140402bef894a5ca1Fred Drake        eq = self.assertEqual
454c6f2891af8e8900a92384ad140402bef894a5ca1Fred Drake        eq(cf.get("Foo", "getname"), "%(__name__)s")
455c6f2891af8e8900a92384ad140402bef894a5ca1Fred Drake        eq(cf.get("Foo", "bar"),
456c6f2891af8e8900a92384ad140402bef894a5ca1Fred Drake           "something %(with1)s interpolation (1 step)")
457c6f2891af8e8900a92384ad140402bef894a5ca1Fred Drake        eq(cf.get("Foo", "bar9"),
458c6f2891af8e8900a92384ad140402bef894a5ca1Fred Drake           "something %(with9)s lots of interpolation (9 steps)")
459c6f2891af8e8900a92384ad140402bef894a5ca1Fred Drake        eq(cf.get("Foo", "bar10"),
460c6f2891af8e8900a92384ad140402bef894a5ca1Fred Drake           "something %(with10)s lots of interpolation (10 steps)")
461c6f2891af8e8900a92384ad140402bef894a5ca1Fred Drake        eq(cf.get("Foo", "bar11"),
462c6f2891af8e8900a92384ad140402bef894a5ca1Fred Drake           "something %(with11)s lots of interpolation (11 steps)")
463c6f2891af8e8900a92384ad140402bef894a5ca1Fred Drake
46498e3b29b5969b7738c4c2e1e21fea47357ea6aa0Fred Drake    def test_items(self):
46598e3b29b5969b7738c4c2e1e21fea47357ea6aa0Fred Drake        self.check_items_config([('default', '<default>'),
46698e3b29b5969b7738c4c2e1e21fea47357ea6aa0Fred Drake                                 ('getdefault', '|%(default)s|'),
46798e3b29b5969b7738c4c2e1e21fea47357ea6aa0Fred Drake                                 ('getname', '|%(__name__)s|'),
46898e3b29b5969b7738c4c2e1e21fea47357ea6aa0Fred Drake                                 ('key', '|%(name)s|'),
46998e3b29b5969b7738c4c2e1e21fea47357ea6aa0Fred Drake                                 ('name', 'value')])
47098e3b29b5969b7738c4c2e1e21fea47357ea6aa0Fred Drake
4711cbf206d322ad1fac12b4bb5a64d501ca021a61dDavid Goodger    def test_set_nonstring_types(self):
4721cbf206d322ad1fac12b4bb5a64d501ca021a61dDavid Goodger        cf = self.newconfig()
4731cbf206d322ad1fac12b4bb5a64d501ca021a61dDavid Goodger        cf.add_section('non-string')
4741cbf206d322ad1fac12b4bb5a64d501ca021a61dDavid Goodger        cf.set('non-string', 'int', 1)
4751cbf206d322ad1fac12b4bb5a64d501ca021a61dDavid Goodger        cf.set('non-string', 'list', [0, 1, 1, 2, 3, 5, 8, 13])
4761cbf206d322ad1fac12b4bb5a64d501ca021a61dDavid Goodger        cf.set('non-string', 'dict', {'pi': 3.14159})
4771cbf206d322ad1fac12b4bb5a64d501ca021a61dDavid Goodger        self.assertEqual(cf.get('non-string', 'int'), 1)
4781cbf206d322ad1fac12b4bb5a64d501ca021a61dDavid Goodger        self.assertEqual(cf.get('non-string', 'list'),
4791cbf206d322ad1fac12b4bb5a64d501ca021a61dDavid Goodger                         [0, 1, 1, 2, 3, 5, 8, 13])
4801cbf206d322ad1fac12b4bb5a64d501ca021a61dDavid Goodger        self.assertEqual(cf.get('non-string', 'dict'), {'pi': 3.14159})
481ab9b32c0778655db5d2bf3f4c34d3a205d87a1afTim Peters
482c6f2891af8e8900a92384ad140402bef894a5ca1Fred Drake
4830eebd5cef982686b9438b35d4c4ed395f437ff3eFred Drakeclass SafeConfigParserTestCase(ConfigParserTestCase):
484392c6fc02d90f211dadc72448a07d9281260cb70Georg Brandl    config_class = ConfigParser.SafeConfigParser
4850eebd5cef982686b9438b35d4c4ed395f437ff3eFred Drake
4860eebd5cef982686b9438b35d4c4ed395f437ff3eFred Drake    def test_safe_interpolation(self):
4870eebd5cef982686b9438b35d4c4ed395f437ff3eFred Drake        # See http://www.python.org/sf/511737
4880eebd5cef982686b9438b35d4c4ed395f437ff3eFred Drake        cf = self.fromstring("[section]\n"
4890eebd5cef982686b9438b35d4c4ed395f437ff3eFred Drake                             "option1=xxx\n"
4900eebd5cef982686b9438b35d4c4ed395f437ff3eFred Drake                             "option2=%(option1)s/xxx\n"
4910eebd5cef982686b9438b35d4c4ed395f437ff3eFred Drake                             "ok=%(option1)s/%%s\n"
4920eebd5cef982686b9438b35d4c4ed395f437ff3eFred Drake                             "not_ok=%(option2)s/%%s")
4930eebd5cef982686b9438b35d4c4ed395f437ff3eFred Drake        self.assertEqual(cf.get("section", "ok"), "xxx/%s")
4940eebd5cef982686b9438b35d4c4ed395f437ff3eFred Drake        self.assertEqual(cf.get("section", "not_ok"), "xxx/xxx/%s")
4950eebd5cef982686b9438b35d4c4ed395f437ff3eFred Drake
49692a6baed7bfae3eaad31c47c5d80348b05a62d8cGeorg Brandl    def test_set_malformatted_interpolation(self):
49792a6baed7bfae3eaad31c47c5d80348b05a62d8cGeorg Brandl        cf = self.fromstring("[sect]\n"
49892a6baed7bfae3eaad31c47c5d80348b05a62d8cGeorg Brandl                             "option1=foo\n")
49992a6baed7bfae3eaad31c47c5d80348b05a62d8cGeorg Brandl
50092a6baed7bfae3eaad31c47c5d80348b05a62d8cGeorg Brandl        self.assertEqual(cf.get('sect', "option1"), "foo")
50192a6baed7bfae3eaad31c47c5d80348b05a62d8cGeorg Brandl
50292a6baed7bfae3eaad31c47c5d80348b05a62d8cGeorg Brandl        self.assertRaises(ValueError, cf.set, "sect", "option1", "%foo")
50392a6baed7bfae3eaad31c47c5d80348b05a62d8cGeorg Brandl        self.assertRaises(ValueError, cf.set, "sect", "option1", "foo%")
50492a6baed7bfae3eaad31c47c5d80348b05a62d8cGeorg Brandl        self.assertRaises(ValueError, cf.set, "sect", "option1", "f%oo")
50592a6baed7bfae3eaad31c47c5d80348b05a62d8cGeorg Brandl
50692a6baed7bfae3eaad31c47c5d80348b05a62d8cGeorg Brandl        self.assertEqual(cf.get('sect', "option1"), "foo")
50792a6baed7bfae3eaad31c47c5d80348b05a62d8cGeorg Brandl
50821cf5ee6fdb190393d27b03f6b3c5453d97859dfGeorg Brandl        # bug #5741: double percents are *not* malformed
50921cf5ee6fdb190393d27b03f6b3c5453d97859dfGeorg Brandl        cf.set("sect", "option2", "foo%%bar")
51021cf5ee6fdb190393d27b03f6b3c5453d97859dfGeorg Brandl        self.assertEqual(cf.get("sect", "option2"), "foo%bar")
51121cf5ee6fdb190393d27b03f6b3c5453d97859dfGeorg Brandl
5121cbf206d322ad1fac12b4bb5a64d501ca021a61dDavid Goodger    def test_set_nonstring_types(self):
5131cbf206d322ad1fac12b4bb5a64d501ca021a61dDavid Goodger        cf = self.fromstring("[sect]\n"
5141cbf206d322ad1fac12b4bb5a64d501ca021a61dDavid Goodger                             "option1=foo\n")
5151cbf206d322ad1fac12b4bb5a64d501ca021a61dDavid Goodger        # Check that we get a TypeError when setting non-string values
5161cbf206d322ad1fac12b4bb5a64d501ca021a61dDavid Goodger        # in an existing section:
5171cbf206d322ad1fac12b4bb5a64d501ca021a61dDavid Goodger        self.assertRaises(TypeError, cf.set, "sect", "option1", 1)
5181cbf206d322ad1fac12b4bb5a64d501ca021a61dDavid Goodger        self.assertRaises(TypeError, cf.set, "sect", "option1", 1.0)
5191cbf206d322ad1fac12b4bb5a64d501ca021a61dDavid Goodger        self.assertRaises(TypeError, cf.set, "sect", "option1", object())
5201cbf206d322ad1fac12b4bb5a64d501ca021a61dDavid Goodger        self.assertRaises(TypeError, cf.set, "sect", "option2", 1)
5211cbf206d322ad1fac12b4bb5a64d501ca021a61dDavid Goodger        self.assertRaises(TypeError, cf.set, "sect", "option2", 1.0)
5221cbf206d322ad1fac12b4bb5a64d501ca021a61dDavid Goodger        self.assertRaises(TypeError, cf.set, "sect", "option2", object())
5231cbf206d322ad1fac12b4bb5a64d501ca021a61dDavid Goodger
524b12f0b581a6f268d0611c87012d1273aeca220b8Facundo Batista    def test_add_section_default_1(self):
525b12f0b581a6f268d0611c87012d1273aeca220b8Facundo Batista        cf = self.newconfig()
526b12f0b581a6f268d0611c87012d1273aeca220b8Facundo Batista        self.assertRaises(ValueError, cf.add_section, "default")
527b12f0b581a6f268d0611c87012d1273aeca220b8Facundo Batista
528b12f0b581a6f268d0611c87012d1273aeca220b8Facundo Batista    def test_add_section_default_2(self):
529b12f0b581a6f268d0611c87012d1273aeca220b8Facundo Batista        cf = self.newconfig()
530b12f0b581a6f268d0611c87012d1273aeca220b8Facundo Batista        self.assertRaises(ValueError, cf.add_section, "DEFAULT")
531b12f0b581a6f268d0611c87012d1273aeca220b8Facundo Batista
532cc43b56960b46734e0d0e19521376d5fdb6af587Fred Drake
533cc43b56960b46734e0d0e19521376d5fdb6af587Fred Drakeclass SafeConfigParserTestCaseNoValue(SafeConfigParserTestCase):
534cc43b56960b46734e0d0e19521376d5fdb6af587Fred Drake    allow_no_value = True
535cc43b56960b46734e0d0e19521376d5fdb6af587Fred Drake
5363ea5224c43663ee4a18e8a08ca927fe8a4790f24Raymond Hettingerclass TestChainMap(unittest.TestCase):
5373ea5224c43663ee4a18e8a08ca927fe8a4790f24Raymond Hettinger    def test_issue_12717(self):
5383ea5224c43663ee4a18e8a08ca927fe8a4790f24Raymond Hettinger        d1 = dict(red=1, green=2)
5393ea5224c43663ee4a18e8a08ca927fe8a4790f24Raymond Hettinger        d2 = dict(green=3, blue=4)
5403ea5224c43663ee4a18e8a08ca927fe8a4790f24Raymond Hettinger        dcomb = d2.copy()
5413ea5224c43663ee4a18e8a08ca927fe8a4790f24Raymond Hettinger        dcomb.update(d1)
5423ea5224c43663ee4a18e8a08ca927fe8a4790f24Raymond Hettinger        cm = ConfigParser._Chainmap(d1, d2)
5433ea5224c43663ee4a18e8a08ca927fe8a4790f24Raymond Hettinger        self.assertIsInstance(cm.keys(), list)
5443ea5224c43663ee4a18e8a08ca927fe8a4790f24Raymond Hettinger        self.assertEqual(set(cm.keys()), set(dcomb.keys()))      # keys()
5453ea5224c43663ee4a18e8a08ca927fe8a4790f24Raymond Hettinger        self.assertEqual(set(cm.values()), set(dcomb.values()))  # values()
5463ea5224c43663ee4a18e8a08ca927fe8a4790f24Raymond Hettinger        self.assertEqual(set(cm.items()), set(dcomb.items()))    # items()
5473ea5224c43663ee4a18e8a08ca927fe8a4790f24Raymond Hettinger        self.assertEqual(set(cm), set(dcomb))                    # __iter__ ()
5483ea5224c43663ee4a18e8a08ca927fe8a4790f24Raymond Hettinger        self.assertEqual(cm, dcomb)                              # __eq__()
5493ea5224c43663ee4a18e8a08ca927fe8a4790f24Raymond Hettinger        self.assertEqual([cm[k] for k in dcomb], dcomb.values()) # __getitem__()
5503ea5224c43663ee4a18e8a08ca927fe8a4790f24Raymond Hettinger        klist = 'red green blue black brown'.split()
5513ea5224c43663ee4a18e8a08ca927fe8a4790f24Raymond Hettinger        self.assertEqual([cm.get(k, 10) for k in klist],
5523ea5224c43663ee4a18e8a08ca927fe8a4790f24Raymond Hettinger                         [dcomb.get(k, 10) for k in klist])      # get()
5533ea5224c43663ee4a18e8a08ca927fe8a4790f24Raymond Hettinger        self.assertEqual([k in cm for k in klist],
5543ea5224c43663ee4a18e8a08ca927fe8a4790f24Raymond Hettinger                         [k in dcomb for k in klist])            # __contains__()
555030aa35a1b5dc9a91b44abeda80d32df8a8d8952Ezio Melotti        with test_support.check_py3k_warnings():
556030aa35a1b5dc9a91b44abeda80d32df8a8d8952Ezio Melotti            self.assertEqual([cm.has_key(k) for k in klist],
557030aa35a1b5dc9a91b44abeda80d32df8a8d8952Ezio Melotti                             [dcomb.has_key(k) for k in klist])  # has_key()
558cc43b56960b46734e0d0e19521376d5fdb6af587Fred Drake
559a1e627d61c57fefbfdabf308b33de75e08ca5374Fred Drakeclass Issue7005TestCase(unittest.TestCase):
560a1e627d61c57fefbfdabf308b33de75e08ca5374Fred Drake    """Test output when None is set() as a value and allow_no_value == False.
561a1e627d61c57fefbfdabf308b33de75e08ca5374Fred Drake
562a1e627d61c57fefbfdabf308b33de75e08ca5374Fred Drake    http://bugs.python.org/issue7005
563a1e627d61c57fefbfdabf308b33de75e08ca5374Fred Drake
564a1e627d61c57fefbfdabf308b33de75e08ca5374Fred Drake    """
565a1e627d61c57fefbfdabf308b33de75e08ca5374Fred Drake
566a1e627d61c57fefbfdabf308b33de75e08ca5374Fred Drake    expected_output = "[section]\noption = None\n\n"
567a1e627d61c57fefbfdabf308b33de75e08ca5374Fred Drake
568a1e627d61c57fefbfdabf308b33de75e08ca5374Fred Drake    def prepare(self, config_class):
569a1e627d61c57fefbfdabf308b33de75e08ca5374Fred Drake        # This is the default, but that's the point.
570a1e627d61c57fefbfdabf308b33de75e08ca5374Fred Drake        cp = config_class(allow_no_value=False)
571a1e627d61c57fefbfdabf308b33de75e08ca5374Fred Drake        cp.add_section("section")
572a1e627d61c57fefbfdabf308b33de75e08ca5374Fred Drake        cp.set("section", "option", None)
573a1e627d61c57fefbfdabf308b33de75e08ca5374Fred Drake        sio = StringIO.StringIO()
574a1e627d61c57fefbfdabf308b33de75e08ca5374Fred Drake        cp.write(sio)
575a1e627d61c57fefbfdabf308b33de75e08ca5374Fred Drake        return sio.getvalue()
576a1e627d61c57fefbfdabf308b33de75e08ca5374Fred Drake
577a1e627d61c57fefbfdabf308b33de75e08ca5374Fred Drake    def test_none_as_value_stringified(self):
578a1e627d61c57fefbfdabf308b33de75e08ca5374Fred Drake        output = self.prepare(ConfigParser.ConfigParser)
579a1e627d61c57fefbfdabf308b33de75e08ca5374Fred Drake        self.assertEqual(output, self.expected_output)
580a1e627d61c57fefbfdabf308b33de75e08ca5374Fred Drake
581a1e627d61c57fefbfdabf308b33de75e08ca5374Fred Drake    def test_none_as_value_stringified_raw(self):
582a1e627d61c57fefbfdabf308b33de75e08ca5374Fred Drake        output = self.prepare(ConfigParser.RawConfigParser)
583a1e627d61c57fefbfdabf308b33de75e08ca5374Fred Drake        self.assertEqual(output, self.expected_output)
584a1e627d61c57fefbfdabf308b33de75e08ca5374Fred Drake
585a1e627d61c57fefbfdabf308b33de75e08ca5374Fred Drake
586a00bcac00382be7f99ef30e24ec029268efa0cbfMartin v. Löwisclass SortedTestCase(RawConfigParserTestCase):
587a00bcac00382be7f99ef30e24ec029268efa0cbfMartin v. Löwis    def newconfig(self, defaults=None):
588a00bcac00382be7f99ef30e24ec029268efa0cbfMartin v. Löwis        self.cf = self.config_class(defaults=defaults, dict_type=SortedDict)
589a00bcac00382be7f99ef30e24ec029268efa0cbfMartin v. Löwis        return self.cf
590a00bcac00382be7f99ef30e24ec029268efa0cbfMartin v. Löwis
591a00bcac00382be7f99ef30e24ec029268efa0cbfMartin v. Löwis    def test_sorted(self):
592a00bcac00382be7f99ef30e24ec029268efa0cbfMartin v. Löwis        self.fromstring("[b]\n"
593a00bcac00382be7f99ef30e24ec029268efa0cbfMartin v. Löwis                        "o4=1\n"
594a00bcac00382be7f99ef30e24ec029268efa0cbfMartin v. Löwis                        "o3=2\n"
595a00bcac00382be7f99ef30e24ec029268efa0cbfMartin v. Löwis                        "o2=3\n"
596a00bcac00382be7f99ef30e24ec029268efa0cbfMartin v. Löwis                        "o1=4\n"
597a00bcac00382be7f99ef30e24ec029268efa0cbfMartin v. Löwis                        "[a]\n"
598f733abb7831d6566cb0fccd0550d58ec3b7f05a4Tim Peters                        "k=v\n")
599a00bcac00382be7f99ef30e24ec029268efa0cbfMartin v. Löwis        output = StringIO.StringIO()
600a00bcac00382be7f99ef30e24ec029268efa0cbfMartin v. Löwis        self.cf.write(output)
6012623a37852153363335956afab010cb0beb7e74eEzio Melotti        self.assertEqual(output.getvalue(),
6022623a37852153363335956afab010cb0beb7e74eEzio Melotti                         "[a]\n"
6032623a37852153363335956afab010cb0beb7e74eEzio Melotti                         "k = v\n\n"
6042623a37852153363335956afab010cb0beb7e74eEzio Melotti                         "[b]\n"
6052623a37852153363335956afab010cb0beb7e74eEzio Melotti                         "o1 = 4\n"
6062623a37852153363335956afab010cb0beb7e74eEzio Melotti                         "o2 = 3\n"
6072623a37852153363335956afab010cb0beb7e74eEzio Melotti                         "o3 = 2\n"
6082623a37852153363335956afab010cb0beb7e74eEzio Melotti                         "o4 = 1\n\n")
6090eebd5cef982686b9438b35d4c4ed395f437ff3eFred Drake
610cc43b56960b46734e0d0e19521376d5fdb6af587Fred Drake
611631c25800068ce8f1d97157fd4d173a82ba32e62Łukasz Langaclass ExceptionPicklingTestCase(unittest.TestCase):
612631c25800068ce8f1d97157fd4d173a82ba32e62Łukasz Langa    """Tests for issue #13760: ConfigParser exceptions are not picklable."""
613631c25800068ce8f1d97157fd4d173a82ba32e62Łukasz Langa
614631c25800068ce8f1d97157fd4d173a82ba32e62Łukasz Langa    def test_error(self):
615631c25800068ce8f1d97157fd4d173a82ba32e62Łukasz Langa        import pickle
616631c25800068ce8f1d97157fd4d173a82ba32e62Łukasz Langa        e1 = ConfigParser.Error('value')
617655720e2758a15c85effb340ff65f4b93e7cc7a7Serhiy Storchaka        for proto in range(pickle.HIGHEST_PROTOCOL + 1):
618655720e2758a15c85effb340ff65f4b93e7cc7a7Serhiy Storchaka            pickled = pickle.dumps(e1, proto)
619655720e2758a15c85effb340ff65f4b93e7cc7a7Serhiy Storchaka            e2 = pickle.loads(pickled)
620655720e2758a15c85effb340ff65f4b93e7cc7a7Serhiy Storchaka            self.assertEqual(e1.message, e2.message)
621655720e2758a15c85effb340ff65f4b93e7cc7a7Serhiy Storchaka            self.assertEqual(repr(e1), repr(e2))
622631c25800068ce8f1d97157fd4d173a82ba32e62Łukasz Langa
623631c25800068ce8f1d97157fd4d173a82ba32e62Łukasz Langa    def test_nosectionerror(self):
624631c25800068ce8f1d97157fd4d173a82ba32e62Łukasz Langa        import pickle
625631c25800068ce8f1d97157fd4d173a82ba32e62Łukasz Langa        e1 = ConfigParser.NoSectionError('section')
626655720e2758a15c85effb340ff65f4b93e7cc7a7Serhiy Storchaka        for proto in range(pickle.HIGHEST_PROTOCOL + 1):
627655720e2758a15c85effb340ff65f4b93e7cc7a7Serhiy Storchaka            pickled = pickle.dumps(e1, proto)
628655720e2758a15c85effb340ff65f4b93e7cc7a7Serhiy Storchaka            e2 = pickle.loads(pickled)
629655720e2758a15c85effb340ff65f4b93e7cc7a7Serhiy Storchaka            self.assertEqual(e1.message, e2.message)
630655720e2758a15c85effb340ff65f4b93e7cc7a7Serhiy Storchaka            self.assertEqual(e1.args, e2.args)
631655720e2758a15c85effb340ff65f4b93e7cc7a7Serhiy Storchaka            self.assertEqual(e1.section, e2.section)
632655720e2758a15c85effb340ff65f4b93e7cc7a7Serhiy Storchaka            self.assertEqual(repr(e1), repr(e2))
633631c25800068ce8f1d97157fd4d173a82ba32e62Łukasz Langa
634631c25800068ce8f1d97157fd4d173a82ba32e62Łukasz Langa    def test_nooptionerror(self):
635631c25800068ce8f1d97157fd4d173a82ba32e62Łukasz Langa        import pickle
636631c25800068ce8f1d97157fd4d173a82ba32e62Łukasz Langa        e1 = ConfigParser.NoOptionError('option', 'section')
637655720e2758a15c85effb340ff65f4b93e7cc7a7Serhiy Storchaka        for proto in range(pickle.HIGHEST_PROTOCOL + 1):
638655720e2758a15c85effb340ff65f4b93e7cc7a7Serhiy Storchaka            pickled = pickle.dumps(e1, proto)
639655720e2758a15c85effb340ff65f4b93e7cc7a7Serhiy Storchaka            e2 = pickle.loads(pickled)
640655720e2758a15c85effb340ff65f4b93e7cc7a7Serhiy Storchaka            self.assertEqual(e1.message, e2.message)
641655720e2758a15c85effb340ff65f4b93e7cc7a7Serhiy Storchaka            self.assertEqual(e1.args, e2.args)
642655720e2758a15c85effb340ff65f4b93e7cc7a7Serhiy Storchaka            self.assertEqual(e1.section, e2.section)
643655720e2758a15c85effb340ff65f4b93e7cc7a7Serhiy Storchaka            self.assertEqual(e1.option, e2.option)
644655720e2758a15c85effb340ff65f4b93e7cc7a7Serhiy Storchaka            self.assertEqual(repr(e1), repr(e2))
645631c25800068ce8f1d97157fd4d173a82ba32e62Łukasz Langa
646631c25800068ce8f1d97157fd4d173a82ba32e62Łukasz Langa    def test_duplicatesectionerror(self):
647631c25800068ce8f1d97157fd4d173a82ba32e62Łukasz Langa        import pickle
648631c25800068ce8f1d97157fd4d173a82ba32e62Łukasz Langa        e1 = ConfigParser.DuplicateSectionError('section')
649655720e2758a15c85effb340ff65f4b93e7cc7a7Serhiy Storchaka        for proto in range(pickle.HIGHEST_PROTOCOL + 1):
650655720e2758a15c85effb340ff65f4b93e7cc7a7Serhiy Storchaka            pickled = pickle.dumps(e1, proto)
651655720e2758a15c85effb340ff65f4b93e7cc7a7Serhiy Storchaka            e2 = pickle.loads(pickled)
652655720e2758a15c85effb340ff65f4b93e7cc7a7Serhiy Storchaka            self.assertEqual(e1.message, e2.message)
653655720e2758a15c85effb340ff65f4b93e7cc7a7Serhiy Storchaka            self.assertEqual(e1.args, e2.args)
654655720e2758a15c85effb340ff65f4b93e7cc7a7Serhiy Storchaka            self.assertEqual(e1.section, e2.section)
655655720e2758a15c85effb340ff65f4b93e7cc7a7Serhiy Storchaka            self.assertEqual(repr(e1), repr(e2))
656631c25800068ce8f1d97157fd4d173a82ba32e62Łukasz Langa
657631c25800068ce8f1d97157fd4d173a82ba32e62Łukasz Langa    def test_interpolationerror(self):
658631c25800068ce8f1d97157fd4d173a82ba32e62Łukasz Langa        import pickle
659631c25800068ce8f1d97157fd4d173a82ba32e62Łukasz Langa        e1 = ConfigParser.InterpolationError('option', 'section', 'msg')
660655720e2758a15c85effb340ff65f4b93e7cc7a7Serhiy Storchaka        for proto in range(pickle.HIGHEST_PROTOCOL + 1):
661655720e2758a15c85effb340ff65f4b93e7cc7a7Serhiy Storchaka            pickled = pickle.dumps(e1, proto)
662655720e2758a15c85effb340ff65f4b93e7cc7a7Serhiy Storchaka            e2 = pickle.loads(pickled)
663655720e2758a15c85effb340ff65f4b93e7cc7a7Serhiy Storchaka            self.assertEqual(e1.message, e2.message)
664655720e2758a15c85effb340ff65f4b93e7cc7a7Serhiy Storchaka            self.assertEqual(e1.args, e2.args)
665655720e2758a15c85effb340ff65f4b93e7cc7a7Serhiy Storchaka            self.assertEqual(e1.section, e2.section)
666655720e2758a15c85effb340ff65f4b93e7cc7a7Serhiy Storchaka            self.assertEqual(e1.option, e2.option)
667655720e2758a15c85effb340ff65f4b93e7cc7a7Serhiy Storchaka            self.assertEqual(repr(e1), repr(e2))
668631c25800068ce8f1d97157fd4d173a82ba32e62Łukasz Langa
669631c25800068ce8f1d97157fd4d173a82ba32e62Łukasz Langa    def test_interpolationmissingoptionerror(self):
670631c25800068ce8f1d97157fd4d173a82ba32e62Łukasz Langa        import pickle
671631c25800068ce8f1d97157fd4d173a82ba32e62Łukasz Langa        e1 = ConfigParser.InterpolationMissingOptionError('option', 'section',
672631c25800068ce8f1d97157fd4d173a82ba32e62Łukasz Langa            'rawval', 'reference')
673655720e2758a15c85effb340ff65f4b93e7cc7a7Serhiy Storchaka        for proto in range(pickle.HIGHEST_PROTOCOL + 1):
674655720e2758a15c85effb340ff65f4b93e7cc7a7Serhiy Storchaka            pickled = pickle.dumps(e1, proto)
675655720e2758a15c85effb340ff65f4b93e7cc7a7Serhiy Storchaka            e2 = pickle.loads(pickled)
676655720e2758a15c85effb340ff65f4b93e7cc7a7Serhiy Storchaka            self.assertEqual(e1.message, e2.message)
677655720e2758a15c85effb340ff65f4b93e7cc7a7Serhiy Storchaka            self.assertEqual(e1.args, e2.args)
678655720e2758a15c85effb340ff65f4b93e7cc7a7Serhiy Storchaka            self.assertEqual(e1.section, e2.section)
679655720e2758a15c85effb340ff65f4b93e7cc7a7Serhiy Storchaka            self.assertEqual(e1.option, e2.option)
680655720e2758a15c85effb340ff65f4b93e7cc7a7Serhiy Storchaka            self.assertEqual(e1.reference, e2.reference)
681655720e2758a15c85effb340ff65f4b93e7cc7a7Serhiy Storchaka            self.assertEqual(repr(e1), repr(e2))
682631c25800068ce8f1d97157fd4d173a82ba32e62Łukasz Langa
683631c25800068ce8f1d97157fd4d173a82ba32e62Łukasz Langa    def test_interpolationsyntaxerror(self):
684631c25800068ce8f1d97157fd4d173a82ba32e62Łukasz Langa        import pickle
685631c25800068ce8f1d97157fd4d173a82ba32e62Łukasz Langa        e1 = ConfigParser.InterpolationSyntaxError('option', 'section', 'msg')
686655720e2758a15c85effb340ff65f4b93e7cc7a7Serhiy Storchaka        for proto in range(pickle.HIGHEST_PROTOCOL + 1):
687655720e2758a15c85effb340ff65f4b93e7cc7a7Serhiy Storchaka            pickled = pickle.dumps(e1, proto)
688655720e2758a15c85effb340ff65f4b93e7cc7a7Serhiy Storchaka            e2 = pickle.loads(pickled)
689655720e2758a15c85effb340ff65f4b93e7cc7a7Serhiy Storchaka            self.assertEqual(e1.message, e2.message)
690655720e2758a15c85effb340ff65f4b93e7cc7a7Serhiy Storchaka            self.assertEqual(e1.args, e2.args)
691655720e2758a15c85effb340ff65f4b93e7cc7a7Serhiy Storchaka            self.assertEqual(e1.section, e2.section)
692655720e2758a15c85effb340ff65f4b93e7cc7a7Serhiy Storchaka            self.assertEqual(e1.option, e2.option)
693655720e2758a15c85effb340ff65f4b93e7cc7a7Serhiy Storchaka            self.assertEqual(repr(e1), repr(e2))
694631c25800068ce8f1d97157fd4d173a82ba32e62Łukasz Langa
695631c25800068ce8f1d97157fd4d173a82ba32e62Łukasz Langa    def test_interpolationdeptherror(self):
696631c25800068ce8f1d97157fd4d173a82ba32e62Łukasz Langa        import pickle
697631c25800068ce8f1d97157fd4d173a82ba32e62Łukasz Langa        e1 = ConfigParser.InterpolationDepthError('option', 'section',
698631c25800068ce8f1d97157fd4d173a82ba32e62Łukasz Langa            'rawval')
699655720e2758a15c85effb340ff65f4b93e7cc7a7Serhiy Storchaka        for proto in range(pickle.HIGHEST_PROTOCOL + 1):
700655720e2758a15c85effb340ff65f4b93e7cc7a7Serhiy Storchaka            pickled = pickle.dumps(e1, proto)
701655720e2758a15c85effb340ff65f4b93e7cc7a7Serhiy Storchaka            e2 = pickle.loads(pickled)
702655720e2758a15c85effb340ff65f4b93e7cc7a7Serhiy Storchaka            self.assertEqual(e1.message, e2.message)
703655720e2758a15c85effb340ff65f4b93e7cc7a7Serhiy Storchaka            self.assertEqual(e1.args, e2.args)
704655720e2758a15c85effb340ff65f4b93e7cc7a7Serhiy Storchaka            self.assertEqual(e1.section, e2.section)
705655720e2758a15c85effb340ff65f4b93e7cc7a7Serhiy Storchaka            self.assertEqual(e1.option, e2.option)
706655720e2758a15c85effb340ff65f4b93e7cc7a7Serhiy Storchaka            self.assertEqual(repr(e1), repr(e2))
707631c25800068ce8f1d97157fd4d173a82ba32e62Łukasz Langa
708631c25800068ce8f1d97157fd4d173a82ba32e62Łukasz Langa    def test_parsingerror(self):
709631c25800068ce8f1d97157fd4d173a82ba32e62Łukasz Langa        import pickle
710631c25800068ce8f1d97157fd4d173a82ba32e62Łukasz Langa        e1 = ConfigParser.ParsingError('source')
711631c25800068ce8f1d97157fd4d173a82ba32e62Łukasz Langa        e1.append(1, 'line1')
712631c25800068ce8f1d97157fd4d173a82ba32e62Łukasz Langa        e1.append(2, 'line2')
713631c25800068ce8f1d97157fd4d173a82ba32e62Łukasz Langa        e1.append(3, 'line3')
714655720e2758a15c85effb340ff65f4b93e7cc7a7Serhiy Storchaka        for proto in range(pickle.HIGHEST_PROTOCOL + 1):
715655720e2758a15c85effb340ff65f4b93e7cc7a7Serhiy Storchaka            pickled = pickle.dumps(e1, proto)
716655720e2758a15c85effb340ff65f4b93e7cc7a7Serhiy Storchaka            e2 = pickle.loads(pickled)
717655720e2758a15c85effb340ff65f4b93e7cc7a7Serhiy Storchaka            self.assertEqual(e1.message, e2.message)
718655720e2758a15c85effb340ff65f4b93e7cc7a7Serhiy Storchaka            self.assertEqual(e1.args, e2.args)
719655720e2758a15c85effb340ff65f4b93e7cc7a7Serhiy Storchaka            self.assertEqual(e1.filename, e2.filename)
720655720e2758a15c85effb340ff65f4b93e7cc7a7Serhiy Storchaka            self.assertEqual(e1.errors, e2.errors)
721655720e2758a15c85effb340ff65f4b93e7cc7a7Serhiy Storchaka            self.assertEqual(repr(e1), repr(e2))
722631c25800068ce8f1d97157fd4d173a82ba32e62Łukasz Langa
723631c25800068ce8f1d97157fd4d173a82ba32e62Łukasz Langa    def test_missingsectionheadererror(self):
724631c25800068ce8f1d97157fd4d173a82ba32e62Łukasz Langa        import pickle
725631c25800068ce8f1d97157fd4d173a82ba32e62Łukasz Langa        e1 = ConfigParser.MissingSectionHeaderError('filename', 123, 'line')
726655720e2758a15c85effb340ff65f4b93e7cc7a7Serhiy Storchaka        for proto in range(pickle.HIGHEST_PROTOCOL + 1):
727655720e2758a15c85effb340ff65f4b93e7cc7a7Serhiy Storchaka            pickled = pickle.dumps(e1, proto)
728655720e2758a15c85effb340ff65f4b93e7cc7a7Serhiy Storchaka            e2 = pickle.loads(pickled)
729655720e2758a15c85effb340ff65f4b93e7cc7a7Serhiy Storchaka            self.assertEqual(e1.message, e2.message)
730655720e2758a15c85effb340ff65f4b93e7cc7a7Serhiy Storchaka            self.assertEqual(e1.args, e2.args)
731655720e2758a15c85effb340ff65f4b93e7cc7a7Serhiy Storchaka            self.assertEqual(e1.line, e2.line)
732655720e2758a15c85effb340ff65f4b93e7cc7a7Serhiy Storchaka            self.assertEqual(e1.filename, e2.filename)
733655720e2758a15c85effb340ff65f4b93e7cc7a7Serhiy Storchaka            self.assertEqual(e1.lineno, e2.lineno)
734655720e2758a15c85effb340ff65f4b93e7cc7a7Serhiy Storchaka            self.assertEqual(repr(e1), repr(e2))
735631c25800068ce8f1d97157fd4d173a82ba32e62Łukasz Langa
736631c25800068ce8f1d97157fd4d173a82ba32e62Łukasz Langa
737c6f2891af8e8900a92384ad140402bef894a5ca1Fred Drakedef test_main():
73821d3a32b99c5763444c34c189ef653ac9745f3c4Walter Dörwald    test_support.run_unittest(
73921d3a32b99c5763444c34c189ef653ac9745f3c4Walter Dörwald        ConfigParserTestCase,
740e4334b4949be3cbb1e8602291deb650bb04642abBrian Curtin        MultilineValuesTestCase,
74121d3a32b99c5763444c34c189ef653ac9745f3c4Walter Dörwald        RawConfigParserTestCase,
742a00bcac00382be7f99ef30e24ec029268efa0cbfMartin v. Löwis        SafeConfigParserTestCase,
743cc43b56960b46734e0d0e19521376d5fdb6af587Fred Drake        SafeConfigParserTestCaseNoValue,
744e4334b4949be3cbb1e8602291deb650bb04642abBrian Curtin        SortedTestCase,
745a1e627d61c57fefbfdabf308b33de75e08ca5374Fred Drake        Issue7005TestCase,
7463ea5224c43663ee4a18e8a08ca927fe8a4790f24Raymond Hettinger        TestChainMap,
747631c25800068ce8f1d97157fd4d173a82ba32e62Łukasz Langa        ExceptionPicklingTestCase,
748cc43b56960b46734e0d0e19521376d5fdb6af587Fred Drake        )
749cc43b56960b46734e0d0e19521376d5fdb6af587Fred Drake
750c6f2891af8e8900a92384ad140402bef894a5ca1Fred Drake
751c6f2891af8e8900a92384ad140402bef894a5ca1Fred Drakeif __name__ == "__main__":
752c6f2891af8e8900a92384ad140402bef894a5ca1Fred Drake    test_main()
753