source: pyyaml/trunk/tests/test_appliance.py @ 325

Revision 325, 5.1 KB checked in by xi, 5 years ago (diff)

Minor 2.3 and win32 compatibility fixes; clarify the 'feature not found' message in setup.py.

Line 
1
2import sys, os, os.path, types, traceback, pprint
3
4DATA = 'tests/data'
5
6def find_test_functions(collections):
7    if not isinstance(collections, list):
8        collections = [collections]
9    functions = []
10    for collection in collections:
11        if not isinstance(collection, dict):
12            collection = vars(collection)
13        keys = collection.keys()
14        keys.sort()
15        for key in keys:
16            value = collection[key]
17            if isinstance(value, types.FunctionType) and hasattr(value, 'unittest'):
18                functions.append(value)
19    return functions
20
21def find_test_filenames(directory):
22    filenames = {}
23    for filename in os.listdir(directory):
24        if os.path.isfile(os.path.join(directory, filename)):
25            base, ext = os.path.splitext(filename)
26            filenames.setdefault(base, []).append(ext)
27    filenames = filenames.items()
28    filenames.sort()
29    return filenames
30
31def parse_arguments(args):
32    if args is None:
33        args = sys.argv[1:]
34    verbose = False
35    if '-v' in args:
36        verbose = True
37        args.remove('-v')
38    if '--verbose' in args:
39        verbose = True
40    if 'YAML_TEST_VERBOSE' in os.environ:
41        verbose = True
42    include_functions = []
43    if args:
44        include_functions.append(args.pop(0))
45    if 'YAML_TEST_FUNCTIONS' in os.environ:
46        include_functions.extend(os.environ['YAML_TEST_FUNCTIONS'].split())
47    include_filenames = []
48    include_filenames.extend(args)
49    if 'YAML_TEST_FILENAMES' in os.environ:
50        include_filenames.extend(os.environ['YAML_TEST_FILENAMES'].split())
51    return include_functions, include_filenames, verbose
52
53def execute(function, filenames, verbose):
54    if hasattr(function, 'unittest_name'):
55        name = function.unittest_name
56    else:
57        name = function.func_name
58    if verbose:
59        sys.stdout.write('='*75+'\n')
60        sys.stdout.write('%s(%s)...\n' % (name, ', '.join(filenames)))
61    try:
62        function(verbose=verbose, *filenames)
63    except Exception, exc:
64        info = sys.exc_info()
65        if isinstance(exc, AssertionError):
66            kind = 'FAILURE'
67        else:
68            kind = 'ERROR'
69        if verbose:
70            traceback.print_exc(limit=1, file=sys.stdout)
71        else:
72            sys.stdout.write(kind[0])
73            sys.stdout.flush()
74    else:
75        kind = 'SUCCESS'
76        info = None
77        if not verbose:
78            sys.stdout.write('.')
79    sys.stdout.flush()
80    return (name, filenames, kind, info)
81
82def display(results, verbose):
83    if results and not verbose:
84        sys.stdout.write('\n')
85    total = len(results)
86    failures = 0
87    errors = 0
88    for name, filenames, kind, info in results:
89        if kind == 'SUCCESS':
90            continue
91        if kind == 'FAILURE':
92            failures += 1
93        if kind == 'ERROR':
94            errors += 1
95        sys.stdout.write('='*75+'\n')
96        sys.stdout.write('%s(%s): %s\n' % (name, ', '.join(filenames), kind))
97        if kind == 'ERROR':
98            traceback.print_exception(file=sys.stdout, *info)
99        else:
100            sys.stdout.write('Traceback (most recent call last):\n')
101            traceback.print_tb(info[2], file=sys.stdout)
102            sys.stdout.write('%s: see below\n' % info[0].__name__)
103            sys.stdout.write('~'*75+'\n')
104            for arg in info[1].args:
105                pprint.pprint(arg, stream=sys.stdout)
106        for filename in filenames:
107            sys.stdout.write('-'*75+'\n')
108            sys.stdout.write('%s:\n' % filename)
109            data = open(filename, 'rb').read()
110            sys.stdout.write(data)
111            if data and data[-1] != '\n':
112                sys.stdout.write('\n')
113    sys.stdout.write('='*75+'\n')
114    sys.stdout.write('TESTS: %s\n' % total)
115    if failures:
116        sys.stdout.write('FAILURES: %s\n' % failures)
117    if errors:
118        sys.stdout.write('ERRORS: %s\n' % errors)
119
120def run(collections, args=None):
121    test_functions = find_test_functions(collections)
122    test_filenames = find_test_filenames(DATA)
123    include_functions, include_filenames, verbose = parse_arguments(args)
124    results = []
125    for function in test_functions:
126        if include_functions and function.func_name not in include_functions:
127            continue
128        if function.unittest:
129            for base, exts in test_filenames:
130                if include_filenames and base not in include_filenames:
131                    continue
132                filenames = []
133                for ext in function.unittest:
134                    if ext not in exts:
135                        break
136                    filenames.append(os.path.join(DATA, base+ext))
137                else:
138                    skip_exts = getattr(function, 'skip', [])
139                    for skip_ext in skip_exts:
140                        if skip_ext in exts:
141                            break
142                    else:
143                        result = execute(function, filenames, verbose)
144                        results.append(result)
145        else:
146            result = execute(function, [], verbose)
147            results.append(result)
148    display(results, verbose=verbose)
149
Note: See TracBrowser for help on using the repository browser.