mirror of
https://github.com/astral-sh/ruff.git
synced 2025-10-02 06:41:23 +00:00
[red-knot] Add tests asserting that KnownClass::to_instance()
doesn't unexpectedly fallback to Type::Unknown
with full typeshed stubs (#16608)
## Summary One of the motivations in https://github.com/astral-sh/ruff/pull/16428 for panicking when the `test` or `debug_assertions` features are enabled and a lookup of a `KnownClass` fails is that we've had some latent bugs in our code where certain variants have been silently falling back to `Unknown` in every typeshed lookup without us realising. But that in itself isn't a great motivation for panicking in `KnownClass::to_instance()`, since we can fairly easily add some tests that assert that we don't unexpectedly fallback to `Unknown` for any `KnownClass` variant. This PR adds those tests. ## Test Plan `cargo test -p red_knot_python_semantic`
This commit is contained in:
parent
e8e24310fb
commit
989075dc16
1 changed files with 45 additions and 5 deletions
|
@ -995,11 +995,10 @@ impl<'db> KnownClass {
|
||||||
| Self::MethodWrapperType
|
| Self::MethodWrapperType
|
||||||
| Self::WrapperDescriptorType => KnownModule::Types,
|
| Self::WrapperDescriptorType => KnownModule::Types,
|
||||||
Self::NoneType => KnownModule::Typeshed,
|
Self::NoneType => KnownModule::Typeshed,
|
||||||
Self::SpecialForm
|
Self::SpecialForm | Self::TypeVar | Self::StdlibAlias | Self::SupportsIndex => {
|
||||||
| Self::TypeVar
|
KnownModule::Typing
|
||||||
| Self::TypeAliasType
|
}
|
||||||
| Self::StdlibAlias
|
Self::TypeAliasType => KnownModule::TypingExtensions,
|
||||||
| Self::SupportsIndex => KnownModule::Typing,
|
|
||||||
Self::NoDefaultType => {
|
Self::NoDefaultType => {
|
||||||
let python_version = Program::get(db).python_version(db);
|
let python_version = Program::get(db).python_version(db);
|
||||||
|
|
||||||
|
@ -1603,6 +1602,7 @@ mod tests {
|
||||||
use super::*;
|
use super::*;
|
||||||
use crate::db::tests::setup_db;
|
use crate::db::tests::setup_db;
|
||||||
use crate::module_resolver::resolve_module;
|
use crate::module_resolver::resolve_module;
|
||||||
|
use salsa::Setter;
|
||||||
use strum::IntoEnumIterator;
|
use strum::IntoEnumIterator;
|
||||||
|
|
||||||
#[test]
|
#[test]
|
||||||
|
@ -1619,4 +1619,44 @@ mod tests {
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
fn known_class_doesnt_fallback_to_unknown_unexpectedly_on_latest_version() {
|
||||||
|
let mut db = setup_db();
|
||||||
|
|
||||||
|
Program::get(&db)
|
||||||
|
.set_python_version(&mut db)
|
||||||
|
.to(PythonVersion::latest());
|
||||||
|
|
||||||
|
for class in KnownClass::iter() {
|
||||||
|
assert_ne!(
|
||||||
|
class.to_instance(&db),
|
||||||
|
Type::unknown(),
|
||||||
|
"Unexpectedly fell back to `Unknown` for `{class:?}`"
|
||||||
|
);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
fn known_class_doesnt_fallback_to_unknown_unexpectedly_on_low_python_version() {
|
||||||
|
let mut db = setup_db();
|
||||||
|
|
||||||
|
for class in KnownClass::iter() {
|
||||||
|
let version_added = match class {
|
||||||
|
KnownClass::BaseExceptionGroup => PythonVersion::PY311,
|
||||||
|
KnownClass::GenericAlias => PythonVersion::PY39,
|
||||||
|
_ => PythonVersion::PY37,
|
||||||
|
};
|
||||||
|
|
||||||
|
Program::get(&db)
|
||||||
|
.set_python_version(&mut db)
|
||||||
|
.to(version_added);
|
||||||
|
|
||||||
|
assert_ne!(
|
||||||
|
class.to_instance(&db),
|
||||||
|
Type::unknown(),
|
||||||
|
"Unexpectedly fell back to `Unknown` for `{class:?}` on Python {version_added}"
|
||||||
|
);
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue