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