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