token-align 0.1.0

Maps overlapping tokens and character positions between tokenized texts
Documentation
mod common;

#[test]
fn all_119_vectors_match() {
    let cases = common::cases();
    assert_eq!(cases.len(), 119);
    for case in &cases {
        common::assert_case(case);
    }
}

#[test]
fn defect_d1_standalone_marker_does_not_capture_text() {
    common::assert_case(&common::find("bpe-standalone-g"));
}

#[test]
fn defect_d2_control_tokens_never_align_by_shared_letters() {
    for id in ["wp-mask", "wp-cls-steal-l", "wp-sep-steal-s"] {
        common::assert_case(&common::find(id));
    }
}

#[test]
fn defect_d3_unknown_token_has_no_counterpart() {
    common::assert_case(&common::find("unk-luck"));
}

#[test]
fn defect_d4_final_sigma_matches_sigma() {
    common::assert_case(&common::find("case-sigma-charmap"));
}

#[test]
fn defect_d5_wordpiece_collision_is_explicit() {
    common::assert_case(&common::find("wp-collision"));
}

#[test]
fn defect_d6_orphan_marks_do_not_block_base_matches() {
    for id in ["wp-uncased-accent", "cm-eacute-strip"] {
        common::assert_case(&common::find(id));
    }
}

#[test]
fn api_parity_group_has_18_exact_cases() {
    let cases = common::cases();
    let parity: Vec<_> = cases
        .iter()
        .filter(|case| case.group == "incumbent-parity")
        .collect();
    assert_eq!(parity.len(), 18);
    for case in parity {
        assert!(case.alternatives.is_empty());
        common::assert_case(case);
    }
}