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