| Index: tools/telemetry/third_party/coverage/lab/branches.py
|
| diff --git a/tools/telemetry/third_party/coverage/lab/branches.py b/tools/telemetry/third_party/coverage/lab/branches.py
|
| new file mode 100644
|
| index 0000000000000000000000000000000000000000..275eef4a1b0c9b9a26d3bb9b86484de77ae7aec9
|
| --- /dev/null
|
| +++ b/tools/telemetry/third_party/coverage/lab/branches.py
|
| @@ -0,0 +1,81 @@
|
| +# Licensed under the Apache License: http://www.apache.org/licenses/LICENSE-2.0
|
| +# For details: https://bitbucket.org/ned/coveragepy/src/default/NOTICE.txt
|
| +
|
| +# Demonstrate some issues with coverage.py branch testing.
|
| +
|
| +def my_function(x):
|
| + """This isn't real code, just snippets..."""
|
| +
|
| + # An infinite loop is structurally still a branch: it can next execute the
|
| + # first line of the loop, or the first line after the loop. But
|
| + # "while True" will never jump to the line after the loop, so the line
|
| + # is shown as a partial branch:
|
| +
|
| + i = 0
|
| + while True:
|
| + print "In while True"
|
| + if i > 0:
|
| + break
|
| + i += 1
|
| + print "Left the True loop"
|
| +
|
| + # Notice that "while 1" also has this problem. Even though the compiler
|
| + # knows there's no computation at the top of the loop, it's still expressed
|
| + # in byte code as a branch with two possibilities.
|
| +
|
| + i = 0
|
| + while 1:
|
| + print "In while 1"
|
| + if i > 0:
|
| + break
|
| + i += 1
|
| + print "Left the 1 loop"
|
| +
|
| + # Coverage.py lets developers exclude lines that they know will not be
|
| + # executed. So far, the branch coverage doesn't use all that information
|
| + # when deciding which lines are partially executed.
|
| + #
|
| + # Here, even though the else line is explicitly marked as never executed,
|
| + # the if line complains that it never branched to the else:
|
| +
|
| + if x < 1000:
|
| + # This branch is always taken
|
| + print "x is reasonable"
|
| + else: # pragma: nocover
|
| + print "this never happens"
|
| +
|
| + # try-except structures are complex branches. An except clause with a
|
| + # type is a three-way branch: there could be no exception, there could be
|
| + # a matching exception, and there could be a non-matching exception.
|
| + #
|
| + # Here we run the code twice: once with no exception, and once with a
|
| + # matching exception. The "except" line is marked as partial because we
|
| + # never executed its third case: a non-matching exception.
|
| +
|
| + for y in (1, 2):
|
| + try:
|
| + if y % 2:
|
| + raise ValueError("y is odd!")
|
| + except ValueError:
|
| + print "y must have been odd"
|
| + print "done with y"
|
| + print "done with 1, 2"
|
| +
|
| + # Another except clause, but this time all three cases are executed. No
|
| + # partial lines are shown:
|
| +
|
| + for y in (0, 1, 2):
|
| + try:
|
| + if y % 2:
|
| + raise ValueError("y is odd!")
|
| + if y == 0:
|
| + raise Exception("zero!")
|
| + except ValueError:
|
| + print "y must have been odd"
|
| + except:
|
| + print "y is something else"
|
| + print "done with y"
|
| + print "done with 0, 1, 2"
|
| +
|
| +
|
| +my_function(1)
|
|
|