-
-
Notifications
You must be signed in to change notification settings - Fork 30.9k
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
bpo-19382: Adding test cases for module tabnanny. #851
bpo-19382: Adding test cases for module tabnanny. #851
Conversation
Hi @ultimatecoder, you'll also need to remove |
Lib/test/test_tabnanny.py
Outdated
|
||
Use this method to assert expected values of `stdout` and `stderr` after | ||
running tabsize.check() on given `dir` or `file` path. Because | ||
tabsize.check() captures arised exceptions and writes to `stdout` and |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Just write “captures exceptions” (or change arised → raised).
What is “tabsize”? Did you mean “tabnanny.check”?
Lib/test/test_tabnanny.py
Outdated
Returns path of the created file. Returned | ||
file path can be feeded to | ||
`tabnanny.check()`. Here, the expression | ||
`*` at function name is dipicting the |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
feeded → fed
dipicting → depicting
Lib/test/test_tabnanny.py
Outdated
* dir_or_file : A path to file or directory. This argument will be | ||
feeded directly to tabnanny.check(). | ||
* out : Expacted `stdout` after running tabsize.check(). | ||
* err : Expacted `stderr` after running tabsize.check(). |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
feeded → fed
Expacted → Expected
Lib/test/test_tabnanny.py
Outdated
"""Directory containing few error free python source code files. | ||
|
||
Because order of files returned by `os.lsdir()` is not fixed, verifying | ||
existance of each output lines at `stdout` using `in` operator. |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
verifying → verify the
existance → existence
Lib/test/test_tabnanny.py
Outdated
self._verify_tabnanny_check(file_path) | ||
|
||
def test_correct_directory_verbose(self): | ||
"""Directory containing few error free python source code files. |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
few → a few [otherwise, the implication is that most of the files have errors: few are error-free]
Lib/test/test_tabnanny.py
Outdated
"""Testing `tabnanny.format_witnesses()`.""" | ||
|
||
def test_format_whitenesses(self): | ||
"""Asserting formatter result by givinig various input samples.""" |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
giving
Lib/test/test_tabnanny.py
Outdated
self._validate_cmd(stderr=stderr) | ||
|
||
def test_quiet_flag(self): | ||
"""Should not display less when quite mode is on.""" |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
quiet mode?
“less” looks wrong, unless you meant “Should display less”
Lib/test/test_tabnanny.py
Outdated
def test_quiet_flag(self): | ||
"""Should not display less when quite mode is on.""" | ||
file_path = create_python_file(SOURCE_CODES["nannynag_errored"]) | ||
stdout = b"%s\n" % (file_path.encode('ascii'),) |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Don’t you get CRLF on Windows?
Lib/test/test_tabnanny.py
Outdated
def test_with_errored_file(self): | ||
"""Should displays error when errored python file is given.""" | ||
file_path = create_python_file(SOURCE_CODES["wrong_indented"]) | ||
stderr = b"%r: Indentation Error: " % (file_path,) |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
In Python 3, b"%r" is equivalent to calling the “ascii” function. I expect the test will fail if the file path has non-ASCII characters. It may be better to only test that an error is being reported, but tolerate variations in the message.
Lib/test/test_tabnanny.py
Outdated
def test_command_usage(self): | ||
"""Should display usage on no arguments.""" | ||
path = findfile('tabnanny.py') | ||
stderr = b'Usage: %s [-v] file_or_directory ...' % (path.encode('ascii')) |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
What if the path is non-ASCII? Again, just check the general form of the output and don’t be too specific.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
I don't think this https://github.com/python/cpython/blob/master/Lib/tempfile.py#L144 generates anything Non-ASCII.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
No, but the OS can provide a parent directory for temporary files that has non-ASCII path components. It seems relatively common on Windows that the temporary directory is within a user’s profile, and the profile directory can be a localized non-ASCII name. Top Google result: https://bugzilla.mozilla.org/show_bug.cgi?id=260034.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Many thanks for affording time for reviewing this. I will agree with you on this point. I have updated code. Will you please review again?
Check out the existing patches and reviews you linked. You may be repeating some of the same problems, e.g. CRLF on Windows. |
d66ae89
to
f9b9e5c
Compare
@vadmium Many thanks for your comments. I am not native English speaker. I have fixed the mistakes. I have added comments to some comments. Please review my fixes. Thanks! @DimitrisJim Thanks for your comment. I have removed |
f9b9e5c
to
d9953b9
Compare
Sorry but I don’t have an easy way to see your fixes relative to the old version I reviewed. I’m not really set up to properly review and push stuff with the new Git Hub setup, so I will leave this to someone else, or for another time in the future. |
@@ -0,0 +1,348 @@ | |||
"""Testing `tabnanny` module. | |||
|
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
remove one empty line
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Removed this. This is Github glitch.
Lib/test/test_tabnanny.py
Outdated
* errored : Whitespace related problems present in file. | ||
""" | ||
from unittest import TestCase, mock | ||
from unittest.mock import patch |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Hum, I prefer to write mock.patch, please remove this import
Lib/test/test_tabnanny.py
Outdated
from unittest.mock import patch | ||
import tabnanny | ||
import tokenize | ||
from tempfile import NamedTemporaryFile, TemporaryDirectory |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Please import tempfile and write tempfile.NamedTemporaryFile.
Lib/test/test_tabnanny.py
Outdated
|
||
It creates file with `.py` extension. | ||
|
||
Returns: Absolute path of created code file.""" |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
IMHO this docstring is useless. Usually, we don't comment much tests, they are not intented to end users.
Lib/test/test_tabnanny.py
Outdated
|
||
Returns: Absolute path of created code file.""" | ||
with NamedTemporaryFile(mode='w', dir=dir, | ||
delete=False, suffix=".py") as f: |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
If you only care of creating a temporary filename, use tempfile.mktemp() and then open() manually the file to create it. You can use open(tmpname, "x") to prevent race conditions.
Lib/test/test_tabnanny.py
Outdated
def test_errprint(self): | ||
"""Asserting result of `tabnanny.errprint()` by giving sample inputs.""" | ||
tests = [ | ||
{'args': ['first', 'second'], 'expected': 'first second\n'}, |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Instead of a dict, you can simply use a tuple (args, expected)
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Don't think we should kill the readability by converting it to tuple
. How about collections.namedtuple
?
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Or How about this way?
tests = [
# (Function arguments , Expected output)
(['first', 'second'], 'first second\n'),
(['first'] , 'first\n'),
([1, 2, 3] , '1 2 3\n'),
([] , '\n')
]
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Keep tests simple:
for args, expected in [
([1], '1'),
]:
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Yes, keep them simple. And don't use namedtuples except for keeping backwards-compatibility with an interface that used to take an indexed object and now takes an object with attributes.
Lib/test/test_tabnanny.py
Outdated
|
||
|
||
class TestNannyNag(TestCase): | ||
"""Testing `tabnanny.NannyNag` exception.""" |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Not sure that this docstring is super useful.
Lib/test/test_tabnanny.py
Outdated
self.assertEqual(stderr.getvalue() , test['expected']) | ||
|
||
|
||
class TestNannyNag(TestCase): |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
I don't think that it's worth it to declare one test case to test a single class/function. Try to put most or all tests into a single test case called "TabnannyTestCase".
TestCheck deserves its own test case since it has a setUp() method.
Lib/test/test_tabnanny.py
Outdated
class TestNannyNag(TestCase): | ||
"""Testing `tabnanny.NannyNag` exception.""" | ||
def setUp(self): | ||
self.tests = [ |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Please move this list into the method directly.
Lib/test/test_tabnanny.py
Outdated
"""Testing tabnanny.check().""" | ||
|
||
def setUp(self): | ||
tabnanny.verbose = 0 # Forcefully deactivating verbose mode. |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Unit tests must have zero side effect: you must save the old verbose value and restore it. Example:
self.addCleanup(setattr, tabnanny, 'verbose', tabnanny.verbose)
tabnanny.verbose = 0
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Aha! a geek way 👍
Lib/test/test_tabnanny.py
Outdated
def setUp(self): | ||
tabnanny.verbose = 0 # Forcefully deactivating verbose mode. | ||
|
||
def _verify_tabnanny_check(self, dir_or_file, out="", err=""): |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
No need to make this method private, remove "_" prefix.
Lib/test/test_tabnanny.py
Outdated
* dir_or_file : A path to file or directory. This argument will be | ||
fed directly to tabnanny.check(). | ||
* out : Expected `stdout` after running tabnanny.check(). | ||
* err : Expected `stderr` after running tabnanny.check(). |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Again, I'm not sure that a long comment is needed for a simple unit test.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
I think it is explaining why the method is here. Suggest a way for improving the docstring.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
At least ditch the whole Arguments
section; we don't use that style in the stdlib.
Lib/test/test_tabnanny.py
Outdated
|
||
def test_correct_file(self): | ||
"""A python source code file without any errors.""" | ||
file_path = create_tmp_python_file(SOURCE_CODES["error_free"]) |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Who removes the temporary file? I suggest to put create_tmp_python_file() in the test case (or in a base class if it's needed by multiple test cases) and use self.addCleanup(support.unlink, tmpfile) to make sure that the temporary file is removed.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Adding it to a method will be a poor idea. If I will add it to base class then we will have a base class with one method. Will you accept that?
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Yes, if the method needs to access information that will be on the instance then a class with a single method is fine. But if you aren't reusing it then just inline the function.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
I like the overall change, but I have a long list of requests :-)
Lib/test/test_tabnanny.py
Outdated
|
||
@patch('tabnanny.NannyNag') | ||
def test_with_correct_code(self, MockNannyNag): | ||
"""A python source code without any whitespace related problems.""" |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
IMHO the docstring is useless.
Lib/test/test_tabnanny.py
Outdated
exception = tabnanny.NannyNag | ||
with open(file_path) as f: | ||
tokens = tokenize.generate_tokens(f.readline) | ||
self.assertRaises(exception, tabnanny.process_tokens, tokens) |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Move this assert out of the with block.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
We can't move this out.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Why not? Is tokenize.generate_tokens()
lazy (which isn't documented)?
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
@brettcannon The tokenize.generate_tokens()
is a lazy function (generator). Can you help to identify a way which allows putting assertRaises
outside the with
? Thanks!
Lib/test/test_tabnanny.py
Outdated
""" | ||
rc, out, err = script_helper.assert_python_ok('-m', 'tabnanny', *args) | ||
# Note: The `splitlines()` will solve the problem of CRLF(\r) added | ||
# by OS Windows. |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Use universal_newlines=True to normalize newlines. I also prefer to use text rather than bytes for stdout/stderr.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
I don't think these chain of methods, assert_python_ok
-> _assert_python
-> run_python_until_end
is allowing to pass universal_newlines
keyword argument!
Reference: https://github.com/python/cpython/blob/master/Lib/test/support/script_helper.py#L94
Are you suggesting to replace script_helper.assert_python_ok()
with subprocess.Popen()
here?
Lib/test/test_tabnanny.py
Outdated
# Note: The `splitlines()` will solve the problem of CRLF(\r) added | ||
# by OS Windows. | ||
self.assertListEqual(out.splitlines(), stdout.splitlines()) | ||
self.assertEqual(rc, return_code) |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
assert_python_ok() already tests that returncode==0.
Lib/test/test_tabnanny.py
Outdated
class TestCommandLine(TestCase): | ||
"""Tests command line interface of `tabnanny`.""" | ||
|
||
def _validate_cmd(self, *args, return_code=0, stdout=b"", stderr=b""): |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
make this method public
Lib/test/test_tabnanny.py
Outdated
def test_double_verbose_mode(self): | ||
"""Should display detailed error information if double verbose is on.""" | ||
file_path = create_tmp_python_file(SOURCE_CODES["nannynag_errored"]) | ||
stdout = b"checking %r ...\n" % (file_path,) |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
For better readability, you can use textwrap.dedent() and a multiline """...""" indented string. See test_faulthandler for examples.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
This is a nice suggestion 👍 Are you expecting these multiline strings to convert into a regular expression? I think this way just looks fine.
Lib/test/test_tabnanny.py
Outdated
class TestFormatWitnesses(TestCase): | ||
"""Testing `tabnanny.format_witnesses()`.""" | ||
|
||
def test_format_whitenesses(self): |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
witnesses, not whitenesses
To try and help move older pull requests forward, we are going through and backfilling 'awaiting' labels on pull requests that are lacking the label. Based on the current reviews, the best we can tell in an automated fashion is that a core developer requested changes to be made to this pull request. If/when the requested changes have been made, please leave a comment that says, |
@brettcannon Many thanks for your comment. I had tried to comment back at confusing points. I think @vstinner lost his interest in my solution. What efforts should I do to make it mergeable? Have a great day! |
@ultimatecoder if you think you have addressed all of the comments left by @vstinner then just leave a comment that says |
@brettcannon I have done the requested changes. There were few which I would like to discuss with @vstinner according to his availability. He has pointed out few changes on which I am confused about. I have tried to write back as a part of reply comment in response to improvement comment. I hope I made a clear statement about the situation. Thanks! |
@brettcannon Many thanks for your comments. I am under little work pressure. Please expect answers/improvements at the end of this week. Thanks! |
@brettcannon Reminding you for this PR. All the best for sprints 👍 |
@ultimatecoder no need as this is the top of the list for when I actually get time to start reviewing PRs 😉 |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Nothing fundamentally wrong, just some things to help make the tests easier to manage in future years.
Lib/test/test_tabnanny.py
Outdated
([] , '\n') | ||
] | ||
|
||
for args, expected in tests: |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
I would use subtests here: https://docs.python.org/3/library/unittest.html#distinguishing-test-iterations-using-subtests
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Done
Lib/test/test_tabnanny.py
Outdated
`verbose` mode of `tabnanny.verbose` asserts `stdout`. | ||
""" | ||
with tempfile.TemporaryDirectory() as tmp_dir: | ||
lines = ["%r: listing directory\n" % (tmp_dir,),] |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Use f-strings everywhere. 😄
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Done
Lib/test/test_tabnanny.py
Outdated
""" | ||
with tempfile.TemporaryDirectory() as tmp_dir: | ||
lines = ["%r: listing directory\n" % (tmp_dir,),] | ||
with TemporaryPyFile( |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
To make this easier to read, I would create the context managers outside the with
statement:
file1 = TemporaryPyFile(...)
file2 = TemporaryPyFile(...)
with file1 as file1_path, file2 as file2_path:
...
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
For this specific case, IMHO "file1 = ..." is better.
Lib/test/test_tabnanny.py
Outdated
def test_correct_directory(self): | ||
"""Directory which contains few error free python source code files.""" | ||
with tempfile.TemporaryDirectory() as tmp_dir: | ||
with TemporaryPyFile( |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Move the TemporaryPyFile
instantiation to its own line so you don't have to spread over multiple lines. (Same of the other lines where you were forced to spread a with
statement over multiple lines.)
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
I looked at the new code and it's fine.
Lib/test/test_tabnanny.py
Outdated
|
||
def test_when_tokenize_tokenerror(self): | ||
"""A python source code file eligible for raising 'tokenize.TokenError'. | ||
""" |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Pull this up to the next line up (it's okay for it to spill over 80 columns).
Lib/test/test_tabnanny.py
Outdated
SOURCE_CODES["nannynag_errored"] | ||
) as file_path: | ||
out = "%r: *** Line 3: trouble in tab city! ***\n" % (file_path,) | ||
out += "offending line: '\\tprint(\"world\")\\n'\n" |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Don't worry too much about the exact output being formatted as it is. For instance, if someone tweaked the grammar of the sentence the test should still pass. Do still check for semantically important info, though, like that the offending line is in the output.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Maybe the test is too strict, but IMHO we have been too pendantic on this nice PR which has been proposed 3 months ago. tabnanny has currently no test. If the test fails tomorrow, we will just fix the test. No need to write the perfect test here.
Lib/test/test_tabnanny.py
Outdated
def test_when_no_file(self): | ||
"""A python file which does not exist actually in system.""" | ||
file_path = 'no_file.py' | ||
err = "%r: I/O Error: [Errno 2] No such file or directory: %r\n" % ( |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
You don't want to tie yourself to exception messages as they do change between versions. Just care about the right exception being raised.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
I agree, but the code does not raise an exception reference: https://github.com/python/cpython/blob/master/Lib/tabnanny.py#L99
What way will be better to assert the working of mentioned function?
# `check_equal and type not in JUNK` condition at | ||
# `tabnanny.process_tokens()`. | ||
|
||
for key in ["tab_space_errored_1", "tab_space_errored_2"]: |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Sub tests would be great here.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Done
A Python core developer has requested some changes be made to your pull request before we can consider merging it. If you could please address their requests along with any other requests in other reviews from core developers that would be appreciated. Once you have made the requested changes, please leave a comment on this pull request containing the phrase |
@brettcannon I am a bit busy with present work. I am sure, I will not be able to complete during this sprints. But I will be able to improve according to your comments in few days. Thanks for reviewing :) |
@ultimatecoder no rush! I'm not expecting to take quite so long to do future reviews as I only need to review relative future changes. |
dcf42e5
to
ebff66b
Compare
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Please remove Lib/test/.test_tabnanny.py.swo from your PR.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Oh, I am sorry, I forgot about your old PR :-( Here is a new review. Your PR is very close to be ready to be merged. Sorry again about the slow review :-(
Lib/test/test_tabnanny.py
Outdated
"""Asserting formatter result by giving various input samples.""" | ||
tests = [ | ||
('Test' , 'at tab sizes T, e, s, t'), | ||
('' , 'at tab size '), |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Sorry but this style is not compliant with PEP 8, please strip spaces before ",".
Lib/test/test_tabnanny.py
Outdated
|
||
def __exit__(self, exc_type, exc_value, exc_traceback): | ||
if exc_type is None: | ||
unlink(self.file_path) |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
You should always remove the created file.
Lib/test/test_tabnanny.py
Outdated
|
||
def validate_cmd(self, *args, stdout="", stderr=""): | ||
"""Common function to assert the behaviour of command line interface.""" | ||
_, out, err = script_helper.assert_python_ok('-m', 'tabnanny', *args) |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
You may use:
proc = script_helper.spawn_python('-m', 'tabnanny', *args, text=True)
out, err = proc.communicate()
self.assertEqual(out, stdout)
self.assertEqual(err, stderr)
self.assertEqual(proc.returncode, 0)
text=True normalizes newlines to \n (Unix EOL).
db139c5
to
83083c9
Compare
@vstinner Thanks for re-observing this. I am working on the improvements suggested by you and @brettcannon 😃 |
@brettcannon I have updated the changes according to your comments. There is one comment in which you mentioned to assert the exception and not the output. I have added a reply to that comment with a reference. I request to provide your input on that. Thanks. |
a2be776
to
e9f48d6
Compare
@vstinner I have improved the code according to your suggestion. I request to re-review. |
Lib/test/test_tabnanny.py
Outdated
|
||
def __exit__(self, exc_type, exc_value, exc_traceback): | ||
unlink(self.file_path) | ||
return exc_type is None |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
I'm not sure that returning True is correct here. I just suggest to remove the "return" line.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
I agree, returning True isn't making sense here. Thanks for commenting.
e9f48d6
to
86b9ad2
Compare
@vstinner @brettcannon I have updated the code according to your comments. I request to proceed for further review. Thanks. |
I checked all latest Brett's comments: all fixed
Description: Unit tests for standard module
tabnanny
. Tests are added for almost all the functionality excepttabnanny.Whitespace
class.Reason leaving Whitespace:? I found the module contains mathematical calculations. I will try to understand it first and then write tests for it. I think it will be good to do that in another branch.
Testing strategy: Whitebox
BPOs
https://bugs.python.org/issue19382