| """Test module for the custom examples | 
 |  | 
 | Custom 1: | 
 |  | 
 | >>> import custom | 
 | >>> c1 = custom.Custom() | 
 | >>> c2 = custom.Custom() | 
 | >>> del c1 | 
 | >>> del c2 | 
 |  | 
 |  | 
 | Custom 2 | 
 |  | 
 | >>> import custom2 | 
 | >>> c1 = custom2.Custom('jim', 'fulton', 42) | 
 | >>> c1.first | 
 | 'jim' | 
 | >>> c1.last | 
 | 'fulton' | 
 | >>> c1.number | 
 | 42 | 
 | >>> c1.name() | 
 | 'jim fulton' | 
 | >>> c1.first = 'will' | 
 | >>> c1.name() | 
 | 'will fulton' | 
 | >>> c1.last = 'tell' | 
 | >>> c1.name() | 
 | 'will tell' | 
 | >>> del c1.first | 
 | >>> c1.name() | 
 | Traceback (most recent call last): | 
 | ... | 
 | AttributeError: first | 
 | >>> c1.first | 
 | Traceback (most recent call last): | 
 | ... | 
 | AttributeError: first | 
 | >>> c1.first = 'drew' | 
 | >>> c1.first | 
 | 'drew' | 
 | >>> del c1.number | 
 | Traceback (most recent call last): | 
 | ... | 
 | TypeError: can't delete numeric/char attribute | 
 | >>> c1.number=2 | 
 | >>> c1.number | 
 | 2 | 
 | >>> c1.first = 42 | 
 | >>> c1.name() | 
 | '42 tell' | 
 | >>> c2 = custom2.Custom() | 
 | >>> c2.name() | 
 | ' ' | 
 | >>> c2.first | 
 | '' | 
 | >>> c2.last | 
 | '' | 
 | >>> del c2.first | 
 | >>> c2.first | 
 | Traceback (most recent call last): | 
 | ... | 
 | AttributeError: first | 
 | >>> c2.first | 
 | Traceback (most recent call last): | 
 | ... | 
 | AttributeError: first | 
 | >>> c2.name() | 
 | Traceback (most recent call last): | 
 |   File "<stdin>", line 1, in ? | 
 | AttributeError: first | 
 | >>> c2.number | 
 | 0 | 
 | >>> n3 = custom2.Custom('jim', 'fulton', 'waaa') | 
 | Traceback (most recent call last): | 
 |   File "<stdin>", line 1, in ? | 
 | TypeError: an integer is required (got type str) | 
 | >>> del c1 | 
 | >>> del c2 | 
 |  | 
 |  | 
 | Custom 3 | 
 |  | 
 | >>> import custom3 | 
 | >>> c1 = custom3.Custom('jim', 'fulton', 42) | 
 | >>> c1 = custom3.Custom('jim', 'fulton', 42) | 
 | >>> c1.name() | 
 | 'jim fulton' | 
 | >>> del c1.first | 
 | Traceback (most recent call last): | 
 |   File "<stdin>", line 1, in ? | 
 | TypeError: Cannot delete the first attribute | 
 | >>> c1.first = 42 | 
 | Traceback (most recent call last): | 
 |   File "<stdin>", line 1, in ? | 
 | TypeError: The first attribute value must be a string | 
 | >>> c1.first = 'will' | 
 | >>> c1.name() | 
 | 'will fulton' | 
 | >>> c2 = custom3.Custom() | 
 | >>> c2 = custom3.Custom() | 
 | >>> c2 = custom3.Custom() | 
 | >>> n3 = custom3.Custom('jim', 'fulton', 'waaa') | 
 | Traceback (most recent call last): | 
 |   File "<stdin>", line 1, in ? | 
 | TypeError: an integer is required (got type str) | 
 | >>> del c1 | 
 | >>> del c2 | 
 |  | 
 | Custom 4 | 
 |  | 
 | >>> import custom4 | 
 | >>> c1 = custom4.Custom('jim', 'fulton', 42) | 
 | >>> c1.first | 
 | 'jim' | 
 | >>> c1.last | 
 | 'fulton' | 
 | >>> c1.number | 
 | 42 | 
 | >>> c1.name() | 
 | 'jim fulton' | 
 | >>> c1.first = 'will' | 
 | >>> c1.name() | 
 | 'will fulton' | 
 | >>> c1.last = 'tell' | 
 | >>> c1.name() | 
 | 'will tell' | 
 | >>> del c1.first | 
 | Traceback (most recent call last): | 
 | ... | 
 | TypeError: Cannot delete the first attribute | 
 | >>> c1.name() | 
 | 'will tell' | 
 | >>> c1.first = 'drew' | 
 | >>> c1.first | 
 | 'drew' | 
 | >>> del c1.number | 
 | Traceback (most recent call last): | 
 | ... | 
 | TypeError: can't delete numeric/char attribute | 
 | >>> c1.number=2 | 
 | >>> c1.number | 
 | 2 | 
 | >>> c1.first = 42 | 
 | Traceback (most recent call last): | 
 | ... | 
 | TypeError: The first attribute value must be a string | 
 | >>> c1.name() | 
 | 'drew tell' | 
 | >>> c2 = custom4.Custom() | 
 | >>> c2 = custom4.Custom() | 
 | >>> c2 = custom4.Custom() | 
 | >>> c2 = custom4.Custom() | 
 | >>> c2.name() | 
 | ' ' | 
 | >>> c2.first | 
 | '' | 
 | >>> c2.last | 
 | '' | 
 | >>> c2.number | 
 | 0 | 
 | >>> n3 = custom4.Custom('jim', 'fulton', 'waaa') | 
 | Traceback (most recent call last): | 
 | ... | 
 | TypeError: an integer is required (got type str) | 
 |  | 
 |  | 
 | Test cyclic gc(?) | 
 |  | 
 | >>> import gc | 
 | >>> gc.disable() | 
 |  | 
 | >>> class Subclass(custom4.Custom): pass | 
 | ... | 
 | >>> s = Subclass() | 
 | >>> s.cycle = [s] | 
 | >>> s.cycle.append(s.cycle) | 
 | >>> x = object() | 
 | >>> s.x = x | 
 | >>> del s | 
 | >>> sys.getrefcount(x) | 
 | 3 | 
 | >>> ignore = gc.collect() | 
 | >>> sys.getrefcount(x) | 
 | 2 | 
 |  | 
 | >>> gc.enable() | 
 | """ | 
 |  | 
 | import os | 
 | import sys | 
 | from distutils.util import get_platform | 
 | PLAT_SPEC = "%s-%d.%d" % (get_platform(), *sys.version_info[:2]) | 
 | src = os.path.join("build", "lib.%s" % PLAT_SPEC) | 
 | sys.path.append(src) | 
 |  | 
 | if __name__ == "__main__": | 
 |     import doctest, __main__ | 
 |     doctest.testmod(__main__) |