* support/regression/tests/snprintf.c: some checks
[fw/sdcc] / support / regression / tests / snprintf.c
diff --git a/support/regression/tests/snprintf.c b/support/regression/tests/snprintf.c
new file mode 100644 (file)
index 0000000..8227204
--- /dev/null
@@ -0,0 +1,125 @@
+/** tests for snprintf\r
+  type: INT, LONG, STRING, FLOAT\r
+*/\r
+#include <testfwk.h>\r
+#include <string.h>\r
+#include <stdio.h>\r
+\r
+#define {type} 1\r
+\r
+#if 0\r
+# define DEBUG(x) x\r
+#else\r
+# define DEBUG(x)\r
+#endif\r
+\r
+#define CHECK_B 0\r
+\r
+#if defined(INT)\r
+\r
+       struct {\r
+               int arg;\r
+               char *fmt;\r
+               char *result;\r
+       } static const cases[]={\r
+               // arg, fmt,    result\r
+               {0xab,  "%04x", "00ab"},\r
+               {0xffff,        "0x%02X", "0xFFFF"},\r
+               {0xffffu,       "%u",   "65535"},\r
+               {1234,  "%+6d", " +1234"},\r
+               {12345, "% d",  " 12345"},\r
+               {-1234, "%d",   "-1234"},\r
+               {32767, "%8d",  "   32767"},\r
+               {1,     "%%%d", "%1"},\r
+               {1001,  "%08i", "00001001"},\r
+               {101,   "%-+8d",        "+101    "},\r
+               {01234, "%o(oct)",      "1234(oct)"},\r
+               \r
+               // do we want to check these:\r
+               #if defined(SDCC) && !defined(SDCC_z80) && CHECK_B\r
+               {0x4142,        "%bc %bx",      "\x41 42"},     /* non-std: print as bytes! */\r
+               {0xfffe,        "0x%02bX%02bx", "0xFFfe"},      /* non-std: print as bytes! */\r
+               #elif defined(SDCC) && defined(SDCC_z80) && CHECK_B\r
+               {0x4142,        "%bc %bx",      "\x42 41"},     /* non-std: print as bytes! */\r
+               {0xfffe,        "0x%02bX%02bx", "0xFEff"},      /* non-std: print as bytes! */\r
+               #endif\r
+       };\r
+\r
+#elif defined(LONG)\r
+\r
+       struct {\r
+               long arg;\r
+               char *fmt;\r
+               char *result;\r
+       } static const cases[]={\r
+               // arg, fmt,    result\r
+               {0x12345678,    "0x%lx",        "0x12345678"},\r
+               {0x7fffFFFF,    "%10lx",        "  7fffffff"},\r
+               {0x789abcde,    "0x%-10lX",     "0x789ABCDE  "},\r
+               {0x1000a,       "0x%02lX",      "0x1000A"},\r
+               {0x80000000,    "%lu",          "2147483648"},\r
+               {-2147483648,   "%li",          "-2147483648"},\r
+               {-1234,         "%+6ld",        " -1234"},\r
+               {012345670123,  "%lo(oct)",     "12345670123(oct)"},\r
+               {0xffffFFFF,    "%lo(oct)",     "37777777777(oct)"},\r
+\r
+               // do we want to check these:\r
+               #if defined(SDCC) && !defined(SDCC_z80) && CHECK_B\r
+               {0xfedcba98,    "0x%bX%bX%bx%bx",       "0xFEDCba98"},  /* non-std: print as bytes! */\r
+               #elif defined(SDCC) && defined(SDCC_z80) && CHECK_B\r
+               {0xfedcba98,    "0x%bX%bX%bx%bx",       "0x98BAdcfe"},  /* non-std: print as bytes! */\r
+               #endif\r
+       };\r
+\r
+#elif defined(STRING)\r
+\r
+       struct {\r
+               char *arg;\r
+               char *fmt;\r
+               char *result;\r
+       } static const cases[]={\r
+               // arg, fmt,    result\r
+               {"abcd",        "%s",   "abcd"},\r
+               {"abcd",        "%3s",  "abcd"},\r
+               {"abcd",        "%5s",  " abcd"},\r
+               {"abcd",        "%-5s", "abcd "},\r
+               {"abcd",        "%.2s", "ab"},\r
+               {"XYZ\\",       "%s",   "XYZ\x5c"},\r
+               {"ab\x1b\x7f",  "%s",   "ab\x1b\x7f"},\r
+               {"ab\tcd\n","%s",       "ab\tcd\n"},\r
+       };\r
+\r
+#elif defined(FLOAT)\r
+\r
+       struct {\r
+               float arg;\r
+               char *fmt;\r
+               char *result;\r
+       } static const cases[]={\r
+               // arg, fmt,    result\r
+               // ... there should be more ...\r
+               #if defined(SDCC) && !defined(SDCC_ds390)\r
+               {1.0,   "%f",   "<NO FLOAT>"},\r
+               #else\r
+               {1.0,   "%f",   "1.000000"},\r
+               #endif\r
+       };\r
+\r
+#endif\r
+\r
+void\r
+test_snprintf(void)\r
+{\r
+       unsigned char buf[32];\r
+       unsigned char i;\r
+\r
+       memset(buf, 0xfe, sizeof buf); /* cookies all over */\r
+       \r
+       for (i=0; i<sizeof cases / sizeof cases[0]; i++) {\r
+               sprintf(buf,cases[i].fmt,cases[i].arg);\r
+               DEBUG(printf ("Test%d should be: \"%s\" is: \"%s\"\n", i, cases[i].result, buf));\r
+               ASSERT(!strcmp(buf,cases[i].result));\r
+       }\r
+       \r
+       ASSERT(buf[sizeof buf - 10] == 0xfe); /* check for cookie */\r
+}\r