3 Summarize the information in the given coverage files.
5 Emits the number of rules covered or the percentage of rules covered depending
6 on whether --num-rules has been used to specify the total number of rules.
8 from __future__
import print_function
13 class FileFormatError(Exception):
16 def backend_int_pair(s
):
17 backend
, sep
, value
= s
.partition('=')
19 raise argparse
.ArgumentTypeError("'=' missing, expected name=value")
21 raise argparse
.ArgumentTypeError("Expected name=value")
23 raise argparse
.ArgumentTypeError("Expected name=value")
24 return backend
, int(value
)
27 parser
= argparse
.ArgumentParser(description
=__doc__
)
28 parser
.add_argument('input', nargs
='+')
29 parser
.add_argument('--num-rules', type=backend_int_pair
, action
='append',
30 metavar
='BACKEND=NUM',
31 help='Specify the number of rules for a backend')
32 args
= parser
.parse_args()
36 for input_filename
in args
.input:
37 with
open(input_filename
, 'rb') as input_fh
:
38 data
= input_fh
.read()
41 backend
, _
, data
= data
.partition('\0')
46 raise FileFormatError()
47 backend
, = struct
.unpack("%ds" % len(backend
), backend
)
51 raise FileFormatError()
52 rule_id
, = struct
.unpack("Q", data
[:8])
55 if rule_id
== (2 ** 64) - 1:
57 covered_rules
[backend
] = covered_rules
.get(backend
, {})
58 covered_rules
[backend
][rule_id
] = covered_rules
[backend
].get(rule_id
, 0) + 1
60 num_rules
= dict(args
.num_rules
)
61 for backend
, rules_for_backend
in covered_rules
.items():
62 if backend
in num_rules
:
63 print("%s: %3.2f%% of rules covered" % (backend
, float(len(rules_for_backend
)) / num_rules
[backend
]) * 100))
65 print("%s: %d rules covered" % (backend
, len(rules_for_backend
)))
67 if __name__
== '__main__':