Skip to content

Commit 66f9c81

Browse files
committed
Add tests targeted at un-covered lines of code
1 parent 5226dee commit 66f9c81

File tree

11 files changed

+555
-0
lines changed

11 files changed

+555
-0
lines changed

src/byte_slice.rs

Lines changed: 31 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -401,3 +401,34 @@ mod proofs {
401401
assert_eq!(unsafe { slc.cast::<u8>().add(mid) }, r.cast::<u8>());
402402
}
403403
}
404+
405+
#[cfg(test)]
406+
mod tests {
407+
use core::cell::RefCell;
408+
409+
use super::*;
410+
411+
#[test]
412+
fn test_ref_split_at_unchecked() {
413+
let cell = RefCell::new([1, 2, 3, 4]);
414+
let borrow = cell.borrow();
415+
let slice_ref: cell::Ref<'_, [u8]> = cell::Ref::map(borrow, |a| &a[..]);
416+
unsafe {
417+
let (l, r) = slice_ref.split_at_unchecked(2);
418+
assert_eq!(*l, [1, 2]);
419+
assert_eq!(*r, [3, 4]);
420+
}
421+
}
422+
423+
#[test]
424+
fn test_ref_mut_split_at_unchecked() {
425+
let cell = RefCell::new([1, 2, 3, 4]);
426+
let borrow_mut = cell.borrow_mut();
427+
let slice_ref_mut: cell::RefMut<'_, [u8]> = cell::RefMut::map(borrow_mut, |a| &mut a[..]);
428+
unsafe {
429+
let (l, r) = slice_ref_mut.split_at_unchecked(2);
430+
assert_eq!(*l, [1, 2]);
431+
assert_eq!(*r, [3, 4]);
432+
}
433+
}
434+
}

src/byteorder.rs

Lines changed: 32 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1529,4 +1529,36 @@ mod tests {
15291529
assert_eq!(format!("{:03?}", val), "U16(010)");
15301530
assert_eq!(format!("{:x?}", val), "U16(a)");
15311531
}
1532+
1533+
#[test]
1534+
fn test_byteorder_traits_coverage() {
1535+
let val_be = U16::<BigEndian>::from_bytes([0, 1]);
1536+
let val_le = U16::<LittleEndian>::from_bytes([1, 0]);
1537+
1538+
assert_eq!(val_be.get(), 1);
1539+
assert_eq!(val_le.get(), 1);
1540+
1541+
// Debug
1542+
assert_eq!(format!("{:?}", val_be), "U16(1)");
1543+
assert_eq!(format!("{:?}", val_le), "U16(1)");
1544+
1545+
// PartialOrd, Ord with same type
1546+
assert!(val_be >= val_be);
1547+
assert!(val_be <= val_be);
1548+
assert_eq!(val_be.cmp(&val_be), core::cmp::Ordering::Equal);
1549+
1550+
// PartialOrd with native
1551+
assert!(val_be == 1u16);
1552+
assert!(val_be >= 1u16);
1553+
1554+
// Default
1555+
let default_be: U16<BigEndian> = Default::default();
1556+
assert_eq!(default_be.get(), 0);
1557+
1558+
// I16
1559+
let val_be_i16 = I16::<BigEndian>::from_bytes([0, 1]);
1560+
assert_eq!(val_be_i16.get(), 1);
1561+
assert_eq!(format!("{:?}", val_be_i16), "I16(1)");
1562+
assert_eq!(val_be_i16.cmp(&val_be_i16), core::cmp::Ordering::Equal);
1563+
}
15321564
}

src/deprecated.rs

Lines changed: 68 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -209,3 +209,71 @@ where
209209
Ref::from_suffix_with_elems(bytes, count).ok()
210210
}
211211
}
212+
213+
#[cfg(test)]
214+
mod tests {
215+
use super::*;
216+
217+
#[test]
218+
#[allow(deprecated)]
219+
fn test_deprecated_ref_methods() {
220+
let bytes = &[0u8; 1][..];
221+
let bytes_slice = &[0u8; 4][..];
222+
223+
let r: Option<Ref<&[u8], u8>> = Ref::new(bytes);
224+
assert!(r.is_some());
225+
226+
let r: Option<(Ref<&[u8], u8>, &[u8])> = Ref::new_from_prefix(bytes);
227+
assert!(r.is_some());
228+
229+
let r: Option<(&[u8], Ref<&[u8], u8>)> = Ref::new_from_suffix(bytes);
230+
assert!(r.is_some());
231+
232+
let r: Option<Ref<&[u8], u8>> = Ref::new_unaligned(bytes);
233+
assert!(r.is_some());
234+
235+
let r: Option<(Ref<&[u8], u8>, &[u8])> = Ref::new_unaligned_from_prefix(bytes);
236+
assert!(r.is_some());
237+
238+
let r: Option<(&[u8], Ref<&[u8], u8>)> = Ref::new_unaligned_from_suffix(bytes);
239+
assert!(r.is_some());
240+
241+
let r: Option<Ref<&[u8], [u8]>> = Ref::new_slice(bytes_slice);
242+
assert!(r.is_some());
243+
244+
let r: Option<Ref<&[u8], [u8]>> = Ref::new_slice_unaligned(bytes_slice);
245+
assert!(r.is_some());
246+
247+
let r: Option<(Ref<&[u8], [u8]>, &[u8])> = Ref::new_slice_from_prefix(bytes_slice, 1);
248+
assert!(r.is_some());
249+
250+
let r: Option<(&[u8], Ref<&[u8], [u8]>)> = Ref::new_slice_from_suffix(bytes_slice, 1);
251+
assert!(r.is_some());
252+
253+
let r: Option<(Ref<&[u8], [u8]>, &[u8])> =
254+
Ref::new_slice_unaligned_from_prefix(bytes_slice, 1);
255+
assert!(r.is_some());
256+
257+
let r: Option<(&[u8], Ref<&[u8], [u8]>)> =
258+
Ref::new_slice_unaligned_from_suffix(bytes_slice, 1);
259+
assert!(r.is_some());
260+
}
261+
262+
#[test]
263+
#[allow(deprecated)]
264+
fn test_deprecated_into_slice() {
265+
let bytes = &[0u8; 4][..];
266+
let r: Ref<&[u8], [u8]> = Ref::from_bytes(bytes).unwrap();
267+
let slice: &[u8] = r.into_slice();
268+
assert_eq!(slice.len(), 4);
269+
}
270+
271+
#[test]
272+
#[allow(deprecated)]
273+
fn test_deprecated_into_mut_slice() {
274+
let mut bytes = [0u8; 4];
275+
let r: Ref<&mut [u8], [u8]> = Ref::from_bytes(&mut bytes[..]).unwrap();
276+
let slice: &mut [u8] = r.into_mut_slice();
277+
assert_eq!(slice.len(), 4);
278+
}
279+
}

src/error.rs

Lines changed: 143 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1003,6 +1003,7 @@ pub struct AllocError;
10031003

10041004
#[cfg(test)]
10051005
mod tests {
1006+
use core::convert::Infallible;
10061007
use super::*;
10071008

10081009
#[test]
@@ -1169,4 +1170,146 @@ mod tests {
11691170
Destination type: bool"
11701171
);
11711172
}
1173+
1174+
#[test]
1175+
fn test_convert_error_debug() {
1176+
let err: ConvertError<
1177+
AlignmentError<&[u8], u16>,
1178+
SizeError<&[u8], u16>,
1179+
ValidityError<&[u8], bool>,
1180+
> = ConvertError::Alignment(AlignmentError::new_checked(&[0u8]));
1181+
assert_eq!(format!("{:?}", err), "Alignment(AlignmentError)");
1182+
1183+
let err: ConvertError<
1184+
AlignmentError<&[u8], u16>,
1185+
SizeError<&[u8], u16>,
1186+
ValidityError<&[u8], bool>,
1187+
> = ConvertError::Size(SizeError::new(&[0u8]));
1188+
assert_eq!(format!("{:?}", err), "Size(SizeError)");
1189+
1190+
let err: ConvertError<
1191+
AlignmentError<&[u8], u16>,
1192+
SizeError<&[u8], u16>,
1193+
ValidityError<&[u8], bool>,
1194+
> = ConvertError::Validity(ValidityError::new(&[0u8]));
1195+
assert_eq!(format!("{:?}", err), "Validity(ValidityError)");
1196+
}
1197+
1198+
#[test]
1199+
fn test_convert_error_from_unaligned() {
1200+
// u8 is Unaligned
1201+
let err: ConvertError<
1202+
AlignmentError<&[u8], u8>,
1203+
SizeError<&[u8], u8>,
1204+
ValidityError<&[u8], bool>,
1205+
> = ConvertError::Size(SizeError::new(&[0u8]));
1206+
let converted: ConvertError<Infallible, SizeError<&[u8], u8>, ValidityError<&[u8], bool>> =
1207+
ConvertError::from(err);
1208+
match converted {
1209+
ConvertError::Size(_) => {}
1210+
_ => panic!("Expected Size error"),
1211+
}
1212+
}
1213+
1214+
#[test]
1215+
fn test_alignment_error_display_debug() {
1216+
let err: AlignmentError<&[u8], u16> = AlignmentError::new_checked(&[0u8]);
1217+
assert!(format!("{:?}", err).contains("AlignmentError"));
1218+
assert!(format!("{}", err).contains("address of the source is not a multiple"));
1219+
}
1220+
1221+
#[test]
1222+
fn test_size_error_display_debug() {
1223+
let err: SizeError<&[u8], u16> = SizeError::new(&[0u8]);
1224+
assert!(format!("{:?}", err).contains("SizeError"));
1225+
assert!(format!("{}", err).contains("source was incorrectly sized"));
1226+
}
1227+
1228+
#[test]
1229+
fn test_validity_error_display_debug() {
1230+
let err: ValidityError<&[u8], bool> = ValidityError::new(&[0u8]);
1231+
assert!(format!("{:?}", err).contains("ValidityError"));
1232+
assert!(format!("{}", err).contains("source bytes are not a valid value"));
1233+
}
1234+
1235+
#[test]
1236+
fn test_convert_error_display_debug_more() {
1237+
let err: ConvertError<
1238+
AlignmentError<&[u8], u16>,
1239+
SizeError<&[u8], u16>,
1240+
ValidityError<&[u8], bool>,
1241+
> = ConvertError::Alignment(AlignmentError::new_checked(&[0u8]));
1242+
assert!(format!("{}", err).contains("address of the source is not a multiple"));
1243+
1244+
let err: ConvertError<
1245+
AlignmentError<&[u8], u16>,
1246+
SizeError<&[u8], u16>,
1247+
ValidityError<&[u8], bool>,
1248+
> = ConvertError::Size(SizeError::new(&[0u8]));
1249+
assert!(format!("{}", err).contains("source was incorrectly sized"));
1250+
1251+
let err: ConvertError<
1252+
AlignmentError<&[u8], u16>,
1253+
SizeError<&[u8], u16>,
1254+
ValidityError<&[u8], bool>,
1255+
> = ConvertError::Validity(ValidityError::new(&[0u8]));
1256+
assert!(format!("{}", err).contains("source bytes are not a valid value"));
1257+
}
1258+
1259+
#[test]
1260+
fn test_alignment_error_methods() {
1261+
let err: AlignmentError<&[u8], u16> = AlignmentError::new_checked(&[0u8]);
1262+
1263+
// into_src
1264+
let src = err.clone().into_src();
1265+
assert_eq!(src, &[0u8]);
1266+
1267+
// into
1268+
let converted: ConvertError<
1269+
AlignmentError<&[u8], u16>,
1270+
SizeError<&[u8], u16>,
1271+
ValidityError<&[u8], bool>,
1272+
> = err.clone().into();
1273+
match converted {
1274+
ConvertError::Alignment(_) => {}
1275+
_ => panic!("Expected Alignment error"),
1276+
}
1277+
1278+
// clone
1279+
let cloned = err.clone();
1280+
assert_eq!(err, cloned);
1281+
1282+
// eq
1283+
assert_eq!(err, cloned);
1284+
let err2: AlignmentError<&[u8], u16> = AlignmentError::new_checked(&[1u8]);
1285+
assert_ne!(err, err2);
1286+
}
1287+
1288+
#[test]
1289+
fn test_convert_error_from_unaligned_variants() {
1290+
// u8 is Unaligned
1291+
let err: ConvertError<
1292+
AlignmentError<&[u8], u8>,
1293+
SizeError<&[u8], u8>,
1294+
ValidityError<&[u8], bool>,
1295+
> = ConvertError::Validity(ValidityError::new(&[0u8]));
1296+
let converted: ConvertError<Infallible, SizeError<&[u8], u8>, ValidityError<&[u8], bool>> =
1297+
ConvertError::from(err);
1298+
match converted {
1299+
ConvertError::Validity(_) => {}
1300+
_ => panic!("Expected Validity error"),
1301+
}
1302+
1303+
let err: ConvertError<
1304+
AlignmentError<&[u8], u8>,
1305+
SizeError<&[u8], u8>,
1306+
ValidityError<&[u8], bool>,
1307+
> = ConvertError::Size(SizeError::new(&[0u8]));
1308+
let converted: ConvertError<Infallible, SizeError<&[u8], u8>, ValidityError<&[u8], bool>> =
1309+
ConvertError::from(err);
1310+
match converted {
1311+
ConvertError::Size(_) => {}
1312+
_ => panic!("Expected Size error"),
1313+
}
1314+
}
11721315
}

src/layout.rs

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -957,6 +957,19 @@ mod cast_from_raw {
957957
mod tests {
958958
use super::*;
959959

960+
#[test]
961+
fn test_dst_layout_for_slice() {
962+
let layout = DstLayout::for_slice::<u32>();
963+
match layout.size_info {
964+
SizeInfo::SliceDst(TrailingSliceLayout { offset, elem_size }) => {
965+
assert_eq!(offset, 0);
966+
assert_eq!(elem_size, 4);
967+
}
968+
_ => panic!("Expected SliceDst"),
969+
}
970+
assert_eq!(layout.align.get(), 4);
971+
}
972+
960973
/// Tests of when a sized `DstLayout` is extended with a sized field.
961974
#[allow(clippy::decimal_literal_representation)]
962975
#[test]

src/lib.rs

Lines changed: 68 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6772,4 +6772,72 @@ mod tests {
67726772
);
67736773
}
67746774
}
6775+
6776+
#[test]
6777+
#[allow(deprecated)]
6778+
fn test_deprecated_from_bytes() {
6779+
let val = 0u32;
6780+
let bytes = val.as_bytes();
6781+
6782+
assert!(u32::ref_from(bytes).is_some());
6783+
// mut_from needs mut bytes
6784+
let mut val = 0u32;
6785+
let mut_bytes = val.as_mut_bytes();
6786+
assert!(u32::mut_from(mut_bytes).is_some());
6787+
6788+
assert!(u32::read_from(bytes).is_some());
6789+
6790+
let (slc, rest) = <u32>::slice_from_prefix(bytes, 0).unwrap();
6791+
assert!(slc.is_empty());
6792+
assert_eq!(rest.len(), 4);
6793+
6794+
let (rest, slc) = <u32>::slice_from_suffix(bytes, 0).unwrap();
6795+
assert!(slc.is_empty());
6796+
assert_eq!(rest.len(), 4);
6797+
6798+
let (slc, rest) = <u32>::mut_slice_from_prefix(mut_bytes, 0).unwrap();
6799+
assert!(slc.is_empty());
6800+
assert_eq!(rest.len(), 4);
6801+
6802+
let (rest, slc) = <u32>::mut_slice_from_suffix(mut_bytes, 0).unwrap();
6803+
assert!(slc.is_empty());
6804+
assert_eq!(rest.len(), 4);
6805+
}
6806+
6807+
#[test]
6808+
fn test_try_ref_from_prefix_suffix() {
6809+
let bytes = &[0u8; 4][..];
6810+
let (r, rest): (&u32, &[u8]) = u32::try_ref_from_prefix(bytes).unwrap();
6811+
assert_eq!(*r, 0);
6812+
assert_eq!(rest.len(), 0);
6813+
6814+
let (rest, r): (&[u8], &u32) = u32::try_ref_from_suffix(bytes).unwrap();
6815+
assert_eq!(*r, 0);
6816+
assert_eq!(rest.len(), 0);
6817+
}
6818+
6819+
#[test]
6820+
fn test_raw_dangling() {
6821+
let ptr: NonNull<u32> = u32::raw_dangling();
6822+
assert_eq!(ptr.as_ptr() as usize, 1);
6823+
6824+
let ptr: NonNull<[u32]> = <[u32]>::raw_dangling();
6825+
assert_eq!(ptr.as_ptr() as *const u8 as usize, 1);
6826+
}
6827+
6828+
#[test]
6829+
fn test_try_ref_from_prefix_with_elems() {
6830+
let bytes = &[0u8; 8][..];
6831+
let (r, rest): (&[u32], &[u8]) = <[u32]>::try_ref_from_prefix_with_elems(bytes, 2).unwrap();
6832+
assert_eq!(r.len(), 2);
6833+
assert_eq!(rest.len(), 0);
6834+
}
6835+
6836+
#[test]
6837+
fn test_try_ref_from_suffix_with_elems() {
6838+
let bytes = &[0u8; 8][..];
6839+
let (rest, r): (&[u8], &[u32]) = <[u32]>::try_ref_from_suffix_with_elems(bytes, 2).unwrap();
6840+
assert_eq!(r.len(), 2);
6841+
assert_eq!(rest.len(), 0);
6842+
}
67756843
}

0 commit comments

Comments
 (0)