// 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::chars::exhaustive::exhaustive_ascii_chars;
use malachite_base::nevers::nevers;
use malachite_base::num::exhaustive::{exhaustive_positive_primitive_ints, exhaustive_unsigneds};
use malachite_base::vecs::exhaustive::lex_vecs_fixed_length_2_inputs;
use std::fmt::Debug;
use std::iter::empty;
fn lex_vecs_fixed_length_2_inputs_helper<
T: Clone + Debug + Eq,
I: Clone + Iterator- ,
J: Clone + Iterator
- ,
>(
xs: &I,
ys: &J,
output_to_input_map: &[usize],
out_len: Option,
out: &[&[T]],
) {
let xss = lex_vecs_fixed_length_2_inputs(xs.clone(), ys.clone(), output_to_input_map);
let xss_prefix = xss.clone().take(20).collect_vec();
assert_eq!(
xss_prefix
.iter()
.map(Vec::as_slice)
.collect_vec()
.as_slice(),
out
);
if let Some(out_len) = out_len {
assert_eq!(xss.count(), out_len);
}
}
#[test]
fn test_lex_vecs_fixed_length_2_inputs() {
lex_vecs_fixed_length_2_inputs_helper(&nevers(), &nevers(), &[0, 1], Some(0), &[]);
lex_vecs_fixed_length_2_inputs_helper(
&empty(),
&exhaustive_unsigneds::(),
&[0, 1],
Some(0),
&[],
);
lex_vecs_fixed_length_2_inputs_helper(
&exhaustive_unsigneds::(),
&exhaustive_positive_primitive_ints::(),
&[0, 1],
None,
&[
&[0, 1],
&[0, 2],
&[0, 3],
&[0, 4],
&[0, 5],
&[0, 6],
&[0, 7],
&[0, 8],
&[0, 9],
&[0, 10],
&[0, 11],
&[0, 12],
&[0, 13],
&[0, 14],
&[0, 15],
&[0, 16],
&[0, 17],
&[0, 18],
&[0, 19],
&[0, 20],
],
);
lex_vecs_fixed_length_2_inputs_helper(
&exhaustive_ascii_chars(),
&['x', 'y', 'z'].iter().copied(),
&[0, 1],
Some(384),
&[
&['a', 'x'],
&['a', 'y'],
&['a', 'z'],
&['b', 'x'],
&['b', 'y'],
&['b', 'z'],
&['c', 'x'],
&['c', 'y'],
&['c', 'z'],
&['d', 'x'],
&['d', 'y'],
&['d', 'z'],
&['e', 'x'],
&['e', 'y'],
&['e', 'z'],
&['f', 'x'],
&['f', 'y'],
&['f', 'z'],
&['g', 'x'],
&['g', 'y'],
],
);
lex_vecs_fixed_length_2_inputs_helper(
&exhaustive_ascii_chars(),
&['x', 'y', 'z'].iter().copied(),
&[0, 1, 1],
Some(1152),
&[
&['a', 'x', 'x'],
&['a', 'x', 'y'],
&['a', 'x', 'z'],
&['a', 'y', 'x'],
&['a', 'y', 'y'],
&['a', 'y', 'z'],
&['a', 'z', 'x'],
&['a', 'z', 'y'],
&['a', 'z', 'z'],
&['b', 'x', 'x'],
&['b', 'x', 'y'],
&['b', 'x', 'z'],
&['b', 'y', 'x'],
&['b', 'y', 'y'],
&['b', 'y', 'z'],
&['b', 'z', 'x'],
&['b', 'z', 'y'],
&['b', 'z', 'z'],
&['c', 'x', 'x'],
&['c', 'x', 'y'],
],
);
lex_vecs_fixed_length_2_inputs_helper(
&exhaustive_ascii_chars(),
&['x', 'y', 'z'].iter().copied(),
&[0, 1, 0],
Some(49152),
&[
&['a', 'x', 'a'],
&['a', 'x', 'b'],
&['a', 'x', 'c'],
&['a', 'x', 'd'],
&['a', 'x', 'e'],
&['a', 'x', 'f'],
&['a', 'x', 'g'],
&['a', 'x', 'h'],
&['a', 'x', 'i'],
&['a', 'x', 'j'],
&['a', 'x', 'k'],
&['a', 'x', 'l'],
&['a', 'x', 'm'],
&['a', 'x', 'n'],
&['a', 'x', 'o'],
&['a', 'x', 'p'],
&['a', 'x', 'q'],
&['a', 'x', 'r'],
&['a', 'x', 's'],
&['a', 'x', 't'],
],
);
}
#[test]
#[should_panic]
fn lex_vecs_fixed_length_2_inputs_fail_1() {
lex_vecs_fixed_length_2_inputs(0..2, 0..3, &[]);
}
#[test]
#[should_panic]
fn lex_vecs_fixed_length_2_inputs_fail_2() {
lex_vecs_fixed_length_2_inputs(0..2, 0..3, &[0]);
}
#[test]
#[should_panic]
fn lex_vecs_fixed_length_2_inputs_fail_3() {
lex_vecs_fixed_length_2_inputs(0..2, 0..3, &[1]);
}
#[test]
#[should_panic]
fn lex_vecs_fixed_length_2_inputs_fail_4() {
lex_vecs_fixed_length_2_inputs(0..2, 0..3, &[0, 1, 2]);
}