extern crate human_name;
extern crate unicode_normalization;
use std::fs::File;
use std::io::prelude::*;
use std::io::BufReader;
use unicode_normalization::UnicodeNormalization;
fn none_if_empty(s: &str) -> Option<&str> {
if s.is_empty() {
None
} else {
Some(s)
}
}
#[test]
fn parsing() {
let f = File::open("tests/parseable-names.txt").ok().unwrap();
let reader = BufReader::new(f);
for line in reader.lines() {
let line: String = line.ok().unwrap().nfkd().collect();
if line.starts_with('#') || !line.contains('|') {
continue;
}
let parts: Vec<&str> = line.split('|').collect();
let input = parts[0];
let surname = parts[1];
let given_name = parts[2];
let middle_names = parts[3];
let first_initial = parts[4].chars().next().unwrap();
let middle_initials = parts[5];
let suffix = parts[6];
let name = human_name::Name::parse(input);
assert!(name.is_some(), "[{}] Could not parse!", input);
let given_name = none_if_empty(given_name);
let middle_names = none_if_empty(middle_names);
let middle_initials = none_if_empty(middle_initials);
let suffix = none_if_empty(suffix);
let name = name.unwrap();
assert!(
name.surname() == surname,
"[{}] Expected surname {}, got {}",
input,
surname,
name.surname()
);
assert!(
name.first_initial() == first_initial,
"[{}] Expected first initial {}, got {}",
input,
first_initial,
name.first_initial()
);
assert!(
name.given_name() == given_name,
"[{}] Expected given_name {:?}, got {:?}",
input,
given_name,
name.given_name()
);
assert!(
name.middle_name().map(|w| w.to_string()) == middle_names.map(|w| w.to_string()),
"[{}] Expected middle names {:?}, got {:?}",
input,
middle_names,
name.middle_name()
);
assert!(
name.middle_initials() == middle_initials,
"[{}] Expected middle initials {:?}, got {:?}",
input,
middle_initials,
name.middle_initials()
);
assert!(
name.generational_suffix() == suffix,
"[{}] Expected suffix {:?}, got {:?}",
input,
suffix,
name.generational_suffix()
);
}
}
#[test]
fn unparseable() {
let f = File::open("tests/unparseable-names.txt").ok().unwrap();
let reader = BufReader::new(f);
for line in reader.lines() {
let line = line.ok().unwrap();
if line.starts_with('#') {
continue;
}
let result = human_name::Name::parse(&line);
assert!(
result.is_none(),
"'Parsed' junk name: '{}' as '{}'",
line,
result.unwrap().display_first_last()
);
}
}
#[test]
fn equality() {
let f = File::open("tests/equal-names.txt").ok().unwrap();
let reader = BufReader::new(f);
for line in reader.lines() {
let line = line.ok().unwrap();
if line.starts_with('#') {
continue;
}
let parts: Vec<&str> = line.split('|').collect();
let a = parts[0];
let b = parts[1];
let expect = parts[2];
let parsed_a = human_name::Name::parse(a).unwrap_or_else(|| panic!("{} was not parsed", a));
let parsed_b = human_name::Name::parse(b).unwrap_or_else(|| panic!("{} was not parsed", b));
if expect == "==" {
assert!(
parsed_a.consistent_with(&parsed_b),
"{} should be consistent with {} but was not!",
a,
b
);
assert!(
parsed_b.consistent_with(&parsed_a),
"{} should be consistent with {} but was not!",
b,
a
);
assert!(
parsed_a.surname_hash() == parsed_b.surname_hash(),
"{} should have the same hash as {} but did not!",
a,
b
);
} else {
assert!(
!parsed_a.consistent_with(&parsed_b),
"{} should not be consistent with {} but was!",
a,
b
);
assert!(
!parsed_b.consistent_with(&parsed_a),
"{} should not be consistent with {} but was!",
b,
a
);
}
}
}