Skip to content

Commit e0e39ca

Browse files
committed
Add basic tests for OwnedSlice
1 parent b6970d0 commit e0e39ca

File tree

2 files changed

+71
-0
lines changed

2 files changed

+71
-0
lines changed

compiler/rustc_data_structures/src/owned_slice.rs

+3
Original file line numberDiff line numberDiff line change
@@ -111,3 +111,6 @@ unsafe impl Send for OwnedSlice {}
111111

112112
// Safety: `OwnedSlice` is conceptually `(&'self.1 [u8], Box<dyn Send + Sync>)`, which is `Sync`
113113
unsafe impl Sync for OwnedSlice {}
114+
115+
#[cfg(test)]
116+
mod tests;
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,68 @@
1+
use std::{cell::Cell, ops::Deref, rc::Rc};
2+
3+
use crate::{
4+
owned_slice::{slice_owned, try_slice_owned, OwnedSlice},
5+
OnDrop,
6+
};
7+
8+
#[test]
9+
fn smoke() {
10+
let slice = slice_owned(vec![1, 2, 3, 4, 5, 6], Vec::as_slice);
11+
12+
assert_eq!(&*slice, [1, 2, 3, 4, 5, 6]);
13+
}
14+
15+
#[test]
16+
fn static_storage() {
17+
let slice = slice_owned(Box::new(String::from("what")), |_| b"bytes boo");
18+
19+
assert_eq!(&*slice, b"bytes boo");
20+
}
21+
22+
#[test]
23+
fn slice_the_slice() {
24+
let slice = slice_owned(vec![1, 2, 3, 4, 5, 6], Vec::as_slice);
25+
let slice = slice_owned(slice, |s| &s[1..][..4]);
26+
let slice = slice_owned(slice, |s| s);
27+
let slice = slice_owned(slice, |s| &s[1..]);
28+
29+
assert_eq!(&*slice, &[1, 2, 3, 4, 5, 6][1..][..4][1..]);
30+
}
31+
32+
#[test]
33+
fn try_and_fail() {
34+
let res = try_slice_owned(vec![0], |v| v.get(12..).ok_or(()));
35+
36+
assert!(res.is_err());
37+
}
38+
39+
#[test]
40+
fn boxed() {
41+
// It's important that we don't cause UB because of `Box`'es uniqueness
42+
43+
let boxed: Box<[u8]> = vec![1, 1, 2, 3, 5, 8, 13, 21].into_boxed_slice();
44+
let slice = slice_owned(boxed, Deref::deref);
45+
46+
assert_eq!(&*slice, [1, 1, 2, 3, 5, 8, 13, 21]);
47+
}
48+
49+
#[test]
50+
fn drop() {
51+
let flag = Rc::new(Cell::new(false));
52+
let flag_prime = Rc::clone(&flag);
53+
let d = OnDrop(move || flag_prime.set(true));
54+
55+
let slice = slice_owned(d, |_| &[]);
56+
57+
assert_eq!(flag.get(), false);
58+
59+
std::mem::drop(slice);
60+
61+
assert_eq!(flag.get(), true);
62+
}
63+
64+
#[test]
65+
fn send_sync() {
66+
crate::sync::assert_send::<OwnedSlice>();
67+
crate::sync::assert_sync::<OwnedSlice>();
68+
}

0 commit comments

Comments
 (0)