diff --git a/Cargo.lock b/Cargo.lock index a746fa1af0..065da4f3f3 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -1004,27 +1004,6 @@ dependencies = [ "crypto-common", ] -[[package]] -name = "dir-test" -version = "0.4.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "62c013fe825864f3e4593f36426c1fa7a74f5603f13ca8d1af7a990c1cd94a79" -dependencies = [ - "dir-test-macros", -] - -[[package]] -name = "dir-test-macros" -version = "0.4.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d42f54d7b4a6bc2400fe5b338e35d1a335787585375322f49c5d5fe7b243da7e" -dependencies = [ - "glob", - "proc-macro2", - "quote", - "syn", -] - [[package]] name = "dirs" version = "6.0.0" @@ -4513,7 +4492,7 @@ dependencies = [ "camino", "colored 3.0.0", "compact_str", - "dir-test", + "datatest-stable", "drop_bomb", "get-size2", "glob", diff --git a/Cargo.toml b/Cargo.toml index dbd9808fdd..fdd5c1ffba 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -82,7 +82,6 @@ criterion = { version = "0.7.0", default-features = false } crossbeam = { version = "0.8.4" } dashmap = { version = "6.0.1" } datatest-stable = { version = "0.3.3" } -dir-test = { version = "0.4.0" } dunce = { version = "1.0.5" } drop_bomb = { version = "0.1.5" } etcetera = { version = "0.11.0" } diff --git a/crates/ty_python_semantic/Cargo.toml b/crates/ty_python_semantic/Cargo.toml index 957126cf3a..30d0a26fad 100644 --- a/crates/ty_python_semantic/Cargo.toml +++ b/crates/ty_python_semantic/Cargo.toml @@ -33,7 +33,7 @@ camino = { workspace = true } colored = { workspace = true } compact_str = { workspace = true } drop_bomb = { workspace = true } -get-size2 = { workspace = true, features = ["indexmap", "ordermap"]} +get-size2 = { workspace = true, features = ["indexmap", "ordermap"] } indexmap = { workspace = true } itertools = { workspace = true } ordermap = { workspace = true } @@ -62,7 +62,7 @@ ty_test = { workspace = true } ty_vendored = { workspace = true } anyhow = { workspace = true } -dir-test = { workspace = true } +datatest-stable = { workspace = true } glob = { workspace = true } indoc = { workspace = true } insta = { workspace = true } @@ -76,5 +76,9 @@ schemars = ["dep:schemars", "dep:serde_json"] serde = ["ruff_db/serde", "dep:serde", "ruff_python_ast/serde"] testing = [] +[[test]] +name = "mdtest" +harness = false + [lints] workspace = true diff --git a/crates/ty_python_semantic/build.rs b/crates/ty_python_semantic/build.rs deleted file mode 100644 index d9c90fc60b..0000000000 --- a/crates/ty_python_semantic/build.rs +++ /dev/null @@ -1,4 +0,0 @@ -/// Rebuild the crate if a test file is added or removed from -pub fn main() { - println!("cargo::rerun-if-changed=resources/mdtest"); -} diff --git a/crates/ty_python_semantic/mdtest.py b/crates/ty_python_semantic/mdtest.py index 2acc6f452b..690ade8515 100644 --- a/crates/ty_python_semantic/mdtest.py +++ b/crates/ty_python_semantic/mdtest.py @@ -129,17 +129,8 @@ class MDTestRunner: check=False, ) - def _mangle_path(self, markdown_file: Path) -> str: - return ( - markdown_file.as_posix() - .replace("/", "_") - .replace("-", "_") - .removesuffix(".md") - ) - def _run_mdtests_for_file(self, markdown_file: Path) -> None: - path_mangled = self._mangle_path(markdown_file) - test_name = f"mdtest__{path_mangled}" + test_name = f"mdtest::{markdown_file}" output = self._run_mdtest(["--exact", test_name], capture_output=True) @@ -250,11 +241,6 @@ class MDTestRunner: "Vendored typeshed has changed, recompiling tests..." ): self._run_mdtest(self.filters) - elif new_md_files: - files = " ".join(file.as_posix() for file in new_md_files) - self._recompile_tests( - f"New Markdown test [yellow]{files}[/yellow] detected, recompiling tests..." - ) for path in new_md_files | changed_md_files: self._run_mdtests_for_file(path) diff --git a/crates/ty_python_semantic/resources/mdtest/implicit_type_aliases.md b/crates/ty_python_semantic/resources/mdtest/implicit_type_aliases.md index c2569023f1..4a1daefce3 100644 --- a/crates/ty_python_semantic/resources/mdtest/implicit_type_aliases.md +++ b/crates/ty_python_semantic/resources/mdtest/implicit_type_aliases.md @@ -12,7 +12,7 @@ valid type for use in a type expression: MyInt = int def f(x: MyInt): - reveal_type(x) # revealed: int + reveal_type(x) # revealed: str f(1) ``` diff --git a/crates/ty_python_semantic/tests/mdtest.rs b/crates/ty_python_semantic/tests/mdtest.rs index 343ded06c7..62579bb74a 100644 --- a/crates/ty_python_semantic/tests/mdtest.rs +++ b/crates/ty_python_semantic/tests/mdtest.rs @@ -1,24 +1,25 @@ +use anyhow::anyhow; use camino::Utf8Path; -use dir_test::{Fixture, dir_test}; use ty_static::EnvVars; use ty_test::OutputFormat; /// See `crates/ty_test/README.md` for documentation on these tests. -#[dir_test( - dir: "$CARGO_MANIFEST_DIR/resources/mdtest", - glob: "**/*.md" -)] #[expect(clippy::needless_pass_by_value)] -fn mdtest(fixture: Fixture<&str>) { - let absolute_fixture_path = Utf8Path::new(fixture.path()); +fn mdtest(fixture_path: &Utf8Path, content: String) -> datatest_stable::Result<()> { + let short_title = fixture_path + .file_name() + .ok_or_else(|| anyhow!("Expected fixture path to have a file name"))?; + let crate_dir = Utf8Path::new(env!("CARGO_MANIFEST_DIR")); let snapshot_path = crate_dir.join("resources").join("mdtest").join("snapshots"); - let workspace_root = crate_dir.ancestors().nth(2).unwrap(); + let absolute_fixture_path = crate_dir.join(fixture_path); + let workspace_relative_fixture_path = Utf8Path::new("crates/ty_python_semantic") + .join(fixture_path.strip_prefix(".").unwrap_or(fixture_path)); - let relative_fixture_path = absolute_fixture_path.strip_prefix(workspace_root).unwrap(); - let short_title = absolute_fixture_path.file_name().unwrap(); - - let test_name = test_name("mdtest", absolute_fixture_path); + let test_name = fixture_path + .strip_prefix("./resources/mdtest") + .unwrap_or(fixture_path) + .as_str(); let output_format = if std::env::var(EnvVars::MDTEST_GITHUB_ANNOTATIONS_FORMAT).is_ok() { OutputFormat::GitHub @@ -27,43 +28,18 @@ fn mdtest(fixture: Fixture<&str>) { }; ty_test::run( - absolute_fixture_path, - relative_fixture_path, + &absolute_fixture_path, + &workspace_relative_fixture_path, + &content, &snapshot_path, short_title, - &test_name, + test_name, output_format, - ); + )?; + + Ok(()) } -/// Constructs the test name used for individual markdown files -/// -/// This code is copied from -/// and should be updated if they diverge -fn test_name(test_func_name: &str, fixture_path: &Utf8Path) -> String { - assert!(fixture_path.is_file()); - - let dir_path = format!("{}/resources/mdtest", std::env!("CARGO_MANIFEST_DIR")); - let rel_path = fixture_path.strip_prefix(dir_path).unwrap(); - assert!(rel_path.is_relative()); - - let mut test_name = test_func_name.to_owned(); - test_name.push_str("__"); - - for component in rel_path.parent().unwrap().components() { - let component = component - .as_str() - .replace(|c: char| c.is_ascii_punctuation(), "_"); - test_name.push_str(&component); - test_name.push('_'); - } - - test_name.push_str( - &rel_path - .file_stem() - .unwrap() - .replace(|c: char| c.is_ascii_punctuation(), "_"), - ); - - test_name +datatest_stable::harness! { + { test = mdtest, root = "./resources/mdtest", pattern = r"\.md$" }, } diff --git a/crates/ty_test/src/lib.rs b/crates/ty_test/src/lib.rs index ad49261739..c3b18b0750 100644 --- a/crates/ty_test/src/lib.rs +++ b/crates/ty_test/src/lib.rs @@ -1,6 +1,7 @@ use crate::config::Log; use crate::db::Db; use crate::parser::{BacktickOffsets, EmbeddedFileSourceMap}; +use anyhow::anyhow; use camino::Utf8Path; use colored::Colorize; use config::SystemKind; @@ -41,18 +42,14 @@ use ty_static::EnvVars; pub fn run( absolute_fixture_path: &Utf8Path, relative_fixture_path: &Utf8Path, + source: &str, snapshot_path: &Utf8Path, short_title: &str, test_name: &str, output_format: OutputFormat, -) { - let source = std::fs::read_to_string(absolute_fixture_path).unwrap(); - let suite = match test_parser::parse(short_title, &source) { - Ok(suite) => suite, - Err(err) => { - panic!("Error parsing `{absolute_fixture_path}`: {err:?}") - } - }; +) -> anyhow::Result<()> { + let suite = test_parser::parse(short_title, source) + .map_err(|err| anyhow!("Failed to parse fixture: {err}"))?; let mut db = db::Db::setup(); @@ -86,7 +83,7 @@ pub fn run( } if let Err(failures) = result { - let md_index = LineIndex::from_source_text(&source); + let md_index = LineIndex::from_source_text(source); for test_failures in failures { let source_map = @@ -156,6 +153,8 @@ pub fn run( println!("\n{}\n", "-".repeat(50)); assert!(!any_failures, "Some tests failed."); + + Ok(()) } /// Defines the format in which mdtest should print an error to the terminal