//-
// Copyright 2017, 2018 The proptest developers
//
// Licensed under the Apache License, Version 2.0 <LICENSE-APACHE or
// http://www.apache.org/licenses/LICENSE-2.0> or the MIT license
// <LICENSE-MIT or http://opensource.org/licenses/MIT>, at your
// option. This file may not be copied, modified, or distributed
// except according to those terms.

//! Arbitrary implementations for tuples.

use crate::arbitrary::{Arbitrary, any_with};

macro_rules! impl_tuple {
    ($($typ: ident),*) => {
        impl<$($typ : Arbitrary),*> Arbitrary for ($($typ,)*) {
            type Parameters = product_type![$($typ::Parameters,)*];
            type Strategy = ($($typ::Strategy,)*);
            fn arbitrary_with(args: Self::Parameters) -> Self::Strategy {
                #[allow(non_snake_case)]
                let product_unpack![$($typ),*] = args;
                ($(any_with::<$typ>($typ)),*,)
            }
        }
    };
}

arbitrary!((); ());
impl_tuple!(T0);
impl_tuple!(T0, T1);
impl_tuple!(T0, T1, T2);
impl_tuple!(T0, T1, T2, T3);
impl_tuple!(T0, T1, T2, T3, T4);
impl_tuple!(T0, T1, T2, T3, T4, T5);
impl_tuple!(T0, T1, T2, T3, T4, T5, T6);
impl_tuple!(T0, T1, T2, T3, T4, T5, T6, T7);
impl_tuple!(T0, T1, T2, T3, T4, T5, T6, T7, T8);
impl_tuple!(T0, T1, T2, T3, T4, T5, T6, T7, T8, T9);

#[cfg(test)]
mod test {
    no_panic_test!(
        tuple_n10 => ((), bool, u8, u16, u32, u64, i8, i16, i32, i64)
    );
}
