//@ run-pass

macro_rules! suite {
    ($(
        $fn:ident -> $ty:ty { $( $label:ident : $expr:expr, $result:expr; )* }
    )*) => { $(
        fn $fn() {
            $(
                const $label: $ty = $expr;
                assert_eq!($label, $result);
            )*
        }
    )* }
}

suite!(
    checked -> Option<i8> {
        // `const_checked_int_methods`
        C1: 5i8.checked_add(2), Some(7);
        C2: 127i8.checked_add(2), None;

        C3: 5i8.checked_sub(2), Some(3);
        C4: (-127i8).checked_sub(2), None;

        C5: 1i8.checked_mul(3), Some(3);
        C6: 5i8.checked_mul(122), None;
        C7: (-127i8).checked_mul(-99), None;

        C8: (i8::MIN + 1).checked_div(-1), Some(127);
        C9: i8::MIN.checked_div(-1), None;
        C10: 1i8.checked_div(0), None;

        C11: 5i8.checked_rem(2), Some(1);
        C12: 5i8.checked_rem(0), None;
        C13: i8::MIN.checked_rem(-1), None;

        C14: 5i8.checked_neg(), Some(-5);
        C15: i8::MIN.checked_neg(), None;

        C16: 0x1i8.checked_shl(4), Some(0x10);
        C17: 0x1i8.checked_shl(129), None;

        C18: 0x10i8.checked_shr(4), Some(0x1);
        C19: 0x10i8.checked_shr(128), None;


        C20: (-5i8).checked_abs(), Some(5);
        C21: i8::MIN.checked_abs(), None;

        // `const_euclidean_int_methods`
        C22: (i8::MIN + 1).checked_div_euclid(-1), Some(127);
        C23: i8::MIN.checked_div_euclid(-1), None;
        C24: (1i8).checked_div_euclid(0), None;

        C25: 5i8.checked_rem_euclid(2), Some(1);
        C26: 5i8.checked_rem_euclid(0), None;
        C27: i8::MIN.checked_rem_euclid(-1), None;
    }
    checked_i128 -> Option<i128> {
        CHK_ADD_I128: i128::MAX.checked_add(1), None;
        CHK_MUL_I128: i128::MIN.checked_mul(-1), None;
    }

    saturating_and_wrapping -> i8 {
        // `const_saturating_int_methods`
        C28: 100i8.saturating_add(1), 101;
        C29: i8::MAX.saturating_add(100), i8::MAX;
        C30: i8::MIN.saturating_add(-1), i8::MIN;

        C31: 100i8.saturating_sub(127), -27;
        C32: i8::MIN.saturating_sub(100), i8::MIN;
        C33: i8::MAX.saturating_sub(-1), i8::MAX;

        C34: 10i8.saturating_mul(12), 120;
        C35: i8::MAX.saturating_mul(10), i8::MAX;
        C36: i8::MIN.saturating_mul(10), i8::MIN;

        C37: 100i8.saturating_neg(), -100;
        C38: (-100i8).saturating_neg(), 100;
        C39: i8::MIN.saturating_neg(), i8::MAX;
        C40: i8::MAX.saturating_neg(), i8::MIN + 1;

        C57: 100i8.saturating_abs(), 100;
        C58: (-100i8).saturating_abs(), 100;
        C59: i8::MIN.saturating_abs(), i8::MAX;
        C60: (i8::MIN + 1).saturating_abs(), i8::MAX;

        // `const_wrapping_int_methods`
        C41: 100i8.wrapping_div(10), 10;
        C42: (-128i8).wrapping_div(-1), -128;

        C43: 100i8.wrapping_rem(10), 0;
        C44: (-128i8).wrapping_rem(-1), 0;

        // `const_euclidean_int_methods`
        C45: 100i8.wrapping_div_euclid(10), 10;
        C46: (-128i8).wrapping_div_euclid(-1), -128;

        C47: 100i8.wrapping_rem_euclid(10), 0;
        C48: (-128i8).wrapping_rem_euclid(-1), 0;
    }
    saturating_and_wrapping_i128 -> i128 {
        SAT_ADD_I128: i128::MAX.saturating_add(1), i128::MAX;
        SAT_MUL_I128: i128::MAX.saturating_mul(2), i128::MAX;

        WRP_ADD_I128: i128::MAX.wrapping_add(1), i128::MIN;
        WRP_MUL_I128: i128::MAX.wrapping_mul(3), i128::MAX-2;
    }

    overflowing -> (i8, bool) {
        // `const_overflowing_int_methods`
        C49: 5i8.overflowing_div(2), (2, false);
        C50: i8::MIN.overflowing_div(-1), (i8::MIN, true);

        C51: 5i8.overflowing_rem(2), (1, false);
        C52: i8::MIN.overflowing_rem(-1), (0, true);

        // `const_euclidean_int_methods`
        C53: 5i8.overflowing_div_euclid(2), (2, false);
        C54: i8::MIN.overflowing_div_euclid(-1), (i8::MIN, true);

        C55: 5i8.overflowing_rem_euclid(2), (1, false);
        C56: i8::MIN.overflowing_rem_euclid(-1), (0, true);
    }
    overflowing_i128 -> (i128, bool) {
        OFL_ADD_I128: i128::MAX.overflowing_add(1), (i128::MIN, true);
        OFL_MUL_I128: i128::MAX.overflowing_mul(3), (i128::MAX-2, true);
    }
);

fn main() {
   checked();
   checked_i128();
   saturating_and_wrapping();
   saturating_and_wrapping_i128();
   overflowing();
   overflowing_i128();
}
