arrayvec.rs 13 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477
  1. #![allow(bad_style)]
  2. #[cfg(feature = "serde")]
  3. use serde_test::{assert_tokens, Token};
  4. use std::iter::FromIterator;
  5. use tinyvec::*;
  6. #[test]
  7. fn test_a_vec() {
  8. let mut expected: ArrayVec<[i32; 4]> = Default::default();
  9. expected.push(1);
  10. expected.push(2);
  11. expected.push(3);
  12. let actual = array_vec!(1, 2, 3);
  13. assert_eq!(expected, actual);
  14. assert_eq!(array_vec![0u8; 4], array_vec!(0u8, 0u8, 0u8, 0u8));
  15. assert_eq!(array_vec![0u8; 4], array_vec!([u8; 4] => 0, 0, 0, 0));
  16. assert_eq!(array_vec![0; 4], array_vec!(0, 0, 0, 0));
  17. assert_eq!(array_vec![0; 4], array_vec!([u8; 4] => 0, 0, 0, 0));
  18. let expected2 = array_vec![1.1; 3];
  19. let actual2 = array_vec!([f32; 3] => 1.1, 1.1, 1.1);
  20. assert_eq!(expected2, actual2);
  21. }
  22. #[test]
  23. fn ArrayVec_push_pop() {
  24. let mut av: ArrayVec<[i32; 4]> = Default::default();
  25. assert_eq!(av.len(), 0);
  26. assert_eq!(av.pop(), None);
  27. av.push(10_i32);
  28. assert_eq!(av.len(), 1);
  29. assert_eq!(av[0], 10);
  30. assert_eq!(av.pop(), Some(10));
  31. assert_eq!(av.len(), 0);
  32. assert_eq!(av.pop(), None);
  33. av.push(10);
  34. av.push(11);
  35. av.push(12);
  36. av.push(13);
  37. assert_eq!(av[0], 10);
  38. assert_eq!(av[1], 11);
  39. assert_eq!(av[2], 12);
  40. assert_eq!(av[3], 13);
  41. assert_eq!(av.len(), 4);
  42. assert_eq!(av.pop(), Some(13));
  43. assert_eq!(av.len(), 3);
  44. assert_eq!(av.pop(), Some(12));
  45. assert_eq!(av.len(), 2);
  46. assert_eq!(av.pop(), Some(11));
  47. assert_eq!(av.len(), 1);
  48. assert_eq!(av.pop(), Some(10));
  49. assert_eq!(av.len(), 0);
  50. assert_eq!(av.pop(), None);
  51. }
  52. #[test]
  53. #[should_panic]
  54. fn ArrayVec_push_overflow() {
  55. let mut av: ArrayVec<[i32; 0]> = Default::default();
  56. av.push(7);
  57. }
  58. #[test]
  59. fn ArrayVec_formatting() {
  60. // check that we get the comma placement correct
  61. let mut av: ArrayVec<[i32; 4]> = Default::default();
  62. assert_eq!(format!("{:?}", av), "[]");
  63. av.push(10);
  64. assert_eq!(format!("{:?}", av), "[10]");
  65. av.push(11);
  66. assert_eq!(format!("{:?}", av), "[10, 11]");
  67. av.push(12);
  68. assert_eq!(format!("{:?}", av), "[10, 11, 12]");
  69. // below here just asserts that the impls exist.
  70. //
  71. let av: ArrayVec<[i32; 4]> = Default::default();
  72. assert_eq!(format!("{:b}", av), "[]");
  73. assert_eq!(format!("{:o}", av), "[]");
  74. assert_eq!(format!("{:x}", av), "[]");
  75. assert_eq!(format!("{:X}", av), "[]");
  76. assert_eq!(format!("{}", av), "[]");
  77. //
  78. let av: ArrayVec<[f32; 4]> = Default::default();
  79. assert_eq!(format!("{:e}", av), "[]");
  80. assert_eq!(format!("{:E}", av), "[]");
  81. //
  82. let av: ArrayVec<[&'static str; 4]> = Default::default();
  83. assert_eq!(format!("{:p}", av), "[]");
  84. }
  85. #[test]
  86. fn ArrayVec_iteration() {
  87. let av = array_vec!([i32; 4] => 10, 11, 12, 13);
  88. let mut i = av.into_iter();
  89. assert_eq!(i.next(), Some(10));
  90. assert_eq!(i.next(), Some(11));
  91. assert_eq!(i.next(), Some(12));
  92. assert_eq!(i.next(), Some(13));
  93. assert_eq!(i.next(), None);
  94. let av = array_vec!([i32; 4] => 10, 11, 12, 13);
  95. let mut av2: ArrayVec<[i32; 4]> = av.clone().into_iter().collect();
  96. assert_eq!(av, av2);
  97. // IntoIterator for &mut ArrayVec
  98. for x in &mut av2 {
  99. *x = -*x;
  100. }
  101. // IntoIterator for &ArrayVec
  102. assert!(av.iter().zip(&av2).all(|(&a, &b)| a == -b));
  103. }
  104. #[test]
  105. fn ArrayVec_append() {
  106. let mut av = array_vec!([i32; 8] => 1, 2, 3);
  107. let mut av2 = array_vec!([i32; 8] => 4, 5, 6);
  108. //
  109. av.append(&mut av2);
  110. assert_eq!(av.as_slice(), &[1_i32, 2, 3, 4, 5, 6]);
  111. assert_eq!(av2.as_slice(), &[]);
  112. }
  113. #[test]
  114. fn ArrayVec_remove() {
  115. let mut av: ArrayVec<[i32; 10]> = Default::default();
  116. av.push(1);
  117. av.push(2);
  118. av.push(3);
  119. assert_eq!(av.remove(1), 2);
  120. assert_eq!(&av[..], &[1, 3][..]);
  121. }
  122. #[test]
  123. #[should_panic]
  124. fn ArrayVec_remove_invalid() {
  125. let mut av: ArrayVec<[i32; 1]> = Default::default();
  126. av.push(1);
  127. av.remove(1);
  128. }
  129. #[test]
  130. fn ArrayVec_swap_remove() {
  131. let mut av: ArrayVec<[i32; 10]> = Default::default();
  132. av.push(1);
  133. av.push(2);
  134. av.push(3);
  135. av.push(4);
  136. assert_eq!(av.swap_remove(3), 4);
  137. assert_eq!(&av[..], &[1, 2, 3][..]);
  138. assert_eq!(av.swap_remove(0), 1);
  139. assert_eq!(&av[..], &[3, 2][..]);
  140. assert_eq!(av.swap_remove(0), 3);
  141. assert_eq!(&av[..], &[2][..]);
  142. assert_eq!(av.swap_remove(0), 2);
  143. assert_eq!(&av[..], &[][..]);
  144. }
  145. #[test]
  146. fn ArrayVec_drain() {
  147. let mut av: ArrayVec<[i32; 10]> = Default::default();
  148. av.push(1);
  149. av.push(2);
  150. av.push(3);
  151. assert_eq!(Vec::from_iter(av.clone().drain(..)), vec![1, 2, 3]);
  152. assert_eq!(Vec::from_iter(av.clone().drain(..2)), vec![1, 2]);
  153. assert_eq!(Vec::from_iter(av.clone().drain(..3)), vec![1, 2, 3]);
  154. assert_eq!(Vec::from_iter(av.clone().drain(..=1)), vec![1, 2]);
  155. assert_eq!(Vec::from_iter(av.clone().drain(..=2)), vec![1, 2, 3]);
  156. assert_eq!(Vec::from_iter(av.clone().drain(0..)), vec![1, 2, 3]);
  157. assert_eq!(Vec::from_iter(av.clone().drain(1..)), vec![2, 3]);
  158. assert_eq!(Vec::from_iter(av.clone().drain(0..2)), vec![1, 2]);
  159. assert_eq!(Vec::from_iter(av.clone().drain(0..3)), vec![1, 2, 3]);
  160. assert_eq!(Vec::from_iter(av.clone().drain(1..2)), vec![2]);
  161. assert_eq!(Vec::from_iter(av.clone().drain(1..3)), vec![2, 3]);
  162. assert_eq!(Vec::from_iter(av.clone().drain(0..=1)), vec![1, 2]);
  163. assert_eq!(Vec::from_iter(av.clone().drain(0..=2)), vec![1, 2, 3]);
  164. assert_eq!(Vec::from_iter(av.clone().drain(1..=1)), vec![2]);
  165. assert_eq!(Vec::from_iter(av.clone().drain(1..=2)), vec![2, 3]);
  166. }
  167. #[test]
  168. fn ArrayVec_splice() {
  169. let mut av: ArrayVec<[i32; 10]> = Default::default();
  170. av.push(1);
  171. av.push(2);
  172. av.push(3);
  173. // splice returns the same things as drain
  174. assert_eq!(Vec::from_iter(av.clone().splice(.., None)), vec![1, 2, 3]);
  175. assert_eq!(Vec::from_iter(av.clone().splice(..2, None)), vec![1, 2]);
  176. assert_eq!(Vec::from_iter(av.clone().splice(..3, None)), vec![1, 2, 3]);
  177. assert_eq!(Vec::from_iter(av.clone().splice(..=1, None)), vec![1, 2]);
  178. assert_eq!(Vec::from_iter(av.clone().splice(..=2, None)), vec![1, 2, 3]);
  179. assert_eq!(Vec::from_iter(av.clone().splice(0.., None)), vec![1, 2, 3]);
  180. assert_eq!(Vec::from_iter(av.clone().splice(1.., None)), vec![2, 3]);
  181. assert_eq!(Vec::from_iter(av.clone().splice(0..2, None)), vec![1, 2]);
  182. assert_eq!(Vec::from_iter(av.clone().splice(0..3, None)), vec![1, 2, 3]);
  183. assert_eq!(Vec::from_iter(av.clone().splice(1..2, None)), vec![2]);
  184. assert_eq!(Vec::from_iter(av.clone().splice(1..3, None)), vec![2, 3]);
  185. assert_eq!(Vec::from_iter(av.clone().splice(0..=1, None)), vec![1, 2]);
  186. assert_eq!(Vec::from_iter(av.clone().splice(0..=2, None)), vec![1, 2, 3]);
  187. assert_eq!(Vec::from_iter(av.clone().splice(1..=1, None)), vec![2]);
  188. assert_eq!(Vec::from_iter(av.clone().splice(1..=2, None)), vec![2, 3]);
  189. // splice removes the same things as drain
  190. let mut av2 = av.clone();
  191. av2.splice(.., None);
  192. assert_eq!(av2, array_vec![]);
  193. let mut av2 = av.clone();
  194. av2.splice(..2, None);
  195. assert_eq!(av2, array_vec![3]);
  196. let mut av2 = av.clone();
  197. av2.splice(..3, None);
  198. assert_eq!(av2, array_vec![]);
  199. let mut av2 = av.clone();
  200. av2.splice(..=1, None);
  201. assert_eq!(av2, array_vec![3]);
  202. let mut av2 = av.clone();
  203. av2.splice(..=2, None);
  204. assert_eq!(av2, array_vec![]);
  205. let mut av2 = av.clone();
  206. av2.splice(0.., None);
  207. assert_eq!(av2, array_vec![]);
  208. let mut av2 = av.clone();
  209. av2.splice(1.., None);
  210. assert_eq!(av2, array_vec![1]);
  211. let mut av2 = av.clone();
  212. av2.splice(0..2, None);
  213. assert_eq!(av2, array_vec![3]);
  214. let mut av2 = av.clone();
  215. av2.splice(0..3, None);
  216. assert_eq!(av2, array_vec![]);
  217. let mut av2 = av.clone();
  218. av2.splice(1..2, None);
  219. assert_eq!(av2, array_vec![1, 3]);
  220. let mut av2 = av.clone();
  221. av2.splice(1..3, None);
  222. assert_eq!(av2, array_vec![1]);
  223. let mut av2 = av.clone();
  224. av2.splice(0..=1, None);
  225. assert_eq!(av2, array_vec![3]);
  226. let mut av2 = av.clone();
  227. av2.splice(0..=2, None);
  228. assert_eq!(av2, array_vec![]);
  229. let mut av2 = av.clone();
  230. av2.splice(1..=1, None);
  231. assert_eq!(av2, array_vec![1, 3]);
  232. let mut av2 = av.clone();
  233. av2.splice(1..=2, None);
  234. assert_eq!(av2, array_vec![1]);
  235. // splice adds the elements correctly
  236. let mut av2 = av.clone();
  237. av2.splice(.., 4..=6);
  238. assert_eq!(av2, array_vec![4, 5, 6]);
  239. let mut av2 = av.clone();
  240. av2.splice(..2, 4..=6);
  241. assert_eq!(av2, array_vec![4, 5, 6, 3]);
  242. let mut av2 = av.clone();
  243. av2.splice(..3, 4..=6);
  244. assert_eq!(av2, array_vec![4, 5, 6]);
  245. let mut av2 = av.clone();
  246. av2.splice(..=1, 4..=6);
  247. assert_eq!(av2, array_vec![4, 5, 6, 3]);
  248. let mut av2 = av.clone();
  249. av2.splice(..=2, 4..=6);
  250. assert_eq!(av2, array_vec![4, 5, 6]);
  251. let mut av2 = av.clone();
  252. av2.splice(0.., 4..=6);
  253. assert_eq!(av2, array_vec![4, 5, 6]);
  254. let mut av2 = av.clone();
  255. av2.splice(1.., 4..=6);
  256. assert_eq!(av2, array_vec![1, 4, 5, 6]);
  257. let mut av2 = av.clone();
  258. av2.splice(0..2, 4..=6);
  259. assert_eq!(av2, array_vec![4, 5, 6, 3]);
  260. let mut av2 = av.clone();
  261. av2.splice(0..3, 4..=6);
  262. assert_eq!(av2, array_vec![4, 5, 6]);
  263. let mut av2 = av.clone();
  264. av2.splice(1..2, 4..=6);
  265. assert_eq!(av2, array_vec![1, 4, 5, 6, 3]);
  266. let mut av2 = av.clone();
  267. av2.splice(1..3, 4..=6);
  268. assert_eq!(av2, array_vec![1, 4, 5, 6]);
  269. let mut av2 = av.clone();
  270. av2.splice(0..=1, 4..=6);
  271. assert_eq!(av2, array_vec![4, 5, 6, 3]);
  272. let mut av2 = av.clone();
  273. av2.splice(0..=2, 4..=6);
  274. assert_eq!(av2, array_vec![4, 5, 6]);
  275. let mut av2 = av.clone();
  276. av2.splice(1..=1, 4..=6);
  277. assert_eq!(av2, array_vec![1, 4, 5, 6, 3]);
  278. let mut av2 = av.clone();
  279. av2.splice(1..=2, 4..=6);
  280. assert_eq!(av2, array_vec![1, 4, 5, 6]);
  281. // splice adds the elements correctly when the replacement is smaller
  282. let mut av2 = av.clone();
  283. av2.splice(.., Some(4));
  284. assert_eq!(av2, array_vec![4]);
  285. let mut av2 = av.clone();
  286. av2.splice(..2, Some(4));
  287. assert_eq!(av2, array_vec![4, 3]);
  288. let mut av2 = av.clone();
  289. av2.splice(1.., Some(4));
  290. assert_eq!(av2, array_vec![1, 4]);
  291. let mut av2 = av.clone();
  292. av2.splice(1..=1, Some(4));
  293. assert_eq!(av2, array_vec![1, 4, 3]);
  294. }
  295. #[test]
  296. fn iter_last_nth() {
  297. let mut av: ArrayVec<[i32; 10]> = Default::default();
  298. av.push(1);
  299. av.push(2);
  300. av.push(3);
  301. av.push(4);
  302. assert_eq!(av.len(), 4);
  303. let mut iter = av.into_iter();
  304. assert_eq!(iter.next(), Some(1));
  305. assert_eq!(iter.next(), Some(2));
  306. assert_eq!(iter.next(), Some(3));
  307. assert_eq!(iter.next(), Some(4));
  308. assert_eq!(iter.next(), None);
  309. assert_eq!(iter.last(), None);
  310. let mut av: ArrayVec<[i32; 10]> = Default::default();
  311. av.push(1);
  312. av.push(2);
  313. av.push(3);
  314. assert_eq!(av.into_iter().nth(0), Some(1));
  315. }
  316. #[test]
  317. #[cfg(feature = "rustc_1_40")]
  318. fn reviter() {
  319. let mut av: ArrayVec<[i32; 10]> = Default::default();
  320. av.push(1);
  321. av.push(2);
  322. av.push(3);
  323. av.push(4);
  324. let mut iter = av.into_iter();
  325. assert_eq!(iter.next(), Some(1));
  326. assert_eq!(iter.next_back(), Some(4));
  327. assert_eq!(iter.next(), Some(2));
  328. assert_eq!(iter.next_back(), Some(3));
  329. assert_eq!(iter.next(), None);
  330. assert_eq!(iter.next_back(), None);
  331. let mut av: ArrayVec<[i32; 32]> = Default::default();
  332. av.extend(0..32);
  333. let mut iter = av.into_iter();
  334. assert_eq!(iter.nth_back(0), Some(31));
  335. assert_eq!(iter.nth_back(2), Some(28));
  336. assert_eq!(iter.nth_back(0), Some(27));
  337. assert_eq!(iter.nth_back(99), None);
  338. assert_eq!(iter.nth_back(99), None);
  339. }
  340. #[cfg(feature = "serde")]
  341. #[test]
  342. fn ArrayVec_ser_de_empty() {
  343. let tv: ArrayVec<[i32; 0]> = Default::default();
  344. assert_tokens(&tv, &[Token::Seq { len: Some(0) }, Token::SeqEnd]);
  345. }
  346. #[cfg(feature = "serde")]
  347. #[test]
  348. fn ArrayVec_ser_de() {
  349. let mut tv: ArrayVec<[i32; 4]> = Default::default();
  350. tv.push(1);
  351. tv.push(2);
  352. tv.push(3);
  353. tv.push(4);
  354. assert_tokens(
  355. &tv,
  356. &[
  357. Token::Seq { len: Some(4) },
  358. Token::I32(1),
  359. Token::I32(2),
  360. Token::I32(3),
  361. Token::I32(4),
  362. Token::SeqEnd,
  363. ],
  364. );
  365. }
  366. #[test]
  367. fn ArrayVec_try_from_slice() {
  368. use std::convert::TryFrom;
  369. let nums = [1, 2, 3, 4];
  370. let empty: Result<ArrayVec<[i32; 2]>, _> = ArrayVec::try_from(&nums[..0]);
  371. assert!(empty.is_ok());
  372. assert_eq!(empty.unwrap().as_slice(), &[]);
  373. let fits: Result<ArrayVec<[i32; 2]>, _> = ArrayVec::try_from(&nums[..2]);
  374. assert!(fits.is_ok());
  375. assert_eq!(fits.unwrap().as_slice(), &[1, 2]);
  376. let doesnt_fit: Result<ArrayVec<[i32; 2]>, _> =
  377. ArrayVec::try_from(&nums[..4]);
  378. assert!(doesnt_fit.is_err());
  379. }
  380. #[test]
  381. fn ArrayVec_pretty_debug() {
  382. let arr: [i32; 3] = [1, 2, 3];
  383. let expect = format!("{:#?}", arr);
  384. let arr: ArrayVec<[i32; 3]> = array_vec![1, 2, 3];
  385. let got = format!("{:#?}", arr);
  386. assert_eq!(got, expect);
  387. }