17db96d56Sopenharmony_ci#!/usr/bin/env python3
27db96d56Sopenharmony_ci# Copyright 2006 Google, Inc. All Rights Reserved.
37db96d56Sopenharmony_ci# Licensed to PSF under a Contributor Agreement.
47db96d56Sopenharmony_ci
57db96d56Sopenharmony_ci"""Main program for testing the infrastructure."""
67db96d56Sopenharmony_ci
77db96d56Sopenharmony_cifrom __future__ import print_function
87db96d56Sopenharmony_ci
97db96d56Sopenharmony_ci__author__ = "Guido van Rossum <guido@python.org>"
107db96d56Sopenharmony_ci
117db96d56Sopenharmony_ci# Support imports (need to be imported first)
127db96d56Sopenharmony_cifrom . import support
137db96d56Sopenharmony_ci
147db96d56Sopenharmony_ci# Python imports
157db96d56Sopenharmony_ciimport os
167db96d56Sopenharmony_ciimport sys
177db96d56Sopenharmony_ciimport logging
187db96d56Sopenharmony_ci
197db96d56Sopenharmony_ci# Local imports
207db96d56Sopenharmony_cifrom .. import pytree
217db96d56Sopenharmony_cifrom .. import pgen2
227db96d56Sopenharmony_cifrom ..pgen2 import driver
237db96d56Sopenharmony_ci
247db96d56Sopenharmony_cilogging.basicConfig()
257db96d56Sopenharmony_ci
267db96d56Sopenharmony_cidef main():
277db96d56Sopenharmony_ci    gr = driver.load_grammar("Grammar.txt")
287db96d56Sopenharmony_ci    dr = driver.Driver(gr, convert=pytree.convert)
297db96d56Sopenharmony_ci
307db96d56Sopenharmony_ci    fn = "example.py"
317db96d56Sopenharmony_ci    tree = dr.parse_file(fn, debug=True)
327db96d56Sopenharmony_ci    if not diff(fn, tree):
337db96d56Sopenharmony_ci        print("No diffs.")
347db96d56Sopenharmony_ci    if not sys.argv[1:]:
357db96d56Sopenharmony_ci        return # Pass a dummy argument to run the complete test suite below
367db96d56Sopenharmony_ci
377db96d56Sopenharmony_ci    problems = []
387db96d56Sopenharmony_ci
397db96d56Sopenharmony_ci    # Process every imported module
407db96d56Sopenharmony_ci    for name in sys.modules:
417db96d56Sopenharmony_ci        mod = sys.modules[name]
427db96d56Sopenharmony_ci        if mod is None or not hasattr(mod, "__file__"):
437db96d56Sopenharmony_ci            continue
447db96d56Sopenharmony_ci        fn = mod.__file__
457db96d56Sopenharmony_ci        if fn.endswith(".pyc"):
467db96d56Sopenharmony_ci            fn = fn[:-1]
477db96d56Sopenharmony_ci        if not fn.endswith(".py"):
487db96d56Sopenharmony_ci            continue
497db96d56Sopenharmony_ci        print("Parsing", fn, file=sys.stderr)
507db96d56Sopenharmony_ci        tree = dr.parse_file(fn, debug=True)
517db96d56Sopenharmony_ci        if diff(fn, tree):
527db96d56Sopenharmony_ci            problems.append(fn)
537db96d56Sopenharmony_ci
547db96d56Sopenharmony_ci    # Process every single module on sys.path (but not in packages)
557db96d56Sopenharmony_ci    for dir in sys.path:
567db96d56Sopenharmony_ci        try:
577db96d56Sopenharmony_ci            names = os.listdir(dir)
587db96d56Sopenharmony_ci        except OSError:
597db96d56Sopenharmony_ci            continue
607db96d56Sopenharmony_ci        print("Scanning", dir, "...", file=sys.stderr)
617db96d56Sopenharmony_ci        for name in names:
627db96d56Sopenharmony_ci            if not name.endswith(".py"):
637db96d56Sopenharmony_ci                continue
647db96d56Sopenharmony_ci            print("Parsing", name, file=sys.stderr)
657db96d56Sopenharmony_ci            fn = os.path.join(dir, name)
667db96d56Sopenharmony_ci            try:
677db96d56Sopenharmony_ci                tree = dr.parse_file(fn, debug=True)
687db96d56Sopenharmony_ci            except pgen2.parse.ParseError as err:
697db96d56Sopenharmony_ci                print("ParseError:", err)
707db96d56Sopenharmony_ci            else:
717db96d56Sopenharmony_ci                if diff(fn, tree):
727db96d56Sopenharmony_ci                    problems.append(fn)
737db96d56Sopenharmony_ci
747db96d56Sopenharmony_ci    # Show summary of problem files
757db96d56Sopenharmony_ci    if not problems:
767db96d56Sopenharmony_ci        print("No problems.  Congratulations!")
777db96d56Sopenharmony_ci    else:
787db96d56Sopenharmony_ci        print("Problems in following files:")
797db96d56Sopenharmony_ci        for fn in problems:
807db96d56Sopenharmony_ci            print("***", fn)
817db96d56Sopenharmony_ci
827db96d56Sopenharmony_cidef diff(fn, tree):
837db96d56Sopenharmony_ci    f = open("@", "w")
847db96d56Sopenharmony_ci    try:
857db96d56Sopenharmony_ci        f.write(str(tree))
867db96d56Sopenharmony_ci    finally:
877db96d56Sopenharmony_ci        f.close()
887db96d56Sopenharmony_ci    try:
897db96d56Sopenharmony_ci        return os.system("diff -u %s @" % fn)
907db96d56Sopenharmony_ci    finally:
917db96d56Sopenharmony_ci        os.remove("@")
927db96d56Sopenharmony_ci
937db96d56Sopenharmony_ciif __name__ == "__main__":
947db96d56Sopenharmony_ci    main()
95