Coverage Report

Created: 2025-07-11 07:04

/src/unicode-normalization/fuzz/fuzz_targets/unicode-normalization.rs
Line
Count
Source
1
#![no_main]
2
3
#[macro_use]
4
extern crate libfuzzer_sys;
5
6
use unicode_normalization::{
7
    is_nfc, is_nfc_quick, is_nfc_stream_safe, is_nfc_stream_safe_quick, is_nfd, is_nfd_quick,
8
    is_nfd_stream_safe, is_nfd_stream_safe_quick, is_nfkc, is_nfkc_quick, is_nfkd, is_nfkd_quick,
9
    IsNormalized, UnicodeNormalization,
10
};
11
12
27.6k
fn from_bool(is_normalized: bool) -> IsNormalized {
13
27.6k
    if is_normalized {
14
12.8k
        IsNormalized::Yes
15
    } else {
16
14.7k
        IsNormalized::No
17
    }
18
27.6k
}
19
20
fuzz_target!(|input: String| {
21
    // The full predicates imply the quick predicates.
22
    assert_ne!(is_nfc_quick(input.chars()), from_bool(!is_nfc(&input)));
23
    assert_ne!(is_nfd_quick(input.chars()), from_bool(!is_nfd(&input)));
24
    assert_ne!(is_nfkc_quick(input.chars()), from_bool(!is_nfkc(&input)));
25
    assert_ne!(is_nfkd_quick(input.chars()), from_bool(!is_nfkd(&input)));
26
    assert_ne!(
27
        is_nfc_stream_safe_quick(input.chars()),
28
        from_bool(!is_nfc_stream_safe(&input))
29
    );
30
    assert_ne!(
31
        is_nfd_stream_safe_quick(input.chars()),
32
        from_bool(!is_nfd_stream_safe(&input))
33
    );
34
35
    // Check NFC, NFD, NFKC, and NFKD normalization.
36
    let nfc = input.chars().nfc().collect::<String>();
37
    assert_eq!(nfc.is_empty(), input.is_empty());
38
    assert_ne!(is_nfc_quick(nfc.chars()), IsNormalized::No);
39
    assert!(is_nfc(&nfc));
40
41
    let nfd = input.chars().nfd().collect::<String>();
42
    assert!(nfd.len() >= nfc.len());
43
    assert_ne!(is_nfd_quick(nfd.chars()), IsNormalized::No);
44
    assert!(is_nfd(&nfd));
45
46
    let nfkc = input.chars().nfkc().collect::<String>();
47
    assert_eq!(nfkc.is_empty(), input.is_empty());
48
    assert_ne!(is_nfkc_quick(nfkc.chars()), IsNormalized::No);
49
    assert!(is_nfkc(&nfkc));
50
51
    let nfkd = input.chars().nfkd().collect::<String>();
52
    assert!(nfkd.len() >= nfkc.len());
53
    assert_ne!(is_nfkd_quick(nfkd.chars()), IsNormalized::No);
54
    assert!(is_nfkd(&nfkd));
55
56
    // Check stream-safe.
57
    let nfc_ss = nfc.chars().stream_safe().collect::<String>();
58
    assert!(nfc_ss.len() >= nfc.len());
59
    assert_ne!(is_nfc_stream_safe_quick(nfc_ss.chars()), IsNormalized::No);
60
    assert!(is_nfc_stream_safe(&nfc_ss));
61
62
    let nfd_ss = nfd.chars().stream_safe().collect::<String>();
63
    assert!(nfd_ss.len() >= nfd.len());
64
    assert_ne!(is_nfd_stream_safe_quick(nfd_ss.chars()), IsNormalized::No);
65
    assert!(is_nfd_stream_safe(&nfd_ss));
66
67
    // Check that NFC and NFD preserve stream-safe.
68
    let ss_nfc = input.chars().stream_safe().nfc().collect::<String>();
69
    assert_eq!(ss_nfc.is_empty(), input.is_empty());
70
    assert_ne!(is_nfc_stream_safe_quick(ss_nfc.chars()), IsNormalized::No);
71
    assert!(is_nfc_stream_safe(&ss_nfc));
72
73
    let ss_nfd = input.chars().stream_safe().nfd().collect::<String>();
74
    assert_eq!(ss_nfd.is_empty(), input.is_empty());
75
    assert_ne!(is_nfd_stream_safe_quick(ss_nfd.chars()), IsNormalized::No);
76
    assert!(is_nfd_stream_safe(&ss_nfd));
77
});