Skip to content

Commit c4eeebc

Browse files
committed
Add more unit tests
Signed-off-by: Liu Jiang <gerry@linux.alibaba.com>
1 parent 1d1f2b3 commit c4eeebc

File tree

1 file changed

+150
-0
lines changed

1 file changed

+150
-0
lines changed

src/interval_tree.rs

Lines changed: 150 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -664,6 +664,41 @@ mod tests {
664664
assert_eq!(d.len(), 1);
665665
}
666666

667+
#[test]
668+
fn test_range_contain() {
669+
let a = Range::new(2, 6);
670+
assert!(a.contain(&Range::new(2, 3)));
671+
assert!(a.contain(&Range::new(3, 4)));
672+
assert!(a.contain(&Range::new(5, 5)));
673+
assert!(a.contain(&Range::new(5, 6)));
674+
assert!(a.contain(&Range::new(6, 6)));
675+
assert!(!a.contain(&Range::new(1, 1)));
676+
assert!(!a.contain(&Range::new(1, 2)));
677+
assert!(!a.contain(&Range::new(1, 3)));
678+
assert!(!a.contain(&Range::new(1, 7)));
679+
assert!(!a.contain(&Range::new(7, 8)));
680+
assert!(!a.contain(&Range::new(6, 7)));
681+
assert!(!a.contain(&Range::new(7, 8)));
682+
}
683+
684+
#[test]
685+
fn test_range_align_to() {
686+
let a = Range::new(2, 6);
687+
assert_eq!(a.align_to(0), Some(Range::new(2, 6)));
688+
assert_eq!(a.align_to(1), Some(Range::new(2, 6)));
689+
assert_eq!(a.align_to(2), Some(Range::new(2, 6)));
690+
assert_eq!(a.align_to(4), Some(Range::new(4, 6)));
691+
assert_eq!(a.align_to(8), None);
692+
assert_eq!(a.align_to(3), None);
693+
694+
let a = Range::new(0xFFFF_FFFF_FFFF_FFFD, 0xFFFF_FFFF_FFFF_FFFF);
695+
assert_eq!(
696+
a.align_to(2),
697+
Some(Range::new(0xFFFF_FFFF_FFFF_FFFE, 0xFFFF_FFFF_FFFF_FFFF))
698+
);
699+
assert_eq!(a.align_to(4), None);
700+
}
701+
667702
#[test]
668703
fn test_range_ord() {
669704
let a = Range::new(1, 4);
@@ -697,4 +732,119 @@ mod tests {
697732
tree.insert(Range::new(0x100, 0x200), Some(1));
698733
tree.insert(Range::new(0x200, 0x2ff), None);
699734
}
735+
736+
#[test]
737+
fn test_tree_get_superset() {
738+
let mut tree = IntervalTree::<u64>::new();
739+
tree.insert(Range::new(0x100, 0x100), Some(1));
740+
tree.insert(Range::new(0x200, 0x2ff), None);
741+
assert_eq!(
742+
tree.get_superset(&Range::new(0x100, 0x100)),
743+
Some((&Range::new(0x100, 0x100), Some(&1)))
744+
);
745+
assert_eq!(
746+
tree.get_superset(&Range::new(0x200, 0x200)),
747+
Some((&Range::new(0x200, 0x2ff), None))
748+
);
749+
assert_eq!(
750+
tree.get_superset(&Range::new(0x200, 0x2ff)),
751+
Some((&Range::new(0x200, 0x2ff), None))
752+
);
753+
assert_eq!(
754+
tree.get_superset(&Range::new(0x210, 0x210)),
755+
Some((&Range::new(0x200, 0x2ff), None))
756+
);
757+
assert_eq!(
758+
tree.get_superset(&Range::new(0x2ff, 0x2ff)),
759+
Some((&Range::new(0x200, 0x2ff), None))
760+
);
761+
assert_eq!(tree.get_superset(&Range::new(0x2ff, 0x300)), None);
762+
assert_eq!(tree.get_superset(&Range::new(0x300, 0x300)), None);
763+
assert_eq!(tree.get_superset(&Range::new(0x1ff, 0x300)), None);
764+
}
765+
766+
#[test]
767+
fn test_tree_update() {
768+
let mut tree = IntervalTree::<u64>::new();
769+
tree.insert(Range::new(0x100, 0x100), None);
770+
tree.insert(Range::new(0x200, 0x2ff), None);
771+
772+
let constraint = Constraint::new(2);
773+
let key = tree.allocate(&constraint);
774+
assert_eq!(key, Some(Range::new(0x200, 0x201)));
775+
let old = tree.update(&Range::new(0x200, 0x201), 2);
776+
assert_eq!(old, None);
777+
let old = tree.update(&Range::new(0x200, 0x201), 3);
778+
assert_eq!(old, Some(2));
779+
let old = tree.update(&Range::new(0x200, 0x200), 4);
780+
assert_eq!(old, None);
781+
let old = tree.update(&Range::new(0x200, 0x203), 5);
782+
assert_eq!(old, None);
783+
784+
tree.delete(&Range::new(0x200, 0x201));
785+
let old = tree.update(&Range::new(0x200, 0x201), 2);
786+
assert_eq!(old, None);
787+
}
788+
789+
#[test]
790+
fn test_tree_delete() {
791+
let mut tree = IntervalTree::<u64>::new();
792+
assert_eq!(tree.get(&Range::new(0x101, 0x101)), None);
793+
assert!(tree.is_empty());
794+
tree.insert(Range::new(0x100, 0x100), Some(1));
795+
tree.insert(Range::new(0x200, 0x2ff), None);
796+
assert!(!tree.is_empty());
797+
assert_eq!(tree.get(&Range::new(0x100, 0x100)), Some(Some(&1)));
798+
assert_eq!(tree.get(&Range::new(0x200, 0x2ff)), Some(None));
799+
assert_eq!(tree.get(&Range::new(0x101, 0x101)), None);
800+
801+
let old = tree.delete(&Range::new(0x100, 0x100));
802+
assert_eq!(old, Some(1));
803+
let old = tree.delete(&Range::new(0x200, 0x2ff));
804+
assert_eq!(old, None);
805+
806+
assert!(tree.is_empty());
807+
assert_eq!(tree.get(&Range::new(0x100, 0x100)), None);
808+
assert_eq!(tree.get(&Range::new(0x200, 0x2ff)), None);
809+
}
810+
811+
#[test]
812+
fn test_allocate_free() {
813+
let mut tree = IntervalTree::<u64>::new();
814+
let mut constraint = Constraint::new(1);
815+
816+
assert_eq!(tree.allocate(&constraint), None);
817+
tree.insert(Range::new(0x100, 0x100), None);
818+
tree.insert(Range::new(0x200, 0x2ff), None);
819+
820+
let key = tree.allocate(&constraint);
821+
assert_eq!(key, Some(Range::new(0x100, 0x100)));
822+
let old = tree.update(&Range::new(0x100, 0x100), 2);
823+
assert_eq!(old, None);
824+
let val = tree.get(&Range::new(0x100, 0x100));
825+
assert_eq!(val, Some(Some(&2)));
826+
827+
constraint.min = 0x100;
828+
constraint.max = 0x100;
829+
assert_eq!(tree.allocate(&constraint), None);
830+
831+
constraint.min = 0x201;
832+
constraint.max = 0x300;
833+
constraint.align = 0x8;
834+
constraint.size = 0x10;
835+
assert_eq!(tree.allocate(&constraint), Some(Range::new(0x208, 0x217)));
836+
837+
constraint.size = 0x100;
838+
assert_eq!(tree.allocate(&constraint), None);
839+
840+
tree.update(&Range::new(0x208, 0x217), 0x10);
841+
let old = tree.free(&Range::new(0x208, 0x217));
842+
assert_eq!(old, Some(0x10));
843+
844+
constraint.min = 0x200;
845+
constraint.max = 0x2ff;
846+
constraint.align = 0x8;
847+
constraint.size = 0x100;
848+
assert_eq!(tree.allocate(&constraint), Some(Range::new(0x200, 0x2ff)));
849+
}
700850
}

0 commit comments

Comments
 (0)