68 lines · 1.9 KB · Rust
RawDownload
#![no_main] use imara_diff::{Algorithm, Diff, Token};use libfuzzer_sys::fuzz_target; /// Tests the lower-level `compute_with` API that works directly with Token sequences:/// - Creating arbitrary token sequences/// - Computing diffs with all algorithms/// - Querying individual token states/// - Iterating through hunksfn do_fuzz(data: &[u8]) {    // Test the lower-level compute_with API that works directly with tokens    if data.len() < 4 {        return;    }     // Use first two bytes to determine before/after lengths    let before_len = (data[0] as usize % 100).min(data.len() / 2);    let after_len = (data[1] as usize % 100).min(data.len() / 2);     // Create token sequences from remaining bytes    let mut before_tokens = Vec::new();    let mut after_tokens = Vec::new();     for i in 0..before_len {        if i + 2 < data.len() {            before_tokens.push(Token::from(data[i + 2] as u32 % 256));        }    }     for i in 0..after_len {        if i + 2 + before_len < data.len() {            after_tokens.push(Token::from(data[i + 2 + before_len] as u32 % 256));        }    }     // Test all algorithms with compute_with    for algorithm in [        Algorithm::Histogram,        Algorithm::Myers,        Algorithm::MyersMinimal,    ] {        let mut diff = Diff::default();        diff.compute_with(algorithm, &before_tokens, &after_tokens, 256);         // Test basic queries        let _ = diff.count_additions();        let _ = diff.count_removals();         // Test is_removed and is_added for valid indices        for i in 0..before_tokens.len() as u32 {            let _ = diff.is_removed(i);        }        for i in 0..after_tokens.len() as u32 {            let _ = diff.is_added(i);        }         // Test hunks        for hunk in diff.hunks() {            let _ = hunk.is_pure_insertion();            let _ = hunk.is_pure_removal();        }    }} fuzz_target!(|data: &[u8]| {    do_fuzz(data);});