iter.rs 4.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199
  1. #[macro_use]
  2. extern crate generic_array;
  3. use std::cell::Cell;
  4. use std::ops::Drop;
  5. use generic_array::typenum::consts::U5;
  6. use generic_array::GenericArray;
  7. #[test]
  8. fn test_from_iterator() {
  9. struct BadExact(usize);
  10. impl Iterator for BadExact {
  11. type Item = usize;
  12. fn next(&mut self) -> Option<usize> {
  13. if self.0 == 1 {
  14. return None;
  15. }
  16. self.0 -= 1;
  17. Some(self.0)
  18. }
  19. }
  20. impl ExactSizeIterator for BadExact {
  21. fn len(&self) -> usize { self.0 }
  22. }
  23. assert!(GenericArray::<usize, U5>::from_exact_iter(BadExact(5)).is_none());
  24. }
  25. #[test]
  26. fn test_into_iter_as_slice() {
  27. let array = arr![char; 'a', 'b', 'c'];
  28. let mut into_iter = array.into_iter();
  29. assert_eq!(into_iter.as_slice(), &['a', 'b', 'c']);
  30. let _ = into_iter.next().unwrap();
  31. assert_eq!(into_iter.as_slice(), &['b', 'c']);
  32. let _ = into_iter.next().unwrap();
  33. let _ = into_iter.next().unwrap();
  34. assert_eq!(into_iter.as_slice(), &[]);
  35. }
  36. #[test]
  37. fn test_into_iter_as_mut_slice() {
  38. let array = arr![char; 'a', 'b', 'c'];
  39. let mut into_iter = array.into_iter();
  40. assert_eq!(into_iter.as_slice(), &['a', 'b', 'c']);
  41. into_iter.as_mut_slice()[0] = 'x';
  42. into_iter.as_mut_slice()[1] = 'y';
  43. assert_eq!(into_iter.next().unwrap(), 'x');
  44. assert_eq!(into_iter.as_slice(), &['y', 'c']);
  45. }
  46. #[test]
  47. fn test_into_iter_debug() {
  48. let array = arr![char; 'a', 'b', 'c'];
  49. let into_iter = array.into_iter();
  50. let debug = format!("{:?}", into_iter);
  51. assert_eq!(debug, "GenericArrayIter(['a', 'b', 'c'])");
  52. }
  53. #[test]
  54. fn test_into_iter_clone() {
  55. fn iter_equal<I: Iterator<Item = i32>>(it: I, slice: &[i32]) {
  56. let v: Vec<i32> = it.collect();
  57. assert_eq!(&v[..], slice);
  58. }
  59. let mut it = arr![i32; 1, 2, 3].into_iter();
  60. iter_equal(it.clone(), &[1, 2, 3]);
  61. assert_eq!(it.next(), Some(1));
  62. let mut it = it.rev();
  63. iter_equal(it.clone(), &[3, 2]);
  64. assert_eq!(it.next(), Some(3));
  65. iter_equal(it.clone(), &[2]);
  66. assert_eq!(it.next(), Some(2));
  67. iter_equal(it.clone(), &[]);
  68. assert_eq!(it.next(), None);
  69. }
  70. #[test]
  71. fn test_into_iter_nth() {
  72. let v = arr![i32; 0, 1, 2, 3, 4];
  73. for i in 0..v.len() {
  74. assert_eq!(v.clone().into_iter().nth(i).unwrap(), v[i]);
  75. }
  76. assert_eq!(v.clone().into_iter().nth(v.len()), None);
  77. let mut iter = v.into_iter();
  78. assert_eq!(iter.nth(2).unwrap(), v[2]);
  79. assert_eq!(iter.nth(1).unwrap(), v[4]);
  80. }
  81. #[test]
  82. fn test_into_iter_last() {
  83. let v = arr![i32; 0, 1, 2, 3, 4];
  84. assert_eq!(v.into_iter().last().unwrap(), 4);
  85. assert_eq!(arr![i32; 0].into_iter().last().unwrap(), 0);
  86. }
  87. #[test]
  88. fn test_into_iter_count() {
  89. let v = arr![i32; 0, 1, 2, 3, 4];
  90. assert_eq!(v.clone().into_iter().count(), 5);
  91. let mut iter2 = v.into_iter();
  92. iter2.next();
  93. iter2.next();
  94. assert_eq!(iter2.count(), 3);
  95. }
  96. #[test]
  97. fn test_into_iter_flat_map() {
  98. assert!((0..5).flat_map(|i| arr![i32; 2 * i, 2 * i + 1]).eq(0..10));
  99. }
  100. #[test]
  101. fn test_into_iter_fold() {
  102. assert_eq!(
  103. arr![i32; 1, 2, 3, 4].into_iter().fold(0, |sum, x| sum + x),
  104. 10
  105. );
  106. let mut iter = arr![i32; 0, 1, 2, 3, 4, 5].into_iter();
  107. iter.next();
  108. iter.next_back();
  109. assert_eq!(iter.clone().fold(0, |sum, x| sum + x), 10);
  110. assert_eq!(iter.rfold(0, |sum, x| sum + x), 10);
  111. }
  112. #[test]
  113. fn test_into_iter_drops() {
  114. struct R<'a> {
  115. i: &'a Cell<usize>,
  116. }
  117. impl<'a> Drop for R<'a> {
  118. fn drop(&mut self) {
  119. self.i.set(self.i.get() + 1);
  120. }
  121. }
  122. fn r(i: &Cell<usize>) -> R {
  123. R { i: i }
  124. }
  125. fn v(i: &Cell<usize>) -> GenericArray<R, U5> {
  126. arr![R; r(i), r(i), r(i), r(i), r(i)]
  127. }
  128. let i = Cell::new(0);
  129. {
  130. v(&i).into_iter();
  131. }
  132. assert_eq!(i.get(), 5);
  133. let i = Cell::new(0);
  134. {
  135. let mut iter = v(&i).into_iter();
  136. let _x = iter.next();
  137. assert_eq!(i.get(), 0);
  138. assert_eq!(iter.count(), 4);
  139. assert_eq!(i.get(), 4);
  140. }
  141. assert_eq!(i.get(), 5);
  142. let i = Cell::new(0);
  143. {
  144. let mut iter = v(&i).into_iter();
  145. let _x = iter.nth(2);
  146. assert_eq!(i.get(), 2);
  147. let _y = iter.last();
  148. assert_eq!(i.get(), 3);
  149. }
  150. assert_eq!(i.get(), 5);
  151. let i = Cell::new(0);
  152. for (index, _x) in v(&i).into_iter().enumerate() {
  153. assert_eq!(i.get(), index);
  154. }
  155. assert_eq!(i.get(), 5);
  156. let i = Cell::new(0);
  157. for (index, _x) in v(&i).into_iter().rev().enumerate() {
  158. assert_eq!(i.get(), index);
  159. }
  160. assert_eq!(i.get(), 5);
  161. }
  162. /*
  163. //TODO: Cover this
  164. #[allow(dead_code)]
  165. fn assert_covariance() {
  166. fn into_iter<'new>(i: GenericArrayIter<&'static str, U10>) -> GenericArrayIter<&'new str, U10> {
  167. i
  168. }
  169. }
  170. */