The error reporting here was a bit sparse. In verbose mode, the code

in run_test() referenced two non-existent variables, and in
non-verbose mode, the tests didn't report the actual number, when it
differed from the expected number.  Fixed this.

Also added an extra call to gc.collect() at the start of test_all().
This will be needed when I check in the changes to add GC to new-style
classes.
This commit is contained in:
Guido van Rossum 2001-10-02 19:49:47 +00:00
parent b855134a0d
commit c907bd89de
1 changed files with 24 additions and 30 deletions

View File

@ -2,35 +2,35 @@ from test_support import verify, verbose, TestFailed
import sys
import gc
def expect(actual, expected, name):
if actual != expected:
raise TestFailed, "test_%s: actual %d, expected %d" % (
name, actual, expected)
def expect_not(actual, expected, name):
if actual == expected:
raise TestFailed, "test_%s: actual %d unexpected" % (name, actual)
def run_test(name, thunk):
if verbose:
print "testing %s..." % name,
try:
thunk()
except TestFailed:
if verbose:
print "failed (expected %s but got %s)" % (result,
test_result)
raise TestFailed, name
else:
if verbose:
print "ok"
thunk()
if verbose:
print "ok"
def test_list():
l = []
l.append(l)
gc.collect()
del l
if gc.collect() != 1:
raise TestFailed
expect(gc.collect(), 1, "list")
def test_dict():
d = {}
d[1] = d
gc.collect()
del d
if gc.collect() != 1:
raise TestFailed
expect(gc.collect(), 1, "dict")
def test_tuple():
# since tuples are immutable we close the loop with a list
@ -40,8 +40,7 @@ def test_tuple():
gc.collect()
del t
del l
if gc.collect() != 2:
raise TestFailed
expect(gc.collect(), 2, "tuple")
def test_class():
class A:
@ -49,8 +48,7 @@ def test_class():
A.a = A
gc.collect()
del A
if gc.collect() == 0:
raise TestFailed
expect_not(gc.collect(), 0, "class")
def test_instance():
class A:
@ -59,8 +57,7 @@ def test_instance():
a.a = a
gc.collect()
del a
if gc.collect() == 0:
raise TestFailed
expect_not(gc.collect(), 0, "instance")
def test_method():
# Tricky: self.__init__ is a bound method, it references the instance.
@ -70,8 +67,7 @@ def test_method():
a = A()
gc.collect()
del a
if gc.collect() == 0:
raise TestFailed
expect_not(gc.collect(), 0, "method")
def test_finalizer():
# A() is uncollectable if it is part of a cycle, make sure it shows up
@ -88,14 +84,13 @@ def test_finalizer():
gc.collect()
del a
del b
if gc.collect() == 0:
raise TestFailed
expect_not(gc.collect(), 0, "finalizer")
for obj in gc.garbage:
if id(obj) == id_a:
del obj.a
break
else:
raise TestFailed
raise TestFailed, "didn't find obj in garbage (finalizer)"
gc.garbage.remove(obj)
def test_function():
@ -105,16 +100,14 @@ def test_function():
exec("def f(): pass\n") in d
gc.collect()
del d
if gc.collect() != 2:
raise TestFailed
expect(gc.collect(), 2, "function")
def test_frame():
def f():
frame = sys._getframe()
gc.collect()
f()
if gc.collect() != 1:
raise TestFailed
expect(gc.collect(), 1, "frame")
def test_saveall():
@ -133,7 +126,7 @@ def test_saveall():
del obj[:]
break
else:
raise TestFailed
raise TestFailed, "didn't find obj in garbage (saveall)"
gc.garbage.remove(obj)
finally:
gc.set_debug(debug)
@ -155,6 +148,7 @@ def test_del():
def test_all():
gc.collect() # Delete 2nd generation garbage
run_test("lists", test_list)
run_test("dicts", test_dict)
run_test("tuples", test_tuple)