Skip to content

Commit 495f7cc

Browse files
committed
BTreeMap: compile-test all borrowing interfaces and test more chaotic order
1 parent f09fb48 commit 495f7cc

File tree

1 file changed

+87
-1
lines changed
  • library/alloc/src/collections/btree/map

1 file changed

+87
-1
lines changed

library/alloc/src/collections/btree/map/tests.rs

+87-1
Original file line numberDiff line numberDiff line change
@@ -777,7 +777,7 @@ fn test_range_backwards_4() {
777777

778778
#[test]
779779
#[should_panic]
780-
fn test_range_backwards_5() {
780+
fn test_range_finding_ill_order_in_map() {
781781
let mut map = BTreeMap::new();
782782
map.insert(Cyclic3::B, ());
783783
// Lacking static_assert, call `range` conditionally, to emphasise that
@@ -788,6 +788,47 @@ fn test_range_backwards_5() {
788788
}
789789
}
790790

791+
#[test]
792+
#[should_panic]
793+
fn test_range_finding_ill_order_in_range_ord() {
794+
// Has proper order the first time asked, then flips around.
795+
struct EvilTwin(i32);
796+
797+
impl PartialOrd for EvilTwin {
798+
fn partial_cmp(&self, other: &Self) -> Option<Ordering> {
799+
Some(self.cmp(other))
800+
}
801+
}
802+
803+
static COMPARES: AtomicUsize = AtomicUsize::new(0);
804+
impl Ord for EvilTwin {
805+
fn cmp(&self, other: &Self) -> Ordering {
806+
let ord = self.0.cmp(&other.0);
807+
if COMPARES.fetch_add(1, SeqCst) > 0 { ord.reverse() } else { ord }
808+
}
809+
}
810+
811+
impl PartialEq for EvilTwin {
812+
fn eq(&self, other: &Self) -> bool {
813+
self.0.eq(&other.0)
814+
}
815+
}
816+
817+
impl Eq for EvilTwin {}
818+
819+
#[derive(PartialEq, Eq, PartialOrd, Ord)]
820+
struct CompositeKey(i32, EvilTwin);
821+
822+
impl Borrow<EvilTwin> for CompositeKey {
823+
fn borrow(&self) -> &EvilTwin {
824+
&self.1
825+
}
826+
}
827+
828+
let map = (0..12).map(|i| (CompositeKey(i, EvilTwin(i)), ())).collect::<BTreeMap<_, _>>();
829+
map.range(EvilTwin(5)..=EvilTwin(7));
830+
}
831+
791832
#[test]
792833
fn test_range_1000() {
793834
// Miri is too slow
@@ -1222,6 +1263,51 @@ fn test_borrow() {
12221263
map.insert(Rc::new(0), 1);
12231264
assert_eq!(map[&0], 1);
12241265
}
1266+
1267+
#[allow(dead_code)]
1268+
fn get<T: Ord>(v: &BTreeMap<Box<T>, ()>, t: &T) {
1269+
v.get(t);
1270+
}
1271+
1272+
#[allow(dead_code)]
1273+
fn get_mut<T: Ord>(v: &mut BTreeMap<Box<T>, ()>, t: &T) {
1274+
v.get_mut(t);
1275+
}
1276+
1277+
#[allow(dead_code)]
1278+
fn get_key_value<T: Ord>(v: &BTreeMap<Box<T>, ()>, t: &T) {
1279+
v.get_key_value(t);
1280+
}
1281+
1282+
#[allow(dead_code)]
1283+
fn contains_key<T: Ord>(v: &BTreeMap<Box<T>, ()>, t: &T) {
1284+
v.contains_key(t);
1285+
}
1286+
1287+
#[allow(dead_code)]
1288+
fn range<T: Ord>(v: &BTreeMap<Box<T>, ()>, t: T) {
1289+
v.range(t..);
1290+
}
1291+
1292+
#[allow(dead_code)]
1293+
fn range_mut<T: Ord>(v: &mut BTreeMap<Box<T>, ()>, t: T) {
1294+
v.range_mut(t..);
1295+
}
1296+
1297+
#[allow(dead_code)]
1298+
fn remove<T: Ord>(v: &mut BTreeMap<Box<T>, ()>, t: &T) {
1299+
v.remove(t);
1300+
}
1301+
1302+
#[allow(dead_code)]
1303+
fn remove_entry<T: Ord>(v: &mut BTreeMap<Box<T>, ()>, t: &T) {
1304+
v.remove_entry(t);
1305+
}
1306+
1307+
#[allow(dead_code)]
1308+
fn split_off<T: Ord>(v: &mut BTreeMap<Box<T>, ()>, t: &T) {
1309+
v.split_off(t);
1310+
}
12251311
}
12261312

12271313
#[test]

0 commit comments

Comments
 (0)