rustcodegraph 1.1.5

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

#[test]
fn should_match_exact_name_references() {
    let mock_nodes = vec![test_node(
        "func:test.ts:myFunction:10",
        NodeKind::Function,
        "myFunction",
        "test.ts::myFunction",
        "test.ts",
        Language::TypeScript,
        10,
    )];
    let mut context = MockResolutionContext::with_nodes(mock_nodes).with_file_exists_default(true);

    let reference = unresolved_ref(
        "myFunction",
        ReferenceKind::Calls,
        "main.ts",
        Language::TypeScript,
    );
    let result = match_reference(&reference, &mut context);

    let result = result.expect("reference should resolve");
    assert_eq!(result.target_node_id, "func:test.ts:myFunction:10");
    assert_eq!(result.resolved_by, ResolvedBy::ExactMatch);
}

#[test]
fn should_prefer_same_module_candidates_over_cross_module_matches() {
    let candidate_a = test_node(
        "func:apps/app_a/src/server.py:navigate:10",
        NodeKind::Function,
        "navigate",
        "apps/app_a/src/server.py::navigate",
        "apps/app_a/src/server.py",
        Language::Python,
        10,
    );
    let candidate_b = test_node(
        "func:apps/app_b/src/server.py:navigate:15",
        NodeKind::Function,
        "navigate",
        "apps/app_b/src/server.py::navigate",
        "apps/app_b/src/server.py",
        Language::Python,
        15,
    );
    let mut context = MockResolutionContext::with_nodes(vec![candidate_a, candidate_b])
        .with_file_exists_default(true);

    let reference = unresolved_ref(
        "navigate",
        ReferenceKind::Calls,
        "apps/app_a/src/handler.py",
        Language::Python,
    );
    let result = match_reference(&reference, &mut context);

    let result = result.expect("reference should resolve");
    assert_eq!(
        result.target_node_id,
        "func:apps/app_a/src/server.py:navigate:10"
    );
    assert_eq!(result.resolved_by, ResolvedBy::ExactMatch);
}

#[test]
fn should_lower_confidence_for_cross_module_exact_matches() {
    let candidates = vec![
        test_node(
            "func:apps/app_b/src/server.py:navigate:10",
            NodeKind::Function,
            "navigate",
            "apps/app_b/src/server.py::navigate",
            "apps/app_b/src/server.py",
            Language::Python,
            10,
        ),
        test_node(
            "func:apps/app_c/src/server.py:navigate:10",
            NodeKind::Function,
            "navigate",
            "apps/app_c/src/server.py::navigate",
            "apps/app_c/src/server.py",
            Language::Python,
            10,
        ),
    ];
    let mut context = MockResolutionContext::with_nodes(candidates).with_file_exists_default(true);

    let reference = unresolved_ref(
        "navigate",
        ReferenceKind::Calls,
        "apps/app_a/src/handler.py",
        Language::Python,
    );
    let result = match_reference(&reference, &mut context);

    assert!(
        result.expect("reference should resolve").confidence <= 0.4,
        "cross-module exact match should have low confidence"
    );
}

#[test]
fn should_match_qualified_name_references() {
    let mock_class_node = test_node(
        "class:user.ts:User:5",
        NodeKind::Class,
        "User",
        "user.ts::User",
        "user.ts",
        Language::TypeScript,
        5,
    );
    let mock_method_node = test_node(
        "method:user.ts:User.save:15",
        NodeKind::Method,
        "save",
        "user.ts::User::save",
        "user.ts",
        Language::TypeScript,
        15,
    );
    let mut context = MockResolutionContext::with_nodes(vec![mock_class_node, mock_method_node])
        .with_file_exists_default(true)
        .with_all_files(&["user.ts"]);

    let reference = unresolved_ref(
        "User.save",
        ReferenceKind::Calls,
        "main.ts",
        Language::TypeScript,
    );
    let result = match_reference(&reference, &mut context);

    assert_eq!(
        result
            .expect("qualified reference should resolve")
            .target_node_id,
        "method:user.ts:User.save:15"
    );
}