mod error;
mod parser;
pub use error::UTF8Validation;
pub use parser::{validate, Success};
#[cfg(test)]
mod tests {
use error::UTF8Validation;
use parser::{self, Success};
const V1: [u8; 1] = [0x00];
const V2: [u8; 1] = [0x14];
const V3: [u8; 1] = [0x7F];
const V4: [u8; 2] = [0xc2, 0x80];
const V5: [u8; 2] = [0xc2, 0xa2];
const V6: [u8; 2] = [0xdf, 0xbf];
const V7: [u8; 3] = [0xe0, 0xa0, 0x80];
const V8: [u8; 3] = [0xe2, 0x82, 0xac];
const V9: [u8; 3] = [0xef, 0xbf, 0xbf];
const V10: [u8; 4] = [0xf0, 0x90, 0x80, 0x80];
const V11: [u8; 4] = [0xf0, 0x90, 0x8d, 0x88];
const V12: [u8; 4] = [0xf4, 0x8f, 0xbf, 0xbf];
const C1: [u8; 2] = [0xc0, 0x00];
const C2: [u8; 2] = [0xc0, 0x7f];
const C3: [u8; 2] = [0xc0, 0xc0];
const C4: [u8; 2] = [0xc0, 0xff];
const C5: [u8; 3] = [0xe0, 0x00, 0x80];
const C6: [u8; 3] = [0xe0, 0x7f, 0x80];
const C7: [u8; 3] = [0xe0, 0xc0, 0x80];
const C8: [u8; 3] = [0xe0, 0xff, 0x80];
const C9: [u8; 3] = [0xe0, 0x80, 0x00];
const C10: [u8; 3] = [0xe0, 0x80, 0x7f];
const C11: [u8; 3] = [0xe0, 0x80, 0xc0];
const C12: [u8; 3] = [0xe0, 0x80, 0xff];
const C13: [u8; 4] = [0xf0, 0x00, 0x80, 0x80];
const C14: [u8; 4] = [0xf0, 0x7f, 0x80, 0x80];
const C15: [u8; 4] = [0xf0, 0xc0, 0x80, 0x80];
const C16: [u8; 4] = [0xf0, 0xff, 0x80, 0x80];
const C17: [u8; 4] = [0xf0, 0x80, 0x00, 0x80];
const C18: [u8; 4] = [0xf0, 0x80, 0x7f, 0x80];
const C19: [u8; 4] = [0xf0, 0x80, 0xc0, 0x80];
const C20: [u8; 4] = [0xf0, 0x80, 0xff, 0x80];
const C21: [u8; 4] = [0xf0, 0x80, 0x80, 0x00];
const C22: [u8; 4] = [0xf0, 0x80, 0x80, 0x7f];
const C23: [u8; 4] = [0xf0, 0x80, 0x80, 0xc0];
const C24: [u8; 4] = [0xf0, 0x80, 0x80, 0xff];
const O1: [u8; 2] = [0xc0, 0x80];
const O2: [u8; 2] = [0xc1, 0xbf];
const O3: [u8; 3] = [0xe0, 0x80, 0x80];
const O4: [u8; 3] = [0xe0, 0x9f, 0xbf];
const O5: [u8; 4] = [0xf0, 0x80, 0x80, 0x80];
const O6: [u8; 4] = [0xf0, 0x8f, 0xbf, 0xbf];
macro_rules! putf8(
($n:ident, $a:expr, $b:expr, $c:expr) => {
#[test]
fn $n() {
let expected = $a;
let res = parser::validate(&expected);
if $b {
assert!(res.is_ok());
} else {
assert!(res.is_err());
}
assert!(res == $c);
}
}
);
putf8!(greater_than_max_code_point,
vec![0xf5],
false,
Err(UTF8Validation::MaximumCodePoint));
putf8!(two_byte_continuation_0x00,
C1,
false,
Err(UTF8Validation::TwoByteContinuation));
putf8!(two_byte_continuation_0x7f,
C2,
false,
Err(UTF8Validation::TwoByteContinuation));
putf8!(two_byte_continuation_0xc0,
C3,
false,
Err(UTF8Validation::TwoByteContinuation));
putf8!(two_byte_continuation_0xff,
C4,
false,
Err(UTF8Validation::TwoByteContinuation));
putf8!(three_byte_continuation_0x00_0x80,
C5,
false,
Err(UTF8Validation::ThreeByteContinuation(2)));
putf8!(three_byte_continuation_0x7f_0x80,
C6,
false,
Err(UTF8Validation::ThreeByteContinuation(2)));
putf8!(three_byte_continuation_0xc0_0x80,
C7,
false,
Err(UTF8Validation::ThreeByteContinuation(2)));
putf8!(three_byte_continuation_0xff_0x80,
C8,
false,
Err(UTF8Validation::ThreeByteContinuation(2)));
putf8!(three_byte_continuation_0x80_0x00,
C9,
false,
Err(UTF8Validation::ThreeByteContinuation(3)));
putf8!(three_byte_continuation_0x80_0x7f,
C10,
false,
Err(UTF8Validation::ThreeByteContinuation(3)));
putf8!(three_byte_continuation_0x80_0xc0,
C11,
false,
Err(UTF8Validation::ThreeByteContinuation(3)));
putf8!(three_byte_continuation_0x80_0xff,
C12,
false,
Err(UTF8Validation::ThreeByteContinuation(3)));
putf8!(four_byte_continuation_0x00_0x80_0x80,
C13,
false,
Err(UTF8Validation::FourByteContinuation(2)));
putf8!(four_byte_continuation_0x7f_0x80_0x80,
C14,
false,
Err(UTF8Validation::FourByteContinuation(2)));
putf8!(four_byte_continuation_0xc0_0x80_0x80,
C15,
false,
Err(UTF8Validation::FourByteContinuation(2)));
putf8!(four_byte_continuation_0xff_0x80_0x80,
C16,
false,
Err(UTF8Validation::FourByteContinuation(2)));
putf8!(four_byte_continuation_0x80_0x00_0x80,
C17,
false,
Err(UTF8Validation::FourByteContinuation(3)));
putf8!(four_byte_continuation_0x80_0x7f_0x80,
C18,
false,
Err(UTF8Validation::FourByteContinuation(3)));
putf8!(four_byte_continuation_0x80_0xc0_0x80,
C19,
false,
Err(UTF8Validation::FourByteContinuation(3)));
putf8!(four_byte_continuation_0x80_0xff_0x80,
C20,
false,
Err(UTF8Validation::FourByteContinuation(3)));
putf8!(four_byte_continuation_0x80_0x80_0x00,
C21,
false,
Err(UTF8Validation::FourByteContinuation(4)));
putf8!(four_byte_continuation_0x80_0x80_0x7f,
C22,
false,
Err(UTF8Validation::FourByteContinuation(4)));
putf8!(four_byte_continuation_0x80_0x80_0xc0,
C23,
false,
Err(UTF8Validation::FourByteContinuation(4)));
putf8!(four_byte_continuation_0x80_0x80_0xff,
C24,
false,
Err(UTF8Validation::FourByteContinuation(4)));
putf8!(smallest_two_byte_overlong,
O1,
false,
Err(UTF8Validation::TwoByteOverlong));
putf8!(largest_two_byte_overlong,
O2,
false,
Err(UTF8Validation::TwoByteOverlong));
putf8!(smallest_three_byte_overlong,
O3,
false,
Err(UTF8Validation::ThreeByteOverlong));
putf8!(largest_three_byte_overlong,
O4,
false,
Err(UTF8Validation::ThreeByteOverlong));
putf8!(smallest_four_byte_overlong,
O5,
false,
Err(UTF8Validation::FourByteOverlong));
putf8!(largest_four_byte_overlong,
O6,
false,
Err(UTF8Validation::FourByteOverlong));
putf8!(invalid_first_byte,
vec![0x80],
false,
Err(UTF8Validation::InvalidFirstByte(0x80)));
putf8!(empty, vec![], true, Ok(Success::Incomplete(1, 0)));
putf8!(incomplete_two_byte,
vec![0xc2],
true,
Ok(Success::Incomplete(2, 0)));
putf8!(incomplete_two_byte_after_one_byte,
vec![0x24, 0xc2],
true,
Ok(Success::Incomplete(2, 1)));
putf8!(incomplete_two_after_two_byte,
vec![0xc2, 0xa2, 0xc2],
true,
Ok(Success::Incomplete(2, 2)));
putf8!(smallest_one_byte_code_point,
V1,
true,
Ok(Success::Complete(V1.len())));
putf8!(valid_one_byte_code_point,
V2,
true,
Ok(Success::Complete(V2.len())));
putf8!(largest_one_byte_code_point,
V3,
true,
Ok(Success::Complete(V3.len())));
putf8!(smallest_two_byte_code_point,
V4,
true,
Ok(Success::Complete(V4.len())));
putf8!(valid_two_byte_code_point,
V5,
true,
Ok(Success::Complete(V5.len())));
putf8!(largest_two_byte_code_point,
V6,
true,
Ok(Success::Complete(V6.len())));
putf8!(smallest_three_byte_code_point,
V7,
true,
Ok(Success::Complete(V7.len())));
putf8!(valid_three_byte_code_point,
V8,
true,
Ok(Success::Complete(V8.len())));
putf8!(largest_three_byte_code_point,
V9,
true,
Ok(Success::Complete(V9.len())));
putf8!(smallest_four_byte_code_point,
V10,
true,
Ok(Success::Complete(V10.len())));
putf8!(valid_four_byte_code_point,
V11,
true,
Ok(Success::Complete(V11.len())));
putf8!(largest_four_byte_code_point,
V12,
true,
Ok(Success::Complete(V12.len())));
}