| import io | |
| import time | |
| import unittest | |
| import tokenize | |
| from functools import partial | |
| from threading import Thread | |
| from test.support import threading_helper | |
| @threading_helper.requires_working_threading() | |
| class TestTokenize(unittest.TestCase): | |
| def test_tokenizer_iter(self): | |
| source = io.StringIO("for _ in a:\n pass") | |
| it = tokenize._tokenize.TokenizerIter(source.readline, extra_tokens=False) | |
| tokens = [] | |
| def next_token(it): | |
| while True: | |
| try: | |
| r = next(it) | |
| tokens.append(tokenize.TokenInfo._make(r)) | |
| time.sleep(0.03) | |
| except StopIteration: | |
| return | |
| threads = [] | |
| for _ in range(5): | |
| threads.append(Thread(target=partial(next_token, it))) | |
| for thread in threads: | |
| thread.start() | |
| for thread in threads: | |
| thread.join() | |
| expected_tokens = [ | |
| tokenize.TokenInfo(type=1, string='for', start=(1, 0), end=(1, 3), line='for _ in a:\n'), | |
| tokenize.TokenInfo(type=1, string='_', start=(1, 4), end=(1, 5), line='for _ in a:\n'), | |
| tokenize.TokenInfo(type=1, string='in', start=(1, 6), end=(1, 8), line='for _ in a:\n'), | |
| tokenize.TokenInfo(type=1, string='a', start=(1, 9), end=(1, 10), line='for _ in a:\n'), | |
| tokenize.TokenInfo(type=11, string=':', start=(1, 10), end=(1, 11), line='for _ in a:\n'), | |
| tokenize.TokenInfo(type=4, string='', start=(1, 11), end=(1, 11), line='for _ in a:\n'), | |
| tokenize.TokenInfo(type=5, string='', start=(2, -1), end=(2, -1), line=' pass'), | |
| tokenize.TokenInfo(type=1, string='pass', start=(2, 2), end=(2, 6), line=' pass'), | |
| tokenize.TokenInfo(type=4, string='', start=(2, 6), end=(2, 6), line=' pass'), | |
| tokenize.TokenInfo(type=6, string='', start=(2, -1), end=(2, -1), line=' pass'), | |
| tokenize.TokenInfo(type=0, string='', start=(2, -1), end=(2, -1), line=' pass'), | |
| ] | |
| tokens.sort() | |
| expected_tokens.sort() | |
| self.assertListEqual(tokens, expected_tokens) | |
| if __name__ == "__main__": | |
| unittest.main() |