// 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 itertools::Itertools;
use malachite_base::num::arithmetic::traits::Factorial;
use malachite_base::num::conversion::traits::WrappingFrom;
use malachite_base::slices::exhaustive_slice_permutations;
fn exhaustive_slice_permutations_helper(cs: &str, out: &[&str]) {
let cs = cs.chars().collect_vec();
let css: Vec = exhaustive_slice_permutations(&cs)
.map(|ds| ds.into_iter().copied().collect())
.collect();
assert_eq!(css.len(), usize::factorial(u64::wrapping_from(cs.len())));
assert_eq!(css.iter().map(String::as_str).collect_vec().as_slice(), out);
}
#[test]
fn test_exhaustive_slice_permutations() {
exhaustive_slice_permutations_helper("", &[""]);
exhaustive_slice_permutations_helper("1", &["1"]);
exhaustive_slice_permutations_helper("12", &["12", "21"]);
exhaustive_slice_permutations_helper("123", &["123", "132", "213", "231", "312", "321"]);
exhaustive_slice_permutations_helper(
"1234",
&[
"1234", "1243", "1324", "1342", "1423", "1432", "2134", "2143", "2314", "2341", "2413",
"2431", "3124", "3142", "3214", "3241", "3412", "3421", "4123", "4132", "4213", "4231",
"4312", "4321",
],
);
exhaustive_slice_permutations_helper(
"12345",
&[
"12345", "12354", "12435", "12453", "12534", "12543", "13245", "13254", "13425",
"13452", "13524", "13542", "14235", "14253", "14325", "14352", "14523", "14532",
"15234", "15243", "15324", "15342", "15423", "15432", "21345", "21354", "21435",
"21453", "21534", "21543", "23145", "23154", "23415", "23451", "23514", "23541",
"24135", "24153", "24315", "24351", "24513", "24531", "25134", "25143", "25314",
"25341", "25413", "25431", "31245", "31254", "31425", "31452", "31524", "31542",
"32145", "32154", "32415", "32451", "32514", "32541", "34125", "34152", "34215",
"34251", "34512", "34521", "35124", "35142", "35214", "35241", "35412", "35421",
"41235", "41253", "41325", "41352", "41523", "41532", "42135", "42153", "42315",
"42351", "42513", "42531", "43125", "43152", "43215", "43251", "43512", "43521",
"45123", "45132", "45213", "45231", "45312", "45321", "51234", "51243", "51324",
"51342", "51423", "51432", "52134", "52143", "52314", "52341", "52413", "52431",
"53124", "53142", "53214", "53241", "53412", "53421", "54123", "54132", "54213",
"54231", "54312", "54321",
],
);
exhaustive_slice_permutations_helper(
"abcd",
&[
"abcd", "abdc", "acbd", "acdb", "adbc", "adcb", "bacd", "badc", "bcad", "bcda", "bdac",
"bdca", "cabd", "cadb", "cbad", "cbda", "cdab", "cdba", "dabc", "dacb", "dbac", "dbca",
"dcab", "dcba",
],
);
}