rustcodegraph 1.2.10

Local-first code intelligence graph and CLI for AI agents
Documentation
mod rust_native_surface_checks {
    use super::*;

    #[test]
    fn language_detection_matches_the_typescript_extension_table() {
        assert_detected_language("src/index.ts", None, Language::TypeScript);
        assert_detected_language("components/Button.tsx", None, Language::Tsx);
        assert_detected_language("index.js", None, Language::JavaScript);
        assert_detected_language("App.jsx", None, Language::Jsx);
        assert_detected_language("config.mjs", None, Language::JavaScript);
        assert_detected_language("main.py", None, Language::Python);
        assert_detected_language("main.go", None, Language::Go);
        assert_detected_language("lib.rs", None, Language::Rust);
        assert_detected_language("Main.java", None, Language::Java);
        assert_detected_language("main.c", None, Language::C);
        assert_detected_language("utils.h", None, Language::C);
        assert_detected_language("main.cpp", None, Language::Cpp);
        assert_detected_language("class.hpp", None, Language::Cpp);
        assert_detected_language("Program.cs", None, Language::CSharp);
        assert_detected_language("index.php", None, Language::Php);
        assert_detected_language("app.rb", None, Language::Ruby);
        assert_detected_language("ViewController.swift", None, Language::Swift);
        assert_detected_language("MainActivity.kt", None, Language::Kotlin);
        assert_detected_language("build.gradle.kts", None, Language::Kotlin);
        assert_detected_language("main.dart", None, Language::Dart);
        assert_detected_language("AppDelegate.m", None, Language::ObjC);
        assert_detected_language("ViewController.mm", None, Language::ObjC);
        assert_detected_language(
            "Foo.h",
            Some("@interface Foo : NSObject\n@end\n"),
            Language::ObjC,
        );
        assert_detected_language(
            "stdio.h",
            Some("#ifndef STDIO_H\nvoid printf();\n#endif\n"),
            Language::C,
        );
        assert_detected_language("styles.css", None, Language::Unknown);
        assert_detected_language("data.json", None, Language::Unknown);
    }

    #[test]
    fn language_support_reports_the_same_core_languages() {
        assert_language_support(Language::TypeScript, true);
        assert_language_support(Language::Python, true);
        assert_language_support(Language::Go, true);
        assert_language_support(Language::Unknown, false);
        assert_supported_languages_include(&[
            Language::TypeScript,
            Language::JavaScript,
            Language::Python,
            Language::Go,
            Language::Rust,
            Language::Java,
            Language::CSharp,
            Language::Php,
            Language::Ruby,
            Language::Swift,
            Language::Kotlin,
            Language::Dart,
            Language::Pascal,
            Language::Scala,
            Language::Lua,
            Language::Luau,
            Language::ObjC,
            Language::R,
        ]);
    }

    #[test]
    fn path_normalization_matches_typescript_helper() {
        assert_eq!(
            normalize_path("gui\\node_modules\\foo"),
            "gui/node_modules/foo"
        );
        assert_eq!(
            normalize_path("src\\components\\Button.tsx"),
            "src/components/Button.tsx"
        );
        assert_eq!(
            normalize_path("src/components/Button.tsx"),
            "src/components/Button.tsx"
        );
        assert_eq!(normalize_path(""), "");
    }

    #[test]
    fn scan_directory_honors_root_gitignore_and_forward_slashes() {
        let temp = TempDir::new("codegraph-extraction-scan");
        temp.write("src/index.ts", "export const x = 1;");
        temp.write("node_modules/pkg/index.js", "module.exports = {};");
        temp.write("packages/app/src/Button.tsx", "export function Button() {}");
        temp.write(
            "packages/app/node_modules/pkg/index.js",
            "module.exports = {};",
        );
        temp.write(".gitignore", "node_modules/\n");

        let files = scan_directory(temp.path(), None);

        assert_contains(&files, "src/index.ts");
        assert_contains(&files, "packages/app/src/Button.tsx");
        assert_not_contains_fragment(&files, "node_modules");
        assert!(
            files.iter().all(|file| !file.contains('\\')),
            "files: {files:?}"
        );
    }

    #[test]
    fn build_default_ignore_survives_bad_gitignore_lines_and_keeps_valid_rules() {
        let temp = TempDir::new("codegraph-extraction-ignore");
        temp.write(".gitignore", "dist/\n\\[\n");
        let ignore = build_default_ignore(temp.path());

        assert!(!ignore.ignores("src/app.ts"));
        assert!(ignore.ignores("dist/"));
        assert!(!ignore.ignores("src/app.ts"));
    }
}