diff options
-rw-r--r-- | coverage/backward.py | 16 | ||||
-rw-r--r-- | coverage/files.py | 5 | ||||
-rw-r--r-- | test/coveragetest.py | 3 | ||||
-rw-r--r-- | test/test_coverage.py | 25 |
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): |