/ dev / clint / tests / rules / test_isinstance_union_syntax.py
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      ]