use crate::{DefaultStringInterner, InternalStrRef, Sym, Symbol};
mod sym {
use super::*;
#[test]
fn same_size_as_optional() {
use std::mem;
assert_eq!(mem::size_of::<Sym>(), mem::size_of::<Option<Sym>>());
}
}
mod internal_str_ref {
use super::*;
#[test]
fn size_of() {
use std::mem;
assert_eq!(mem::size_of::<InternalStrRef>(), mem::size_of::<&str>());
}
#[test]
fn eq() {
let s = "bar";
assert_eq!(InternalStrRef::from_str(s), InternalStrRef::from_str(s));
assert_eq!(
InternalStrRef::from_str("foo"),
InternalStrRef::from_str("foo")
);
}
#[test]
fn ne() {
assert_ne!(
InternalStrRef::from_str("foo"),
InternalStrRef::from_str("bar")
)
}
#[test]
fn hash_same_as_str() {
use std::{collections::hash_map::DefaultHasher, hash::Hash};
let (s0, s1) = ("foo", "bar");
let (r0, r1) = (InternalStrRef::from_str(s0), InternalStrRef::from_str(s1));
let mut sip = DefaultHasher::new();
assert_eq!(r0.hash(&mut sip), s0.hash(&mut sip));
assert_eq!(r1.hash(&mut sip), s1.hash(&mut sip));
}
}
mod len {
use super::*;
#[test]
fn new_len() {
assert_eq!(DefaultStringInterner::new().len(), 0)
}
#[test]
fn len_after_intern() {
let interner = DefaultStringInterner::new();
interner.get_or_intern("foo");
assert_eq!(interner.len(), 1)
}
#[test]
fn len_after_same() {
let interner = DefaultStringInterner::new();
interner.get_or_intern("foo");
interner.get_or_intern("foo");
assert_eq!(interner.len(), 1)
}
#[test]
fn len_after_diff() {
let interner = DefaultStringInterner::new();
interner.get_or_intern("foo");
interner.get_or_intern("bar");
assert_eq!(interner.len(), 2)
}
}
mod is_empty {
use super::*;
#[test]
fn new() {
assert_eq!(DefaultStringInterner::new().is_empty(), true)
}
#[test]
fn not_empty() {
let interner = DefaultStringInterner::with_capacity(1);
interner.get_or_intern("foo");
assert_eq!(interner.is_empty(), false)
}
}
mod get_or_intern {
use super::*;
#[test]
fn simple() {
assert_eq!(
DefaultStringInterner::sym_to_index(DefaultStringInterner::new().get_or_intern("foo")),
0
)
}
#[test]
fn empty_string() {
assert_eq!(
DefaultStringInterner::sym_to_index(DefaultStringInterner::new().get_or_intern("")),
0
)
}
#[test]
fn same_twice() {
let interner = DefaultStringInterner::new();
let fst = interner.get_or_intern("foo");
let snd = interner.get_or_intern("foo");
assert_eq!(fst, snd);
}
#[test]
fn two_different() {
let interner = DefaultStringInterner::new();
let fst = interner.get_or_intern("foo");
let snd = interner.get_or_intern("bar");
assert_ne!(fst, snd);
}
#[test]
fn act_same() {
let interner1 = DefaultStringInterner::new();
let interner2 = DefaultStringInterner::new();
let sym1 = interner1.get_or_intern("foo");
let sym2 = interner2.get_or_intern("foo");
assert_eq!(
DefaultStringInterner::sym_to_index(sym1),
DefaultStringInterner::sym_to_index(sym2)
);
}
#[test]
fn intern_string() {
assert_eq!(
DefaultStringInterner::sym_to_index(
DefaultStringInterner::new().get_or_intern(String::from("foo"))
),
0
)
}
}
mod resolve {
use super::*;
#[test]
fn simple() {
let interner = DefaultStringInterner::new();
let sym = interner.get_or_intern("foo");
assert_eq!(interner.resolve(sym), Some("foo".into()));
}
#[test]
fn not_found() {
let interner = DefaultStringInterner::new();
assert_eq!(interner.resolve(Sym::from_usize(0)), None);
}
#[test]
fn unchecked() {
let interner = DefaultStringInterner::new();
let sym = interner.get_or_intern("foo");
assert_eq!(unsafe { interner.resolve_unchecked(sym) }.as_ref(), "foo");
}
}
mod get {
use super::*;
#[test]
fn simple() {
let interner = DefaultStringInterner::new();
let sym = interner.get_or_intern("foo");
assert_eq!(interner.get("foo"), Some(sym));
}
#[test]
fn not_founds() {
let interner = DefaultStringInterner::new();
assert_eq!(interner.get("foo"), None);
}
#[test]
fn simple_strings() {
let interner = DefaultStringInterner::new();
let sym = interner.get_or_intern("foo");
assert_eq!(interner.get(String::from("foo")), Some(sym));
}
}
mod from_iterator {
}
mod extend {
}
mod clone_and_drop {
}