use crate::core::word_dictionary::WordDictionary;
pub const BIP39_ENGLISH: &str = include_str!("../../dictionaries/word/security/bip39-english.txt");
pub const EFF_LONG: &str = include_str!("../../dictionaries/word/security/eff-long.txt");
pub const EFF_SHORT1: &str = include_str!("../../dictionaries/word/security/eff-short1.txt");
pub const EFF_SHORT2: &str = include_str!("../../dictionaries/word/security/eff-short2.txt");
pub const DICEWARE: &str = include_str!("../../dictionaries/word/security/diceware.txt");
pub const PGP_EVEN: &str = include_str!("../../dictionaries/word/security/pgp-even.txt");
pub const PGP_ODD: &str = include_str!("../../dictionaries/word/security/pgp-odd.txt");
pub const NATO: &str = include_str!("../../dictionaries/word/fun/nato.txt");
pub const BUZZWORDS: &str = include_str!("../../dictionaries/word/fun/buzzwords.txt");
pub const KLINGON: &str = include_str!("../../dictionaries/word/fun/klingon.txt");
pub const POKEMON: &str = include_str!("../../dictionaries/word/fun/pokemon.txt");
pub fn bip39_english() -> WordDictionary {
WordDictionary::builder()
.words_from_str(BIP39_ENGLISH)
.delimiter(" ")
.case_sensitive(false)
.build()
.expect("BIP-39 English word list should be valid")
}
pub fn eff_long() -> WordDictionary {
WordDictionary::builder()
.words_from_str(EFF_LONG)
.delimiter(" ")
.case_sensitive(false)
.build()
.expect("EFF Long word list should be valid")
}
pub fn eff_short1() -> WordDictionary {
WordDictionary::builder()
.words_from_str(EFF_SHORT1)
.delimiter(" ")
.case_sensitive(false)
.build()
.expect("EFF Short 1 word list should be valid")
}
pub fn eff_short2() -> WordDictionary {
WordDictionary::builder()
.words_from_str(EFF_SHORT2)
.delimiter(" ")
.case_sensitive(false)
.build()
.expect("EFF Short 2 word list should be valid")
}
pub fn diceware() -> WordDictionary {
WordDictionary::builder()
.words_from_str(DICEWARE)
.delimiter(" ")
.case_sensitive(false)
.build()
.expect("Diceware word list should be valid")
}
pub fn pgp_even() -> WordDictionary {
WordDictionary::builder()
.words_from_str(PGP_EVEN)
.delimiter("-")
.case_sensitive(false)
.build()
.expect("PGP Even word list should be valid")
}
pub fn pgp_odd() -> WordDictionary {
WordDictionary::builder()
.words_from_str(PGP_ODD)
.delimiter("-")
.case_sensitive(false)
.build()
.expect("PGP Odd word list should be valid")
}
pub fn nato() -> WordDictionary {
WordDictionary::builder()
.words_from_str(NATO)
.delimiter("-")
.case_sensitive(false)
.build()
.expect("NATO word list should be valid")
}
pub fn buzzwords() -> WordDictionary {
WordDictionary::builder()
.words_from_str(BUZZWORDS)
.delimiter(" ")
.case_sensitive(false)
.build()
.expect("Buzzwords word list should be valid")
}
pub fn klingon() -> WordDictionary {
WordDictionary::builder()
.words_from_str(KLINGON)
.delimiter(" ")
.case_sensitive(true) .build()
.expect("Klingon word list should be valid")
}
pub fn pokemon() -> WordDictionary {
WordDictionary::builder()
.words_from_str(POKEMON)
.delimiter(" ")
.case_sensitive(false)
.build()
.expect("Pokemon word list should be valid")
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn test_bip39_english_word_count() {
let dict = bip39_english();
assert_eq!(dict.base(), 2048);
}
#[test]
fn test_bip39_english_first_word() {
let dict = bip39_english();
assert_eq!(dict.encode_word(0), Some("abandon"));
}
#[test]
fn test_bip39_english_last_word() {
let dict = bip39_english();
assert_eq!(dict.encode_word(2047), Some("zoo"));
}
#[test]
fn test_bip39_english_roundtrip() {
use crate::encoders::algorithms::word;
let dict = bip39_english();
let data = b"The quick brown fox jumps over the lazy dog";
let encoded = word::encode(data, &dict);
let decoded = word::decode(&encoded, &dict).unwrap();
assert_eq!(decoded, data);
}
#[test]
fn test_bip39_english_case_insensitive() {
let dict = bip39_english();
assert_eq!(dict.decode_word("abandon"), Some(0));
assert_eq!(dict.decode_word("ABANDON"), Some(0));
assert_eq!(dict.decode_word("Abandon"), Some(0));
}
}