// 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::strings::exhaustive::exhaustive_fixed_length_strings_using_chars;
use std::iter::{empty, once};
fn exhaustive_fixed_length_strings_using_chars_helper>(
len: u64,
cs: I,
out: &[&str],
) {
let css = exhaustive_fixed_length_strings_using_chars(len, cs)
.take(20)
.collect_vec();
assert_eq!(css.iter().map(String::as_str).collect_vec().as_slice(), out);
}
#[test]
fn test_exhaustive_fixed_length_strings_using_chars() {
exhaustive_fixed_length_strings_using_chars_helper(0, empty(), &[""]);
exhaustive_fixed_length_strings_using_chars_helper(1, empty(), &[]);
exhaustive_fixed_length_strings_using_chars_helper(0, once('q'), &[""]);
exhaustive_fixed_length_strings_using_chars_helper(1, once('q'), &["q"]);
exhaustive_fixed_length_strings_using_chars_helper(2, once('q'), &["qq"]);
exhaustive_fixed_length_strings_using_chars_helper(3, once('q'), &["qqq"]);
exhaustive_fixed_length_strings_using_chars_helper(10, once('q'), &["qqqqqqqqqq"]);
exhaustive_fixed_length_strings_using_chars_helper(0, ['x', 'y'].iter().copied(), &[""]);
exhaustive_fixed_length_strings_using_chars_helper(1, ['x', 'y'].iter().copied(), &["x", "y"]);
exhaustive_fixed_length_strings_using_chars_helper(
2,
['x', 'y'].iter().copied(),
&["xx", "xy", "yx", "yy"],
);
exhaustive_fixed_length_strings_using_chars_helper(
3,
['x', 'y'].iter().copied(),
&["xxx", "xxy", "xyx", "xyy", "yxx", "yxy", "yyx", "yyy"],
);
exhaustive_fixed_length_strings_using_chars_helper(
10,
['x', 'y'].iter().copied(),
&[
"xxxxxxxxxx",
"xxxxxxxxxy",
"xxxxxxxxyx",
"xxxxxxxxyy",
"xxxxxxxyxx",
"xxxxxxxyxy",
"xxxxxxxyyx",
"xxxxxxxyyy",
"xxxxxxyxxx",
"xxxxxxyxxy",
"xxxxxxyxyx",
"xxxxxxyxyy",
"xxxxxxyyxx",
"xxxxxxyyxy",
"xxxxxxyyyx",
"xxxxxxyyyy",
"xxxxxyxxxx",
"xxxxxyxxxy",
"xxxxxyxxyx",
"xxxxxyxxyy",
],
);
exhaustive_fixed_length_strings_using_chars_helper(0, ['c', 'a', 't'].iter().copied(), &[""]);
exhaustive_fixed_length_strings_using_chars_helper(
1,
['c', 'a', 't'].iter().copied(),
&["c", "a", "t"],
);
exhaustive_fixed_length_strings_using_chars_helper(
2,
['c', 'a', 't'].iter().copied(),
&["cc", "ca", "ac", "aa", "ct", "at", "tc", "ta", "tt"],
);
exhaustive_fixed_length_strings_using_chars_helper(
3,
['c', 'a', 't'].iter().copied(),
&[
"ccc", "cca", "cac", "caa", "acc", "aca", "aac", "aaa", "cct", "cat", "act", "aat",
"ctc", "cta", "atc", "ata", "ctt", "att", "tcc", "tca",
],
);
exhaustive_fixed_length_strings_using_chars_helper(
10,
['c', 'a', 't'].iter().copied(),
&[
"cccccccccc",
"ccccccccca",
"ccccccccac",
"ccccccccaa",
"cccccccacc",
"cccccccaca",
"cccccccaac",
"cccccccaaa",
"ccccccaccc",
"ccccccacca",
"ccccccacac",
"ccccccacaa",
"ccccccaacc",
"ccccccaaca",
"ccccccaaac",
"ccccccaaaa",
"cccccacccc",
"cccccaccca",
"cccccaccac",
"cccccaccaa",
],
);
}