blob: c3d966c3f128d5220fe807e2fca0da0068eae0d1 [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 Drake3c823aa2001-02-26 21:55:34 +000051def case_sensitivity():
52 print "Testing case sensitivity..."
53 cf = ConfigParser.ConfigParser()
54 cf.add_section("A")
55 cf.add_section("a")
56 L = cf.sections()
57 L.sort()
58 verify(L == ["A", "a"])
59 cf.set("a", "B", "value")
60 verify(cf.options("a") == ["b"])
61 verify(cf.get("a", "b", raw=1) == "value",
62 "could not locate option, expecting case-insensitive option names")
63 verify(cf.has_option("a", "b"))
64 cf.set("A", "A-B", "A-B value")
65 for opt in ("a-b", "A-b", "a-B", "A-B"):
66 verify(cf.has_option("A", opt),
67 "has_option() returned false for option which should exist")
68 verify(cf.options("A") == ["a-b"])
69 verify(cf.options("a") == ["b"])
70 cf.remove_option("a", "B")
71 verify(cf.options("a") == [])
72
Fred Drakebeb67132001-07-06 17:22:48 +000073 # SF bug #432369:
74 cf = ConfigParser.ConfigParser()
75 sio = StringIO.StringIO("[MySection]\nOption: first line\n\tsecond line\n")
76 cf.readfp(sio)
77 verify(cf.options("MySection") == ["option"])
78 verify(cf.get("MySection", "Option") == "first line\nsecond line")
79
Fred Drake3c823aa2001-02-26 21:55:34 +000080
Fred Drake168bead2001-10-08 17:13:12 +000081def boolean(src):
82 print "Testing interpretation of boolean Values..."
83 cf = ConfigParser.ConfigParser()
84 sio = StringIO.StringIO(src)
85 cf.readfp(sio)
86 for x in range(1, 5):
87 verify(cf.getboolean('BOOLTEST', 't%d' % (x)) == 1)
88 for x in range(1, 5):
89 verify(cf.getboolean('BOOLTEST', 'f%d' % (x)) == 0)
90 for x in range(1, 5):
91 try:
92 cf.getboolean('BOOLTEST', 'e%d' % (x))
93 except ValueError:
94 pass
95 else:
96 raise TestFailed(
97 "getboolean() failed to report a non boolean value")
98
99
Fred Drake8ef67672000-09-27 22:45:25 +0000100def interpolation(src):
Fred Drake8ef67672000-09-27 22:45:25 +0000101 print "Testing value interpolation..."
102 cf = ConfigParser.ConfigParser({"getname": "%(__name__)s"})
103 sio = StringIO.StringIO(src)
104 cf.readfp(sio)
Fred Drake95b96d32001-02-12 17:23:20 +0000105 verify(cf.get("Foo", "getname") == "Foo")
106 verify(cf.get("Foo", "bar") == "something with interpolation (1 step)")
107 verify(cf.get("Foo", "bar9")
108 == "something with lots of interpolation (9 steps)")
109 verify(cf.get("Foo", "bar10")
110 == "something with lots of interpolation (10 steps)")
Fred Drake8ef67672000-09-27 22:45:25 +0000111 expect_get_error(cf, ConfigParser.InterpolationDepthError, "Foo", "bar11")
112
Fred Drake95b96d32001-02-12 17:23:20 +0000113
Fred Drake8ef67672000-09-27 22:45:25 +0000114def parse_errors():
Fred Drake95b96d32001-02-12 17:23:20 +0000115 print "Testing parse errors..."
Fred Drake8ef67672000-09-27 22:45:25 +0000116 expect_parse_error(ConfigParser.ParsingError,
117 """[Foo]\n extra-spaces: splat\n""")
118 expect_parse_error(ConfigParser.ParsingError,
119 """[Foo]\n extra-spaces= splat\n""")
120 expect_parse_error(ConfigParser.ParsingError,
121 """[Foo]\noption-without-value\n""")
122 expect_parse_error(ConfigParser.ParsingError,
123 """[Foo]\n:value-without-option-name\n""")
124 expect_parse_error(ConfigParser.ParsingError,
125 """[Foo]\n=value-without-option-name\n""")
126 expect_parse_error(ConfigParser.MissingSectionHeaderError,
127 """No Section!\n""")
128
Fred Drake95b96d32001-02-12 17:23:20 +0000129
Fred Drake8ef67672000-09-27 22:45:25 +0000130def query_errors():
Fred Drake8ef67672000-09-27 22:45:25 +0000131 print "Testing query interface..."
132 cf = ConfigParser.ConfigParser()
Fred Drake95b96d32001-02-12 17:23:20 +0000133 verify(cf.sections() == [],
134 "new ConfigParser should have no defined sections")
135 verify(not cf.has_section("Foo"),
136 "new ConfigParser should have no acknowledged sections")
Fred Drake8ef67672000-09-27 22:45:25 +0000137 try:
138 cf.options("Foo")
139 except ConfigParser.NoSectionError, e:
Fred Drake95b96d32001-02-12 17:23:20 +0000140 pass
Fred Drake8ef67672000-09-27 22:45:25 +0000141 else:
Fred Drake95b96d32001-02-12 17:23:20 +0000142 raise TestFailed(
143 "Failed to catch expected NoSectionError from options()")
Fred Drake8ef67672000-09-27 22:45:25 +0000144 try:
145 cf.set("foo", "bar", "value")
146 except ConfigParser.NoSectionError, e:
Fred Drake95b96d32001-02-12 17:23:20 +0000147 pass
Fred Drake8ef67672000-09-27 22:45:25 +0000148 else:
Fred Drake95b96d32001-02-12 17:23:20 +0000149 raise TestFailed("Failed to catch expected NoSectionError from set()")
Fred Drake8ef67672000-09-27 22:45:25 +0000150 expect_get_error(cf, ConfigParser.NoSectionError, "foo", "bar")
151 cf.add_section("foo")
152 expect_get_error(cf, ConfigParser.NoOptionError, "foo", "bar")
153
Fred Drake95b96d32001-02-12 17:23:20 +0000154
Fred Drake8ef67672000-09-27 22:45:25 +0000155def weird_errors():
Fred Drake8ef67672000-09-27 22:45:25 +0000156 print "Testing miscellaneous error conditions..."
157 cf = ConfigParser.ConfigParser()
158 cf.add_section("Foo")
159 try:
160 cf.add_section("Foo")
161 except ConfigParser.DuplicateSectionError, e:
Fred Drake95b96d32001-02-12 17:23:20 +0000162 pass
Fred Drake8ef67672000-09-27 22:45:25 +0000163 else:
Fred Drake95b96d32001-02-12 17:23:20 +0000164 raise TestFailed("Failed to catch expected DuplicateSectionError")
165
Fred Drake8ef67672000-09-27 22:45:25 +0000166
167def expect_get_error(cf, exctype, section, option, raw=0):
168 try:
169 cf.get(section, option, raw=raw)
170 except exctype, e:
Fred Drake95b96d32001-02-12 17:23:20 +0000171 pass
Fred Drake8ef67672000-09-27 22:45:25 +0000172 else:
Fred Drake95b96d32001-02-12 17:23:20 +0000173 raise TestFailed("Failed to catch expected " + exctype.__name__)
174
Fred Drake8ef67672000-09-27 22:45:25 +0000175
176def expect_parse_error(exctype, src):
177 cf = ConfigParser.ConfigParser()
178 sio = StringIO.StringIO(src)
179 try:
180 cf.readfp(sio)
181 except exctype, e:
Fred Drake95b96d32001-02-12 17:23:20 +0000182 pass
Fred Drake8ef67672000-09-27 22:45:25 +0000183 else:
Fred Drake95b96d32001-02-12 17:23:20 +0000184 raise TestFailed("Failed to catch expected " + exctype.__name__)
185
Fred Drake8ef67672000-09-27 22:45:25 +0000186
187basic(r"""
188[Foo Bar]
189foo=bar
190[Spacey Bar]
Fred Drake004d5e62000-10-23 17:22:08 +0000191foo = bar
Fred Drake8ef67672000-09-27 22:45:25 +0000192[Commented Bar]
193foo: bar ; comment
Fred Drakecc1f9512001-02-14 15:30:31 +0000194[Section\with$weird%characters[""" '\t' r"""]
Fred Drake95b96d32001-02-12 17:23:20 +0000195[Internationalized Stuff]
196foo[bg]: Bulgarian
197foo=Default
198foo[en]=English
199foo[de]=Deutsch
Fred Drake8ef67672000-09-27 22:45:25 +0000200""")
Fred Drake3c823aa2001-02-26 21:55:34 +0000201case_sensitivity()
Fred Drake168bead2001-10-08 17:13:12 +0000202boolean(r"""
203[BOOLTEST]
204T1=1
205T2=TRUE
206T3=True
207T4=oN
208T5=yes
209F1=0
210F2=FALSE
211F3=False
212F4=oFF
213F5=nO
214E1=2
215E2=foo
216E3=-1
217E4=0.1
218E5=FALSE AND MORE
219""")
Fred Drake8ef67672000-09-27 22:45:25 +0000220interpolation(r"""
221[Foo]
222bar=something %(with1)s interpolation (1 step)
223bar9=something %(with9)s lots of interpolation (9 steps)
224bar10=something %(with10)s lots of interpolation (10 steps)
225bar11=something %(with11)s lots of interpolation (11 steps)
226with11=%(with10)s
227with10=%(with9)s
228with9=%(with8)s
229with8=%(with7)s
230with7=%(with6)s
231with6=%(with5)s
232with5=%(with4)s
233with4=%(with3)s
234with3=%(with2)s
235with2=%(with1)s
236with1=with
237
238[Mutual Recursion]
239foo=%(bar)s
240bar=%(foo)s
241""")
242parse_errors()
243query_errors()
244weird_errors()