use crate::scope::Scope;
use ustr::Ustr;
#[derive(Debug, Clone, PartialEq)]
pub struct Name {
pub(crate) scope: Scope,
pub(crate) data: InputName,
}
impl Name {
pub fn unwrap_given(self) -> GivenName {
match self.data {
InputName::Given(given) => given,
InputName::Anonymous(_) => panic!("unwrap_given on an anonymous name"),
}
}
}
#[derive(Debug, Clone, PartialEq, Eq, Hash)]
pub struct GivenName {
pub(crate) name: Ustr,
}
#[derive(Debug, Clone)]
pub struct AnonName {
pub(crate) name: Ustr,
}
impl PartialEq for AnonName {
fn eq(&self, _other: &Self) -> bool {
false
}
}
#[derive(Debug, Clone, PartialEq)]
pub(crate) enum InputName {
Given(GivenName),
Anonymous(AnonName),
}
#[cfg(test)]
mod mixed {
use crate::scope::RootScope;
#[test]
fn different_variant() {
let scope = RootScope::new_root();
let name1 = scope.add_prefixed("hello");
let name2 = scope.add_named("hello").unwrap();
assert_ne!(name1, name1);
assert_eq!(name2, name2.clone());
assert_ne!(name1, name2);
}
}
#[cfg(test)]
mod anonymous {
use crate::scope::RootScope;
#[test]
fn prefixed_ne() {
let scope = RootScope::new_root();
let name1 = scope.add_prefixed("hello");
let name2 = scope.add_prefixed("hello");
assert_ne!(name1, name1);
assert_ne!(name2, name2.clone());
assert_ne!(name1, name2);
}
#[test]
fn anonymous_ne() {
let scope = RootScope::new_root();
let name1 = scope.add_anonymous();
let name2 = scope.add_anonymous();
assert_ne!(name1, name1);
assert_ne!(name2, name2.clone());
assert_ne!(name1, name2);
}
}
#[cfg(test)]
mod given {
use ::std::collections::HashSet;
use crate::scope::RootScope;
#[test]
fn different_text_ne() {
let scope = RootScope::new_root();
let name1 = scope.add_named("hello").unwrap();
let name2 = scope.add_named("world").unwrap();
assert_eq!(name1, name1);
assert_eq!(name2, name2.clone());
assert_ne!(name1, name2);
}
#[test]
fn different_text_hash() {
let scope = RootScope::new_root();
let name1 = scope.add_named("hello").unwrap().unwrap_given();
let name2 = scope.add_named("world").unwrap().unwrap_given();
let mut set = HashSet::new();
assert!(set.insert(name1.clone()));
assert!(set.insert(name2));
assert!(!set.insert(name1));
}
#[test]
fn different_scope_ne() {
let scope = RootScope::new_root();
let child1 = scope.add_child();
let name1 = child1.add_named("hello").unwrap();
let child2 = scope.add_child();
let name2 = child2.add_named("hello").unwrap();
assert_eq!(name1, name1);
assert_eq!(name2, name2.clone());
assert_ne!(name1, name2);
}
#[test]
fn different_root_ne() {
let scope1 = RootScope::new_root();
let scope2 = RootScope::new_root();
let name1 = scope1.add_named("hello").unwrap();
let name2 = scope2.add_named("hello").unwrap();
assert_eq!(name1, name1);
assert_eq!(name2, name2.clone());
assert_ne!(name1, name2);
}
}