Regression test for ConfigParser module.
diff --git a/Lib/test/test_cfgparser.py b/Lib/test/test_cfgparser.py
new file mode 100644
index 0000000..cf6bb89
--- /dev/null
+++ b/Lib/test/test_cfgparser.py
@@ -0,0 +1,144 @@
+import ConfigParser
+import StringIO
+
+def basic(src):
+    print
+    print "Testing basic accessors..."
+    cf = ConfigParser.ConfigParser()
+    sio = StringIO.StringIO(src)
+    cf.readfp(sio)
+    L = cf.sections()
+    L.sort()
+    print L
+    for s in L:
+        print "%s: %s" % (s, cf.options(s))
+
+    # The use of spaces in the section names serves as a regression test for
+    # SourceForge bug #115357.
+    #
+    # http://sourceforge.net/bugs/?func=detailbug&group_id=5470&bug_id=115357
+    #
+    print "test for SourceForge bug #115357"
+    print `cf.get('Foo Bar', 'foo', raw=1)`
+    print `cf.get('Spacey Bar', 'foo', raw=1)`
+    print `cf.get('Commented Bar', 'foo', raw=1)`
+
+    if '__name__' in cf.options("Foo Bar"):
+        print '__name__ "option" should not be exposed by the API!'
+    else:
+        print '__name__ "option" properly hidden by the API.'
+
+def interpolation(src):
+    print
+    print "Testing value interpolation..."
+    cf = ConfigParser.ConfigParser({"getname": "%(__name__)s"})
+    sio = StringIO.StringIO(src)
+    cf.readfp(sio)
+    print `cf.get("Foo", "getname")`
+    print `cf.get("Foo", "bar")`
+    print `cf.get("Foo", "bar9")`
+    print `cf.get("Foo", "bar10")`
+    expect_get_error(cf, ConfigParser.InterpolationDepthError, "Foo", "bar11")
+
+def parse_errors():
+    print
+    print "Testing for parsing errors..."
+    expect_parse_error(ConfigParser.ParsingError,
+                       """[Foo]\n  extra-spaces: splat\n""")
+    expect_parse_error(ConfigParser.ParsingError,
+                       """[Foo]\n  extra-spaces= splat\n""")
+    expect_parse_error(ConfigParser.ParsingError,
+                       """[Foo]\noption-without-value\n""")
+    expect_parse_error(ConfigParser.ParsingError,
+                       """[Foo]\n:value-without-option-name\n""")
+    expect_parse_error(ConfigParser.ParsingError,
+                       """[Foo]\n=value-without-option-name\n""")
+    expect_parse_error(ConfigParser.MissingSectionHeaderError,
+                       """No Section!\n""")
+
+def query_errors():
+    print
+    print "Testing query interface..."
+    cf = ConfigParser.ConfigParser()
+    print cf.sections()
+    print "Has section 'Foo'?", cf.has_section("Foo")
+    try:
+        cf.options("Foo")
+    except ConfigParser.NoSectionError, e:
+        print "Caught expected NoSectionError:", e
+    else:
+        print "Failed to catch expected NoSectionError from options()"
+    try:
+        cf.set("foo", "bar", "value")
+    except ConfigParser.NoSectionError, e:
+        print "Caught expected NoSectionError:", e
+    else:
+        print "Failed to catch expected NoSectionError from set()"
+    expect_get_error(cf, ConfigParser.NoSectionError, "foo", "bar")
+    cf.add_section("foo")
+    expect_get_error(cf, ConfigParser.NoOptionError, "foo", "bar")
+
+def weird_errors():
+    print
+    print "Testing miscellaneous error conditions..."
+    cf = ConfigParser.ConfigParser()
+    cf.add_section("Foo")
+    try:
+        cf.add_section("Foo")
+    except ConfigParser.DuplicateSectionError, e:
+        print "Caught expected DuplicateSectionError:", e
+    else:
+        print "Failed to catch expected DuplicateSectionError"
+
+def expect_get_error(cf, exctype, section, option, raw=0):
+    try:
+        cf.get(section, option, raw=raw)
+    except exctype, e:
+        print "Caught expected", exctype.__name__, ":"
+        print e
+    else:
+        print "Failed to catch expected", exctype.__name__
+
+def expect_parse_error(exctype, src):
+    cf = ConfigParser.ConfigParser()
+    sio = StringIO.StringIO(src)
+    try:
+        cf.readfp(sio)
+    except exctype, e:
+        print "Caught expected exception:", e
+    else:
+        print "Failed to catch expected", exctype.__name__
+
+basic(r"""
+[Foo Bar]
+foo=bar
+[Spacey Bar]
+foo = bar 
+[Commented Bar]
+foo: bar ; comment
+""")
+interpolation(r"""
+[Foo]
+bar=something %(with1)s interpolation (1 step)
+bar9=something %(with9)s lots of interpolation (9 steps)
+bar10=something %(with10)s lots of interpolation (10 steps)
+bar11=something %(with11)s lots of interpolation (11 steps)
+with11=%(with10)s
+with10=%(with9)s
+with9=%(with8)s
+with8=%(with7)s
+with7=%(with6)s
+with6=%(with5)s
+with5=%(with4)s
+with4=%(with3)s
+with3=%(with2)s
+with2=%(with1)s
+with1=with
+
+[Mutual Recursion]
+foo=%(bar)s
+bar=%(foo)s
+""")
+parse_errors()
+query_errors()
+weird_errors()