#ifndef DIV_COMMON_H
#define DIV_COMMON_H

/* check if the result is correct */
#define TEST_A_T(type, _n,_a,_b,_r) \
    int test##_n##a(void) { \
        typedef type int_t; \
        int_t a = ((int_t)_a), b = ((int_t)_b); \
        if (((a/((int_t)_b)) == ((int_t)_r)) && ((a/b) == ((int_t)_r))) { \
            return 0; \
        } else { \
            printf("%d\tincorrect: a/%ld = %ld, a/b = %ld\n\texpected:  %ld/%ld = %ld\n", \
                   (_n), (long)((int_t)_b), (long)(a/((int_t)_b)), (long)(a/b), (long)((int_t)_a), (long)((int_t)_b), (long)((int_t)_r)); \
            return 1; \
        } \
    }

/* check if the results are equal */
#define TEST_B_T(type, _n,_a,_b,_r) \
    int test##_n##b(void) { \
        typedef type int_t; \
        int_t a = ((int_t)_a), b = ((int_t)_b); \
        if (((a/((int_t)_b)) == (a/b))) { \
            return 0; \
        } else { \
            printf("%d\tnot equal: %ld != %ld, a = %ld, b = %ld\n\texpected:  %ld/%ld = %ld\n", \
                   (_n), (long)(a/((int_t)_b)), (long)(a/b), (long)(a), (long)(b), (long)((int_t)_a), (long)((int_t)_b), (long)((int_t)_r)); \
            return 1; \
        } \
    }

#define TEST_A_8(_n,_a,_b,_r) TEST_A_T(int8_t, _n,_a,_b,_r)
#define TEST_B_8(_n,_a,_b,_r) TEST_B_T(int8_t, _n,_a,_b,_r)
#define TEST_A_16(_n,_a,_b,_r) TEST_A_T(int16_t, _n,_a,_b,_r)
#define TEST_B_16(_n,_a,_b,_r) TEST_B_T(int16_t, _n,_a,_b,_r)
#define TEST_A_32(_n,_a,_b,_r) TEST_A_T(int32_t, _n,_a,_b,_r)
#define TEST_B_32(_n,_a,_b,_r) TEST_B_T(int32_t, _n,_a,_b,_r)

/* A and B */
#define TEST_AB_8(_n,_a,_b,_r) \
    TEST_A_8(_n,_a,_b,_r) \
    TEST_B_8(_n,_a,_b,_r)

#define TEST_AB_16(_n,_a,_b,_r) \
    TEST_A_16(_n,_a,_b,_r) \
    TEST_B_16(_n,_a,_b,_r)

#define TEST_AB_32(_n,_a,_b,_r) \
    TEST_A_32(_n,_a,_b,_r) \
    TEST_B_32(_n,_a,_b,_r)

#endif