Home | History | Annotate | Download | only in tests
      1 #!/usr/bin/env python
      2 # Copyright 2006 Google, Inc. All Rights Reserved.
      3 # Licensed to PSF under a Contributor Agreement.
      4 
      5 """Main program for testing the infrastructure."""
      6 
      7 __author__ = "Guido van Rossum <guido (at] python.org>"
      8 
      9 # Support imports (need to be imported first)
     10 from . import support
     11 
     12 # Python imports
     13 import os
     14 import sys
     15 import logging
     16 
     17 # Local imports
     18 from .. import pytree
     19 import pgen2
     20 from pgen2 import driver
     21 
     22 logging.basicConfig()
     23 
     24 def main():
     25     gr = driver.load_grammar("Grammar.txt")
     26     dr = driver.Driver(gr, convert=pytree.convert)
     27 
     28     fn = "example.py"
     29     tree = dr.parse_file(fn, debug=True)
     30     if not diff(fn, tree):
     31         print "No diffs."
     32     if not sys.argv[1:]:
     33         return # Pass a dummy argument to run the complete test suite below
     34 
     35     problems = []
     36 
     37     # Process every imported module
     38     for name in sys.modules:
     39         mod = sys.modules[name]
     40         if mod is None or not hasattr(mod, "__file__"):
     41             continue
     42         fn = mod.__file__
     43         if fn.endswith(".pyc"):
     44             fn = fn[:-1]
     45         if not fn.endswith(".py"):
     46             continue
     47         print >>sys.stderr, "Parsing", fn
     48         tree = dr.parse_file(fn, debug=True)
     49         if diff(fn, tree):
     50             problems.append(fn)
     51 
     52     # Process every single module on sys.path (but not in packages)
     53     for dir in sys.path:
     54         try:
     55             names = os.listdir(dir)
     56         except os.error:
     57             continue
     58         print >>sys.stderr, "Scanning", dir, "..."
     59         for name in names:
     60             if not name.endswith(".py"):
     61                 continue
     62             print >>sys.stderr, "Parsing", name
     63             fn = os.path.join(dir, name)
     64             try:
     65                 tree = dr.parse_file(fn, debug=True)
     66             except pgen2.parse.ParseError, err:
     67                 print "ParseError:", err
     68             else:
     69                 if diff(fn, tree):
     70                     problems.append(fn)
     71 
     72     # Show summary of problem files
     73     if not problems:
     74         print "No problems.  Congratulations!"
     75     else:
     76         print "Problems in following files:"
     77         for fn in problems:
     78             print "***", fn
     79 
     80 def diff(fn, tree):
     81     f = open("@", "w")
     82     try:
     83         f.write(str(tree))
     84     finally:
     85         f.close()
     86     try:
     87         return os.system("diff -u %s @" % fn)
     88     finally:
     89         os.remove("@")
     90 
     91 if __name__ == "__main__":
     92     main()
     93