use crate::dictionary::{Dictionary, DictionaryError};
pub fn ascii94() -> Dictionary {
Dictionary::new((0x21u8..=0x7e).map(|b| b as char).collect())
.expect("el alfabeto ASCII es válido")
}
pub fn from_range(start: u32, count: u32) -> Result<Dictionary, DictionaryError> {
let symbols: Vec<char> = (start..0x11_0000)
.filter_map(char::from_u32)
.take(count as usize)
.collect();
Dictionary::new(symbols)
}
pub fn flagship() -> Dictionary {
from_range(0x4E00, 4096).expect("el rango CJK insignia es válido")
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn flagship_has_4096_glyphs() {
assert_eq!(flagship().base(), 4096);
}
#[test]
fn from_range_builds_requested_count() {
let d = from_range(0x4E00, 100).unwrap();
assert_eq!(d.base(), 100);
}
#[test]
fn flagship_round_trips_and_is_denser_than_ascii() {
use crate::api::{decode, encode, Options};
use crate::kdf::KdfParams;
let opts = Options {
pepper: b"",
kdf_params: KdfParams {
mem_kib: 64,
iterations: 1,
parallelism: 1,
},
codebook_id: 0,
};
let data = b"un mensaje suficientemente largo para comparar densidad de alfabetos";
let ascii = ascii94();
let flag = flagship();
let s_flag = encode(data, "clave", &flag, &opts);
assert_eq!(decode(&s_flag, "clave", &flag, b"").unwrap(), data);
let s_ascii = encode(data, "clave", &ascii, &opts);
assert!(s_flag.chars().count() < s_ascii.chars().count());
}
}