Skip to content

Commit 388e6af

Browse files
committed
Add tests for drops
1 parent 100a469 commit 388e6af

File tree

1 file changed

+126
-1
lines changed

1 file changed

+126
-1
lines changed

src/libarena/lib.rs

Lines changed: 126 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -561,9 +561,11 @@ mod tests {
561561
extern crate test;
562562
use self::test::Bencher;
563563
use super::{Arena, TypedArena};
564+
use std::cell::Cell;
564565
use std::rc::Rc;
565566

566567
#[allow(dead_code)]
568+
#[derive(Debug, Eq, PartialEq)]
567569
struct Point {
568570
x: i32,
569571
y: i32,
@@ -668,11 +670,16 @@ mod tests {
668670
#[test]
669671
pub fn test_arena_zero_sized() {
670672
let arena = Arena::new();
673+
let mut points = vec![];
671674
for _ in 0..1000 {
672675
for _ in 0..100 {
673676
arena.alloc(|| ());
674677
}
675-
arena.alloc(|| Point { x: 1, y: 2, z: 3 });
678+
let point = arena.alloc(|| Point { x: 1, y: 2, z: 3 });
679+
points.push(point);
680+
}
681+
for point in &points {
682+
assert_eq!(**point, Point { x: 1, y: 2, z: 3 });
676683
}
677684
}
678685

@@ -747,6 +754,124 @@ mod tests {
747754
});
748755
}
749756

757+
// Drop tests
758+
759+
struct DropCounter<'a> {
760+
count: &'a Cell<u32>,
761+
}
762+
763+
impl<'a> Drop for DropCounter<'a> {
764+
fn drop(&mut self) {
765+
self.count.set(self.count.get() + 1);
766+
}
767+
}
768+
769+
#[test]
770+
fn test_arena_drop_count() {
771+
let counter = Cell::new(0);
772+
{
773+
let arena = Arena::new();
774+
for _ in 0..100 {
775+
// Allocate something with drop glue to make sure it doesn't leak.
776+
arena.alloc(|| DropCounter { count: &counter });
777+
// Allocate something with funny size and alignment, to keep
778+
// things interesting.
779+
arena.alloc(|| [0u8, 1u8, 2u8]);
780+
}
781+
// dropping
782+
};
783+
assert_eq!(counter.get(), 100);
784+
}
785+
786+
#[test]
787+
fn test_arena_drop_on_clear() {
788+
let counter = Cell::new(0);
789+
for i in 0..10 {
790+
let mut arena = Arena::new();
791+
for _ in 0..100 {
792+
// Allocate something with drop glue to make sure it doesn't leak.
793+
arena.alloc(|| DropCounter { count: &counter });
794+
// Allocate something with funny size and alignment, to keep
795+
// things interesting.
796+
arena.alloc(|| [0u8, 1u8, 2u8]);
797+
}
798+
arena.clear();
799+
assert_eq!(counter.get(), i * 100 + 100);
800+
}
801+
}
802+
803+
#[test]
804+
fn test_typed_arena_drop_count() {
805+
let counter = Cell::new(0);
806+
{
807+
let arena: TypedArena<DropCounter> = TypedArena::new();
808+
for _ in 0..100 {
809+
// Allocate something with drop glue to make sure it doesn't leak.
810+
arena.alloc(DropCounter { count: &counter });
811+
}
812+
};
813+
assert_eq!(counter.get(), 100);
814+
}
815+
816+
#[test]
817+
fn test_typed_arena_drop_on_clear() {
818+
let counter = Cell::new(0);
819+
let mut arena: TypedArena<DropCounter> = TypedArena::new();
820+
for i in 0..10 {
821+
for _ in 0..100 {
822+
// Allocate something with drop glue to make sure it doesn't leak.
823+
arena.alloc(DropCounter { count: &counter });
824+
}
825+
arena.clear();
826+
assert_eq!(counter.get(), i * 100 + 100);
827+
}
828+
}
829+
830+
thread_local! {
831+
static DROP_COUNTER: Cell<u32> = Cell::new(0)
832+
}
833+
834+
struct SmallDroppable;
835+
836+
impl Drop for SmallDroppable {
837+
fn drop(&mut self) {
838+
DROP_COUNTER.with(|c| c.set(c.get() + 1));
839+
}
840+
}
841+
842+
#[test]
843+
fn test_arena_drop_small_count() {
844+
DROP_COUNTER.with(|c| c.set(0));
845+
{
846+
let arena = Arena::new();
847+
for _ in 0..10 {
848+
for _ in 0..10 {
849+
// Allocate something with drop glue to make sure it doesn't leak.
850+
arena.alloc(|| SmallDroppable);
851+
}
852+
// Allocate something with funny size and alignment, to keep
853+
// things interesting.
854+
arena.alloc(|| [0u8, 1u8, 2u8]);
855+
}
856+
// dropping
857+
};
858+
assert_eq!(DROP_COUNTER.with(|c| c.get()), 100);
859+
}
860+
861+
#[test]
862+
fn test_typed_arena_drop_small_count() {
863+
DROP_COUNTER.with(|c| c.set(0));
864+
{
865+
let arena: TypedArena<SmallDroppable> = TypedArena::new();
866+
for _ in 0..100 {
867+
// Allocate something with drop glue to make sure it doesn't leak.
868+
arena.alloc(SmallDroppable);
869+
}
870+
// dropping
871+
};
872+
assert_eq!(DROP_COUNTER.with(|c| c.get()), 100);
873+
}
874+
750875
#[bench]
751876
pub fn bench_noncopy(b: &mut Bencher) {
752877
let arena = TypedArena::new();

0 commit comments

Comments
 (0)