blob: e9d4ee5edc0794493c5dfb86e17b195b04671974 [file] [log] [blame]
Fred Drake8ef67672000-09-27 22:45:25 +00001import ConfigParser
2import StringIO
3
Fred Drake95b96d32001-02-12 17:23:20 +00004from test_support import TestFailed, verify
Fred Drake3d5f7e82000-12-04 16:30:40 +00005
6
Fred Drake8ef67672000-09-27 22:45:25 +00007def basic(src):
Fred Drake8ef67672000-09-27 22:45:25 +00008 print "Testing basic accessors..."
9 cf = ConfigParser.ConfigParser()
10 sio = StringIO.StringIO(src)
11 cf.readfp(sio)
12 L = cf.sections()
13 L.sort()
Fred Drakecc1f9512001-02-14 15:30:31 +000014 verify(L == [r'Commented Bar',
15 r'Foo Bar',
16 r'Internationalized Stuff',
17 r'Section\with$weird%characters[' '\t',
18 r'Spacey Bar',
19 ],
Fred Drake95b96d32001-02-12 17:23:20 +000020 "unexpected list of section names")
Fred Drake8ef67672000-09-27 22:45:25 +000021
22 # The use of spaces in the section names serves as a regression test for
23 # SourceForge bug #115357.
Fred Drake8ef67672000-09-27 22:45:25 +000024 # http://sourceforge.net/bugs/?func=detailbug&group_id=5470&bug_id=115357
Fred Drake95b96d32001-02-12 17:23:20 +000025 verify(cf.get('Foo Bar', 'foo', raw=1) == 'bar')
26 verify(cf.get('Spacey Bar', 'foo', raw=1) == 'bar')
27 verify(cf.get('Commented Bar', 'foo', raw=1) == 'bar')
Fred Drake8ef67672000-09-27 22:45:25 +000028
Fred Drake95b96d32001-02-12 17:23:20 +000029 verify('__name__' not in cf.options("Foo Bar"),
30 '__name__ "option" should not be exposed by the API!')
Fred Drake8ef67672000-09-27 22:45:25 +000031
Fred Drake3d5f7e82000-12-04 16:30:40 +000032 # Make sure the right things happen for remove_option();
33 # added to include check for SourceForge bug #123324:
Fred Drake95b96d32001-02-12 17:23:20 +000034 verify(cf.remove_option('Foo Bar', 'foo'),
35 "remove_option() failed to report existance of option")
36 verify(not cf.has_option('Foo Bar', 'foo'),
37 "remove_option() failed to remove option")
38 verify(not cf.remove_option('Foo Bar', 'foo'),
39 "remove_option() failed to report non-existance of option"
40 " that was removed")
Fred Drake3d5f7e82000-12-04 16:30:40 +000041 try:
42 cf.remove_option('No Such Section', 'foo')
43 except ConfigParser.NoSectionError:
44 pass
45 else:
46 raise TestFailed(
47 "remove_option() failed to report non-existance of option"
48 " that never existed")
49
50
Fred Drake8ef67672000-09-27 22:45:25 +000051def interpolation(src):
Fred Drake8ef67672000-09-27 22:45:25 +000052 print "Testing value interpolation..."
53 cf = ConfigParser.ConfigParser({"getname": "%(__name__)s"})
54 sio = StringIO.StringIO(src)
55 cf.readfp(sio)
Fred Drake95b96d32001-02-12 17:23:20 +000056 verify(cf.get("Foo", "getname") == "Foo")
57 verify(cf.get("Foo", "bar") == "something with interpolation (1 step)")
58 verify(cf.get("Foo", "bar9")
59 == "something with lots of interpolation (9 steps)")
60 verify(cf.get("Foo", "bar10")
61 == "something with lots of interpolation (10 steps)")
Fred Drake8ef67672000-09-27 22:45:25 +000062 expect_get_error(cf, ConfigParser.InterpolationDepthError, "Foo", "bar11")
63
Fred Drake95b96d32001-02-12 17:23:20 +000064
Fred Drake8ef67672000-09-27 22:45:25 +000065def parse_errors():
Fred Drake95b96d32001-02-12 17:23:20 +000066 print "Testing parse errors..."
Fred Drake8ef67672000-09-27 22:45:25 +000067 expect_parse_error(ConfigParser.ParsingError,
68 """[Foo]\n extra-spaces: splat\n""")
69 expect_parse_error(ConfigParser.ParsingError,
70 """[Foo]\n extra-spaces= splat\n""")
71 expect_parse_error(ConfigParser.ParsingError,
72 """[Foo]\noption-without-value\n""")
73 expect_parse_error(ConfigParser.ParsingError,
74 """[Foo]\n:value-without-option-name\n""")
75 expect_parse_error(ConfigParser.ParsingError,
76 """[Foo]\n=value-without-option-name\n""")
77 expect_parse_error(ConfigParser.MissingSectionHeaderError,
78 """No Section!\n""")
79
Fred Drake95b96d32001-02-12 17:23:20 +000080
Fred Drake8ef67672000-09-27 22:45:25 +000081def query_errors():
Fred Drake8ef67672000-09-27 22:45:25 +000082 print "Testing query interface..."
83 cf = ConfigParser.ConfigParser()
Fred Drake95b96d32001-02-12 17:23:20 +000084 verify(cf.sections() == [],
85 "new ConfigParser should have no defined sections")
86 verify(not cf.has_section("Foo"),
87 "new ConfigParser should have no acknowledged sections")
Fred Drake8ef67672000-09-27 22:45:25 +000088 try:
89 cf.options("Foo")
90 except ConfigParser.NoSectionError, e:
Fred Drake95b96d32001-02-12 17:23:20 +000091 pass
Fred Drake8ef67672000-09-27 22:45:25 +000092 else:
Fred Drake95b96d32001-02-12 17:23:20 +000093 raise TestFailed(
94 "Failed to catch expected NoSectionError from options()")
Fred Drake8ef67672000-09-27 22:45:25 +000095 try:
96 cf.set("foo", "bar", "value")
97 except ConfigParser.NoSectionError, e:
Fred Drake95b96d32001-02-12 17:23:20 +000098 pass
Fred Drake8ef67672000-09-27 22:45:25 +000099 else:
Fred Drake95b96d32001-02-12 17:23:20 +0000100 raise TestFailed("Failed to catch expected NoSectionError from set()")
Fred Drake8ef67672000-09-27 22:45:25 +0000101 expect_get_error(cf, ConfigParser.NoSectionError, "foo", "bar")
102 cf.add_section("foo")
103 expect_get_error(cf, ConfigParser.NoOptionError, "foo", "bar")
104
Fred Drake95b96d32001-02-12 17:23:20 +0000105
Fred Drake8ef67672000-09-27 22:45:25 +0000106def weird_errors():
Fred Drake8ef67672000-09-27 22:45:25 +0000107 print "Testing miscellaneous error conditions..."
108 cf = ConfigParser.ConfigParser()
109 cf.add_section("Foo")
110 try:
111 cf.add_section("Foo")
112 except ConfigParser.DuplicateSectionError, e:
Fred Drake95b96d32001-02-12 17:23:20 +0000113 pass
Fred Drake8ef67672000-09-27 22:45:25 +0000114 else:
Fred Drake95b96d32001-02-12 17:23:20 +0000115 raise TestFailed("Failed to catch expected DuplicateSectionError")
116
Fred Drake8ef67672000-09-27 22:45:25 +0000117
118def expect_get_error(cf, exctype, section, option, raw=0):
119 try:
120 cf.get(section, option, raw=raw)
121 except exctype, e:
Fred Drake95b96d32001-02-12 17:23:20 +0000122 pass
Fred Drake8ef67672000-09-27 22:45:25 +0000123 else:
Fred Drake95b96d32001-02-12 17:23:20 +0000124 raise TestFailed("Failed to catch expected " + exctype.__name__)
125
Fred Drake8ef67672000-09-27 22:45:25 +0000126
127def expect_parse_error(exctype, src):
128 cf = ConfigParser.ConfigParser()
129 sio = StringIO.StringIO(src)
130 try:
131 cf.readfp(sio)
132 except exctype, e:
Fred Drake95b96d32001-02-12 17:23:20 +0000133 pass
Fred Drake8ef67672000-09-27 22:45:25 +0000134 else:
Fred Drake95b96d32001-02-12 17:23:20 +0000135 raise TestFailed("Failed to catch expected " + exctype.__name__)
136
Fred Drake8ef67672000-09-27 22:45:25 +0000137
138basic(r"""
139[Foo Bar]
140foo=bar
141[Spacey Bar]
Fred Drake004d5e62000-10-23 17:22:08 +0000142foo = bar
Fred Drake8ef67672000-09-27 22:45:25 +0000143[Commented Bar]
144foo: bar ; comment
Fred Drakecc1f9512001-02-14 15:30:31 +0000145[Section\with$weird%characters[""" '\t' r"""]
Fred Drake95b96d32001-02-12 17:23:20 +0000146[Internationalized Stuff]
147foo[bg]: Bulgarian
148foo=Default
149foo[en]=English
150foo[de]=Deutsch
Fred Drake8ef67672000-09-27 22:45:25 +0000151""")
152interpolation(r"""
153[Foo]
154bar=something %(with1)s interpolation (1 step)
155bar9=something %(with9)s lots of interpolation (9 steps)
156bar10=something %(with10)s lots of interpolation (10 steps)
157bar11=something %(with11)s lots of interpolation (11 steps)
158with11=%(with10)s
159with10=%(with9)s
160with9=%(with8)s
161with8=%(with7)s
162with7=%(with6)s
163with6=%(with5)s
164with5=%(with4)s
165with4=%(with3)s
166with3=%(with2)s
167with2=%(with1)s
168with1=with
169
170[Mutual Recursion]
171foo=%(bar)s
172bar=%(foo)s
173""")
174parse_errors()
175query_errors()
176weird_errors()