kimun 0.34.1

Code metrics tool — health score, complexity, duplication, hotspots, ownership
use super::*;

#[test]
fn js_relative_imports() {
    let src = r#"
import foo from './foo';
import { bar } from '../bar';
import external from 'lodash';
const x = require('./utils');
"#;
    let result = extract_js(src);
    assert_eq!(result, vec!["./foo", "../bar", "./utils"]);
}

#[test]
fn go_block_import() {
    let src = r#"
import (
    "fmt"
    "github.com/user/project/pkg/foo"
    alias "github.com/user/project/internal/bar"
)
"#;
    let result = extract_go(src);
    assert_eq!(
        result,
        vec![
            "fmt",
            "github.com/user/project/pkg/foo",
            "github.com/user/project/internal/bar",
        ]
    );
}

#[test]
fn js_comment_lines_are_skipped() {
    let src =
        "// import a from './line';\n/* import b from './block'; */\n * import c from './doc';\n";
    assert!(extract_js(src).is_empty());
}

#[test]
fn js_imports_without_semicolons() {
    let src = "import external from 'lodash'\nimport bar from './bar'\n";
    assert_eq!(extract_js(src), vec!["./bar"]);
}

#[test]
fn js_relative_string_after_a_bare_one_on_the_same_line() {
    let src = "export { a } from 'pkg'; export { b } from './local';\n";
    assert_eq!(extract_js(src), vec!["./local"]);
}

#[test]
fn go_single_line_imports() {
    let src = "package main\n\nimport \"fmt\"\nimport bar \"github.com/user/project/bar\"\n";
    assert_eq!(extract_go(src), vec!["fmt", "github.com/user/project/bar"]);
}

#[test]
fn go_strings_outside_imports_are_not_imports() {
    let src = "package main\nconst name = \"before\"\nimport (\n\t\"fmt\"\n\n\t\"os\"\n)\nvar after = \"after\"\n";
    assert_eq!(extract_go(src), vec!["fmt", "os"]);
}

#[test]
fn dispatcher_routes_each_language_to_its_extractor() {
    let cases = [
        ("pkg/a.py", "Python", "from .foo import bar\n", ".foo:bar"),
        (
            "src/a.js",
            "JavaScript",
            "import a from './foo';\n",
            "./foo",
        ),
        (
            "src/a.ts",
            "TypeScript",
            "import a from './foo';\n",
            "./foo",
        ),
        ("src/a.jsx", "JSX", "import a from './foo';\n", "./foo"),
        ("src/a.tsx", "TSX", "import a from './foo';\n", "./foo"),
        ("main.go", "Go", "import \"fmt\"\n", "fmt"),
    ];
    for (_, language, source, expected) in cases {
        let result = extract_imports(language, source);
        assert_eq!(result, vec![expected], "{language}");
    }
}

#[test]
fn kaikai_is_extracted_through_the_dispatcher() {
    let result = extract_imports("Kaikai", "import app.b\n");
    assert_eq!(result, vec!["app.b"]);
}

#[test]
fn supported_languages() {
    for lang in ["Rust", "Python", "TypeScript", "TSX", "Go", "Kaikai"] {
        assert!(is_supported(lang), "{lang} should be supported");
    }
    for lang in ["Bash", "TOML", "Java"] {
        assert!(!is_supported(lang), "{lang} should not be supported");
    }
}