| Index: tools/telemetry/third_party/coverage/tests/test_arcs.py
|
| diff --git a/tools/telemetry/third_party/coverage/tests/test_arcs.py b/tools/telemetry/third_party/coverage/tests/test_arcs.py
|
| new file mode 100644
|
| index 0000000000000000000000000000000000000000..df303d8bc8b928a62215ea635364a184e520a563
|
| --- /dev/null
|
| +++ b/tools/telemetry/third_party/coverage/tests/test_arcs.py
|
| @@ -0,0 +1,768 @@
|
| +# Licensed under the Apache License: http://www.apache.org/licenses/LICENSE-2.0
|
| +# For details: https://bitbucket.org/ned/coveragepy/src/default/NOTICE.txt
|
| +
|
| +"""Tests for coverage.py's arc measurement."""
|
| +
|
| +from tests.coveragetest import CoverageTest
|
| +
|
| +import coverage
|
| +from coverage import env
|
| +from coverage.files import abs_file
|
| +
|
| +
|
| +class SimpleArcTest(CoverageTest):
|
| + """Tests for coverage.py's arc measurement."""
|
| +
|
| + def test_simple_sequence(self):
|
| + self.check_coverage("""\
|
| + a = 1
|
| + b = 2
|
| + """,
|
| + arcz=".1 12 2.")
|
| + self.check_coverage("""\
|
| + a = 1
|
| +
|
| + b = 3
|
| + """,
|
| + arcz=".1 13 3.")
|
| + self.check_coverage("""\
|
| +
|
| + a = 2
|
| + b = 3
|
| +
|
| + c = 5
|
| + """,
|
| + arcz=".2 23 35 5-2")
|
| +
|
| + def test_function_def(self):
|
| + self.check_coverage("""\
|
| + def foo():
|
| + a = 2
|
| +
|
| + foo()
|
| + """,
|
| + arcz=".1 .2 14 2. 4.")
|
| +
|
| + def test_if(self):
|
| + self.check_coverage("""\
|
| + a = 1
|
| + if len([]) == 0:
|
| + a = 3
|
| + assert a == 3
|
| + """,
|
| + arcz=".1 12 23 24 34 4.", arcz_missing="24")
|
| + self.check_coverage("""\
|
| + a = 1
|
| + if len([]) == 1:
|
| + a = 3
|
| + assert a == 1
|
| + """,
|
| + arcz=".1 12 23 24 34 4.", arcz_missing="23 34")
|
| +
|
| + def test_if_else(self):
|
| + self.check_coverage("""\
|
| + if len([]) == 0:
|
| + a = 2
|
| + else:
|
| + a = 4
|
| + assert a == 2
|
| + """,
|
| + arcz=".1 12 25 14 45 5.", arcz_missing="14 45")
|
| + self.check_coverage("""\
|
| + if len([]) == 1:
|
| + a = 2
|
| + else:
|
| + a = 4
|
| + assert a == 4
|
| + """,
|
| + arcz=".1 12 25 14 45 5.", arcz_missing="12 25")
|
| +
|
| + def test_compact_if(self):
|
| + self.check_coverage("""\
|
| + a = 1
|
| + if len([]) == 0: a = 2
|
| + assert a == 2
|
| + """,
|
| + arcz=".1 12 23 3.", arcz_missing="")
|
| + self.check_coverage("""\
|
| + def fn(x):
|
| + if x % 2: return True
|
| + return False
|
| + a = fn(1)
|
| + assert a == True
|
| + """,
|
| + arcz=".1 14 45 5. .2 2. 23 3.", arcz_missing="23 3.")
|
| +
|
| + def test_multiline(self):
|
| + self.check_coverage("""\
|
| + a = (
|
| + 2 +
|
| + 3
|
| + )
|
| + b = \\
|
| + 6
|
| + """,
|
| + arcz=".1 15 5-2", arcz_missing="")
|
| +
|
| + def test_if_return(self):
|
| + self.check_coverage("""\
|
| + def if_ret(a):
|
| + if a:
|
| + return 3
|
| + b = 4
|
| + return 5
|
| + x = if_ret(0) + if_ret(1)
|
| + assert x == 8
|
| + """,
|
| + arcz=".1 16 67 7. .2 23 24 3. 45 5.", arcz_missing=""
|
| + )
|
| +
|
| + def test_dont_confuse_exit_and_else(self):
|
| + self.check_coverage("""\
|
| + def foo():
|
| + if foo:
|
| + a = 3
|
| + else:
|
| + a = 5
|
| + return a
|
| + assert foo() == 3 # 7
|
| + """,
|
| + arcz=".1 17 7. .2 23 36 25 56 6.", arcz_missing="25 56"
|
| + )
|
| + self.check_coverage("""\
|
| + def foo():
|
| + if foo:
|
| + a = 3
|
| + else:
|
| + a = 5
|
| + foo() # 6
|
| + """,
|
| + arcz=".1 16 6. .2 23 3. 25 5.", arcz_missing="25 5."
|
| + )
|
| +
|
| + if 0: # expected failure
|
| + def test_unused_lambdas_are_confusing_bug_90(self):
|
| + self.check_coverage("""\
|
| + a = 1
|
| + fn = lambda x: x
|
| + b = 3
|
| + """,
|
| + arcz=".1 12 .2 2-2 23 3."
|
| + )
|
| +
|
| +
|
| +class WithTest(CoverageTest):
|
| + """Arc-measuring tests involving context managers."""
|
| +
|
| + def test_with(self):
|
| + self.check_coverage("""\
|
| + def example():
|
| + with open("test", "w") as f: # exit
|
| + f.write("")
|
| + return 1
|
| +
|
| + example()
|
| + """,
|
| + arcz=".1 .2 23 34 4. 16 6."
|
| + )
|
| +
|
| + def test_bug_146(self):
|
| + # https://bitbucket.org/ned/coveragepy/issue/146
|
| + self.check_coverage("""\
|
| + for i in range(2):
|
| + with open("test", "w") as f:
|
| + print(3)
|
| + print(4)
|
| + print(5)
|
| + """,
|
| + arcz=".1 12 23 34 41 15 5."
|
| + )
|
| +
|
| +
|
| +class LoopArcTest(CoverageTest):
|
| + """Arc-measuring tests involving loops."""
|
| +
|
| + def test_loop(self):
|
| + self.check_coverage("""\
|
| + for i in range(10):
|
| + a = i
|
| + assert a == 9
|
| + """,
|
| + arcz=".1 12 21 13 3.", arcz_missing="")
|
| + self.check_coverage("""\
|
| + a = -1
|
| + for i in range(0):
|
| + a = i
|
| + assert a == -1
|
| + """,
|
| + arcz=".1 12 23 32 24 4.", arcz_missing="23 32")
|
| +
|
| + def test_nested_loop(self):
|
| + self.check_coverage("""\
|
| + for i in range(3):
|
| + for j in range(3):
|
| + a = i + j
|
| + assert a == 4
|
| + """,
|
| + arcz=".1 12 23 32 21 14 4.", arcz_missing="")
|
| +
|
| + def test_break(self):
|
| + self.check_coverage("""\
|
| + for i in range(10):
|
| + a = i
|
| + break # 3
|
| + a = 99
|
| + assert a == 0 # 5
|
| + """,
|
| + arcz=".1 12 23 35 15 41 5.", arcz_missing="15 41")
|
| +
|
| + def test_continue(self):
|
| + self.check_coverage("""\
|
| + for i in range(10):
|
| + a = i
|
| + continue # 3
|
| + a = 99
|
| + assert a == 9 # 5
|
| + """,
|
| + arcz=".1 12 23 31 15 41 5.", arcz_missing="41")
|
| +
|
| + def test_nested_breaks(self):
|
| + self.check_coverage("""\
|
| + for i in range(3):
|
| + for j in range(3):
|
| + a = i + j
|
| + break # 4
|
| + if i == 2:
|
| + break
|
| + assert a == 2 and i == 2 # 7
|
| + """,
|
| + arcz=".1 12 23 34 45 25 56 51 67 17 7.", arcz_missing="17 25")
|
| +
|
| + def test_while_true(self):
|
| + # With "while 1", the loop knows it's constant.
|
| + self.check_coverage("""\
|
| + a, i = 1, 0
|
| + while 1:
|
| + if i >= 3:
|
| + a = 4
|
| + break
|
| + i += 1
|
| + assert a == 4 and i == 3
|
| + """,
|
| + arcz=".1 12 23 34 45 36 63 57 7.",
|
| + )
|
| + # With "while True", 2.x thinks it's computation, 3.x thinks it's
|
| + # constant.
|
| + if env.PY3:
|
| + arcz = ".1 12 23 34 45 36 63 57 7."
|
| + else:
|
| + arcz = ".1 12 23 27 34 45 36 62 57 7."
|
| + self.check_coverage("""\
|
| + a, i = 1, 0
|
| + while True:
|
| + if i >= 3:
|
| + a = 4
|
| + break
|
| + i += 1
|
| + assert a == 4 and i == 3
|
| + """,
|
| + arcz=arcz,
|
| + )
|
| +
|
| + def test_for_if_else_for(self):
|
| + self.check_coverage("""\
|
| + def branches_2(l):
|
| + if l:
|
| + for e in l:
|
| + a = 4
|
| + else:
|
| + a = 6
|
| +
|
| + def branches_3(l):
|
| + for x in l:
|
| + if x:
|
| + for e in l:
|
| + a = 12
|
| + else:
|
| + a = 14
|
| +
|
| + branches_2([0,1])
|
| + branches_3([0,1])
|
| + """,
|
| + arcz=
|
| + ".1 18 8G GH H. "
|
| + ".2 23 34 43 26 3. 6. "
|
| + ".9 9A 9-8 AB BC CB B9 AE E9",
|
| + arcz_missing="26 6."
|
| + )
|
| +
|
| + def test_for_else(self):
|
| + self.check_coverage("""\
|
| + def forelse(seq):
|
| + for n in seq:
|
| + if n > 5:
|
| + break
|
| + else:
|
| + print('None of the values were greater than 5')
|
| + print('Done')
|
| + forelse([1,2])
|
| + forelse([1,6])
|
| + """,
|
| + arcz=".1 .2 23 32 34 47 26 67 7. 18 89 9."
|
| + )
|
| +
|
| + def test_confusing_for_loop_bug_175(self):
|
| + if env.PY3:
|
| + # Py3 counts the list comp as a separate code object.
|
| + arcz = ".1 .2 2-2 12 23 34 45 53 3."
|
| + else:
|
| + arcz = ".1 12 23 34 45 53 3."
|
| + self.check_coverage("""\
|
| + o = [(1,2), (3,4)]
|
| + o = [a for a in o]
|
| + for tup in o:
|
| + x = tup[0]
|
| + y = tup[1]
|
| + """,
|
| + arcz=arcz, arcz_missing="", arcz_unpredicted="")
|
| + if env.PY3:
|
| + arcz = ".1 12 .2 2-2 23 34 42 2."
|
| + else:
|
| + arcz = ".1 12 23 34 42 2."
|
| + self.check_coverage("""\
|
| + o = [(1,2), (3,4)]
|
| + for tup in [a for a in o]:
|
| + x = tup[0]
|
| + y = tup[1]
|
| + """,
|
| + arcz=arcz, arcz_missing="", arcz_unpredicted="")
|
| +
|
| +
|
| +class ExceptionArcTest(CoverageTest):
|
| + """Arc-measuring tests involving exception handling."""
|
| +
|
| + def test_try_except(self):
|
| + self.check_coverage("""\
|
| + a, b = 1, 1
|
| + try:
|
| + a = 3
|
| + except:
|
| + b = 5
|
| + assert a == 3 and b == 1
|
| + """,
|
| + arcz=".1 12 23 36 45 56 6.", arcz_missing="45 56")
|
| + self.check_coverage("""\
|
| + a, b = 1, 1
|
| + try:
|
| + a = 3
|
| + raise Exception("Yikes!")
|
| + a = 5
|
| + except:
|
| + b = 7
|
| + assert a == 3 and b == 7
|
| + """,
|
| + arcz=".1 12 23 34 58 67 78 8.",
|
| + arcz_missing="58", arcz_unpredicted="46")
|
| +
|
| + def test_hidden_raise(self):
|
| + self.check_coverage("""\
|
| + a, b = 1, 1
|
| + def oops(x):
|
| + if x % 2: raise Exception("odd")
|
| + try:
|
| + a = 5
|
| + oops(1)
|
| + a = 7
|
| + except:
|
| + b = 9
|
| + assert a == 5 and b == 9
|
| + """,
|
| + arcz=".1 12 .3 3-2 24 45 56 67 7A 89 9A A.",
|
| + arcz_missing="67 7A", arcz_unpredicted="68")
|
| +
|
| + def test_except_with_type(self):
|
| + self.check_coverage("""\
|
| + a, b = 1, 1
|
| + def oops(x):
|
| + if x % 2: raise ValueError("odd")
|
| + def try_it(x):
|
| + try:
|
| + a = 6
|
| + oops(x)
|
| + a = 8
|
| + except ValueError:
|
| + b = 10
|
| + return a
|
| + assert try_it(0) == 8 # C
|
| + assert try_it(1) == 6 # D
|
| + """,
|
| + arcz=".1 12 .3 3-2 24 4C CD D. .5 56 67 78 8B 9A AB B-4",
|
| + arcz_missing="",
|
| + arcz_unpredicted="79")
|
| +
|
| + def test_try_finally(self):
|
| + self.check_coverage("""\
|
| + a, c = 1, 1
|
| + try:
|
| + a = 3
|
| + finally:
|
| + c = 5
|
| + assert a == 3 and c == 5
|
| + """,
|
| + arcz=".1 12 23 35 56 6.", arcz_missing="")
|
| + self.check_coverage("""\
|
| + a, c, d = 1, 1, 1
|
| + try:
|
| + try:
|
| + a = 4
|
| + finally:
|
| + c = 6
|
| + except:
|
| + d = 8
|
| + assert a == 4 and c == 6 and d == 1 # 9
|
| + """,
|
| + arcz=".1 12 23 34 46 67 78 89 69 9.",
|
| + arcz_missing="67 78 89", arcz_unpredicted="")
|
| + self.check_coverage("""\
|
| + a, c, d = 1, 1, 1
|
| + try:
|
| + try:
|
| + a = 4
|
| + raise Exception("Yikes!")
|
| + a = 6
|
| + finally:
|
| + c = 8
|
| + except:
|
| + d = 10 # A
|
| + assert a == 4 and c == 8 and d == 10 # B
|
| + """,
|
| + arcz=".1 12 23 34 45 68 89 8B 9A AB B.",
|
| + arcz_missing="68 8B", arcz_unpredicted="58")
|
| +
|
| + def test_finally_in_loop(self):
|
| + self.check_coverage("""\
|
| + a, c, d, i = 1, 1, 1, 99
|
| + try:
|
| + for i in range(5):
|
| + try:
|
| + a = 5
|
| + if i > 0:
|
| + raise Exception("Yikes!")
|
| + a = 8
|
| + finally:
|
| + c = 10
|
| + except:
|
| + d = 12 # C
|
| + assert a == 5 and c == 10 and d == 12 # D
|
| + """,
|
| + arcz=".1 12 23 34 3D 45 56 67 68 8A A3 AB BC CD D.",
|
| + arcz_missing="3D", arcz_unpredicted="7A")
|
| + self.check_coverage("""\
|
| + a, c, d, i = 1, 1, 1, 99
|
| + try:
|
| + for i in range(5):
|
| + try:
|
| + a = 5
|
| + if i > 10:
|
| + raise Exception("Yikes!")
|
| + a = 8
|
| + finally:
|
| + c = 10
|
| + except:
|
| + d = 12 # C
|
| + assert a == 8 and c == 10 and d == 1 # D
|
| + """,
|
| + arcz=".1 12 23 34 3D 45 56 67 68 8A A3 AB BC CD D.",
|
| + arcz_missing="67 AB BC CD", arcz_unpredicted="")
|
| +
|
| +
|
| + def test_break_in_finally(self):
|
| + self.check_coverage("""\
|
| + a, c, d, i = 1, 1, 1, 99
|
| + try:
|
| + for i in range(5):
|
| + try:
|
| + a = 5
|
| + if i > 0:
|
| + break
|
| + a = 8
|
| + finally:
|
| + c = 10
|
| + except:
|
| + d = 12 # C
|
| + assert a == 5 and c == 10 and d == 1 # D
|
| + """,
|
| + arcz=".1 12 23 34 3D 45 56 67 68 7A 8A A3 AB BC CD D.",
|
| + arcz_missing="3D AB BC CD", arcz_unpredicted="AD")
|
| +
|
| + def test_finally_in_loop_bug_92(self):
|
| + self.check_coverage("""\
|
| + for i in range(5):
|
| + try:
|
| + j = 3
|
| + finally:
|
| + f = 5
|
| + g = 6
|
| + h = 7
|
| + """,
|
| + arcz=".1 12 23 35 56 61 17 7.",
|
| + arcz_missing="", arcz_unpredicted="")
|
| +
|
| + # "except Exception as e" is crucial here.
|
| + def test_bug_212(self):
|
| + # Run this test only on Py2 for now. I hope to fix it on Py3
|
| + # eventually...
|
| + if env.PY3:
|
| + self.skip("This doesn't work on Python 3")
|
| + self.check_coverage("""\
|
| + def b(exc):
|
| + try:
|
| + while 1:
|
| + raise Exception(exc) # 4
|
| + except Exception as e:
|
| + if exc != 'expected':
|
| + raise
|
| + q = 8
|
| +
|
| + b('expected')
|
| + try:
|
| + b('unexpected') # C
|
| + except:
|
| + pass
|
| + """,
|
| + arcz=".1 .2 1A 23 34 56 67 68 8. AB BC C. DE E.",
|
| + arcz_missing="C.", arcz_unpredicted="45 7. CD")
|
| +
|
| + def test_except_finally(self):
|
| + self.check_coverage("""\
|
| + a, b, c = 1, 1, 1
|
| + try:
|
| + a = 3
|
| + except:
|
| + b = 5
|
| + finally:
|
| + c = 7
|
| + assert a == 3 and b == 1 and c == 7
|
| + """,
|
| + arcz=".1 12 23 45 37 57 78 8.", arcz_missing="45 57")
|
| + self.check_coverage("""\
|
| + a, b, c = 1, 1, 1
|
| + def oops(x):
|
| + if x % 2: raise Exception("odd")
|
| + try:
|
| + a = 5
|
| + oops(1)
|
| + a = 7
|
| + except:
|
| + b = 9
|
| + finally:
|
| + c = 11
|
| + assert a == 5 and b == 9 and c == 11
|
| + """,
|
| + arcz=".1 12 .3 3-2 24 45 56 67 7B 89 9B BC C.",
|
| + arcz_missing="67 7B", arcz_unpredicted="68")
|
| +
|
| +
|
| +class YieldTest(CoverageTest):
|
| + """Arc tests for generators."""
|
| +
|
| + def test_yield_in_loop(self):
|
| + self.check_coverage("""\
|
| + def gen(inp):
|
| + for n in inp:
|
| + yield n
|
| +
|
| + list(gen([1,2,3]))
|
| + """,
|
| + arcz=".1 .2 23 2. 32 15 5.",
|
| + arcz_missing="",
|
| + arcz_unpredicted="")
|
| +
|
| + def test_padded_yield_in_loop(self):
|
| + self.check_coverage("""\
|
| + def gen(inp):
|
| + i = 2
|
| + for n in inp:
|
| + i = 4
|
| + yield n
|
| + i = 6
|
| + i = 7
|
| +
|
| + list(gen([1,2,3]))
|
| + """,
|
| + arcz=".1 19 9. .2 23 34 45 56 63 37 7.",
|
| + arcz_missing="",
|
| + arcz_unpredicted="")
|
| +
|
| + def test_bug_308(self):
|
| + self.check_coverage("""\
|
| + def run():
|
| + for i in range(10):
|
| + yield lambda: i
|
| +
|
| + for f in run():
|
| + print(f())
|
| + """,
|
| + arcz=".1 15 56 65 5. .2 23 32 2. .3 3-3",
|
| + arcz_missing="",
|
| + arcz_unpredicted="")
|
| +
|
| + self.check_coverage("""\
|
| + def run():
|
| + yield lambda: 100
|
| + for i in range(10):
|
| + yield lambda: i
|
| +
|
| + for f in run():
|
| + print(f())
|
| + """,
|
| + arcz=".1 16 67 76 6. .2 23 34 43 3. 2-2 .4 4-4",
|
| + arcz_missing="",
|
| + arcz_unpredicted="")
|
| +
|
| + self.check_coverage("""\
|
| + def run():
|
| + yield lambda: 100 # no branch miss
|
| +
|
| + for f in run():
|
| + print(f())
|
| + """,
|
| + arcz=".1 14 45 54 4. .2 2. 2-2",
|
| + arcz_missing="",
|
| + arcz_unpredicted="")
|
| +
|
| + def test_bug_324(self):
|
| + # This code is tricky: the list() call pulls all the values from gen(),
|
| + # but each of them is a generator itself that is never iterated. As a
|
| + # result, the generator expression on line 3 is never entered or run.
|
| + self.check_coverage("""\
|
| + def gen(inp):
|
| + for n in inp:
|
| + yield (i * 2 for i in range(n))
|
| +
|
| + list(gen([1,2,3]))
|
| + """,
|
| + arcz=
|
| + ".1 15 5. " # The module level
|
| + ".2 23 32 2. " # The gen() function
|
| + ".3 3-3", # The generator expression
|
| + arcz_missing=".3 3-3",
|
| + arcz_unpredicted="")
|
| +
|
| + def test_coroutines(self):
|
| + self.check_coverage("""\
|
| + def double_inputs():
|
| + while [1]: # avoid compiler differences
|
| + x = yield
|
| + x *= 2
|
| + yield x
|
| +
|
| + gen = double_inputs()
|
| + next(gen)
|
| + print(gen.send(10))
|
| + next(gen)
|
| + print(gen.send(6))
|
| + """,
|
| + arcz=
|
| + ".1 17 78 89 9A AB B. "
|
| + ".2 23 34 45 52 2.",
|
| + arcz_missing="2.",
|
| + arcz_unpredicted="")
|
| + self.assertEqual(self.stdout(), "20\n12\n")
|
| +
|
| +
|
| +class MiscArcTest(CoverageTest):
|
| + """Miscellaneous arc-measuring tests."""
|
| +
|
| + def test_dict_literal(self):
|
| + if env.PYVERSION < (3, 5):
|
| + arcz = ".1 19 9."
|
| + else:
|
| + # Python 3.5 changed how dict literals are constructed.
|
| + arcz = ".1 19 9-2"
|
| + self.check_coverage("""\
|
| + d = {
|
| + 'a': 2,
|
| + 'b': 3,
|
| + 'c': {
|
| + 'd': 5,
|
| + 'e': 6,
|
| + }
|
| + }
|
| + assert d
|
| + """,
|
| + arcz=arcz)
|
| +
|
| + def test_pathologically_long_code_object(self):
|
| + # https://bitbucket.org/ned/coveragepy/issue/359
|
| + # The structure of this file is such that an EXTENDED_ARG byte code is
|
| + # needed to encode the jump at the end. We weren't interpreting those
|
| + # opcodes.
|
| + code = """\
|
| + data = [
|
| + """ + "".join("""\
|
| + [{i}, {i}, {i}, {i}, {i}, {i}, {i}, {i}, {i}, {i}],
|
| + """.format(i=i) for i in range(2000)
|
| + ) + """\
|
| + ]
|
| +
|
| + if __name__ == "__main__":
|
| + print(len(data))
|
| + """
|
| + self.check_coverage(
|
| + code,
|
| + arcs=[(-1, 1), (1, 2004), (2004, -2), (2004, 2005), (2005, -2)],
|
| + )
|
| +
|
| +
|
| +class ExcludeTest(CoverageTest):
|
| + """Tests of exclusions to indicate known partial branches."""
|
| +
|
| + def test_default(self):
|
| + # A number of forms of pragma comment are accepted.
|
| + self.check_coverage("""\
|
| + a = 1
|
| + if a: #pragma: no branch
|
| + b = 3
|
| + c = 4
|
| + if c: # pragma NOBRANCH
|
| + d = 6
|
| + e = 7
|
| + if e:#\tpragma:\tno branch
|
| + f = 9
|
| + """,
|
| + [1,2,3,4,5,6,7,8,9],
|
| + arcz=".1 12 23 24 34 45 56 57 67 78 89 9. 8.", arcz_missing="")
|
| +
|
| + def test_custom_pragmas(self):
|
| + self.check_coverage("""\
|
| + a = 1
|
| + while a: # [only some]
|
| + c = 3
|
| + break
|
| + assert c == 5-2
|
| + """,
|
| + [1,2,3,4,5],
|
| + partials=["only some"],
|
| + arcz=".1 12 23 34 45 25 5.", arcz_missing="")
|
| +
|
| +
|
| +class LineDataTest(CoverageTest):
|
| + """Tests that line_data gives us what we expect."""
|
| +
|
| + def test_branch(self):
|
| + cov = coverage.Coverage(branch=True)
|
| +
|
| + self.make_file("fun1.py", """\
|
| + def fun1(x):
|
| + if x == 1:
|
| + return
|
| +
|
| + fun1(3)
|
| + """)
|
| +
|
| + self.start_import_stop(cov, "fun1")
|
| +
|
| + data = cov.get_data()
|
| + fun1_lines = data.lines(abs_file("fun1.py"))
|
| + self.assertCountEqual(fun1_lines, [1, 2, 5])
|
|
|