fix: VarName::hash

This commit is contained in:
Shunsuke Shibayama 2024-10-03 17:47:57 +09:00
parent e7ff9f4ea7
commit d230bb7374
2 changed files with 62 additions and 2 deletions

View file

@ -394,3 +394,40 @@ impl<K: Hash + Eq, V> Dict<K, V> {
self.dict.entry(k)
}
}
#[cfg(test)]
mod tests {
use super::*;
use crate::str::Str;
#[test]
fn test_dict() {
let mut dict = Dict::new();
dict.insert(Str::from("a"), 1);
dict.insert(Str::from("b"), 2);
dict.insert(Str::from("c"), 3);
assert_eq!(dict.len(), 3);
assert_eq!(dict.get(&Str::from("a")), Some(&1));
assert_eq!(dict.get(&Str::from("b")), Some(&2));
assert_eq!(dict.get(&Str::from("c")), Some(&3));
assert_eq!(dict.get(&Str::from("d")), None);
assert_eq!(dict.get("a"), Some(&1));
assert_eq!(dict.get("b"), Some(&2));
assert_eq!(dict.get("c"), Some(&3));
assert_eq!(dict.get("d"), None);
assert_eq!(dict.remove(&Str::from("a")), Some(1));
assert_eq!(dict.remove(&Str::from("a")), None);
assert_eq!(dict.len(), 2);
assert_eq!(dict.get(&Str::from("a")), None);
assert_eq!(dict.get(&Str::from("b")), Some(&2));
assert_eq!(dict.get(&Str::from("c")), Some(&3));
assert_eq!(dict.get(&Str::from("d")), None);
dict.clear();
assert_eq!(dict.len(), 0);
assert_eq!(dict.get(&Str::from("a")), None);
assert_eq!(dict.get(&Str::from("b")), None);
assert_eq!(dict.get(&Str::from("c")), None);
assert_eq!(dict.get(&Str::from("d")), None);
}
}

View file

@ -3835,13 +3835,13 @@ impl Immutable for VarName {}
impl PartialEq for VarName {
fn eq(&self, other: &Self) -> bool {
self.0 == other.0
self.0.content == other.0.content
}
}
impl std::hash::Hash for VarName {
fn hash<H: std::hash::Hasher>(&self, state: &mut H) {
self.0.hash(state)
self.0.content.hash(state)
}
}
@ -6310,3 +6310,26 @@ impl InlineModule {
Self { input, ast, import }
}
}
#[cfg(test)]
mod tests {
use super::*;
use erg_common::dict::Dict;
#[test]
fn test_dict() {
let mut dict = Dict::new();
let a = Token::new(TokenKind::Symbol, "a", 1, 1);
let a = VarName::new(a);
let a2 = Token::new(TokenKind::Symbol, "a", 2, 3);
let a2 = VarName::new(a2);
dict.insert(a.clone(), 1);
assert_eq!(dict.len(), 1);
assert_eq!(dict.get(&a2), Some(&1));
assert_eq!(dict.get("a"), Some(&1));
assert_eq!(dict.get(&Str::from("a")), Some(&1));
assert_eq!(dict.remove(&a2), Some(1));
assert_eq!(dict.remove(&a2), None);
}
}