// Copyright © 2024 Mikhail Hogrefe // // This file is part of Malachite. // // Malachite is free software: you can redistribute it and/or modify it under the terms of the GNU // Lesser General Public License (LGPL) as published by the Free Software Foundation; either version // 3 of the License, or (at your option) any later version. See . use malachite_base::num::basic::integers::PrimitiveInt; use malachite_base::slices::slice_set_zero; use malachite_base::test_util::generators::common::GenConfig; use malachite_base::test_util::generators::unsigned_vec_unsigned_unsigned_triple_gen_var_2; #[test] fn test_split_into_chunks() { let xs = &[0, 1, 2, 3, 4, 5, 6, 7]; split_into_chunks!(xs, 3, [xs_1, xs_2], xs_3); assert_eq!(xs_1, &[0, 1, 2]); assert_eq!(xs_2, &[3, 4, 5]); assert_eq!(xs_3, &[6, 7]); split_into_chunks!(xs, 3, [xs_1], xs_2); assert_eq!(xs_1, &[0, 1, 2]); assert_eq!(xs_2, &[3, 4, 5, 6, 7]); split_into_chunks!(xs, 1, [xs_1, xs_2], xs_3); assert_eq!(xs_1, &[0]); assert_eq!(xs_2, &[1]); assert_eq!(xs_3, &[2, 3, 4, 5, 6, 7]); split_into_chunks!(xs, 0, [xs_1, xs_2], xs_3); assert_eq!(xs_1, &[]); assert_eq!(xs_2, &[]); assert_eq!(xs_3, &[0, 1, 2, 3, 4, 5, 6, 7]); split_into_chunks!(xs, 5, [], xs_1); assert_eq!(xs_1, &[0, 1, 2, 3, 4, 5, 6, 7]); } #[test] #[should_panic] fn split_into_chunks_fail() { let xs = &[0, 1, 2, 3, 4, 5, 6, 7]; split_into_chunks!(xs, 5, [_xs_1, _xs_2], _xs_3); } #[test] fn test_split_into_chunks_mut() { let xs = &mut [0, 1, 2, 3, 4, 5, 6, 7]; split_into_chunks_mut!(xs, 3, [xs_1, xs_2], xs_3); assert_eq!(xs_1, &[0, 1, 2]); assert_eq!(xs_2, &[3, 4, 5]); assert_eq!(xs_3, &[6, 7]); split_into_chunks_mut!(xs, 3, [xs_1], xs_2); assert_eq!(xs_1, &[0, 1, 2]); assert_eq!(xs_2, &[3, 4, 5, 6, 7]); split_into_chunks_mut!(xs, 1, [xs_1, xs_2], xs_3); assert_eq!(xs_1, &[0]); assert_eq!(xs_2, &[1]); assert_eq!(xs_3, &[2, 3, 4, 5, 6, 7]); split_into_chunks_mut!(xs, 0, [xs_1, xs_2], xs_3); assert_eq!(xs_1, &[]); assert_eq!(xs_2, &[]); assert_eq!(xs_3, &[0, 1, 2, 3, 4, 5, 6, 7]); split_into_chunks_mut!(xs, 5, [], xs_1); assert_eq!(xs_1, &[0, 1, 2, 3, 4, 5, 6, 7]); split_into_chunks_mut!(xs, 3, [_xs_1, xs_2], _xs_3); slice_set_zero(xs_2); assert_eq!(xs, &[0, 1, 2, 0, 0, 0, 6, 7]); } #[test] #[should_panic] fn split_into_chunks_mut_fail() { let xs = &mut [0, 1, 2, 3, 4, 5, 6, 7]; split_into_chunks_mut!(xs, 5, [_xs_1, _xs_2], _xs_3); } macro_rules! split_into_chunks_helper { ($xs: expr, $len: expr, $n: expr, [$($xs_i: ident),*], $xs_last: ident) => {{ split_into_chunks!($xs, $len, [$($xs_i),*], $xs_last); $( assert_eq!($xs_i.len(), $len); )* assert_eq!($xs_last.len(), $xs.len() - ($n - 1) * $len); let mut xs_alt = Vec::with_capacity($xs.len()); $( xs_alt.extend($xs_i.iter().cloned()); )* xs_alt.extend($xs_last.iter().cloned()); assert_eq!(xs_alt, $xs); }} } #[test] fn split_into_chunks_properties() { let mut config = GenConfig::new(); config.insert("small_unsigned_mean_n", 8); config.insert("small_unsigned_mean_d", 1); config.insert("mean_stripe_n", u8::WIDTH << 1); config.insert("mean_stripe_d", 1); unsigned_vec_unsigned_unsigned_triple_gen_var_2::().test_properties_with_config( &config, |(xs, len, n)| match n { 0 => split_into_chunks_helper!(xs, len, 1, [], xs_1), 1 => split_into_chunks_helper!(xs, len, 2, [xs_1], xs_2), 2 => split_into_chunks_helper!(xs, len, 3, [xs_1, xs_2], xs_3), 3 => { split_into_chunks_helper!(xs, len, 4, [xs_1, xs_2, xs_3], xs_4); } 4 => { split_into_chunks_helper!(xs, len, 5, [xs_1, xs_2, xs_3, xs_4], xs_5); } 5 => split_into_chunks_helper!(xs, len, 6, [xs_1, xs_2, xs_3, xs_4, xs_5], xs_6), 6 => split_into_chunks_helper!(xs, len, 7, [xs_1, xs_2, xs_3, xs_4, xs_5, xs_6], xs_7), 7 => split_into_chunks_helper!( xs, len, 8, [xs_1, xs_2, xs_3, xs_4, xs_5, xs_6, xs_7], xs_8 ), _ => {} }, ); } macro_rules! split_into_chunks_mut_helper { ($xs: expr, $len: expr, $n: expr, [$($xs_i: ident),*], $xs_last: ident) => {{ let xs_len = $xs.len(); split_into_chunks_mut!($xs, $len, [$($xs_i),*], $xs_last); $( assert_eq!($xs_i.len(), $len); )* assert_eq!($xs_last.len(), xs_len - ($n - 1) * $len); let mut xs_alt = Vec::with_capacity(xs_len); $( xs_alt.extend($xs_i.iter().cloned()); )* xs_alt.extend($xs_last.iter().cloned()); assert_eq!(xs_alt, $xs); }} } #[test] fn split_into_chunks_mut_properties() { let mut config = GenConfig::new(); config.insert("small_unsigned_mean_n", 8); config.insert("small_unsigned_mean_d", 1); config.insert("mean_stripe_n", u8::WIDTH << 1); config.insert("mean_stripe_d", 1); unsigned_vec_unsigned_unsigned_triple_gen_var_2::().test_properties_with_config( &config, |(mut xs, len, n)| match n { 0 => split_into_chunks_mut_helper!(xs, len, 1, [], xs_1), 1 => split_into_chunks_mut_helper!(xs, len, 2, [xs_1], xs_2), 2 => split_into_chunks_mut_helper!(xs, len, 3, [xs_1, xs_2], xs_3), 3 => { split_into_chunks_mut_helper!(xs, len, 4, [xs_1, xs_2, xs_3], xs_4); } 4 => { split_into_chunks_mut_helper!(xs, len, 5, [xs_1, xs_2, xs_3, xs_4], xs_5); } 5 => split_into_chunks_mut_helper!(xs, len, 6, [xs_1, xs_2, xs_3, xs_4, xs_5], xs_6), 6 => { split_into_chunks_mut_helper!( xs, len, 7, [xs_1, xs_2, xs_3, xs_4, xs_5, xs_6], xs_7 ); } 7 => split_into_chunks_mut_helper!( xs, len, 8, [xs_1, xs_2, xs_3, xs_4, xs_5, xs_6, xs_7], xs_8 ), _ => {} }, ); }