1a8c51b3fSopenharmony_ci#!/usr/bin/env python3
2a8c51b3fSopenharmony_ci
3a8c51b3fSopenharmony_ciimport unittest
4a8c51b3fSopenharmony_ci"""
5a8c51b3fSopenharmony_cicompare.py - versatile benchmark output compare tool
6a8c51b3fSopenharmony_ci"""
7a8c51b3fSopenharmony_ci
8a8c51b3fSopenharmony_ciimport argparse
9a8c51b3fSopenharmony_cifrom argparse import ArgumentParser
10a8c51b3fSopenharmony_ciimport json
11a8c51b3fSopenharmony_ciimport sys
12a8c51b3fSopenharmony_ciimport os
13a8c51b3fSopenharmony_ciimport gbench
14a8c51b3fSopenharmony_cifrom gbench import util, report
15a8c51b3fSopenharmony_ci
16a8c51b3fSopenharmony_ci
17a8c51b3fSopenharmony_cidef check_inputs(in1, in2, flags):
18a8c51b3fSopenharmony_ci    """
19a8c51b3fSopenharmony_ci    Perform checking on the user provided inputs and diagnose any abnormalities
20a8c51b3fSopenharmony_ci    """
21a8c51b3fSopenharmony_ci    in1_kind, in1_err = util.classify_input_file(in1)
22a8c51b3fSopenharmony_ci    in2_kind, in2_err = util.classify_input_file(in2)
23a8c51b3fSopenharmony_ci    output_file = util.find_benchmark_flag('--benchmark_out=', flags)
24a8c51b3fSopenharmony_ci    output_type = util.find_benchmark_flag('--benchmark_out_format=', flags)
25a8c51b3fSopenharmony_ci    if in1_kind == util.IT_Executable and in2_kind == util.IT_Executable and output_file:
26a8c51b3fSopenharmony_ci        print(("WARNING: '--benchmark_out=%s' will be passed to both "
27a8c51b3fSopenharmony_ci               "benchmarks causing it to be overwritten") % output_file)
28a8c51b3fSopenharmony_ci    if in1_kind == util.IT_JSON and in2_kind == util.IT_JSON:
29a8c51b3fSopenharmony_ci        # When both sides are JSON the only supported flag is
30a8c51b3fSopenharmony_ci        # --benchmark_filter=
31a8c51b3fSopenharmony_ci        for flag in util.remove_benchmark_flags('--benchmark_filter=', flags):
32a8c51b3fSopenharmony_ci            print("WARNING: passing %s has no effect since both "
33a8c51b3fSopenharmony_ci                  "inputs are JSON" % flag)
34a8c51b3fSopenharmony_ci    if output_type is not None and output_type != 'json':
35a8c51b3fSopenharmony_ci        print(("ERROR: passing '--benchmark_out_format=%s' to 'compare.py`"
36a8c51b3fSopenharmony_ci               " is not supported.") % output_type)
37a8c51b3fSopenharmony_ci        sys.exit(1)
38a8c51b3fSopenharmony_ci
39a8c51b3fSopenharmony_ci
40a8c51b3fSopenharmony_cidef create_parser():
41a8c51b3fSopenharmony_ci    parser = ArgumentParser(
42a8c51b3fSopenharmony_ci        description='versatile benchmark output compare tool')
43a8c51b3fSopenharmony_ci
44a8c51b3fSopenharmony_ci    parser.add_argument(
45a8c51b3fSopenharmony_ci        '-a',
46a8c51b3fSopenharmony_ci        '--display_aggregates_only',
47a8c51b3fSopenharmony_ci        dest='display_aggregates_only',
48a8c51b3fSopenharmony_ci        action="store_true",
49a8c51b3fSopenharmony_ci        help="If there are repetitions, by default, we display everything - the"
50a8c51b3fSopenharmony_ci             " actual runs, and the aggregates computed. Sometimes, it is "
51a8c51b3fSopenharmony_ci             "desirable to only view the aggregates. E.g. when there are a lot "
52a8c51b3fSopenharmony_ci             "of repetitions. Do note that only the display is affected. "
53a8c51b3fSopenharmony_ci             "Internally, all the actual runs are still used, e.g. for U test.")
54a8c51b3fSopenharmony_ci
55a8c51b3fSopenharmony_ci    parser.add_argument(
56a8c51b3fSopenharmony_ci        '--no-color',
57a8c51b3fSopenharmony_ci        dest='color',
58a8c51b3fSopenharmony_ci        default=True,
59a8c51b3fSopenharmony_ci        action="store_false",
60a8c51b3fSopenharmony_ci        help="Do not use colors in the terminal output"
61a8c51b3fSopenharmony_ci    )
62a8c51b3fSopenharmony_ci
63a8c51b3fSopenharmony_ci    parser.add_argument(
64a8c51b3fSopenharmony_ci        '-d',
65a8c51b3fSopenharmony_ci        '--dump_to_json',
66a8c51b3fSopenharmony_ci        dest='dump_to_json',
67a8c51b3fSopenharmony_ci        help="Additionally, dump benchmark comparison output to this file in JSON format.")
68a8c51b3fSopenharmony_ci
69a8c51b3fSopenharmony_ci    utest = parser.add_argument_group()
70a8c51b3fSopenharmony_ci    utest.add_argument(
71a8c51b3fSopenharmony_ci        '--no-utest',
72a8c51b3fSopenharmony_ci        dest='utest',
73a8c51b3fSopenharmony_ci        default=True,
74a8c51b3fSopenharmony_ci        action="store_false",
75a8c51b3fSopenharmony_ci        help="The tool can do a two-tailed Mann-Whitney U test with the null hypothesis that it is equally likely that a randomly selected value from one sample will be less than or greater than a randomly selected value from a second sample.\nWARNING: requires **LARGE** (no less than {}) number of repetitions to be meaningful!\nThe test is being done by default, if at least {} repetitions were done.\nThis option can disable the U Test.".format(report.UTEST_OPTIMAL_REPETITIONS, report.UTEST_MIN_REPETITIONS))
76a8c51b3fSopenharmony_ci    alpha_default = 0.05
77a8c51b3fSopenharmony_ci    utest.add_argument(
78a8c51b3fSopenharmony_ci        "--alpha",
79a8c51b3fSopenharmony_ci        dest='utest_alpha',
80a8c51b3fSopenharmony_ci        default=alpha_default,
81a8c51b3fSopenharmony_ci        type=float,
82a8c51b3fSopenharmony_ci        help=("significance level alpha. if the calculated p-value is below this value, then the result is said to be statistically significant and the null hypothesis is rejected.\n(default: %0.4f)") %
83a8c51b3fSopenharmony_ci        alpha_default)
84a8c51b3fSopenharmony_ci
85a8c51b3fSopenharmony_ci    subparsers = parser.add_subparsers(
86a8c51b3fSopenharmony_ci        help='This tool has multiple modes of operation:',
87a8c51b3fSopenharmony_ci        dest='mode')
88a8c51b3fSopenharmony_ci
89a8c51b3fSopenharmony_ci    parser_a = subparsers.add_parser(
90a8c51b3fSopenharmony_ci        'benchmarks',
91a8c51b3fSopenharmony_ci        help='The most simple use-case, compare all the output of these two benchmarks')
92a8c51b3fSopenharmony_ci    baseline = parser_a.add_argument_group(
93a8c51b3fSopenharmony_ci        'baseline', 'The benchmark baseline')
94a8c51b3fSopenharmony_ci    baseline.add_argument(
95a8c51b3fSopenharmony_ci        'test_baseline',
96a8c51b3fSopenharmony_ci        metavar='test_baseline',
97a8c51b3fSopenharmony_ci        type=argparse.FileType('r'),
98a8c51b3fSopenharmony_ci        nargs=1,
99a8c51b3fSopenharmony_ci        help='A benchmark executable or JSON output file')
100a8c51b3fSopenharmony_ci    contender = parser_a.add_argument_group(
101a8c51b3fSopenharmony_ci        'contender', 'The benchmark that will be compared against the baseline')
102a8c51b3fSopenharmony_ci    contender.add_argument(
103a8c51b3fSopenharmony_ci        'test_contender',
104a8c51b3fSopenharmony_ci        metavar='test_contender',
105a8c51b3fSopenharmony_ci        type=argparse.FileType('r'),
106a8c51b3fSopenharmony_ci        nargs=1,
107a8c51b3fSopenharmony_ci        help='A benchmark executable or JSON output file')
108a8c51b3fSopenharmony_ci    parser_a.add_argument(
109a8c51b3fSopenharmony_ci        'benchmark_options',
110a8c51b3fSopenharmony_ci        metavar='benchmark_options',
111a8c51b3fSopenharmony_ci        nargs=argparse.REMAINDER,
112a8c51b3fSopenharmony_ci        help='Arguments to pass when running benchmark executables')
113a8c51b3fSopenharmony_ci
114a8c51b3fSopenharmony_ci    parser_b = subparsers.add_parser(
115a8c51b3fSopenharmony_ci        'filters', help='Compare filter one with the filter two of benchmark')
116a8c51b3fSopenharmony_ci    baseline = parser_b.add_argument_group(
117a8c51b3fSopenharmony_ci        'baseline', 'The benchmark baseline')
118a8c51b3fSopenharmony_ci    baseline.add_argument(
119a8c51b3fSopenharmony_ci        'test',
120a8c51b3fSopenharmony_ci        metavar='test',
121a8c51b3fSopenharmony_ci        type=argparse.FileType('r'),
122a8c51b3fSopenharmony_ci        nargs=1,
123a8c51b3fSopenharmony_ci        help='A benchmark executable or JSON output file')
124a8c51b3fSopenharmony_ci    baseline.add_argument(
125a8c51b3fSopenharmony_ci        'filter_baseline',
126a8c51b3fSopenharmony_ci        metavar='filter_baseline',
127a8c51b3fSopenharmony_ci        type=str,
128a8c51b3fSopenharmony_ci        nargs=1,
129a8c51b3fSopenharmony_ci        help='The first filter, that will be used as baseline')
130a8c51b3fSopenharmony_ci    contender = parser_b.add_argument_group(
131a8c51b3fSopenharmony_ci        'contender', 'The benchmark that will be compared against the baseline')
132a8c51b3fSopenharmony_ci    contender.add_argument(
133a8c51b3fSopenharmony_ci        'filter_contender',
134a8c51b3fSopenharmony_ci        metavar='filter_contender',
135a8c51b3fSopenharmony_ci        type=str,
136a8c51b3fSopenharmony_ci        nargs=1,
137a8c51b3fSopenharmony_ci        help='The second filter, that will be compared against the baseline')
138a8c51b3fSopenharmony_ci    parser_b.add_argument(
139a8c51b3fSopenharmony_ci        'benchmark_options',
140a8c51b3fSopenharmony_ci        metavar='benchmark_options',
141a8c51b3fSopenharmony_ci        nargs=argparse.REMAINDER,
142a8c51b3fSopenharmony_ci        help='Arguments to pass when running benchmark executables')
143a8c51b3fSopenharmony_ci
144a8c51b3fSopenharmony_ci    parser_c = subparsers.add_parser(
145a8c51b3fSopenharmony_ci        'benchmarksfiltered',
146a8c51b3fSopenharmony_ci        help='Compare filter one of first benchmark with filter two of the second benchmark')
147a8c51b3fSopenharmony_ci    baseline = parser_c.add_argument_group(
148a8c51b3fSopenharmony_ci        'baseline', 'The benchmark baseline')
149a8c51b3fSopenharmony_ci    baseline.add_argument(
150a8c51b3fSopenharmony_ci        'test_baseline',
151a8c51b3fSopenharmony_ci        metavar='test_baseline',
152a8c51b3fSopenharmony_ci        type=argparse.FileType('r'),
153a8c51b3fSopenharmony_ci        nargs=1,
154a8c51b3fSopenharmony_ci        help='A benchmark executable or JSON output file')
155a8c51b3fSopenharmony_ci    baseline.add_argument(
156a8c51b3fSopenharmony_ci        'filter_baseline',
157a8c51b3fSopenharmony_ci        metavar='filter_baseline',
158a8c51b3fSopenharmony_ci        type=str,
159a8c51b3fSopenharmony_ci        nargs=1,
160a8c51b3fSopenharmony_ci        help='The first filter, that will be used as baseline')
161a8c51b3fSopenharmony_ci    contender = parser_c.add_argument_group(
162a8c51b3fSopenharmony_ci        'contender', 'The benchmark that will be compared against the baseline')
163a8c51b3fSopenharmony_ci    contender.add_argument(
164a8c51b3fSopenharmony_ci        'test_contender',
165a8c51b3fSopenharmony_ci        metavar='test_contender',
166a8c51b3fSopenharmony_ci        type=argparse.FileType('r'),
167a8c51b3fSopenharmony_ci        nargs=1,
168a8c51b3fSopenharmony_ci        help='The second benchmark executable or JSON output file, that will be compared against the baseline')
169a8c51b3fSopenharmony_ci    contender.add_argument(
170a8c51b3fSopenharmony_ci        'filter_contender',
171a8c51b3fSopenharmony_ci        metavar='filter_contender',
172a8c51b3fSopenharmony_ci        type=str,
173a8c51b3fSopenharmony_ci        nargs=1,
174a8c51b3fSopenharmony_ci        help='The second filter, that will be compared against the baseline')
175a8c51b3fSopenharmony_ci    parser_c.add_argument(
176a8c51b3fSopenharmony_ci        'benchmark_options',
177a8c51b3fSopenharmony_ci        metavar='benchmark_options',
178a8c51b3fSopenharmony_ci        nargs=argparse.REMAINDER,
179a8c51b3fSopenharmony_ci        help='Arguments to pass when running benchmark executables')
180a8c51b3fSopenharmony_ci
181a8c51b3fSopenharmony_ci    return parser
182a8c51b3fSopenharmony_ci
183a8c51b3fSopenharmony_ci
184a8c51b3fSopenharmony_cidef main():
185a8c51b3fSopenharmony_ci    # Parse the command line flags
186a8c51b3fSopenharmony_ci    parser = create_parser()
187a8c51b3fSopenharmony_ci    args, unknown_args = parser.parse_known_args()
188a8c51b3fSopenharmony_ci    if args.mode is None:
189a8c51b3fSopenharmony_ci        parser.print_help()
190a8c51b3fSopenharmony_ci        exit(1)
191a8c51b3fSopenharmony_ci    assert not unknown_args
192a8c51b3fSopenharmony_ci    benchmark_options = args.benchmark_options
193a8c51b3fSopenharmony_ci
194a8c51b3fSopenharmony_ci    if args.mode == 'benchmarks':
195a8c51b3fSopenharmony_ci        test_baseline = args.test_baseline[0].name
196a8c51b3fSopenharmony_ci        test_contender = args.test_contender[0].name
197a8c51b3fSopenharmony_ci        filter_baseline = ''
198a8c51b3fSopenharmony_ci        filter_contender = ''
199a8c51b3fSopenharmony_ci
200a8c51b3fSopenharmony_ci        # NOTE: if test_baseline == test_contender, you are analyzing the stdev
201a8c51b3fSopenharmony_ci
202a8c51b3fSopenharmony_ci        description = 'Comparing %s to %s' % (test_baseline, test_contender)
203a8c51b3fSopenharmony_ci    elif args.mode == 'filters':
204a8c51b3fSopenharmony_ci        test_baseline = args.test[0].name
205a8c51b3fSopenharmony_ci        test_contender = args.test[0].name
206a8c51b3fSopenharmony_ci        filter_baseline = args.filter_baseline[0]
207a8c51b3fSopenharmony_ci        filter_contender = args.filter_contender[0]
208a8c51b3fSopenharmony_ci
209a8c51b3fSopenharmony_ci        # NOTE: if filter_baseline == filter_contender, you are analyzing the
210a8c51b3fSopenharmony_ci        # stdev
211a8c51b3fSopenharmony_ci
212a8c51b3fSopenharmony_ci        description = 'Comparing %s to %s (from %s)' % (
213a8c51b3fSopenharmony_ci            filter_baseline, filter_contender, args.test[0].name)
214a8c51b3fSopenharmony_ci    elif args.mode == 'benchmarksfiltered':
215a8c51b3fSopenharmony_ci        test_baseline = args.test_baseline[0].name
216a8c51b3fSopenharmony_ci        test_contender = args.test_contender[0].name
217a8c51b3fSopenharmony_ci        filter_baseline = args.filter_baseline[0]
218a8c51b3fSopenharmony_ci        filter_contender = args.filter_contender[0]
219a8c51b3fSopenharmony_ci
220a8c51b3fSopenharmony_ci        # NOTE: if test_baseline == test_contender and
221a8c51b3fSopenharmony_ci        # filter_baseline == filter_contender, you are analyzing the stdev
222a8c51b3fSopenharmony_ci
223a8c51b3fSopenharmony_ci        description = 'Comparing %s (from %s) to %s (from %s)' % (
224a8c51b3fSopenharmony_ci            filter_baseline, test_baseline, filter_contender, test_contender)
225a8c51b3fSopenharmony_ci    else:
226a8c51b3fSopenharmony_ci        # should never happen
227a8c51b3fSopenharmony_ci        print("Unrecognized mode of operation: '%s'" % args.mode)
228a8c51b3fSopenharmony_ci        parser.print_help()
229a8c51b3fSopenharmony_ci        exit(1)
230a8c51b3fSopenharmony_ci
231a8c51b3fSopenharmony_ci    check_inputs(test_baseline, test_contender, benchmark_options)
232a8c51b3fSopenharmony_ci
233a8c51b3fSopenharmony_ci    if args.display_aggregates_only:
234a8c51b3fSopenharmony_ci        benchmark_options += ['--benchmark_display_aggregates_only=true']
235a8c51b3fSopenharmony_ci
236a8c51b3fSopenharmony_ci    options_baseline = []
237a8c51b3fSopenharmony_ci    options_contender = []
238a8c51b3fSopenharmony_ci
239a8c51b3fSopenharmony_ci    if filter_baseline and filter_contender:
240a8c51b3fSopenharmony_ci        options_baseline = ['--benchmark_filter=%s' % filter_baseline]
241a8c51b3fSopenharmony_ci        options_contender = ['--benchmark_filter=%s' % filter_contender]
242a8c51b3fSopenharmony_ci
243a8c51b3fSopenharmony_ci    # Run the benchmarks and report the results
244a8c51b3fSopenharmony_ci    json1 = json1_orig = gbench.util.sort_benchmark_results(gbench.util.run_or_load_benchmark(
245a8c51b3fSopenharmony_ci        test_baseline, benchmark_options + options_baseline))
246a8c51b3fSopenharmony_ci    json2 = json2_orig = gbench.util.sort_benchmark_results(gbench.util.run_or_load_benchmark(
247a8c51b3fSopenharmony_ci        test_contender, benchmark_options + options_contender))
248a8c51b3fSopenharmony_ci
249a8c51b3fSopenharmony_ci    # Now, filter the benchmarks so that the difference report can work
250a8c51b3fSopenharmony_ci    if filter_baseline and filter_contender:
251a8c51b3fSopenharmony_ci        replacement = '[%s vs. %s]' % (filter_baseline, filter_contender)
252a8c51b3fSopenharmony_ci        json1 = gbench.report.filter_benchmark(
253a8c51b3fSopenharmony_ci            json1_orig, filter_baseline, replacement)
254a8c51b3fSopenharmony_ci        json2 = gbench.report.filter_benchmark(
255a8c51b3fSopenharmony_ci            json2_orig, filter_contender, replacement)
256a8c51b3fSopenharmony_ci
257a8c51b3fSopenharmony_ci    diff_report = gbench.report.get_difference_report(
258a8c51b3fSopenharmony_ci        json1, json2, args.utest)
259a8c51b3fSopenharmony_ci    output_lines = gbench.report.print_difference_report(
260a8c51b3fSopenharmony_ci        diff_report,
261a8c51b3fSopenharmony_ci        args.display_aggregates_only,
262a8c51b3fSopenharmony_ci        args.utest, args.utest_alpha, args.color)
263a8c51b3fSopenharmony_ci    print(description)
264a8c51b3fSopenharmony_ci    for ln in output_lines:
265a8c51b3fSopenharmony_ci        print(ln)
266a8c51b3fSopenharmony_ci
267a8c51b3fSopenharmony_ci    # Optionally, diff and output to JSON
268a8c51b3fSopenharmony_ci    if args.dump_to_json is not None:
269a8c51b3fSopenharmony_ci        with open(args.dump_to_json, 'w') as f_json:
270a8c51b3fSopenharmony_ci            json.dump(diff_report, f_json)
271a8c51b3fSopenharmony_ci
272a8c51b3fSopenharmony_ciclass TestParser(unittest.TestCase):
273a8c51b3fSopenharmony_ci    def setUp(self):
274a8c51b3fSopenharmony_ci        self.parser = create_parser()
275a8c51b3fSopenharmony_ci        testInputs = os.path.join(
276a8c51b3fSopenharmony_ci            os.path.dirname(
277a8c51b3fSopenharmony_ci                os.path.realpath(__file__)),
278a8c51b3fSopenharmony_ci            'gbench',
279a8c51b3fSopenharmony_ci            'Inputs')
280a8c51b3fSopenharmony_ci        self.testInput0 = os.path.join(testInputs, 'test1_run1.json')
281a8c51b3fSopenharmony_ci        self.testInput1 = os.path.join(testInputs, 'test1_run2.json')
282a8c51b3fSopenharmony_ci
283a8c51b3fSopenharmony_ci    def test_benchmarks_basic(self):
284a8c51b3fSopenharmony_ci        parsed = self.parser.parse_args(
285a8c51b3fSopenharmony_ci            ['benchmarks', self.testInput0, self.testInput1])
286a8c51b3fSopenharmony_ci        self.assertFalse(parsed.display_aggregates_only)
287a8c51b3fSopenharmony_ci        self.assertTrue(parsed.utest)
288a8c51b3fSopenharmony_ci        self.assertEqual(parsed.mode, 'benchmarks')
289a8c51b3fSopenharmony_ci        self.assertEqual(parsed.test_baseline[0].name, self.testInput0)
290a8c51b3fSopenharmony_ci        self.assertEqual(parsed.test_contender[0].name, self.testInput1)
291a8c51b3fSopenharmony_ci        self.assertFalse(parsed.benchmark_options)
292a8c51b3fSopenharmony_ci
293a8c51b3fSopenharmony_ci    def test_benchmarks_basic_without_utest(self):
294a8c51b3fSopenharmony_ci        parsed = self.parser.parse_args(
295a8c51b3fSopenharmony_ci            ['--no-utest', 'benchmarks', self.testInput0, self.testInput1])
296a8c51b3fSopenharmony_ci        self.assertFalse(parsed.display_aggregates_only)
297a8c51b3fSopenharmony_ci        self.assertFalse(parsed.utest)
298a8c51b3fSopenharmony_ci        self.assertEqual(parsed.utest_alpha, 0.05)
299a8c51b3fSopenharmony_ci        self.assertEqual(parsed.mode, 'benchmarks')
300a8c51b3fSopenharmony_ci        self.assertEqual(parsed.test_baseline[0].name, self.testInput0)
301a8c51b3fSopenharmony_ci        self.assertEqual(parsed.test_contender[0].name, self.testInput1)
302a8c51b3fSopenharmony_ci        self.assertFalse(parsed.benchmark_options)
303a8c51b3fSopenharmony_ci
304a8c51b3fSopenharmony_ci    def test_benchmarks_basic_display_aggregates_only(self):
305a8c51b3fSopenharmony_ci        parsed = self.parser.parse_args(
306a8c51b3fSopenharmony_ci            ['-a', 'benchmarks', self.testInput0, self.testInput1])
307a8c51b3fSopenharmony_ci        self.assertTrue(parsed.display_aggregates_only)
308a8c51b3fSopenharmony_ci        self.assertTrue(parsed.utest)
309a8c51b3fSopenharmony_ci        self.assertEqual(parsed.mode, 'benchmarks')
310a8c51b3fSopenharmony_ci        self.assertEqual(parsed.test_baseline[0].name, self.testInput0)
311a8c51b3fSopenharmony_ci        self.assertEqual(parsed.test_contender[0].name, self.testInput1)
312a8c51b3fSopenharmony_ci        self.assertFalse(parsed.benchmark_options)
313a8c51b3fSopenharmony_ci
314a8c51b3fSopenharmony_ci    def test_benchmarks_basic_with_utest_alpha(self):
315a8c51b3fSopenharmony_ci        parsed = self.parser.parse_args(
316a8c51b3fSopenharmony_ci            ['--alpha=0.314', 'benchmarks', self.testInput0, self.testInput1])
317a8c51b3fSopenharmony_ci        self.assertFalse(parsed.display_aggregates_only)
318a8c51b3fSopenharmony_ci        self.assertTrue(parsed.utest)
319a8c51b3fSopenharmony_ci        self.assertEqual(parsed.utest_alpha, 0.314)
320a8c51b3fSopenharmony_ci        self.assertEqual(parsed.mode, 'benchmarks')
321a8c51b3fSopenharmony_ci        self.assertEqual(parsed.test_baseline[0].name, self.testInput0)
322a8c51b3fSopenharmony_ci        self.assertEqual(parsed.test_contender[0].name, self.testInput1)
323a8c51b3fSopenharmony_ci        self.assertFalse(parsed.benchmark_options)
324a8c51b3fSopenharmony_ci
325a8c51b3fSopenharmony_ci    def test_benchmarks_basic_without_utest_with_utest_alpha(self):
326a8c51b3fSopenharmony_ci        parsed = self.parser.parse_args(
327a8c51b3fSopenharmony_ci            ['--no-utest', '--alpha=0.314', 'benchmarks', self.testInput0, self.testInput1])
328a8c51b3fSopenharmony_ci        self.assertFalse(parsed.display_aggregates_only)
329a8c51b3fSopenharmony_ci        self.assertFalse(parsed.utest)
330a8c51b3fSopenharmony_ci        self.assertEqual(parsed.utest_alpha, 0.314)
331a8c51b3fSopenharmony_ci        self.assertEqual(parsed.mode, 'benchmarks')
332a8c51b3fSopenharmony_ci        self.assertEqual(parsed.test_baseline[0].name, self.testInput0)
333a8c51b3fSopenharmony_ci        self.assertEqual(parsed.test_contender[0].name, self.testInput1)
334a8c51b3fSopenharmony_ci        self.assertFalse(parsed.benchmark_options)
335a8c51b3fSopenharmony_ci
336a8c51b3fSopenharmony_ci    def test_benchmarks_with_remainder(self):
337a8c51b3fSopenharmony_ci        parsed = self.parser.parse_args(
338a8c51b3fSopenharmony_ci            ['benchmarks', self.testInput0, self.testInput1, 'd'])
339a8c51b3fSopenharmony_ci        self.assertFalse(parsed.display_aggregates_only)
340a8c51b3fSopenharmony_ci        self.assertTrue(parsed.utest)
341a8c51b3fSopenharmony_ci        self.assertEqual(parsed.mode, 'benchmarks')
342a8c51b3fSopenharmony_ci        self.assertEqual(parsed.test_baseline[0].name, self.testInput0)
343a8c51b3fSopenharmony_ci        self.assertEqual(parsed.test_contender[0].name, self.testInput1)
344a8c51b3fSopenharmony_ci        self.assertEqual(parsed.benchmark_options, ['d'])
345a8c51b3fSopenharmony_ci
346a8c51b3fSopenharmony_ci    def test_benchmarks_with_remainder_after_doubleminus(self):
347a8c51b3fSopenharmony_ci        parsed = self.parser.parse_args(
348a8c51b3fSopenharmony_ci            ['benchmarks', self.testInput0, self.testInput1, '--', 'e'])
349a8c51b3fSopenharmony_ci        self.assertFalse(parsed.display_aggregates_only)
350a8c51b3fSopenharmony_ci        self.assertTrue(parsed.utest)
351a8c51b3fSopenharmony_ci        self.assertEqual(parsed.mode, 'benchmarks')
352a8c51b3fSopenharmony_ci        self.assertEqual(parsed.test_baseline[0].name, self.testInput0)
353a8c51b3fSopenharmony_ci        self.assertEqual(parsed.test_contender[0].name, self.testInput1)
354a8c51b3fSopenharmony_ci        self.assertEqual(parsed.benchmark_options, ['e'])
355a8c51b3fSopenharmony_ci
356a8c51b3fSopenharmony_ci    def test_filters_basic(self):
357a8c51b3fSopenharmony_ci        parsed = self.parser.parse_args(
358a8c51b3fSopenharmony_ci            ['filters', self.testInput0, 'c', 'd'])
359a8c51b3fSopenharmony_ci        self.assertFalse(parsed.display_aggregates_only)
360a8c51b3fSopenharmony_ci        self.assertTrue(parsed.utest)
361a8c51b3fSopenharmony_ci        self.assertEqual(parsed.mode, 'filters')
362a8c51b3fSopenharmony_ci        self.assertEqual(parsed.test[0].name, self.testInput0)
363a8c51b3fSopenharmony_ci        self.assertEqual(parsed.filter_baseline[0], 'c')
364a8c51b3fSopenharmony_ci        self.assertEqual(parsed.filter_contender[0], 'd')
365a8c51b3fSopenharmony_ci        self.assertFalse(parsed.benchmark_options)
366a8c51b3fSopenharmony_ci
367a8c51b3fSopenharmony_ci    def test_filters_with_remainder(self):
368a8c51b3fSopenharmony_ci        parsed = self.parser.parse_args(
369a8c51b3fSopenharmony_ci            ['filters', self.testInput0, 'c', 'd', 'e'])
370a8c51b3fSopenharmony_ci        self.assertFalse(parsed.display_aggregates_only)
371a8c51b3fSopenharmony_ci        self.assertTrue(parsed.utest)
372a8c51b3fSopenharmony_ci        self.assertEqual(parsed.mode, 'filters')
373a8c51b3fSopenharmony_ci        self.assertEqual(parsed.test[0].name, self.testInput0)
374a8c51b3fSopenharmony_ci        self.assertEqual(parsed.filter_baseline[0], 'c')
375a8c51b3fSopenharmony_ci        self.assertEqual(parsed.filter_contender[0], 'd')
376a8c51b3fSopenharmony_ci        self.assertEqual(parsed.benchmark_options, ['e'])
377a8c51b3fSopenharmony_ci
378a8c51b3fSopenharmony_ci    def test_filters_with_remainder_after_doubleminus(self):
379a8c51b3fSopenharmony_ci        parsed = self.parser.parse_args(
380a8c51b3fSopenharmony_ci            ['filters', self.testInput0, 'c', 'd', '--', 'f'])
381a8c51b3fSopenharmony_ci        self.assertFalse(parsed.display_aggregates_only)
382a8c51b3fSopenharmony_ci        self.assertTrue(parsed.utest)
383a8c51b3fSopenharmony_ci        self.assertEqual(parsed.mode, 'filters')
384a8c51b3fSopenharmony_ci        self.assertEqual(parsed.test[0].name, self.testInput0)
385a8c51b3fSopenharmony_ci        self.assertEqual(parsed.filter_baseline[0], 'c')
386a8c51b3fSopenharmony_ci        self.assertEqual(parsed.filter_contender[0], 'd')
387a8c51b3fSopenharmony_ci        self.assertEqual(parsed.benchmark_options, ['f'])
388a8c51b3fSopenharmony_ci
389a8c51b3fSopenharmony_ci    def test_benchmarksfiltered_basic(self):
390a8c51b3fSopenharmony_ci        parsed = self.parser.parse_args(
391a8c51b3fSopenharmony_ci            ['benchmarksfiltered', self.testInput0, 'c', self.testInput1, 'e'])
392a8c51b3fSopenharmony_ci        self.assertFalse(parsed.display_aggregates_only)
393a8c51b3fSopenharmony_ci        self.assertTrue(parsed.utest)
394a8c51b3fSopenharmony_ci        self.assertEqual(parsed.mode, 'benchmarksfiltered')
395a8c51b3fSopenharmony_ci        self.assertEqual(parsed.test_baseline[0].name, self.testInput0)
396a8c51b3fSopenharmony_ci        self.assertEqual(parsed.filter_baseline[0], 'c')
397a8c51b3fSopenharmony_ci        self.assertEqual(parsed.test_contender[0].name, self.testInput1)
398a8c51b3fSopenharmony_ci        self.assertEqual(parsed.filter_contender[0], 'e')
399a8c51b3fSopenharmony_ci        self.assertFalse(parsed.benchmark_options)
400a8c51b3fSopenharmony_ci
401a8c51b3fSopenharmony_ci    def test_benchmarksfiltered_with_remainder(self):
402a8c51b3fSopenharmony_ci        parsed = self.parser.parse_args(
403a8c51b3fSopenharmony_ci            ['benchmarksfiltered', self.testInput0, 'c', self.testInput1, 'e', 'f'])
404a8c51b3fSopenharmony_ci        self.assertFalse(parsed.display_aggregates_only)
405a8c51b3fSopenharmony_ci        self.assertTrue(parsed.utest)
406a8c51b3fSopenharmony_ci        self.assertEqual(parsed.mode, 'benchmarksfiltered')
407a8c51b3fSopenharmony_ci        self.assertEqual(parsed.test_baseline[0].name, self.testInput0)
408a8c51b3fSopenharmony_ci        self.assertEqual(parsed.filter_baseline[0], 'c')
409a8c51b3fSopenharmony_ci        self.assertEqual(parsed.test_contender[0].name, self.testInput1)
410a8c51b3fSopenharmony_ci        self.assertEqual(parsed.filter_contender[0], 'e')
411a8c51b3fSopenharmony_ci        self.assertEqual(parsed.benchmark_options[0], 'f')
412a8c51b3fSopenharmony_ci
413a8c51b3fSopenharmony_ci    def test_benchmarksfiltered_with_remainder_after_doubleminus(self):
414a8c51b3fSopenharmony_ci        parsed = self.parser.parse_args(
415a8c51b3fSopenharmony_ci            ['benchmarksfiltered', self.testInput0, 'c', self.testInput1, 'e', '--', 'g'])
416a8c51b3fSopenharmony_ci        self.assertFalse(parsed.display_aggregates_only)
417a8c51b3fSopenharmony_ci        self.assertTrue(parsed.utest)
418a8c51b3fSopenharmony_ci        self.assertEqual(parsed.mode, 'benchmarksfiltered')
419a8c51b3fSopenharmony_ci        self.assertEqual(parsed.test_baseline[0].name, self.testInput0)
420a8c51b3fSopenharmony_ci        self.assertEqual(parsed.filter_baseline[0], 'c')
421a8c51b3fSopenharmony_ci        self.assertEqual(parsed.test_contender[0].name, self.testInput1)
422a8c51b3fSopenharmony_ci        self.assertEqual(parsed.filter_contender[0], 'e')
423a8c51b3fSopenharmony_ci        self.assertEqual(parsed.benchmark_options[0], 'g')
424a8c51b3fSopenharmony_ci
425a8c51b3fSopenharmony_ci
426a8c51b3fSopenharmony_ciif __name__ == '__main__':
427a8c51b3fSopenharmony_ci    # unittest.main()
428a8c51b3fSopenharmony_ci    main()
429a8c51b3fSopenharmony_ci
430a8c51b3fSopenharmony_ci# vim: tabstop=4 expandtab shiftwidth=4 softtabstop=4
431a8c51b3fSopenharmony_ci# kate: tab-width: 4; replace-tabs on; indent-width 4; tab-indents: off;
432a8c51b3fSopenharmony_ci# kate: indent-mode python; remove-trailing-spaces modified;
433