[ty] Add more tests for renamings (#21810)

This commit is contained in:
Alex Waygood 2025-12-05 12:41:31 +00:00 committed by GitHub
parent 48f7f42784
commit 71a7a03ad4
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
1 changed files with 477 additions and 9 deletions

View File

@ -1432,7 +1432,7 @@ result = func(10, y=20)
fn rename_overloaded_function() {
let test = CursorTest::builder()
.source(
"mypackage/__init__.py",
"lib1.py",
r#"
from typing import overload, Any
@ -1448,9 +1448,9 @@ result = func(10, y=20)
"#,
)
.source(
"mypackage/subpkg/__init__.py",
"main.py",
r#"
from lib import test
from lib2 import test
test("test")
"#,
@ -1459,7 +1459,7 @@ result = func(10, y=20)
assert_snapshot!(test.rename("better_name"), @r"
info[rename]: Rename symbol (found 1 locations)
--> mypackage/__init__.py:5:5
--> lib1.py:5:5
|
4 | @overload
5 | def test() -> None: ...
@ -1470,11 +1470,479 @@ result = func(10, y=20)
");
}
#[test]
fn rename_property() {
let test = CursorTest::builder()
.source(
"lib.py",
r#"
class Foo:
@property
def my_property<CURSOR>(self) -> int:
return 42
"#,
)
.source(
"main.py",
r#"
from lib import Foo
print(Foo().my_property)
"#,
)
.build();
assert_snapshot!(test.rename("better_name"), @r"
info[rename]: Rename symbol (found 2 locations)
--> lib.py:4:9
|
2 | class Foo:
3 | @property
4 | def my_property(self) -> int:
| ^^^^^^^^^^^
5 | return 42
|
::: main.py:4:13
|
2 | from lib import Foo
3 |
4 | print(Foo().my_property)
| -----------
|
");
}
// TODO: this should rename the name of the function decorated with
// `@my_property.setter` as well as the getter function name
#[test]
fn rename_property_with_setter() {
let test = CursorTest::builder()
.source(
"lib.py",
r#"
class Foo:
@property
def my_property<CURSOR>(self) -> int:
return 42
@my_property.setter
def my_property(self, value: int) -> None:
pass
"#,
)
.source(
"main.py",
r#"
from lib import Foo
print(Foo().my_property)
Foo().my_property = 56
"#,
)
.build();
assert_snapshot!(test.rename("better_name"), @r"
info[rename]: Rename symbol (found 4 locations)
--> lib.py:4:9
|
2 | class Foo:
3 | @property
4 | def my_property(self) -> int:
| ^^^^^^^^^^^
5 | return 42
6 |
7 | @my_property.setter
| -----------
8 | def my_property(self, value: int) -> None:
9 | pass
|
::: main.py:4:13
|
2 | from lib import Foo
3 |
4 | print(Foo().my_property)
| -----------
5 | Foo().my_property = 56
| -----------
|
");
}
// TODO: this should rename the name of the function decorated with
// `@my_property.deleter` as well as the getter function name
#[test]
fn rename_property_with_deleter() {
let test = CursorTest::builder()
.source(
"lib.py",
r#"
class Foo:
@property
def my_property<CURSOR>(self) -> int:
return 42
@my_property.deleter
def my_property(self) -> None:
pass
"#,
)
.source(
"main.py",
r#"
from lib import Foo
print(Foo().my_property)
del Foo().my_property
"#,
)
.build();
assert_snapshot!(test.rename("better_name"), @r"
info[rename]: Rename symbol (found 4 locations)
--> lib.py:4:9
|
2 | class Foo:
3 | @property
4 | def my_property(self) -> int:
| ^^^^^^^^^^^
5 | return 42
6 |
7 | @my_property.deleter
| -----------
8 | def my_property(self) -> None:
9 | pass
|
::: main.py:4:13
|
2 | from lib import Foo
3 |
4 | print(Foo().my_property)
| -----------
5 | del Foo().my_property
| -----------
|
");
}
// TODO: this should rename the name of the functions decorated with
// `@my_property.deleter` and `@my_property.deleter` as well as the
// getter function name
#[test]
fn rename_property_with_setter_and_deleter() {
let test = CursorTest::builder()
.source(
"lib.py",
r#"
class Foo:
@property
def my_property<CURSOR>(self) -> int:
return 42
@my_property.setter
def my_property(self, value: int) -> None:
pass
@my_property.deleter
def my_property(self) -> None:
pass
"#,
)
.source(
"main.py",
r#"
from lib import Foo
print(Foo().my_property)
Foo().my_property = 56
del Foo().my_property
"#,
)
.build();
assert_snapshot!(test.rename("better_name"), @r"
info[rename]: Rename symbol (found 6 locations)
--> lib.py:4:9
|
2 | class Foo:
3 | @property
4 | def my_property(self) -> int:
| ^^^^^^^^^^^
5 | return 42
6 |
7 | @my_property.setter
| -----------
8 | def my_property(self, value: int) -> None:
9 | pass
10 |
11 | @my_property.deleter
| -----------
12 | def my_property(self) -> None:
13 | pass
|
::: main.py:4:13
|
2 | from lib import Foo
3 |
4 | print(Foo().my_property)
| -----------
5 | Foo().my_property = 56
| -----------
6 | del Foo().my_property
| -----------
|
");
}
#[test]
fn rename_single_dispatch_function() {
let test = CursorTest::builder()
.source(
"foo.py",
r#"
from functools import singledispatch
@singledispatch
def f<CURSOR>(x: object):
raise NotImplementedError
@f.register
def _(x: int) -> str:
return "int"
@f.register
def _(x: str) -> int:
return int(x)
"#,
)
.build();
assert_snapshot!(test.rename("better_name"), @r#"
info[rename]: Rename symbol (found 3 locations)
--> foo.py:5:5
|
4 | @singledispatch
5 | def f(x: object):
| ^
6 | raise NotImplementedError
7 |
8 | @f.register
| -
9 | def _(x: int) -> str:
10 | return "int"
11 |
12 | @f.register
| -
13 | def _(x: str) -> int:
14 | return int(x)
|
"#);
}
#[test]
fn rename_single_dispatch_function_stacked_register() {
let test = CursorTest::builder()
.source(
"foo.py",
r#"
from functools import singledispatch
@singledispatch
def f<CURSOR>(x):
raise NotImplementedError
@f.register(int)
@f.register(float)
def _(x) -> float:
return "int"
@f.register(str)
def _(x) -> int:
return int(x)
"#,
)
.build();
assert_snapshot!(test.rename("better_name"), @r#"
info[rename]: Rename symbol (found 4 locations)
--> foo.py:5:5
|
4 | @singledispatch
5 | def f(x):
| ^
6 | raise NotImplementedError
7 |
8 | @f.register(int)
| -
9 | @f.register(float)
| -
10 | def _(x) -> float:
11 | return "int"
12 |
13 | @f.register(str)
| -
14 | def _(x) -> int:
15 | return int(x)
|
"#);
}
#[test]
fn rename_single_dispatchmethod() {
let test = CursorTest::builder()
.source(
"foo.py",
r#"
from functools import singledispatchmethod
class Foo:
@singledispatchmethod
def f<CURSOR>(self, x: object):
raise NotImplementedError
@f.register
def _(self, x: str) -> float:
return "int"
@f.register
def _(self, x: str) -> int:
return int(x)
"#,
)
.build();
assert_snapshot!(test.rename("better_name"), @r#"
info[rename]: Rename symbol (found 3 locations)
--> foo.py:6:9
|
4 | class Foo:
5 | @singledispatchmethod
6 | def f(self, x: object):
| ^
7 | raise NotImplementedError
8 |
9 | @f.register
| -
10 | def _(self, x: str) -> float:
11 | return "int"
12 |
13 | @f.register
| -
14 | def _(self, x: str) -> int:
15 | return int(x)
|
"#);
}
#[test]
fn rename_single_dispatchmethod_staticmethod() {
let test = CursorTest::builder()
.source(
"foo.py",
r#"
from functools import singledispatchmethod
class Foo:
@singledispatchmethod
@staticmethod
def f<CURSOR>(self, x):
raise NotImplementedError
@f.register(str)
@staticmethod
def _(x: int) -> str:
return "int"
@f.register
@staticmethod
def _(x: str) -> int:
return int(x)
"#,
)
.build();
assert_snapshot!(test.rename("better_name"), @r#"
info[rename]: Rename symbol (found 3 locations)
--> foo.py:7:9
|
5 | @singledispatchmethod
6 | @staticmethod
7 | def f(self, x):
| ^
8 | raise NotImplementedError
9 |
10 | @f.register(str)
| -
11 | @staticmethod
12 | def _(x: int) -> str:
13 | return "int"
14 |
15 | @f.register
| -
16 | @staticmethod
17 | def _(x: str) -> int:
|
"#);
}
#[test]
fn rename_single_dispatchmethod_classmethod() {
let test = CursorTest::builder()
.source(
"foo.py",
r#"
from functools import singledispatchmethod
class Foo:
@singledispatchmethod
@classmethod
def f<CURSOR>(cls, x):
raise NotImplementedError
@f.register(str)
@classmethod
def _(cls, x) -> str:
return "int"
@f.register(int)
@f.register(float)
@staticmethod
def _(cls, x) -> int:
return int(x)
"#,
)
.build();
assert_snapshot!(test.rename("better_name"), @r#"
info[rename]: Rename symbol (found 4 locations)
--> foo.py:7:9
|
5 | @singledispatchmethod
6 | @classmethod
7 | def f(cls, x):
| ^
8 | raise NotImplementedError
9 |
10 | @f.register(str)
| -
11 | @classmethod
12 | def _(cls, x) -> str:
13 | return "int"
14 |
15 | @f.register(int)
| -
16 | @f.register(float)
| -
17 | @staticmethod
18 | def _(cls, x) -> int:
|
"#);
}
#[test]
fn rename_attribute() {
let test = CursorTest::builder()
.source(
"mypackage/__init__.py",
"foo.py",
r#"
class Test:
attribute<CURSOR>: str
@ -1497,7 +1965,7 @@ result = func(10, y=20)
assert_snapshot!(test.rename("better_name"), @r#"
info[rename]: Rename symbol (found 5 locations)
--> mypackage/__init__.py:3:5
--> foo.py:3:5
|
2 | class Test:
3 | attribute: str
@ -1512,7 +1980,7 @@ result = func(10, y=20)
10 | return self.attribute
| ---------
|
::: mypackage/__init__.py:15:9
::: foo.py:15:9
|
13 | c = Child("test")
14 |
@ -1530,7 +1998,7 @@ result = func(10, y=20)
fn rename_implicit_attribute() {
let test = CursorTest::builder()
.source(
"mypackage/__init__.py",
"main.py",
r#"
class Test:
def __init__(self, value: str):
@ -1555,7 +2023,7 @@ result = func(10, y=20)
assert_snapshot!(test.rename("better_name"), @r"
info[rename]: Rename symbol (found 1 locations)
--> mypackage/__init__.py:4:14
--> main.py:4:14
|
2 | class Test:
3 | def __init__(self, value: str):