|
| 1 | +# -*- coding: utf-8 -*- |
| 2 | + |
1 | 3 | from __future__ import print_function
|
2 | 4 |
|
| 5 | +import contextlib |
3 | 6 | import os
|
4 | 7 | import os.path as op
|
5 | 8 | import sys
|
6 | 9 | import tempfile
|
7 | 10 | import warnings
|
8 | 11 |
|
9 |
| -from nose.tools import assert_equal |
| 12 | +from nose.tools import assert_equal, assert_true |
10 | 13 |
|
11 | 14 | from codespell_lib import main
|
12 | 15 |
|
13 | 16 |
|
14 | 17 | def test_basic():
|
15 | 18 | """Test some basic functionality"""
|
16 | 19 | assert_equal(main('_does_not_exist_'), 0)
|
17 |
| - with tempfile.NamedTemporaryFile() as f: |
18 |
| - assert_equal(main(f.name,), 0) # empty file |
19 |
| - f.write('this is a test file\n'.encode('utf-8')) |
| 20 | + with tempfile.NamedTemporaryFile('w') as f: |
| 21 | + with CaptureStdout() as sio: |
| 22 | + assert_equal(main('-D', 'foo', f.name), 1) # missing dictionary |
| 23 | + assert_true('cannot find dictionary' in sio[1]) |
| 24 | + assert_equal(main(f.name), 0) # empty file |
| 25 | + f.write('this is a test file\n') |
20 | 26 | f.flush()
|
21 |
| - assert_equal(main(f.name,), 0) # good |
22 |
| - f.write('abandonned\n'.encode('utf-8')) |
| 27 | + assert_equal(main(f.name), 0) # good |
| 28 | + f.write('abandonned\n') |
23 | 29 | f.flush()
|
24 | 30 | assert_equal(main(f.name), 1) # bad
|
25 |
| - f.write('abandonned\n'.encode('utf-8')) |
| 31 | + f.write('abandonned\n') |
26 | 32 | f.flush()
|
27 | 33 | assert_equal(main(f.name), 2) # worse
|
| 34 | + with TemporaryDirectory() as d: |
| 35 | + with open(op.join(d, 'bad.txt'), 'w') as f: |
| 36 | + f.write('abandonned\nAbandonned\nABANDONNED\nAbAnDoNnEd') |
| 37 | + assert_equal(main(d), 4) |
| 38 | + with CaptureStdout() as sio: |
| 39 | + assert_equal(main('-w', d), 0) |
| 40 | + assert_true('FIXED:' in sio[1]) |
| 41 | + with open(op.join(d, 'bad.txt')) as f: |
| 42 | + new_content = f.read() |
| 43 | + assert_equal(main(d), 0) |
| 44 | + assert_equal(new_content, 'abandoned\nAbandoned\nABANDONED\nabandoned') |
| 45 | + |
| 46 | + with open(op.join(d, 'bad.txt'), 'w') as f: |
| 47 | + f.write('abandonned abandonned\n') |
| 48 | + assert_equal(main(d), 2) |
| 49 | + with CaptureStdout() as sio: |
| 50 | + assert_equal(main('-q', '16', '-w', d), 0) |
| 51 | + assert_equal(sio[0], '') |
| 52 | + assert_equal(main(d), 0) |
| 53 | + |
| 54 | + # empty directory |
| 55 | + os.mkdir(op.join(d, 'test')) |
| 56 | + assert_equal(main(d), 0) |
| 57 | + |
| 58 | + # hidden file |
| 59 | + with open(op.join(d, 'test.txt'), 'w') as f: |
| 60 | + f.write('abandonned\n') |
| 61 | + assert_equal(main(op.join(d, 'test.txt')), 1) |
| 62 | + os.rename(op.join(d, 'test.txt'), op.join(d, '.test.txt')) |
| 63 | + assert_equal(main(op.join(d, '.test.txt')), 0) |
| 64 | + |
| 65 | + |
| 66 | +def test_interactivity(): |
| 67 | + """Test interaction""" |
| 68 | + with tempfile.NamedTemporaryFile('w') as f: |
| 69 | + assert_equal(main(f.name), 0) # empty file |
| 70 | + f.write('abandonned\n') |
| 71 | + f.flush() |
| 72 | + assert_equal(main('-i', '-1', f.name), 1) # bad |
| 73 | + with FakeStdin('y\n'): |
| 74 | + assert_equal(main('-i', '3', f.name), 1) |
| 75 | + with CaptureStdout() as sio: |
| 76 | + with FakeStdin('n\n'): |
| 77 | + assert_equal(main('-w', '-i', '3', f.name), 0) |
| 78 | + assert_true('==>' in sio[0]) |
| 79 | + with CaptureStdout(): |
| 80 | + with FakeStdin('x\ny\n'): |
| 81 | + assert_equal(main('-w', '-i', '3', f.name), 0) |
| 82 | + assert_equal(main(f.name), 0) |
| 83 | + with tempfile.NamedTemporaryFile('w') as f: |
| 84 | + f.write('abandonned\n') |
| 85 | + f.flush() |
| 86 | + assert_equal(main(f.name), 1) |
| 87 | + with CaptureStdout(): |
| 88 | + with FakeStdin(' '): # blank input -> Y |
| 89 | + assert_equal(main('-w', '-i', '3', f.name), 0) |
| 90 | + assert_equal(main(f.name), 0) |
| 91 | + # multiple options |
| 92 | + with tempfile.NamedTemporaryFile('w') as f: |
| 93 | + f.write('ackward\n') |
| 94 | + f.flush() |
| 95 | + assert_equal(main(f.name), 1) |
| 96 | + with CaptureStdout(): |
| 97 | + with FakeStdin(' \n'): # blank input -> nothing |
| 98 | + assert_equal(main('-w', '-i', '3', f.name), 0) |
| 99 | + assert_equal(main(f.name), 1) |
| 100 | + with CaptureStdout(): |
| 101 | + with FakeStdin('0\n'): # blank input -> nothing |
| 102 | + assert_equal(main('-w', '-i', '3', f.name), 0) |
| 103 | + assert_equal(main(f.name), 0) |
| 104 | + with open(f.name, 'r') as f_read: |
| 105 | + assert_equal(f_read.read(), 'awkward\n') |
| 106 | + f.seek(0) |
| 107 | + f.write('ackward\n') |
| 108 | + f.flush() |
| 109 | + assert_equal(main(f.name), 1) |
| 110 | + with CaptureStdout() as sio: |
| 111 | + with FakeStdin('x\n1\n'): # blank input -> nothing |
| 112 | + assert_equal(main('-w', '-i', '3', f.name), 0) |
| 113 | + assert_true('a valid option' in sio[0]) |
| 114 | + assert_equal(main(f.name), 0) |
| 115 | + with open(f.name, 'r') as f: |
| 116 | + assert_equal(f.read(), 'backward\n') |
| 117 | + |
| 118 | + |
| 119 | +def test_summary(): |
| 120 | + """Test summary functionality""" |
| 121 | + with tempfile.NamedTemporaryFile('w') as f: |
| 122 | + with CaptureStdout() as sio: |
| 123 | + main(f.name) |
| 124 | + for ii in range(2): |
| 125 | + assert_equal(sio[ii], '') # no output |
| 126 | + with CaptureStdout() as sio: |
| 127 | + main(f.name, '--summary') |
| 128 | + assert_equal(sio[1], '') # stderr |
| 129 | + assert_true('SUMMARY' in sio[0]) |
| 130 | + assert_equal(len(sio[0].split('\n')), 5) # no output |
| 131 | + f.write('abandonned\nabandonned') |
| 132 | + f.flush() |
| 133 | + with CaptureStdout() as sio: |
| 134 | + main(f.name, '--summary') |
| 135 | + assert_equal(sio[1], '') # stderr |
| 136 | + assert_true('SUMMARY' in sio[0]) |
| 137 | + assert_equal(len(sio[0].split('\n')), 7) |
| 138 | + assert_true('abandonned' in sio[0].split()[-2]) |
| 139 | + |
| 140 | + |
| 141 | +def test_exclude_file(): |
| 142 | + """Test exclude file functionality""" |
| 143 | + with TemporaryDirectory() as d: |
| 144 | + with open(op.join(d, 'bad.txt'), 'w') as f: |
| 145 | + f.write('abandonned 1\nabandonned 2\n') |
| 146 | + with tempfile.NamedTemporaryFile('w') as f: |
| 147 | + f.write('abandonned 1\n') |
| 148 | + f.flush() |
| 149 | + assert_equal(main(d), 2) |
| 150 | + assert_equal(main('-x', f.name, d), 1) |
| 151 | + |
| 152 | + |
| 153 | +def test_encoding(): |
| 154 | + """Test encoding handling""" |
| 155 | + # Some simple Unicode things |
| 156 | + with tempfile.NamedTemporaryFile('wb') as f: |
| 157 | + # with CaptureStdout() as sio: |
| 158 | + assert_equal(main(f.name), 0) |
| 159 | + f.write(u'naïve\n'.encode('utf-8')) |
| 160 | + f.flush() |
| 161 | + assert_equal(main(f.name), 0) |
| 162 | + assert_equal(main('-e', f.name), 0) |
| 163 | + f.write(u'naieve\n'.encode('utf-8')) |
| 164 | + f.flush() |
| 165 | + assert_equal(main(f.name), 1) |
| 166 | + # Binary file warning |
| 167 | + with tempfile.NamedTemporaryFile('wb') as f: |
| 168 | + assert_equal(main(f.name), 0) |
| 169 | + f.write(b'\x00\x00naiive\x00\x00') |
| 170 | + f.flush() |
| 171 | + with CaptureStdout() as sio: |
| 172 | + assert_equal(main(f.name), 0) |
| 173 | + assert_true('WARNING: Binary file' in sio[1]) |
| 174 | + with CaptureStdout() as sio: |
| 175 | + assert_equal(main('-q', '2', f.name), 0) |
| 176 | + assert_equal(sio[1], '') |
28 | 177 |
|
29 | 178 |
|
30 | 179 | def test_ignore():
|
@@ -114,3 +263,35 @@ def _rmtree(self, path):
|
114 | 263 | self._rmdir(path)
|
115 | 264 | except OSError:
|
116 | 265 | pass
|
| 266 | + |
| 267 | + |
| 268 | +@contextlib.contextmanager |
| 269 | +def CaptureStdout(): |
| 270 | + if sys.version[0] == '2': |
| 271 | + from StringIO import StringIO |
| 272 | + else: |
| 273 | + from io import StringIO |
| 274 | + oldout, olderr = sys.stdout, sys.stderr |
| 275 | + try: |
| 276 | + out = [StringIO(), StringIO()] |
| 277 | + sys.stdout, sys.stderr = out |
| 278 | + yield out |
| 279 | + finally: |
| 280 | + sys.stdout, sys.stderr = oldout, olderr |
| 281 | + out[0] = out[0].getvalue() |
| 282 | + out[1] = out[1].getvalue() |
| 283 | + |
| 284 | + |
| 285 | +@contextlib.contextmanager |
| 286 | +def FakeStdin(text): |
| 287 | + if sys.version[0] == '2': |
| 288 | + from StringIO import StringIO |
| 289 | + else: |
| 290 | + from io import StringIO |
| 291 | + oldin = sys.stdin |
| 292 | + try: |
| 293 | + in_ = StringIO(text) |
| 294 | + sys.stdin = in_ |
| 295 | + yield |
| 296 | + finally: |
| 297 | + sys.stdin = oldin |
0 commit comments