forked from Lephenixnoir/gintctl
121 lines
2.5 KiB
C
121 lines
2.5 KiB
C
#include <gint/std/stdio.h>
|
|
#include <gint/std/string.h>
|
|
#include <gint/display.h>
|
|
#include <gint/keyboard.h>
|
|
#include <stdarg.h>
|
|
|
|
#include <gintctl/gint.h>
|
|
#include <gintctl/util.h>
|
|
|
|
static int passed = 0;
|
|
static int total = 0;
|
|
|
|
static struct {
|
|
char const *format;
|
|
char const *expected;
|
|
} fails[10];
|
|
|
|
static void check(char const *expected, char const *format, ...)
|
|
{
|
|
va_list args;
|
|
va_start(args, format);
|
|
|
|
char buffer[128];
|
|
vsnprintf(buffer, 128, format, args);
|
|
|
|
va_end(args);
|
|
|
|
total++;
|
|
|
|
if(!strcmp(buffer, expected))
|
|
{
|
|
passed++;
|
|
}
|
|
else if(total - passed <= 10)
|
|
{
|
|
fails[total - passed - 1].format = format;
|
|
fails[total - passed - 1].expected = expected;
|
|
}
|
|
}
|
|
|
|
static void check_all(void)
|
|
{
|
|
passed = 0;
|
|
total = 0;
|
|
|
|
/* Base cases with length and precision */
|
|
check("-849", "%d", -849);
|
|
check(" 78372", "%7i", 78372);
|
|
check("65536", "%3d", 65536);
|
|
check(" 0017", "%6.4d", 17);
|
|
check(" -1876", "%6.3d", -1876);
|
|
|
|
/* Sign */
|
|
check("+15", "%+i", 15);
|
|
check(" 78372", "% 7i", 78372);
|
|
check(" 65536", "% d", 65536);
|
|
|
|
/* Alignment */
|
|
check("0017 ", "%-6.4d", 17);
|
|
check("+0017 ", "%-+6.4i", 17);
|
|
|
|
/* Bases */
|
|
check("3255", "%d", 0xcb7);
|
|
check("cb7", "%x", 0xcb7);
|
|
check("CB7", "%X", 0xcb7);
|
|
check("6267", "%o", 0xcb7);
|
|
|
|
/* Argument size */
|
|
check("10000000000", "%lld", 10000000000ll);
|
|
check("123456789ab", "%llx", 0x123456789abull);
|
|
|
|
/* Alternative prefixes */
|
|
check("0x7b", "%#x", 0x7b);
|
|
check("0X7B", "%#X", 0x7b);
|
|
check("0377", "%#o", 255);
|
|
|
|
/* Pointers */
|
|
check("0xa44b0000", "%p", (void *)0xa44b0000);
|
|
|
|
/* Characters and strings */
|
|
check("HellWrld!", "%s", "HellWrld!");
|
|
check("Hello ", "%-8.5s", "Hello, World!");
|
|
check("d", "%c", 100);
|
|
check(" #", "%6c", '#');
|
|
}
|
|
|
|
/* gintctl_gint_printf(): printf() function */
|
|
void gintctl_gint_printf(void)
|
|
{
|
|
int key = 0;
|
|
while(key != KEY_EXIT)
|
|
{
|
|
dclear(C_WHITE);
|
|
|
|
#ifdef FX9860G
|
|
row_print(1, 1, "printf() tests");
|
|
row_print(3, 1, "passed: %d/%d", passed, total);
|
|
#endif
|
|
|
|
#ifdef FXCG50
|
|
row_title("Unit tests for the printf() family");
|
|
|
|
row_print(1, 1, "Passed: %d/%d", passed, total);
|
|
|
|
for(int i = 0; i < 10 && i <= total - passed - 1; i++)
|
|
{
|
|
int y = 22 + 14 * (i + 2);
|
|
dtext(6, y, fails[i].format, C_BLACK, C_NONE);
|
|
dtext(86, y, fails[i].expected, C_BLACK, C_NONE);
|
|
}
|
|
|
|
fkey_button(1, "RUN");
|
|
#endif
|
|
|
|
dupdate();
|
|
|
|
key = getkey().key;
|
|
if(key == KEY_F1) check_all();
|
|
}
|
|
}
|