/*
 * t_smoke.c — проверка самого каркаса, а не движка.
 *
 * Главное здесь — TC_EQ(sizeof(int), 2): она доказывает, что тест реально
 * исполняется с z80-семантикой, а не собран хостовым компилятором.  Ради
 * этого весь прогон под ucsim и затевался (см. обсуждение 16/32 бит).
 */
#include "tcheck.h"

TC_TEST(smoke_z80_widths)
{
    TC_EQ(sizeof(int), 2);            /* мы под z80, int 16 бит */
    TC_EQ(sizeof(void *), 2);
    TC_EQ(sizeof(long), 4);
}

TC_TEST(smoke_arith)
{
    static volatile uint8_t a, b;     /* volatile: иначе SDCC свернёт всё
                                       * в константу и тест ничего не
                                       * проверит (warning 110) */
    int16_t s;
    a = 200; b = 100;
    s = (int16_t)(a + b);             /* байты повышаются до int */
    TC_EQ(s, 300);
    TC_EQ((uint8_t)(a + b), 44);      /* явный заворот в байт */
}

TC_TEST(smoke_wraparound_is_16bit)
{
    /* Ровно тот случай, который на хосте посчитался бы в 32 битах:
     * здесь заворот обязан произойти. */
    static volatile uint16_t a, b;
    a = 60000; b = 10000;
    TC_EQ((uint16_t)(a + b), 4464);
    TC_TRUE((uint16_t)(a + b) < 65000);
}

int main(void)
{
    TC_RUN(smoke_z80_widths);
    TC_RUN(smoke_arith);
    TC_RUN(smoke_wraparound_is_16bit);
    return 0;
}
