|
8 | 8 | from argparse import Namespace |
9 | 9 | from pathlib import Path |
10 | 10 |
|
11 | | -from hypothesis import HealthCheck, given, settings |
12 | | -from hypothesmith import from_grammar |
13 | | - |
14 | 11 | from bugbear import ( |
15 | 12 | B001, |
16 | 13 | B002, |
@@ -524,43 +521,51 @@ def test_b907(self): |
524 | 521 | filename = Path(__file__).absolute().parent / "b907.py" |
525 | 522 | bbc = BugBearChecker(filename=str(filename)) |
526 | 523 | errors = list(bbc.run()) |
| 524 | + py39 = sys.version_info >= (3, 9) |
| 525 | + py312 = sys.version_info >= (3, 12) |
| 526 | + |
| 527 | + def on_py312(number): |
| 528 | + """F-string nodes have column numbers set to 0 on <py312""" |
| 529 | + return number if py312 else 0 |
| 530 | + |
527 | 531 | expected = self.errors( |
528 | | - B907(8, 0, vars=("var",)), |
529 | | - B907(9, 0, vars=("var",)), |
530 | | - B907(10, 0, vars=("var",)), |
531 | | - B907(12, 0, vars=("var",)), |
532 | | - B907(13, 0, vars=("var",)), |
533 | | - B907(14, 0, vars=("var",)), |
534 | | - B907(16, 0, vars=("'hello'",)), |
535 | | - B907(17, 0, vars=("foo()",)), |
536 | | - B907(20, 5, vars=("var",)), |
537 | | - B907(25, 5, vars=("var",)), |
538 | | - B907(31, 0, vars=("var",)), |
539 | | - B907(32, 0, vars=("var",)), |
540 | | - B907(33, 0, vars=("var",)), |
541 | | - B907(33, 0, vars=("var2",)), |
542 | | - B907(34, 0, vars=("var",)), |
543 | | - B907(34, 0, vars=("var2",)), |
544 | | - B907(35, 0, vars=("var",)), |
545 | | - B907(35, 0, vars=("var2",)), |
546 | | - B907(38, 0, vars=("var2",)), |
547 | | - B907(41, 0, vars=("var",)), |
548 | | - B907(42, 0, vars=("var.__str__",)), |
549 | | - B907(43, 0, vars=("var.__str__.__repr__",)), |
550 | | - B907(44, 0, vars=("3 + 5" if sys.version_info >= (3, 9) else "BinOp",)), |
551 | | - B907(45, 0, vars=("foo()",)), |
552 | | - B907(46, 0, vars=("None",)), |
553 | | - B907(47, 0, vars=("..." if sys.version_info >= (3, 9) else "Ellipsis",)), |
554 | | - B907(48, 0, vars=("True",)), |
555 | | - B907(51, 0, vars=("var",)), |
556 | | - B907(52, 0, vars=("var",)), |
557 | | - B907(53, 0, vars=("var",)), |
558 | | - B907(54, 0, vars=("var",)), |
559 | | - B907(57, 0, vars=("var",)), |
560 | | - B907(60, 0, vars=("var",)), |
561 | | - B907(64, 0, vars=("var",)), |
562 | | - B907(66, 0, vars=("var",)), |
563 | | - B907(68, 0, vars=("var",)), |
| 532 | + B907(8, on_py312(9), vars=("var",)), |
| 533 | + B907(9, on_py312(3), vars=("var",)), |
| 534 | + B907(10, on_py312(9), vars=("var",)), |
| 535 | + B907(12, on_py312(9), vars=("var",)), |
| 536 | + B907(13, on_py312(3), vars=("var",)), |
| 537 | + B907(14, on_py312(9), vars=("var",)), |
| 538 | + B907(16, on_py312(5), vars=("'hello'",)), |
| 539 | + B907(17, on_py312(5), vars=("foo()",)), |
| 540 | + # Multiline f-strings have lineno changes as well as colno changes on py312+ |
| 541 | + B907(21 if py312 else 20, 7 if py312 else 5, vars=("var",)), |
| 542 | + B907(26 if py312 else 25, 7 if py312 else 5, vars=("var",)), |
| 543 | + B907(31, on_py312(12), vars=("var",)), |
| 544 | + B907(32, on_py312(3), vars=("var",)), |
| 545 | + B907(33, on_py312(3), vars=("var",)), |
| 546 | + B907(33, on_py312(29), vars=("var2",)), |
| 547 | + B907(34, on_py312(3), vars=("var",)), |
| 548 | + B907(34, on_py312(15), vars=("var2",)), |
| 549 | + B907(35, on_py312(3), vars=("var",)), |
| 550 | + B907(35, on_py312(10), vars=("var2",)), |
| 551 | + B907(38, on_py312(13), vars=("var2",)), |
| 552 | + B907(41, on_py312(3), vars=("var",)), |
| 553 | + B907(42, on_py312(3), vars=("var.__str__",)), |
| 554 | + B907(43, on_py312(3), vars=("var.__str__.__repr__",)), |
| 555 | + B907(44, on_py312(3), vars=("3 + 5" if py39 else "BinOp",)), |
| 556 | + B907(45, on_py312(3), vars=("foo()",)), |
| 557 | + B907(46, on_py312(3), vars=("None",)), |
| 558 | + B907(47, on_py312(3), vars=("..." if py39 else "Ellipsis",)), |
| 559 | + B907(48, on_py312(3), vars=("True",)), |
| 560 | + B907(51, on_py312(3), vars=("var",)), |
| 561 | + B907(52, on_py312(3), vars=("var",)), |
| 562 | + B907(53, on_py312(3), vars=("var",)), |
| 563 | + B907(54, on_py312(3), vars=("var",)), |
| 564 | + B907(57, on_py312(3), vars=("var",)), |
| 565 | + B907(60, on_py312(3), vars=("var",)), |
| 566 | + B907(64, on_py312(5), vars=("var",)), |
| 567 | + B907(66, on_py312(3), vars=("var",)), |
| 568 | + B907(68, on_py312(3), vars=("var",)), |
564 | 569 | ) |
565 | 570 | self.assertEqual(errors, expected) |
566 | 571 |
|
@@ -795,13 +800,18 @@ def test_selfclean_test_bugbear(self): |
795 | 800 |
|
796 | 801 |
|
797 | 802 | class TestFuzz(unittest.TestCase): |
798 | | - @settings(suppress_health_check=[HealthCheck.too_slow]) |
799 | | - @given(from_grammar().map(ast.parse)) |
800 | | - def test_does_not_crash_on_any_valid_code(self, syntax_tree): |
801 | | - # Given any syntatically-valid source code, flake8-bugbear should |
802 | | - # not crash. This tests doesn't check that we do the *right* thing, |
803 | | - # just that we don't crash on valid-if-poorly-styled code! |
804 | | - BugBearVisitor(filename="<string>", lines=[]).visit(syntax_tree) |
| 803 | + # TODO: enable this test on py312 once hypothesmith supports py312 |
| 804 | + if sys.version_info < (3, 12): |
| 805 | + from hypothesis import HealthCheck, given, settings |
| 806 | + from hypothesmith import from_grammar |
| 807 | + |
| 808 | + @settings(suppress_health_check=[HealthCheck.too_slow]) |
| 809 | + @given(from_grammar().map(ast.parse)) |
| 810 | + def test_does_not_crash_on_any_valid_code(self, syntax_tree): |
| 811 | + # Given any syntatically-valid source code, flake8-bugbear should |
| 812 | + # not crash. This tests doesn't check that we do the *right* thing, |
| 813 | + # just that we don't crash on valid-if-poorly-styled code! |
| 814 | + BugBearVisitor(filename="<string>", lines=[]).visit(syntax_tree) |
805 | 815 |
|
806 | 816 | def test_does_not_crash_on_site_code(self): |
807 | 817 | # Because the generator isn't perfect, we'll also test on all the code |
|
0 commit comments