summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--coverage/backward.py16
-rw-r--r--coverage/files.py5
-rw-r--r--test/coveragetest.py3
-rw-r--r--test/test_coverage.py25
4 files changed, 43 insertions, 6 deletions
diff --git a/coverage/backward.py b/coverage/backward.py
index c363f21f..af6da629 100644
--- a/coverage/backward.py
+++ b/coverage/backward.py
@@ -81,3 +81,19 @@ except AttributeError:
"""Open a source file the best way."""
return open(fname, "rU")
+# Python 3.x is picky about bytes and strings, so provide methods to
+# get them right, and make them no-ops in 2.x
+if sys.version_info >= (3, 0):
+ def to_bytes(s):
+ return s.encode('utf8')
+
+ def to_string(b):
+ return b.decode('utf8')
+
+else:
+ def to_bytes(s):
+ return s
+
+ def to_string(b):
+ return b
+
diff --git a/coverage/files.py b/coverage/files.py
index 9a8ac564..a68a0a7f 100644
--- a/coverage/files.py
+++ b/coverage/files.py
@@ -1,5 +1,6 @@
"""File wrangling."""
+from coverage.backward import to_string
import fnmatch, os, sys
class FileLocator(object):
@@ -72,9 +73,7 @@ class FileLocator(object):
data = zi.get_data(parts[1])
except IOError:
continue
- if sys.version_info >= (3, 0):
- data = data.decode('utf8') # TODO: How to do this properly?
- return data
+ return to_string(data)
return None
diff --git a/test/coveragetest.py b/test/coveragetest.py
index 694288f0..aad90e5c 100644
--- a/test/coveragetest.py
+++ b/test/coveragetest.py
@@ -4,6 +4,7 @@ import imp, os, random, shlex, shutil, sys, tempfile, textwrap
import coverage
from coverage.backward import sorted, StringIO # pylint: disable=W0622
+from coverage.backward import to_bytes
from backtest import run_command
from backunittest import TestCase
@@ -147,7 +148,7 @@ class CoverageTest(TestCase):
# Create the file.
f = open(filename, 'wb')
try:
- f.write(text)
+ f.write(to_bytes(text))
finally:
f.close()
diff --git a/test/test_coverage.py b/test/test_coverage.py
index 31f3aa17..4d3c37f5 100644
--- a/test/test_coverage.py
+++ b/test/test_coverage.py
@@ -140,12 +140,33 @@ class SimpleStatementTest(CoverageTest):
"""Testing simple single-line statements."""
def test_expression(self):
+ # Bare expressions as statements are tricky: some implementations
+ # optimize some of them away. All implementations seem to count
+ # the implicit return at the end as executable.
+ self.check_coverage("""\
+ 12
+ 23
+ """,
+ ([1,2],[2]), "")
+ self.check_coverage("""\
+ 12
+ 23
+ a = 3
+ """,
+ ([1,2,3],[3]), "")
self.check_coverage("""\
1 + 2
1 + \\
2
""",
- [1,2], "")
+ ([1,2], [2]), "")
+ self.check_coverage("""\
+ 1 + 2
+ 1 + \\
+ 2
+ a = 4
+ """,
+ ([1,2,4], [4]), "")
def test_assert(self):
self.check_coverage("""\
@@ -560,7 +581,7 @@ class SimpleStatementTest(CoverageTest):
c = 6
assert (a,b,c) == (1,3,6)
""",
- ([1,3,5,6,7], [1,3,4,5,6,7]), "")
+ ([1,3,6,7], [1,3,5,6,7], [1,3,4,5,6,7]), "")
class CompoundStatementTest(CoverageTest):