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