Code Duplication    Length = 13-17 lines in 3 locations

didyoumean/didyoumean_sugg_tests.py 3 locations

@@ 1574-1590 (lines=17) @@
1571
1572
    def test_iter_cannot_be_interpreted_as_int(self):
1573
        """Trying to call `range(len(iterable))` (bad) and forget the len."""
1574
        before, after = before_and_after((3, 0))
1575
        bad_code = 'range([0, 1, 2])'
1576
        good_code = 'range(len([0, 1, 2]))'
1577
        sugg = "'len(list)'"
1578
        self.runs(good_code)
1579
        self.throws(bad_code, INTEXPECTED, sugg, before)
1580
        self.throws(bad_code, CANNOTBEINTERPRETED, sugg, after)
1581
1582
    RANGE_CODE_TEMPLATES = [
1583
        'range({0})',
1584
        'range({0}, 14)',
1585
        'range(0, 24, {0})'
1586
    ]
1587
    INDEX_CODE_TEMPLATES = ['[1, 2, 3][{0}]', '(1, 2, 3)[{0}]']
1588
1589
    def test_str_cannot_be_interpreted_as_int(self):
1590
        """Forget to convert str to int."""
1591
        before, after = before_and_after((3, 0))
1592
        suggs = ["'int(str)'", "'len(str)'"]
1593
        for code in self.RANGE_CODE_TEMPLATES:
@@ 1504-1518 (lines=15) @@
1501
    def test_keyword_builtin(self):
1502
        """A few builtins (like int()) have a different error message."""
1503
        # NICE_TO_HAVE
1504
        # 'max', 'input', 'len', 'abs', 'all', etc have a specific error
1505
        # message and are not relevant here
1506
        before, after = before_and_after((3, 7))
1507
        for builtin, kwarg in [
1508
                ('float', False), ('bool', False),
1509
                ('int', True), ('complex', True)]:
1510
            code = builtin + '(this_doesnt_exist=2)'
1511
            old_exc = UNEXPECTEDKWARG2
1512
            new_exc = UNEXPECTEDKWARG4 if kwarg else NOKWARGS
1513
            sugg = [] if kwarg else NO_KEYWORD_ARG_MSG
1514
            self.throws(code, old_exc, [], before, interpreters='cpython')
1515
            self.throws(code, new_exc, sugg, after, interpreters='cpython')
1516
            self.throws(code, UNEXPECTEDKWARG, interpreters='pypy')
1517
1518
    def test_keyword_builtin_print(self):
1519
        """Builtin "print" has a different error message."""
1520
        # It would be NICE_TO_HAVE suggestions on keyword arguments
1521
        before, mid, after = before_mid_and_after((3, 0), (3, 7))
@@ 2240-2252 (lines=13) @@
2237
        self.throws(bad, INVALIDTOKEN, [], after, 'cpython')
2238
        self.throws(bad, INVALIDSYNTAX, [], after, 'pypy')
2239
2240
    def test_extended_unpacking(self):
2241
        """Extended iterable unpacking is added with Python 3."""
2242
        before, after = before_and_after((3, 0))
2243
        code = '(a, *rest, b) = range(5)'
2244
        self.throws(code, INVALIDSYNTAX, [], before)
2245
        self.runs(code, after)
2246
2247
    def test_ellipsis(self):
2248
        """Triple dot (...) aka Ellipsis can be used anywhere in Python 3."""
2249
        before, after = before_and_after((3, 0))
2250
        code = '...'
2251
        self.throws(code, INVALIDSYNTAX, [], before)
2252
        self.runs(code, after)
2253
2254
    def test_fstring(self):
2255
        """Fstring (see PEP 498) appeared in Python 3.6."""