test_isinstance_union_syntax.py
1 from pathlib import Path 2 3 from clint.config import Config 4 from clint.index import SymbolIndex 5 from clint.linter import Position, Range, lint_file 6 from clint.rules import IsinstanceUnionSyntax 7 8 9 def test_isinstance_union_syntax(index: SymbolIndex) -> None: 10 code = """ 11 # Bad - basic union syntax 12 isinstance(obj, str | int) 13 isinstance(value, int | str | float) 14 15 # Bad - parenthesized union in tuple 16 isinstance(x, ((str | int),)) 17 18 # Good - tuple syntax (recommended) 19 isinstance(obj, (str, int)) 20 isinstance(value, (int, str, float)) 21 22 # Good - single type 23 isinstance(obj, str) 24 isinstance(obj, int) 25 26 # Good - Union type annotation (different syntax) 27 isinstance(obj, Union[str, int]) 28 29 # Good - other functions with union syntax 30 other_func(obj, str | int) 31 some_call(x | y) 32 33 # Good - invalid isinstance calls, not our concern 34 isinstance() 35 isinstance(obj) 36 """ 37 config = Config(select={IsinstanceUnionSyntax.name}) 38 results = lint_file(Path("test.py"), code, config, index) 39 assert all(isinstance(r.rule, IsinstanceUnionSyntax) for r in results) 40 assert [r.range for r in results] == [ 41 Range(Position(2, 0)), 42 Range(Position(3, 0)), 43 Range(Position(6, 0)), 44 ]