| from test.test_support import verbose, findfile, is_resource_enabled, TestFailed |
| import os, glob, random |
| from tokenize import (tokenize, generate_tokens, untokenize, |
| NUMBER, NAME, OP, STRING) |
| |
| if verbose: |
| print 'starting...' |
| |
| f = file(findfile('tokenize_tests' + os.extsep + 'txt')) |
| tokenize(f.readline) |
| f.close() |
| |
| |
| |
| ###### Test roundtrip for untokenize ########################## |
| |
| def test_roundtrip(f): |
| ## print 'Testing:', f |
| f = file(f) |
| try: |
| fulltok = list(generate_tokens(f.readline)) |
| finally: |
| f.close() |
| |
| t1 = [tok[:2] for tok in fulltok] |
| newtext = untokenize(t1) |
| readline = iter(newtext.splitlines(1)).next |
| t2 = [tok[:2] for tok in generate_tokens(readline)] |
| assert t1 == t2 |
| |
| |
| f = findfile('tokenize_tests' + os.extsep + 'txt') |
| test_roundtrip(f) |
| |
| testdir = os.path.dirname(f) or os.curdir |
| testfiles = glob.glob(testdir + os.sep + 'test*.py') |
| if not is_resource_enabled('compiler'): |
| testfiles = random.sample(testfiles, 10) |
| |
| for f in testfiles: |
| test_roundtrip(f) |
| |
| |
| ###### Test detecton of IndentationError ###################### |
| |
| from cStringIO import StringIO |
| |
| sampleBadText = """ |
| def foo(): |
| bar |
| baz |
| """ |
| |
| try: |
| for tok in generate_tokens(StringIO(sampleBadText).readline): |
| pass |
| except IndentationError: |
| pass |
| else: |
| raise TestFailed("Did not detect IndentationError:") |
| |
| |
| ###### Test example in the docs ############################### |
| |
| from decimal import Decimal |
| from cStringIO import StringIO |
| |
| def decistmt(s): |
| """Substitute Decimals for floats in a string of statements. |
| |
| >>> from decimal import Decimal |
| >>> s = 'print +21.3e-5*-.1234/81.7' |
| >>> decistmt(s) |
| "print +Decimal ('21.3e-5')*-Decimal ('.1234')/Decimal ('81.7')" |
| |
| >>> exec(s) |
| -3.21716034272e-007 |
| >>> exec(decistmt(s)) |
| -3.217160342717258261933904529E-7 |
| |
| """ |
| result = [] |
| g = generate_tokens(StringIO(s).readline) # tokenize the string |
| for toknum, tokval, _, _, _ in g: |
| if toknum == NUMBER and '.' in tokval: # replace NUMBER tokens |
| result.extend([ |
| (NAME, 'Decimal'), |
| (OP, '('), |
| (STRING, repr(tokval)), |
| (OP, ')') |
| ]) |
| else: |
| result.append((toknum, tokval)) |
| return untokenize(result) |
| |
| import doctest |
| doctest.testmod() |
| |
| if verbose: |
| print 'finished' |