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