codebook 0.3.37

A code-aware spell checker library (dependency for codebook-lsp)
Documentation
use codebook::{
    parser::{TextRange, WordLocation},
    queries::LanguageType,
};
mod utils;

#[test]
fn test_cpp_simple() {
    utils::init_logging();
    let processor = utils::get_processor();
    let sample_text = r#"
        int calculatr(int numbr1, int numbr2, char operashun) {
            // This is an exampl function that performz calculashuns
            int resalt = 0;
            return resalt;
        }
    "#;
    let expected = vec![
        "calculashuns",
        "calculatr",
        "exampl",
        "numbr",
        "operashun",
        "performz",
        "resalt",
    ];
    let binding = processor
        .spell_check(sample_text, Some(LanguageType::Cpp), None)
        .to_vec();
    let mut misspelled = binding
        .iter()
        .map(|r| r.word.as_str())
        .collect::<Vec<&str>>();
    misspelled.sort();
    println!("Misspelled words: {misspelled:?}");
    assert_eq!(misspelled, expected);
}

#[test]
fn test_cpp_comment_location() {
    utils::init_logging();
    let sample_cpp = r#"
        // Structur definition with misspellings
    "#;
    let expected = vec![WordLocation::new(
        "Structur".to_string(),
        vec![TextRange {
            start_byte: 12,
            end_byte: 20,
        }],
    )];
    let processor = utils::get_processor();
    let misspelled = processor
        .spell_check(sample_cpp, Some(LanguageType::Cpp), None)
        .to_vec();
    println!("Misspelled words: {misspelled:?}");
    assert_eq!(misspelled, expected);
    assert!(misspelled[0].locations.len() == 1);
}

#[test]
fn test_cpp_class() {
    utils::init_logging();
    let sample_cpp = r#"
        class UserAccaunt {
            std::string usrrnamee;
            int ballancee;
            float intrest_rate;
        };
    "#;
    let expected = [
        WordLocation::new(
            "Accaunt".to_string(),
            vec![TextRange {
                start_byte: 19,
                end_byte: 26,
            }],
        ),
        WordLocation::new(
            "usrrnamee".to_string(),
            vec![TextRange {
                start_byte: 53,
                end_byte: 62,
            }],
        ),
        WordLocation::new(
            "ballancee".to_string(),
            vec![TextRange {
                start_byte: 80,
                end_byte: 89,
            }],
        ),
        WordLocation::new(
            "intrest".to_string(),
            vec![TextRange {
                start_byte: 109,
                end_byte: 116,
            }],
        ),
    ];
    let processor = utils::get_processor();
    let misspelled = processor
        .spell_check(sample_cpp, Some(LanguageType::Cpp), None)
        .to_vec();
    println!("Misspelled words: {misspelled:?}");
    for expect in expected.iter() {
        println!("Expecting {}", expect.word);
        let result = misspelled.iter().find(|r| r.word == expect.word).unwrap();
        assert_eq!(result.word, expect.word);
        assert_eq!(result.locations, expect.locations);
    }
}

#[test]
fn test_cpp_multiline_string_concat() {
    utils::init_logging();
    let processor = utils::get_processor();
    let sample_text = r#"
        const char* message =
            "This is a verry long string\n"
            "that continuez on multiple linez\n"
            "with lots of speling misstakes\n";
    "#;
    let expected = vec!["continuez", "linez", "misstakes", "speling", "verry"];
    let binding = processor
        .spell_check(sample_text, Some(LanguageType::Cpp), None)
        .to_vec();
    let mut misspelled = binding
        .iter()
        .map(|r| r.word.as_str())
        .collect::<Vec<&str>>();
    misspelled.sort();
    println!("Misspelled words: {misspelled:?}");
    assert_eq!(misspelled, expected);
}

#[test]
fn test_cpp_vector_string_literals() {
    utils::init_logging();
    let processor = utils::get_processor();
    let sample_text = r#"
        std::vector<std::string> mesages = { "Helo", "Wrold", "Cpp" };
    "#;
    let expected = vec!["Helo", "Wrold", "mesages"];
    let binding = processor
        .spell_check(sample_text, Some(LanguageType::Cpp), None)
        .to_vec();
    let mut misspelled = binding
        .iter()
        .map(|r| r.word.as_str())
        .collect::<Vec<&str>>();
    misspelled.sort();
    println!("Misspelled words: {misspelled:?}");
    assert_eq!(misspelled, expected);
}

#[test]
fn test_cpp_stream_string_literal() {
    utils::init_logging();
    let processor = utils::get_processor();
    let sample_text = r#"
        std::cout << "Currect anser!\n youu best";
    "#;
    let expected = vec!["Currect", "anser", "youu"];
    let binding = processor
        .spell_check(sample_text, Some(LanguageType::Cpp), None)
        .to_vec();
    let mut misspelled = binding
        .iter()
        .map(|r| r.word.as_str())
        .collect::<Vec<&str>>();
    misspelled.sort();
    println!("Misspelled words: {misspelled:?}");
    assert_eq!(misspelled, expected);
}