use crate::{object::shape::slot::SlotAttributes, property::PropertyKey, JsObject, JsSymbol};
use super::{SharedShape, TransitionKey};
#[test]
fn test_prune_property_on_counter_limit() {
let shape = SharedShape::root();
for i in 0..255 {
assert_eq!(
shape.forward_transitions().property_transitions_count(),
(i, i as u8)
);
shape.insert_property_transition(TransitionKey {
property_key: PropertyKey::Symbol(JsSymbol::new(None).unwrap()),
attributes: SlotAttributes::all(),
});
}
assert_eq!(
shape.forward_transitions().property_transitions_count(),
(255, 255)
);
boa_gc::force_collect();
{
shape.insert_property_transition(TransitionKey {
property_key: PropertyKey::Symbol(JsSymbol::new(None).unwrap()),
attributes: SlotAttributes::all(),
});
}
assert_eq!(
shape.forward_transitions().property_transitions_count(),
(1, 0)
);
{
shape.insert_property_transition(TransitionKey {
property_key: PropertyKey::Symbol(JsSymbol::new(None).unwrap()),
attributes: SlotAttributes::all(),
});
}
assert_eq!(
shape.forward_transitions().property_transitions_count(),
(2, 1)
);
boa_gc::force_collect();
assert_eq!(
shape.forward_transitions().property_transitions_count(),
(2, 1)
);
}
#[test]
fn test_prune_prototype_on_counter_limit() {
let shape = SharedShape::root();
assert_eq!(
shape.forward_transitions().prototype_transitions_count(),
(0, 0)
);
for i in 0..255 {
assert_eq!(
shape.forward_transitions().prototype_transitions_count(),
(i, i as u8)
);
shape.change_prototype_transition(Some(JsObject::with_null_proto()));
}
boa_gc::force_collect();
assert_eq!(
shape.forward_transitions().prototype_transitions_count(),
(255, 255)
);
{
shape.change_prototype_transition(Some(JsObject::with_null_proto()));
}
assert_eq!(
shape.forward_transitions().prototype_transitions_count(),
(1, 0)
);
{
shape.change_prototype_transition(Some(JsObject::with_null_proto()));
}
assert_eq!(
shape.forward_transitions().prototype_transitions_count(),
(2, 1)
);
boa_gc::force_collect();
assert_eq!(
shape.forward_transitions().prototype_transitions_count(),
(2, 1)
);
}