xref: /llvm-project/third-party/benchmark/tools/compare.py (revision a5b797172cc902db166e9a695716fb81405f86e4)
1*a5b79717SMircea Trofin#!/usr/bin/env python3
25dda2efdSMircea Trofin
3*a5b79717SMircea Trofin# type: ignore
4f98ee40fSTobias Hieta
55dda2efdSMircea Trofin"""
65dda2efdSMircea Trofincompare.py - versatile benchmark output compare tool
75dda2efdSMircea Trofin"""
85dda2efdSMircea Trofin
95dda2efdSMircea Trofinimport argparse
10aec6a04bSMircea Trofinimport json
11*a5b79717SMircea Trofinimport os
12aec6a04bSMircea Trofinimport sys
13*a5b79717SMircea Trofinimport unittest
14*a5b79717SMircea Trofinfrom argparse import ArgumentParser
15*a5b79717SMircea Trofin
165dda2efdSMircea Trofinimport gbench
17*a5b79717SMircea Trofinfrom gbench import report, util
185dda2efdSMircea Trofin
195dda2efdSMircea Trofin
205dda2efdSMircea Trofindef check_inputs(in1, in2, flags):
215dda2efdSMircea Trofin    """
225dda2efdSMircea Trofin    Perform checking on the user provided inputs and diagnose any abnormalities
235dda2efdSMircea Trofin    """
24*a5b79717SMircea Trofin    in1_kind, in1_err = util.classify_input_file(in1)
25*a5b79717SMircea Trofin    in2_kind, in2_err = util.classify_input_file(in2)
26*a5b79717SMircea Trofin    output_file = util.find_benchmark_flag("--benchmark_out=", flags)
27*a5b79717SMircea Trofin    output_type = util.find_benchmark_flag("--benchmark_out_format=", flags)
28*a5b79717SMircea Trofin    if (
29*a5b79717SMircea Trofin        in1_kind == util.IT_Executable
30*a5b79717SMircea Trofin        and in2_kind == util.IT_Executable
31*a5b79717SMircea Trofin        and output_file
32*a5b79717SMircea Trofin    ):
33f98ee40fSTobias Hieta        print(
34f98ee40fSTobias Hieta            (
35f98ee40fSTobias Hieta                "WARNING: '--benchmark_out=%s' will be passed to both "
36f98ee40fSTobias Hieta                "benchmarks causing it to be overwritten"
37f98ee40fSTobias Hieta            )
38f98ee40fSTobias Hieta            % output_file
39f98ee40fSTobias Hieta        )
40*a5b79717SMircea Trofin    if in1_kind == util.IT_JSON and in2_kind == util.IT_JSON:
41*a5b79717SMircea Trofin        # When both sides are JSON the only supported flag is
42*a5b79717SMircea Trofin        # --benchmark_filter=
43*a5b79717SMircea Trofin        for flag in util.remove_benchmark_flags("--benchmark_filter=", flags):
44f98ee40fSTobias Hieta            print(
45*a5b79717SMircea Trofin                "WARNING: passing %s has no effect since both "
46*a5b79717SMircea Trofin                "inputs are JSON" % flag
47f98ee40fSTobias Hieta            )
48f98ee40fSTobias Hieta    if output_type is not None and output_type != "json":
49f98ee40fSTobias Hieta        print(
50f98ee40fSTobias Hieta            (
51f98ee40fSTobias Hieta                "ERROR: passing '--benchmark_out_format=%s' to 'compare.py`"
52f98ee40fSTobias Hieta                " is not supported."
53f98ee40fSTobias Hieta            )
54f98ee40fSTobias Hieta            % output_type
55f98ee40fSTobias Hieta        )
565dda2efdSMircea Trofin        sys.exit(1)
575dda2efdSMircea Trofin
585dda2efdSMircea Trofin
595dda2efdSMircea Trofindef create_parser():
60*a5b79717SMircea Trofin    parser = ArgumentParser(
61*a5b79717SMircea Trofin        description="versatile benchmark output compare tool"
62*a5b79717SMircea Trofin    )
635dda2efdSMircea Trofin
645dda2efdSMircea Trofin    parser.add_argument(
65f98ee40fSTobias Hieta        "-a",
66f98ee40fSTobias Hieta        "--display_aggregates_only",
67f98ee40fSTobias Hieta        dest="display_aggregates_only",
685dda2efdSMircea Trofin        action="store_true",
695dda2efdSMircea Trofin        help="If there are repetitions, by default, we display everything - the"
705dda2efdSMircea Trofin        " actual runs, and the aggregates computed. Sometimes, it is "
715dda2efdSMircea Trofin        "desirable to only view the aggregates. E.g. when there are a lot "
725dda2efdSMircea Trofin        "of repetitions. Do note that only the display is affected. "
73f98ee40fSTobias Hieta        "Internally, all the actual runs are still used, e.g. for U test.",
745dda2efdSMircea Trofin    )
755dda2efdSMircea Trofin
765dda2efdSMircea Trofin    parser.add_argument(
77f98ee40fSTobias Hieta        "--no-color",
78f98ee40fSTobias Hieta        dest="color",
79f98ee40fSTobias Hieta        default=True,
80f98ee40fSTobias Hieta        action="store_false",
81f98ee40fSTobias Hieta        help="Do not use colors in the terminal output",
82f98ee40fSTobias Hieta    )
83f98ee40fSTobias Hieta
84f98ee40fSTobias Hieta    parser.add_argument(
85f98ee40fSTobias Hieta        "-d",
86f98ee40fSTobias Hieta        "--dump_to_json",
87f98ee40fSTobias Hieta        dest="dump_to_json",
88f98ee40fSTobias Hieta        help="Additionally, dump benchmark comparison output to this file in JSON format.",
89f98ee40fSTobias Hieta    )
905dda2efdSMircea Trofin
915dda2efdSMircea Trofin    utest = parser.add_argument_group()
925dda2efdSMircea Trofin    utest.add_argument(
93f98ee40fSTobias Hieta        "--no-utest",
94f98ee40fSTobias Hieta        dest="utest",
955dda2efdSMircea Trofin        default=True,
965dda2efdSMircea Trofin        action="store_false",
97f98ee40fSTobias Hieta        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(
98f98ee40fSTobias Hieta            report.UTEST_OPTIMAL_REPETITIONS, report.UTEST_MIN_REPETITIONS
99f98ee40fSTobias Hieta        ),
100f98ee40fSTobias Hieta    )
1015dda2efdSMircea Trofin    alpha_default = 0.05
1025dda2efdSMircea Trofin    utest.add_argument(
1035dda2efdSMircea Trofin        "--alpha",
104f98ee40fSTobias Hieta        dest="utest_alpha",
1055dda2efdSMircea Trofin        default=alpha_default,
1065dda2efdSMircea Trofin        type=float,
107f98ee40fSTobias Hieta        help=(
108f98ee40fSTobias Hieta            "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)"
109f98ee40fSTobias Hieta        )
110f98ee40fSTobias Hieta        % alpha_default,
111f98ee40fSTobias Hieta    )
1125dda2efdSMircea Trofin
1135dda2efdSMircea Trofin    subparsers = parser.add_subparsers(
114f98ee40fSTobias Hieta        help="This tool has multiple modes of operation:", dest="mode"
115f98ee40fSTobias Hieta    )
1165dda2efdSMircea Trofin
1175dda2efdSMircea Trofin    parser_a = subparsers.add_parser(
118f98ee40fSTobias Hieta        "benchmarks",
119f98ee40fSTobias Hieta        help="The most simple use-case, compare all the output of these two benchmarks",
120f98ee40fSTobias Hieta    )
121f98ee40fSTobias Hieta    baseline = parser_a.add_argument_group("baseline", "The benchmark baseline")
1225dda2efdSMircea Trofin    baseline.add_argument(
123f98ee40fSTobias Hieta        "test_baseline",
124f98ee40fSTobias Hieta        metavar="test_baseline",
125f98ee40fSTobias Hieta        type=argparse.FileType("r"),
1265dda2efdSMircea Trofin        nargs=1,
127f98ee40fSTobias Hieta        help="A benchmark executable or JSON output file",
128f98ee40fSTobias Hieta    )
1295dda2efdSMircea Trofin    contender = parser_a.add_argument_group(
130f98ee40fSTobias Hieta        "contender", "The benchmark that will be compared against the baseline"
131f98ee40fSTobias Hieta    )
1325dda2efdSMircea Trofin    contender.add_argument(
133f98ee40fSTobias Hieta        "test_contender",
134f98ee40fSTobias Hieta        metavar="test_contender",
135f98ee40fSTobias Hieta        type=argparse.FileType("r"),
1365dda2efdSMircea Trofin        nargs=1,
137f98ee40fSTobias Hieta        help="A benchmark executable or JSON output file",
138f98ee40fSTobias Hieta    )
1395dda2efdSMircea Trofin    parser_a.add_argument(
140f98ee40fSTobias Hieta        "benchmark_options",
141f98ee40fSTobias Hieta        metavar="benchmark_options",
1425dda2efdSMircea Trofin        nargs=argparse.REMAINDER,
143f98ee40fSTobias Hieta        help="Arguments to pass when running benchmark executables",
144f98ee40fSTobias Hieta    )
1455dda2efdSMircea Trofin
1465dda2efdSMircea Trofin    parser_b = subparsers.add_parser(
147f98ee40fSTobias Hieta        "filters", help="Compare filter one with the filter two of benchmark"
148f98ee40fSTobias Hieta    )
149f98ee40fSTobias Hieta    baseline = parser_b.add_argument_group("baseline", "The benchmark baseline")
1505dda2efdSMircea Trofin    baseline.add_argument(
151f98ee40fSTobias Hieta        "test",
152f98ee40fSTobias Hieta        metavar="test",
153f98ee40fSTobias Hieta        type=argparse.FileType("r"),
1545dda2efdSMircea Trofin        nargs=1,
155f98ee40fSTobias Hieta        help="A benchmark executable or JSON output file",
156f98ee40fSTobias Hieta    )
1575dda2efdSMircea Trofin    baseline.add_argument(
158f98ee40fSTobias Hieta        "filter_baseline",
159f98ee40fSTobias Hieta        metavar="filter_baseline",
1605dda2efdSMircea Trofin        type=str,
1615dda2efdSMircea Trofin        nargs=1,
162f98ee40fSTobias Hieta        help="The first filter, that will be used as baseline",
163f98ee40fSTobias Hieta    )
1645dda2efdSMircea Trofin    contender = parser_b.add_argument_group(
165f98ee40fSTobias Hieta        "contender", "The benchmark that will be compared against the baseline"
166f98ee40fSTobias Hieta    )
1675dda2efdSMircea Trofin    contender.add_argument(
168f98ee40fSTobias Hieta        "filter_contender",
169f98ee40fSTobias Hieta        metavar="filter_contender",
1705dda2efdSMircea Trofin        type=str,
1715dda2efdSMircea Trofin        nargs=1,
172f98ee40fSTobias Hieta        help="The second filter, that will be compared against the baseline",
173f98ee40fSTobias Hieta    )
1745dda2efdSMircea Trofin    parser_b.add_argument(
175f98ee40fSTobias Hieta        "benchmark_options",
176f98ee40fSTobias Hieta        metavar="benchmark_options",
1775dda2efdSMircea Trofin        nargs=argparse.REMAINDER,
178f98ee40fSTobias Hieta        help="Arguments to pass when running benchmark executables",
179f98ee40fSTobias Hieta    )
1805dda2efdSMircea Trofin
1815dda2efdSMircea Trofin    parser_c = subparsers.add_parser(
182f98ee40fSTobias Hieta        "benchmarksfiltered",
183f98ee40fSTobias Hieta        help="Compare filter one of first benchmark with filter two of the second benchmark",
184f98ee40fSTobias Hieta    )
185f98ee40fSTobias Hieta    baseline = parser_c.add_argument_group("baseline", "The benchmark baseline")
1865dda2efdSMircea Trofin    baseline.add_argument(
187f98ee40fSTobias Hieta        "test_baseline",
188f98ee40fSTobias Hieta        metavar="test_baseline",
189f98ee40fSTobias Hieta        type=argparse.FileType("r"),
1905dda2efdSMircea Trofin        nargs=1,
191f98ee40fSTobias Hieta        help="A benchmark executable or JSON output file",
192f98ee40fSTobias Hieta    )
1935dda2efdSMircea Trofin    baseline.add_argument(
194f98ee40fSTobias Hieta        "filter_baseline",
195f98ee40fSTobias Hieta        metavar="filter_baseline",
1965dda2efdSMircea Trofin        type=str,
1975dda2efdSMircea Trofin        nargs=1,
198f98ee40fSTobias Hieta        help="The first filter, that will be used as baseline",
199f98ee40fSTobias Hieta    )
2005dda2efdSMircea Trofin    contender = parser_c.add_argument_group(
201f98ee40fSTobias Hieta        "contender", "The benchmark that will be compared against the baseline"
202f98ee40fSTobias Hieta    )
2035dda2efdSMircea Trofin    contender.add_argument(
204f98ee40fSTobias Hieta        "test_contender",
205f98ee40fSTobias Hieta        metavar="test_contender",
206f98ee40fSTobias Hieta        type=argparse.FileType("r"),
2075dda2efdSMircea Trofin        nargs=1,
208f98ee40fSTobias Hieta        help="The second benchmark executable or JSON output file, that will be compared against the baseline",
209f98ee40fSTobias Hieta    )
2105dda2efdSMircea Trofin    contender.add_argument(
211f98ee40fSTobias Hieta        "filter_contender",
212f98ee40fSTobias Hieta        metavar="filter_contender",
2135dda2efdSMircea Trofin        type=str,
2145dda2efdSMircea Trofin        nargs=1,
215f98ee40fSTobias Hieta        help="The second filter, that will be compared against the baseline",
216f98ee40fSTobias Hieta    )
2175dda2efdSMircea Trofin    parser_c.add_argument(
218f98ee40fSTobias Hieta        "benchmark_options",
219f98ee40fSTobias Hieta        metavar="benchmark_options",
2205dda2efdSMircea Trofin        nargs=argparse.REMAINDER,
221f98ee40fSTobias Hieta        help="Arguments to pass when running benchmark executables",
222f98ee40fSTobias Hieta    )
2235dda2efdSMircea Trofin
2245dda2efdSMircea Trofin    return parser
2255dda2efdSMircea Trofin
2265dda2efdSMircea Trofin
2275dda2efdSMircea Trofindef main():
2285dda2efdSMircea Trofin    # Parse the command line flags
2295dda2efdSMircea Trofin    parser = create_parser()
2305dda2efdSMircea Trofin    args, unknown_args = parser.parse_known_args()
2315dda2efdSMircea Trofin    if args.mode is None:
2325dda2efdSMircea Trofin        parser.print_help()
2335dda2efdSMircea Trofin        exit(1)
2345dda2efdSMircea Trofin    assert not unknown_args
2355dda2efdSMircea Trofin    benchmark_options = args.benchmark_options
2365dda2efdSMircea Trofin
237f98ee40fSTobias Hieta    if args.mode == "benchmarks":
2385dda2efdSMircea Trofin        test_baseline = args.test_baseline[0].name
2395dda2efdSMircea Trofin        test_contender = args.test_contender[0].name
240f98ee40fSTobias Hieta        filter_baseline = ""
241f98ee40fSTobias Hieta        filter_contender = ""
2425dda2efdSMircea Trofin
2435dda2efdSMircea Trofin        # NOTE: if test_baseline == test_contender, you are analyzing the stdev
2445dda2efdSMircea Trofin
245f98ee40fSTobias Hieta        description = "Comparing %s to %s" % (test_baseline, test_contender)
246f98ee40fSTobias Hieta    elif args.mode == "filters":
2475dda2efdSMircea Trofin        test_baseline = args.test[0].name
2485dda2efdSMircea Trofin        test_contender = args.test[0].name
2495dda2efdSMircea Trofin        filter_baseline = args.filter_baseline[0]
2505dda2efdSMircea Trofin        filter_contender = args.filter_contender[0]
2515dda2efdSMircea Trofin
2525dda2efdSMircea Trofin        # NOTE: if filter_baseline == filter_contender, you are analyzing the
2535dda2efdSMircea Trofin        # stdev
2545dda2efdSMircea Trofin
255f98ee40fSTobias Hieta        description = "Comparing %s to %s (from %s)" % (
256f98ee40fSTobias Hieta            filter_baseline,
257f98ee40fSTobias Hieta            filter_contender,
258f98ee40fSTobias Hieta            args.test[0].name,
259f98ee40fSTobias Hieta        )
260f98ee40fSTobias Hieta    elif args.mode == "benchmarksfiltered":
2615dda2efdSMircea Trofin        test_baseline = args.test_baseline[0].name
2625dda2efdSMircea Trofin        test_contender = args.test_contender[0].name
2635dda2efdSMircea Trofin        filter_baseline = args.filter_baseline[0]
2645dda2efdSMircea Trofin        filter_contender = args.filter_contender[0]
2655dda2efdSMircea Trofin
2665dda2efdSMircea Trofin        # NOTE: if test_baseline == test_contender and
2675dda2efdSMircea Trofin        # filter_baseline == filter_contender, you are analyzing the stdev
2685dda2efdSMircea Trofin
269f98ee40fSTobias Hieta        description = "Comparing %s (from %s) to %s (from %s)" % (
270f98ee40fSTobias Hieta            filter_baseline,
271f98ee40fSTobias Hieta            test_baseline,
272f98ee40fSTobias Hieta            filter_contender,
273f98ee40fSTobias Hieta            test_contender,
274f98ee40fSTobias Hieta        )
2755dda2efdSMircea Trofin    else:
2765dda2efdSMircea Trofin        # should never happen
2775dda2efdSMircea Trofin        print("Unrecognized mode of operation: '%s'" % args.mode)
2785dda2efdSMircea Trofin        parser.print_help()
2795dda2efdSMircea Trofin        exit(1)
2805dda2efdSMircea Trofin
2815dda2efdSMircea Trofin    check_inputs(test_baseline, test_contender, benchmark_options)
2825dda2efdSMircea Trofin
2835dda2efdSMircea Trofin    if args.display_aggregates_only:
284f98ee40fSTobias Hieta        benchmark_options += ["--benchmark_display_aggregates_only=true"]
2855dda2efdSMircea Trofin
2865dda2efdSMircea Trofin    options_baseline = []
2875dda2efdSMircea Trofin    options_contender = []
2885dda2efdSMircea Trofin
2895dda2efdSMircea Trofin    if filter_baseline and filter_contender:
290f98ee40fSTobias Hieta        options_baseline = ["--benchmark_filter=%s" % filter_baseline]
291f98ee40fSTobias Hieta        options_contender = ["--benchmark_filter=%s" % filter_contender]
2925dda2efdSMircea Trofin
2935dda2efdSMircea Trofin    # Run the benchmarks and report the results
294f98ee40fSTobias Hieta    json1 = json1_orig = gbench.util.sort_benchmark_results(
295f98ee40fSTobias Hieta        gbench.util.run_or_load_benchmark(
296f98ee40fSTobias Hieta            test_baseline, benchmark_options + options_baseline
297f98ee40fSTobias Hieta        )
298f98ee40fSTobias Hieta    )
299f98ee40fSTobias Hieta    json2 = json2_orig = gbench.util.sort_benchmark_results(
300f98ee40fSTobias Hieta        gbench.util.run_or_load_benchmark(
301f98ee40fSTobias Hieta            test_contender, benchmark_options + options_contender
302f98ee40fSTobias Hieta        )
303f98ee40fSTobias Hieta    )
3045dda2efdSMircea Trofin
3055dda2efdSMircea Trofin    # Now, filter the benchmarks so that the difference report can work
3065dda2efdSMircea Trofin    if filter_baseline and filter_contender:
307f98ee40fSTobias Hieta        replacement = "[%s vs. %s]" % (filter_baseline, filter_contender)
308*a5b79717SMircea Trofin        json1 = gbench.report.filter_benchmark(
309*a5b79717SMircea Trofin            json1_orig, filter_baseline, replacement
310*a5b79717SMircea Trofin        )
3115dda2efdSMircea Trofin        json2 = gbench.report.filter_benchmark(
312f98ee40fSTobias Hieta            json2_orig, filter_contender, replacement
313f98ee40fSTobias Hieta        )
3145dda2efdSMircea Trofin
315f98ee40fSTobias Hieta    diff_report = gbench.report.get_difference_report(json1, json2, args.utest)
3165dda2efdSMircea Trofin    output_lines = gbench.report.print_difference_report(
3175dda2efdSMircea Trofin        diff_report,
3185dda2efdSMircea Trofin        args.display_aggregates_only,
319f98ee40fSTobias Hieta        args.utest,
320f98ee40fSTobias Hieta        args.utest_alpha,
321f98ee40fSTobias Hieta        args.color,
322f98ee40fSTobias Hieta    )
3235dda2efdSMircea Trofin    print(description)
3245dda2efdSMircea Trofin    for ln in output_lines:
3255dda2efdSMircea Trofin        print(ln)
3265dda2efdSMircea Trofin
3275dda2efdSMircea Trofin    # Optionally, diff and output to JSON
3285dda2efdSMircea Trofin    if args.dump_to_json is not None:
329f98ee40fSTobias Hieta        with open(args.dump_to_json, "w") as f_json:
330*a5b79717SMircea Trofin            json.dump(diff_report, f_json, indent=1)
3315dda2efdSMircea Trofin
332f98ee40fSTobias Hieta
3335dda2efdSMircea Trofinclass TestParser(unittest.TestCase):
3345dda2efdSMircea Trofin    def setUp(self):
3355dda2efdSMircea Trofin        self.parser = create_parser()
3365dda2efdSMircea Trofin        testInputs = os.path.join(
337f98ee40fSTobias Hieta            os.path.dirname(os.path.realpath(__file__)), "gbench", "Inputs"
338f98ee40fSTobias Hieta        )
339f98ee40fSTobias Hieta        self.testInput0 = os.path.join(testInputs, "test1_run1.json")
340f98ee40fSTobias Hieta        self.testInput1 = os.path.join(testInputs, "test1_run2.json")
3415dda2efdSMircea Trofin
3425dda2efdSMircea Trofin    def test_benchmarks_basic(self):
3435dda2efdSMircea Trofin        parsed = self.parser.parse_args(
344f98ee40fSTobias Hieta            ["benchmarks", self.testInput0, self.testInput1]
345f98ee40fSTobias Hieta        )
3465dda2efdSMircea Trofin        self.assertFalse(parsed.display_aggregates_only)
3475dda2efdSMircea Trofin        self.assertTrue(parsed.utest)
348f98ee40fSTobias Hieta        self.assertEqual(parsed.mode, "benchmarks")
3495dda2efdSMircea Trofin        self.assertEqual(parsed.test_baseline[0].name, self.testInput0)
3505dda2efdSMircea Trofin        self.assertEqual(parsed.test_contender[0].name, self.testInput1)
3515dda2efdSMircea Trofin        self.assertFalse(parsed.benchmark_options)
3525dda2efdSMircea Trofin
3535dda2efdSMircea Trofin    def test_benchmarks_basic_without_utest(self):
3545dda2efdSMircea Trofin        parsed = self.parser.parse_args(
355f98ee40fSTobias Hieta            ["--no-utest", "benchmarks", self.testInput0, self.testInput1]
356f98ee40fSTobias Hieta        )
3575dda2efdSMircea Trofin        self.assertFalse(parsed.display_aggregates_only)
3585dda2efdSMircea Trofin        self.assertFalse(parsed.utest)
3595dda2efdSMircea Trofin        self.assertEqual(parsed.utest_alpha, 0.05)
360f98ee40fSTobias Hieta        self.assertEqual(parsed.mode, "benchmarks")
3615dda2efdSMircea Trofin        self.assertEqual(parsed.test_baseline[0].name, self.testInput0)
3625dda2efdSMircea Trofin        self.assertEqual(parsed.test_contender[0].name, self.testInput1)
3635dda2efdSMircea Trofin        self.assertFalse(parsed.benchmark_options)
3645dda2efdSMircea Trofin
3655dda2efdSMircea Trofin    def test_benchmarks_basic_display_aggregates_only(self):
3665dda2efdSMircea Trofin        parsed = self.parser.parse_args(
367f98ee40fSTobias Hieta            ["-a", "benchmarks", self.testInput0, self.testInput1]
368f98ee40fSTobias Hieta        )
3695dda2efdSMircea Trofin        self.assertTrue(parsed.display_aggregates_only)
3705dda2efdSMircea Trofin        self.assertTrue(parsed.utest)
371f98ee40fSTobias Hieta        self.assertEqual(parsed.mode, "benchmarks")
3725dda2efdSMircea Trofin        self.assertEqual(parsed.test_baseline[0].name, self.testInput0)
3735dda2efdSMircea Trofin        self.assertEqual(parsed.test_contender[0].name, self.testInput1)
3745dda2efdSMircea Trofin        self.assertFalse(parsed.benchmark_options)
3755dda2efdSMircea Trofin
3765dda2efdSMircea Trofin    def test_benchmarks_basic_with_utest_alpha(self):
3775dda2efdSMircea Trofin        parsed = self.parser.parse_args(
378f98ee40fSTobias Hieta            ["--alpha=0.314", "benchmarks", self.testInput0, self.testInput1]
379f98ee40fSTobias Hieta        )
3805dda2efdSMircea Trofin        self.assertFalse(parsed.display_aggregates_only)
3815dda2efdSMircea Trofin        self.assertTrue(parsed.utest)
3825dda2efdSMircea Trofin        self.assertEqual(parsed.utest_alpha, 0.314)
383f98ee40fSTobias Hieta        self.assertEqual(parsed.mode, "benchmarks")
3845dda2efdSMircea Trofin        self.assertEqual(parsed.test_baseline[0].name, self.testInput0)
3855dda2efdSMircea Trofin        self.assertEqual(parsed.test_contender[0].name, self.testInput1)
3865dda2efdSMircea Trofin        self.assertFalse(parsed.benchmark_options)
3875dda2efdSMircea Trofin
3885dda2efdSMircea Trofin    def test_benchmarks_basic_without_utest_with_utest_alpha(self):
3895dda2efdSMircea Trofin        parsed = self.parser.parse_args(
390f98ee40fSTobias Hieta            [
391f98ee40fSTobias Hieta                "--no-utest",
392f98ee40fSTobias Hieta                "--alpha=0.314",
393f98ee40fSTobias Hieta                "benchmarks",
394f98ee40fSTobias Hieta                self.testInput0,
395f98ee40fSTobias Hieta                self.testInput1,
396f98ee40fSTobias Hieta            ]
397f98ee40fSTobias Hieta        )
3985dda2efdSMircea Trofin        self.assertFalse(parsed.display_aggregates_only)
3995dda2efdSMircea Trofin        self.assertFalse(parsed.utest)
4005dda2efdSMircea Trofin        self.assertEqual(parsed.utest_alpha, 0.314)
401f98ee40fSTobias Hieta        self.assertEqual(parsed.mode, "benchmarks")
4025dda2efdSMircea Trofin        self.assertEqual(parsed.test_baseline[0].name, self.testInput0)
4035dda2efdSMircea Trofin        self.assertEqual(parsed.test_contender[0].name, self.testInput1)
4045dda2efdSMircea Trofin        self.assertFalse(parsed.benchmark_options)
4055dda2efdSMircea Trofin
4065dda2efdSMircea Trofin    def test_benchmarks_with_remainder(self):
4075dda2efdSMircea Trofin        parsed = self.parser.parse_args(
408f98ee40fSTobias Hieta            ["benchmarks", self.testInput0, self.testInput1, "d"]
409f98ee40fSTobias Hieta        )
4105dda2efdSMircea Trofin        self.assertFalse(parsed.display_aggregates_only)
4115dda2efdSMircea Trofin        self.assertTrue(parsed.utest)
412f98ee40fSTobias Hieta        self.assertEqual(parsed.mode, "benchmarks")
4135dda2efdSMircea Trofin        self.assertEqual(parsed.test_baseline[0].name, self.testInput0)
4145dda2efdSMircea Trofin        self.assertEqual(parsed.test_contender[0].name, self.testInput1)
415f98ee40fSTobias Hieta        self.assertEqual(parsed.benchmark_options, ["d"])
4165dda2efdSMircea Trofin
4175dda2efdSMircea Trofin    def test_benchmarks_with_remainder_after_doubleminus(self):
4185dda2efdSMircea Trofin        parsed = self.parser.parse_args(
419f98ee40fSTobias Hieta            ["benchmarks", self.testInput0, self.testInput1, "--", "e"]
420f98ee40fSTobias Hieta        )
4215dda2efdSMircea Trofin        self.assertFalse(parsed.display_aggregates_only)
4225dda2efdSMircea Trofin        self.assertTrue(parsed.utest)
423f98ee40fSTobias Hieta        self.assertEqual(parsed.mode, "benchmarks")
4245dda2efdSMircea Trofin        self.assertEqual(parsed.test_baseline[0].name, self.testInput0)
4255dda2efdSMircea Trofin        self.assertEqual(parsed.test_contender[0].name, self.testInput1)
426f98ee40fSTobias Hieta        self.assertEqual(parsed.benchmark_options, ["e"])
4275dda2efdSMircea Trofin
4285dda2efdSMircea Trofin    def test_filters_basic(self):
429f98ee40fSTobias Hieta        parsed = self.parser.parse_args(["filters", self.testInput0, "c", "d"])
4305dda2efdSMircea Trofin        self.assertFalse(parsed.display_aggregates_only)
4315dda2efdSMircea Trofin        self.assertTrue(parsed.utest)
432f98ee40fSTobias Hieta        self.assertEqual(parsed.mode, "filters")
4335dda2efdSMircea Trofin        self.assertEqual(parsed.test[0].name, self.testInput0)
434f98ee40fSTobias Hieta        self.assertEqual(parsed.filter_baseline[0], "c")
435f98ee40fSTobias Hieta        self.assertEqual(parsed.filter_contender[0], "d")
4365dda2efdSMircea Trofin        self.assertFalse(parsed.benchmark_options)
4375dda2efdSMircea Trofin
4385dda2efdSMircea Trofin    def test_filters_with_remainder(self):
439*a5b79717SMircea Trofin        parsed = self.parser.parse_args(
440*a5b79717SMircea Trofin            ["filters", self.testInput0, "c", "d", "e"]
441*a5b79717SMircea Trofin        )
4425dda2efdSMircea Trofin        self.assertFalse(parsed.display_aggregates_only)
4435dda2efdSMircea Trofin        self.assertTrue(parsed.utest)
444f98ee40fSTobias Hieta        self.assertEqual(parsed.mode, "filters")
4455dda2efdSMircea Trofin        self.assertEqual(parsed.test[0].name, self.testInput0)
446f98ee40fSTobias Hieta        self.assertEqual(parsed.filter_baseline[0], "c")
447f98ee40fSTobias Hieta        self.assertEqual(parsed.filter_contender[0], "d")
448f98ee40fSTobias Hieta        self.assertEqual(parsed.benchmark_options, ["e"])
4495dda2efdSMircea Trofin
4505dda2efdSMircea Trofin    def test_filters_with_remainder_after_doubleminus(self):
4515dda2efdSMircea Trofin        parsed = self.parser.parse_args(
452f98ee40fSTobias Hieta            ["filters", self.testInput0, "c", "d", "--", "f"]
453f98ee40fSTobias Hieta        )
4545dda2efdSMircea Trofin        self.assertFalse(parsed.display_aggregates_only)
4555dda2efdSMircea Trofin        self.assertTrue(parsed.utest)
456f98ee40fSTobias Hieta        self.assertEqual(parsed.mode, "filters")
4575dda2efdSMircea Trofin        self.assertEqual(parsed.test[0].name, self.testInput0)
458f98ee40fSTobias Hieta        self.assertEqual(parsed.filter_baseline[0], "c")
459f98ee40fSTobias Hieta        self.assertEqual(parsed.filter_contender[0], "d")
460f98ee40fSTobias Hieta        self.assertEqual(parsed.benchmark_options, ["f"])
4615dda2efdSMircea Trofin
4625dda2efdSMircea Trofin    def test_benchmarksfiltered_basic(self):
4635dda2efdSMircea Trofin        parsed = self.parser.parse_args(
464f98ee40fSTobias Hieta            ["benchmarksfiltered", self.testInput0, "c", self.testInput1, "e"]
465f98ee40fSTobias Hieta        )
4665dda2efdSMircea Trofin        self.assertFalse(parsed.display_aggregates_only)
4675dda2efdSMircea Trofin        self.assertTrue(parsed.utest)
468f98ee40fSTobias Hieta        self.assertEqual(parsed.mode, "benchmarksfiltered")
4695dda2efdSMircea Trofin        self.assertEqual(parsed.test_baseline[0].name, self.testInput0)
470f98ee40fSTobias Hieta        self.assertEqual(parsed.filter_baseline[0], "c")
4715dda2efdSMircea Trofin        self.assertEqual(parsed.test_contender[0].name, self.testInput1)
472f98ee40fSTobias Hieta        self.assertEqual(parsed.filter_contender[0], "e")
4735dda2efdSMircea Trofin        self.assertFalse(parsed.benchmark_options)
4745dda2efdSMircea Trofin
4755dda2efdSMircea Trofin    def test_benchmarksfiltered_with_remainder(self):
4765dda2efdSMircea Trofin        parsed = self.parser.parse_args(
477*a5b79717SMircea Trofin            [
478*a5b79717SMircea Trofin                "benchmarksfiltered",
479*a5b79717SMircea Trofin                self.testInput0,
480*a5b79717SMircea Trofin                "c",
481*a5b79717SMircea Trofin                self.testInput1,
482*a5b79717SMircea Trofin                "e",
483*a5b79717SMircea Trofin                "f",
484*a5b79717SMircea Trofin            ]
485f98ee40fSTobias Hieta        )
4865dda2efdSMircea Trofin        self.assertFalse(parsed.display_aggregates_only)
4875dda2efdSMircea Trofin        self.assertTrue(parsed.utest)
488f98ee40fSTobias Hieta        self.assertEqual(parsed.mode, "benchmarksfiltered")
4895dda2efdSMircea Trofin        self.assertEqual(parsed.test_baseline[0].name, self.testInput0)
490f98ee40fSTobias Hieta        self.assertEqual(parsed.filter_baseline[0], "c")
4915dda2efdSMircea Trofin        self.assertEqual(parsed.test_contender[0].name, self.testInput1)
492f98ee40fSTobias Hieta        self.assertEqual(parsed.filter_contender[0], "e")
493f98ee40fSTobias Hieta        self.assertEqual(parsed.benchmark_options[0], "f")
4945dda2efdSMircea Trofin
4955dda2efdSMircea Trofin    def test_benchmarksfiltered_with_remainder_after_doubleminus(self):
4965dda2efdSMircea Trofin        parsed = self.parser.parse_args(
497f98ee40fSTobias Hieta            [
498f98ee40fSTobias Hieta                "benchmarksfiltered",
499f98ee40fSTobias Hieta                self.testInput0,
500f98ee40fSTobias Hieta                "c",
501f98ee40fSTobias Hieta                self.testInput1,
502f98ee40fSTobias Hieta                "e",
503f98ee40fSTobias Hieta                "--",
504f98ee40fSTobias Hieta                "g",
505f98ee40fSTobias Hieta            ]
506f98ee40fSTobias Hieta        )
5075dda2efdSMircea Trofin        self.assertFalse(parsed.display_aggregates_only)
5085dda2efdSMircea Trofin        self.assertTrue(parsed.utest)
509f98ee40fSTobias Hieta        self.assertEqual(parsed.mode, "benchmarksfiltered")
5105dda2efdSMircea Trofin        self.assertEqual(parsed.test_baseline[0].name, self.testInput0)
511f98ee40fSTobias Hieta        self.assertEqual(parsed.filter_baseline[0], "c")
5125dda2efdSMircea Trofin        self.assertEqual(parsed.test_contender[0].name, self.testInput1)
513f98ee40fSTobias Hieta        self.assertEqual(parsed.filter_contender[0], "e")
514f98ee40fSTobias Hieta        self.assertEqual(parsed.benchmark_options[0], "g")
5155dda2efdSMircea Trofin
5165dda2efdSMircea Trofin
517f98ee40fSTobias Hietaif __name__ == "__main__":
5185dda2efdSMircea Trofin    # unittest.main()
5195dda2efdSMircea Trofin    main()
5205dda2efdSMircea Trofin
5215dda2efdSMircea Trofin# vim: tabstop=4 expandtab shiftwidth=4 softtabstop=4
5225dda2efdSMircea Trofin# kate: tab-width: 4; replace-tabs on; indent-width 4; tab-indents: off;
5235dda2efdSMircea Trofin# kate: indent-mode python; remove-trailing-spaces modified;
524