mod.rs 8.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379
  1. #![recursion_limit = "128"]
  2. #![no_std]
  3. #[macro_use]
  4. extern crate generic_array;
  5. use core::cell::Cell;
  6. use core::ops::{Add, Drop};
  7. use generic_array::functional::*;
  8. use generic_array::sequence::*;
  9. use generic_array::typenum::{U0, U3, U4, U97};
  10. use generic_array::GenericArray;
  11. #[test]
  12. fn test() {
  13. let mut list97 = [0; 97];
  14. for i in 0..97 {
  15. list97[i] = i as i32;
  16. }
  17. let l: GenericArray<i32, U97> = GenericArray::clone_from_slice(&list97);
  18. assert_eq!(l[0], 0);
  19. assert_eq!(l[1], 1);
  20. assert_eq!(l[32], 32);
  21. assert_eq!(l[56], 56);
  22. }
  23. #[test]
  24. fn test_drop() {
  25. #[derive(Clone)]
  26. struct TestDrop<'a>(&'a Cell<u32>);
  27. impl<'a> Drop for TestDrop<'a> {
  28. fn drop(&mut self) {
  29. self.0.set(self.0.get() + 1);
  30. }
  31. }
  32. let drop_counter = Cell::new(0);
  33. {
  34. let _: GenericArray<TestDrop, U3> = arr![TestDrop; TestDrop(&drop_counter),
  35. TestDrop(&drop_counter),
  36. TestDrop(&drop_counter)];
  37. }
  38. assert_eq!(drop_counter.get(), 3);
  39. }
  40. #[test]
  41. fn test_arr() {
  42. let test: GenericArray<u32, U3> = arr![u32; 1, 2, 3];
  43. assert_eq!(test[1], 2);
  44. }
  45. #[test]
  46. fn test_copy() {
  47. let test = arr![u32; 1, 2, 3];
  48. let test2 = test;
  49. // if GenericArray is not copy, this should fail as a use of a moved value
  50. assert_eq!(test[1], 2);
  51. assert_eq!(test2[0], 1);
  52. }
  53. #[derive(Debug, PartialEq, Eq)]
  54. struct NoClone<T>(T);
  55. #[test]
  56. fn test_from_slice() {
  57. let arr = [1, 2, 3, 4];
  58. let gen_arr = GenericArray::<_, U3>::from_slice(&arr[..3]);
  59. assert_eq!(&arr[..3], gen_arr.as_slice());
  60. let arr = [NoClone(1u32), NoClone(2), NoClone(3), NoClone(4)];
  61. let gen_arr = GenericArray::<_, U3>::from_slice(&arr[..3]);
  62. assert_eq!(&arr[..3], gen_arr.as_slice());
  63. }
  64. #[test]
  65. fn test_from_mut_slice() {
  66. let mut arr = [1, 2, 3, 4];
  67. {
  68. let gen_arr = GenericArray::<_, U3>::from_mut_slice(&mut arr[..3]);
  69. gen_arr[2] = 10;
  70. }
  71. assert_eq!(arr, [1, 2, 10, 4]);
  72. let mut arr = [NoClone(1u32), NoClone(2), NoClone(3), NoClone(4)];
  73. {
  74. let gen_arr = GenericArray::<_, U3>::from_mut_slice(&mut arr[..3]);
  75. gen_arr[2] = NoClone(10);
  76. }
  77. assert_eq!(arr, [NoClone(1), NoClone(2), NoClone(10), NoClone(4)]);
  78. }
  79. #[test]
  80. fn test_default() {
  81. let arr = GenericArray::<u8, U4>::default();
  82. assert_eq!(arr.as_slice(), &[0, 0, 0, 0]);
  83. }
  84. #[test]
  85. fn test_from() {
  86. let data = [(1, 2, 3), (4, 5, 6), (7, 8, 9)];
  87. let garray: GenericArray<(usize, usize, usize), U3> = data.into();
  88. assert_eq!(&data, garray.as_slice());
  89. }
  90. #[test]
  91. fn test_unit_macro() {
  92. let arr = arr![f32; 3.14];
  93. assert_eq!(arr[0], 3.14);
  94. }
  95. #[test]
  96. fn test_empty_macro() {
  97. let _arr = arr![f32;];
  98. }
  99. #[test]
  100. fn test_cmp() {
  101. let _ = arr![u8; 0x00].cmp(&arr![u8; 0x00]);
  102. }
  103. /// This test should cause a helpful compile error if uncommented.
  104. // #[test]
  105. // fn test_empty_macro2(){
  106. // let arr = arr![];
  107. // }
  108. #[cfg(feature = "serde")]
  109. mod impl_serde {
  110. extern crate serde_json;
  111. use generic_array::typenum::U6;
  112. use generic_array::GenericArray;
  113. #[test]
  114. fn test_serde_implementation() {
  115. let array: GenericArray<f64, U6> = arr![f64; 0.0, 5.0, 3.0, 7.07192, 76.0, -9.0];
  116. let string = serde_json::to_string(&array).unwrap();
  117. assert_eq!(string, "[0.0,5.0,3.0,7.07192,76.0,-9.0]");
  118. let test_array: GenericArray<f64, U6> = serde_json::from_str(&string).unwrap();
  119. assert_eq!(test_array, array);
  120. }
  121. }
  122. #[test]
  123. fn test_map() {
  124. let b: GenericArray<i32, U4> = GenericArray::generate(|i| i as i32 * 4).map(|x| x - 3);
  125. assert_eq!(b, arr![i32; -3, 1, 5, 9]);
  126. }
  127. #[test]
  128. fn test_zip() {
  129. let a: GenericArray<_, U4> = GenericArray::generate(|i| i + 1);
  130. let b: GenericArray<_, U4> = GenericArray::generate(|i| i as i32 * 4);
  131. // Uses reference and non-reference arguments
  132. let c = (&a).zip(b, |r, l| *r as i32 + l);
  133. assert_eq!(c, arr![i32; 1, 6, 11, 16]);
  134. }
  135. #[test]
  136. #[should_panic]
  137. fn test_from_iter_short() {
  138. use core::iter::repeat;
  139. let a: GenericArray<_, U4> = repeat(11).take(3).collect();
  140. assert_eq!(a, arr![i32; 11, 11, 11, 0]);
  141. }
  142. #[test]
  143. fn test_from_iter() {
  144. use core::iter::{once, repeat};
  145. let a: GenericArray<_, U4> = repeat(11).take(3).chain(once(0)).collect();
  146. assert_eq!(a, arr![i32; 11, 11, 11, 0]);
  147. }
  148. #[allow(unused)]
  149. #[derive(Debug, Copy, Clone)]
  150. enum E {
  151. V,
  152. V2(i32),
  153. V3 { h: bool, i: i32 },
  154. }
  155. #[allow(unused)]
  156. #[derive(Debug, Copy, Clone)]
  157. #[repr(C)]
  158. #[repr(packed)]
  159. struct Test {
  160. t: u16,
  161. s: u32,
  162. mm: bool,
  163. r: u16,
  164. f: u16,
  165. p: (),
  166. o: u32,
  167. ff: *const extern "C" fn(*const char) -> *const core::ffi::c_void,
  168. l: *const core::ffi::c_void,
  169. w: bool,
  170. q: bool,
  171. v: E,
  172. }
  173. #[test]
  174. fn test_sizes() {
  175. use core::mem::{size_of, size_of_val};
  176. assert_eq!(size_of::<E>(), 8);
  177. assert_eq!(size_of::<Test>(), 25 + size_of::<usize>() * 2);
  178. assert_eq!(size_of_val(&arr![u8; 1, 2, 3]), size_of::<u8>() * 3);
  179. assert_eq!(size_of_val(&arr![u32; 1]), size_of::<u32>() * 1);
  180. assert_eq!(size_of_val(&arr![u64; 1, 2, 3, 4]), size_of::<u64>() * 4);
  181. assert_eq!(size_of::<GenericArray<Test, U97>>(), size_of::<Test>() * 97);
  182. }
  183. #[test]
  184. fn test_alignment() {
  185. use core::mem::align_of;
  186. assert_eq!(align_of::<GenericArray::<u32, U0>>(), align_of::<[u32; 0]>());
  187. assert_eq!(align_of::<GenericArray::<u32, U3>>(), align_of::<[u32; 3]>());
  188. assert_eq!(align_of::<GenericArray::<Test, U3>>(), align_of::<[Test; 3]>());
  189. }
  190. #[test]
  191. fn test_append() {
  192. let a = arr![i32; 1, 2, 3];
  193. let b = a.append(4);
  194. assert_eq!(b, arr![i32; 1, 2, 3, 4]);
  195. }
  196. #[test]
  197. fn test_prepend() {
  198. let a = arr![i32; 1, 2, 3];
  199. let b = a.prepend(4);
  200. assert_eq!(b, arr![i32; 4, 1, 2, 3]);
  201. }
  202. #[test]
  203. fn test_pop() {
  204. let a = arr![i32; 1, 2, 3, 4];
  205. let (init, last) = a.pop_back();
  206. assert_eq!(init, arr![i32; 1, 2, 3]);
  207. assert_eq!(last, 4);
  208. let (head, tail) = a.pop_front();
  209. assert_eq!(head, 1);
  210. assert_eq!(tail, arr![i32; 2, 3, 4]);
  211. }
  212. #[test]
  213. fn test_split() {
  214. let a = arr![i32; 1, 2, 3, 4];
  215. let (b, c) = a.split();
  216. assert_eq!(b, arr![i32; 1]);
  217. assert_eq!(c, arr![i32; 2, 3, 4]);
  218. let (e, f) = a.split();
  219. assert_eq!(e, arr![i32; 1, 2]);
  220. assert_eq!(f, arr![i32; 3, 4]);
  221. }
  222. #[test]
  223. fn test_split_ref() {
  224. let a = arr![i32; 1, 2, 3, 4];
  225. let a_ref = &a;
  226. let (b_ref, c_ref) = a_ref.split();
  227. assert_eq!(b_ref, &arr![i32; 1]);
  228. assert_eq!(c_ref, &arr![i32; 2, 3, 4]);
  229. let (e_ref, f_ref) = a_ref.split();
  230. assert_eq!(e_ref, &arr![i32; 1, 2]);
  231. assert_eq!(f_ref, &arr![i32; 3, 4]);
  232. }
  233. #[test]
  234. fn test_split_mut() {
  235. let mut a = arr![i32; 1, 2, 3, 4];
  236. let a_ref = &mut a;
  237. let (b_ref, c_ref) = a_ref.split();
  238. assert_eq!(b_ref, &mut arr![i32; 1]);
  239. assert_eq!(c_ref, &mut arr![i32; 2, 3, 4]);
  240. let (e_ref, f_ref) = a_ref.split();
  241. assert_eq!(e_ref, &mut arr![i32; 1, 2]);
  242. assert_eq!(f_ref, &mut arr![i32; 3, 4]);
  243. }
  244. #[test]
  245. fn test_concat() {
  246. let a = arr![i32; 1, 2];
  247. let b = arr![i32; 3, 4, 5];
  248. let c = a.concat(b);
  249. assert_eq!(c, arr![i32; 1, 2, 3, 4, 5]);
  250. let (d, e) = c.split();
  251. assert_eq!(d, arr![i32; 1, 2]);
  252. assert_eq!(e, arr![i32; 3, 4, 5]);
  253. }
  254. #[test]
  255. fn test_fold() {
  256. let a = arr![i32; 1, 2, 3, 4];
  257. assert_eq!(10, a.fold(0, |a, x| a + x));
  258. }
  259. fn sum_generic<S>(s: S) -> i32
  260. where
  261. S: FunctionalSequence<i32>,
  262. S::Item: Add<i32, Output = i32>, // `+`
  263. i32: Add<S::Item, Output = i32>, // reflexive
  264. {
  265. s.fold(0, |a, x| a + x)
  266. }
  267. #[test]
  268. fn test_sum() {
  269. let a = sum_generic(arr![i32; 1, 2, 3, 4]);
  270. assert_eq!(a, 10);
  271. }
  272. #[test]
  273. fn test_as_ref() {
  274. let a = arr![i32; 1, 2, 3, 4];
  275. let a_ref: &[i32; 4] = a.as_ref();
  276. assert_eq!(a_ref, &[1, 2, 3, 4]);
  277. }
  278. #[test]
  279. fn test_as_mut() {
  280. let mut a = arr![i32; 1, 2, 3, 4];
  281. let a_mut: &mut [i32; 4] = a.as_mut();
  282. assert_eq!(a_mut, &mut [1, 2, 3, 4]);
  283. a_mut[2] = 0;
  284. assert_eq!(a_mut, &mut [1, 2, 0, 4]);
  285. assert_eq!(a, arr![i32; 1, 2, 0, 4]);
  286. }
  287. #[test]
  288. fn test_from_array_ref() {
  289. let a = arr![i32; 1, 2, 3, 4];
  290. let a_ref: &[i32; 4] = a.as_ref();
  291. let a_from: &GenericArray<i32, U4> = a_ref.into();
  292. assert_eq!(&a, a_from);
  293. }
  294. #[test]
  295. fn test_from_array_mut() {
  296. let mut a = arr![i32; 1, 2, 3, 4];
  297. let mut a_copy = a;
  298. let a_mut: &mut [i32; 4] = a.as_mut();
  299. let a_from: &mut GenericArray<i32, U4> = a_mut.into();
  300. assert_eq!(&mut a_copy, a_from);
  301. }