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