From 18300412ffd3308cc2c1dc07bc0c533b225b11b0 Mon Sep 17 00:00:00 2001 From: Wim Looman Date: Sun, 12 Jan 2020 14:07:13 +0100 Subject: [PATCH] Fix TinyVec::drain implementation --- Cargo.toml | 4 ++++ src/tiny_vec.rs | 4 ++-- tests/tinyvec.rs | 33 +++++++++++++++++++++++++++++++++ 3 files changed, 39 insertions(+), 2 deletions(-) create mode 100644 tests/tinyvec.rs diff --git a/Cargo.toml b/Cargo.toml index 4d02844..7544800 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -32,3 +32,7 @@ all-features = true [workspace] members = ["fuzz"] + +[[test]] +name = "tinyvec" +required-features = ["extern_crate_alloc"] diff --git a/src/tiny_vec.rs b/src/tiny_vec.rs index db4e933..25135ea 100644 --- a/src/tiny_vec.rs +++ b/src/tiny_vec.rs @@ -215,8 +215,8 @@ impl TinyVec { Bound::Unbounded => 0, }; let end = match range.end_bound() { - Bound::Included(x) => *x, - Bound::Excluded(x) => x - 1, + Bound::Included(x) => x + 1, + Bound::Excluded(x) => *x, Bound::Unbounded => self.len(), }; assert!( diff --git a/tests/tinyvec.rs b/tests/tinyvec.rs new file mode 100644 index 0000000..86756d2 --- /dev/null +++ b/tests/tinyvec.rs @@ -0,0 +1,33 @@ +#![allow(bad_style)] + +use tinyvec::*; +use std::iter::FromIterator; + +#[test] +fn TinyVec_drain() { + let mut tv: TinyVec<[i32; 10]> = Default::default(); + tv.push(1); + tv.push(2); + tv.push(3); + + assert_eq!(Vec::from_iter(tv.clone().drain(..)), vec![1, 2, 3]); + + assert_eq!(Vec::from_iter(tv.clone().drain(..2)), vec![1, 2]); + assert_eq!(Vec::from_iter(tv.clone().drain(..3)), vec![1, 2, 3]); + + assert_eq!(Vec::from_iter(tv.clone().drain(..=1)), vec![1, 2]); + assert_eq!(Vec::from_iter(tv.clone().drain(..=2)), vec![1, 2, 3]); + + assert_eq!(Vec::from_iter(tv.clone().drain(0..)), vec![1, 2, 3]); + assert_eq!(Vec::from_iter(tv.clone().drain(1..)), vec![2, 3]); + + assert_eq!(Vec::from_iter(tv.clone().drain(0..2)), vec![1, 2]); + assert_eq!(Vec::from_iter(tv.clone().drain(0..3)), vec![1, 2, 3]); + assert_eq!(Vec::from_iter(tv.clone().drain(1..2)), vec![2]); + assert_eq!(Vec::from_iter(tv.clone().drain(1..3)), vec![2, 3]); + + assert_eq!(Vec::from_iter(tv.clone().drain(0..=1)), vec![1, 2]); + assert_eq!(Vec::from_iter(tv.clone().drain(0..=2)), vec![1, 2, 3]); + assert_eq!(Vec::from_iter(tv.clone().drain(1..=1)), vec![2]); + assert_eq!(Vec::from_iter(tv.clone().drain(1..=2)), vec![2, 3]); +}