cairo-language-server 2.20.0

The Cairo Language Server
Documentation
use cairo_language_server::lsp;
use indoc::indoc;
use lsp_types::{ExecuteCommandParams, lsp_request};

use crate::support::cairo_project_toml::CAIRO_PROJECT_TOML;
use crate::support::normalize::normalize;
use crate::support::sandbox;

#[test]
fn cairo_projects() {
    let mut ls = sandbox! {
        files {
            "project1/cairo_project.toml" => indoc! {r#"
                [crate_roots]
                project1 = "src"
            "#},
            "project1/src/lib.cairo" => "fn main() {}",

            "project2/cairo_project.toml" => indoc! {r#"
                [crate_roots]
                project2 = "src"
            "#},
            "project2/src/lib.cairo" => "fn main() {}",

            "project2/subproject/cairo_project.toml" => indoc! {r#"
                [crate_roots]
                subproject = "src"
            "#},
            "project2/subproject/src/lib.cairo" => "fn main() {}"
        }
    };

    ls.open_all_cairo_files_and_wait_for_project_update();

    let output = ls.send_request::<lsp::ext::ViewAnalyzedCrates>(());

    insta::assert_snapshot!("view_analyzed_crates", normalize(&ls, output));
}

#[test]
fn test_reload() {
    let mut ls = sandbox! {
        files {
            "cairo_project.toml" => CAIRO_PROJECT_TOML,
            "src/lib.cairo" => "fn main() {}",
        }
    };

    ls.open_all_cairo_files_and_wait_for_project_update();

    let expected = ls.send_request::<lsp::ext::ViewAnalyzedCrates>(());

    ls.send_request::<lsp_request!("workspace/executeCommand")>(ExecuteCommandParams {
        command: "cairo.reload".into(),
        ..Default::default()
    });
    let actual = ls.wait_for_project_update();

    assert_eq!(expected, actual);
}

#[test]
fn assert_macros_with_no_cairo_test() {
    let mut ls = sandbox! {
        files {
            "Scarb.toml" => indoc! (r#"
                [package]
                name = "a"
                version = "0.1.0"
                edition = "2025_12"

                [dependencies]
                assert_macros = "2"
            "#),
            "src/lib.cairo" => "fn main() {}",
        }
    };

    ls.open_all_cairo_files_and_wait_for_project_update();

    let output = ls.send_request::<lsp::ext::ViewAnalyzedCrates>(());

    insta::assert_snapshot!("view_analyzed_crates_assert_macros", normalize(&ls, output));
}