weavatrix-clone 0.1.1

Deterministic, evidence-carrying code clone detection
Documentation
use super::{CloneLocation, Language, Similarity, SourceFragment, SourceSpan};

#[test]
fn maps_every_language_profile_and_unknown_files() {
    for (path, expected) in [
        ("a.rs", Language::Rust),
        ("a.go", Language::Go),
        ("a.h", Language::C),
        ("a.hxx", Language::Cpp),
        ("a.zsh", Language::Bash),
        ("a.psql", Language::Sql),
        ("a.mjs", Language::JavaScript),
        ("a.mts", Language::TypeScript),
        ("a.pyi", Language::Python),
        ("a.java", Language::Java),
        ("a.cs", Language::CSharp),
        ("a.svelte", Language::Markup),
        ("Makefile", Language::Text),
    ] {
        assert_eq!(Language::from_path(path), expected);
    }
}

#[test]
fn validates_spans_paths_and_similarity_boundaries() {
    let text = "one\ntwo\n";
    let span = SourceSpan::whole(text);
    assert_eq!(span.end_line, 2);
    assert!(span.overlaps(SourceSpan {
        start_byte: 1,
        end_byte: 2,
        start_line: 1,
        end_line: 1,
    }));
    let fragment = SourceFragment::new("id", r"src\file.rs", Language::Rust, span, text).unwrap();
    assert_eq!(fragment.path, "src/file.rs");
    assert_eq!(CloneLocation::from_fragment(&fragment).path, fragment.path);
    assert!(SourceFragment::new("", "a.rs", Language::Rust, span, text).is_err());
    assert!(SourceFragment::new("id", "", Language::Rust, span, text).is_err());
    assert!(
        SourceFragment::new(
            "id",
            "a.rs",
            Language::Rust,
            SourceSpan {
                start_byte: 2,
                end_byte: 1,
                start_line: 1,
                end_line: 1,
            },
            text,
        )
        .is_err()
    );
    assert_eq!(Similarity::from_ratio(1, 0).permille(), 0);
    assert_eq!(Similarity::from_permille(1_500), Similarity::PERFECT);
    assert_eq!(Similarity::from_ratio(1, 2).permille(), 500);
}