Tests for mbtowc.
authoraj <aj>
Thu, 29 Jun 2000 07:01:50 +0000 (07:01 +0000)
committeraj <aj>
Thu, 29 Jun 2000 07:01:50 +0000 (07:01 +0000)
localedata/tests-mbwc/dat_mbtowc.c [new file with mode: 0644]
localedata/tests-mbwc/tst_mbtowc.c [new file with mode: 0644]

diff --git a/localedata/tests-mbwc/dat_mbtowc.c b/localedata/tests-mbwc/dat_mbtowc.c
new file mode 100644 (file)
index 0000000..1e33594
--- /dev/null
@@ -0,0 +1,327 @@
+/*
+ *  TEST SUITE FOR MB/WC FUNCTIONS IN C LIBRARY
+ *
+ *      FILE:  dat_mbtowc.c
+ *
+ *      MBTOWC:  int  mbtowc (wchar_t *wp, char *s, size_t n);
+ */
+
+/*  NOTE:
+ *
+ *      int  mbtowc (wchar_t *wp, char *s, size_t n);
+ *
+ *      where       n: a maximum number of bytes
+ *             return: the number of bytes
+ *
+ *
+ *       o When you feed a null pointer for a string (s) to the function,
+ *         set s_flg=0 instead of putting just a 'NULL' there.
+ *         Even if you put a 'NULL', it means a null string as well as "".
+ *
+ *       o When s is a null pointer, the function checks state dependency.
+ *
+ *             state-dependent encoding      - return  NON-zero
+ *             state-independent encoding    - return  0
+ *
+ *         If state-dependent encoding is expected, set
+ *
+ *             s_flg = 0,  ret_flg = 0,  ret_val = +1
+ *
+ *         If state-independent encoding is expected, set
+ *
+ *             s_flg = 0,  ret_flg = 0,  ret_val = 0
+ *
+ *
+ *         When you set ret_flg=1, the test program simply compares
+ *         an actual return value with an expected value. You can
+ *         check state-independent case (return value is 0) in that
+ *         way, but you can not check state-dependent case. So when
+ *         you check state- dependency in this test function:
+ *         tst_mbtowc(), set ret_flg=0 always. It's a special case
+ *         and the test function takes care of it.
+ *
+ *                       w_flg
+ *                       |     s: (a null string; can't be (char *)NULL)
+ *                       |     |
+ *            input.   { 1, 0, (char)NULL, MB_LEN_MAX  },
+ *                          |
+ *                          s_flg=0: makes _s_ a null pointer.
+ *
+ *            expect   { 0,0,0,x,     0x0000     },
+ *                           | |
+ *                           | ret_val: 0/+1
+ *                           ret_flg=0
+ *
+ *
+ *    Test data for State dependent encodings:
+ *
+ *       mbtowc( NULL, NULL, 0 );       ... first  data
+ *       mbtowc( &wc,  s1,  n1 );       ... second data
+ *       mbtowc( &wc,  s2,  n2 );       ... third  data
+ * */
+
+#include <limits.h>
+
+TST_MBTOWC tst_mbtowc_loc [] = {
+  {
+    { Tmbtowc, TST_LOC_de },
+    {
+      { /*----------------- #01 -----------------*/
+       {
+         {
+           { 1, 1, "üäö",          1          },
+           { 1, 1, "üäö",          2          },
+           { 1, 1, "üäö",          MB_LEN_MAX },
+         }
+       },
+       {
+         {
+           { 0,          0,  1,  1,   0x00FC },
+           { 0,          0,  1,  1,   0x00FC },
+           { 0,          0,  1,  1,   0x00FC },
+         }
+       }
+      },
+      { /*----------------- #02 -----------------*/
+       {
+         {
+           { 1, 1, "\177",         MB_LEN_MAX },
+           { 1, 1, "\200",         MB_LEN_MAX },
+           { 1, 1, "\201",         MB_LEN_MAX },
+         }
+       },
+       {
+         {
+           { 0,          0,  1,  1,   0x007F },
+           { 1,          0,  1,  1,   0x0080 },
+           { 1,          0,  1,  1,   0x0081 },
+         }
+       }
+      },
+      { /*----------------- #03 -----------------*/
+       {
+         {
+           { 1, 1, "",     MB_LEN_MAX },
+           { 0, 1, "üäö",          1          },
+           { 0, 1, "üäö",          2          },
+         }
+       },
+       {
+         {
+           { 0,          0,  1,  0,   0x0000 },
+           { 0,          0,  1,  1,   0x0000 },
+           { 0,          0,  1,  1,   0x0000 },
+         }
+       }
+      },
+      { /*----------------- #04 -----------------*/
+       {
+         {
+           { 0, 1, "üäö",          MB_LEN_MAX },
+           { 0, 1, "\177",         MB_LEN_MAX },
+           { 0, 1, "",     MB_LEN_MAX },
+         }
+       },
+       {
+         {
+           { 0,          0,  1,  1,   0x0000 },
+           { 0,          0,  1,  1,   0x0000 },
+           { 0,          0,  1,  0,   0x0000 },
+         }
+       }
+      },
+      { /*----------------- #05 -----------------*/
+       {
+         {
+           { 0, 1, "üäö",          MB_LEN_MAX },
+           { 0, 1, "\177",         MB_LEN_MAX },
+           { 0, 0, (char)NULL, MB_LEN_MAX },
+         }
+       },
+       {
+         {
+           { 0,          0,  1,  1,   0x0000 },
+           { 0,          0,  1,  1,   0x0000 },
+           { 0,          0,  0,  0,   0x0000 },
+         }
+       }
+      },
+      { is_last: 1 }
+    }
+  },
+  {
+    { Tmbtowc, TST_LOC_enUS },
+    {
+      { /*----------------- #01 -----------------*/
+       {
+         {
+           { 1, 1, "ABC",          1          },
+           { 1, 1, "ABC",          2          },
+           { 1, 1, "ABC",          MB_LEN_MAX },
+         }
+       },
+       {
+         {
+           { 0,          0,  1,  1,   0x0041 },
+           { 0,          0,  1,  1,   0x0041 },
+           { 0,          0,  1,  1,   0x0041 },
+         }
+       }
+      },
+      { /*----------------- #02 -----------------*/
+       {
+         {
+           { 1, 1, "\177",         MB_LEN_MAX },
+           { 1, 1, "\200",         MB_LEN_MAX },
+           { 1, 1, "\201",         MB_LEN_MAX },
+         }
+       },
+       {
+         {
+           { 0,          0,  1,  1,   0x007F },
+           { 1, EILSEQ,  1, -1,   0x0000 },
+           { 1, EILSEQ,  1, -1,   0x0000 },
+         }
+       }
+      },
+      { /*----------------- #03 -----------------*/
+       {
+         {
+           { 1, 1, "",     MB_LEN_MAX },
+           { 0, 1, "ABC",          1          },
+           { 0, 1, "ABC",          2          },
+         }
+       },
+       {
+         {
+           { 0,          0,  1,  0,   0x0000 },
+           { 0,          0,  1,  1,   0x0000 },
+           { 0,          0,  1,  1,   0x0000 },
+         }
+       }
+      },
+      { /*----------------- #04 -----------------*/
+       {
+         {
+           { 0, 1, "ABC",          MB_LEN_MAX },
+           { 0, 1, "\177",         MB_LEN_MAX },
+           { 0, 1, "",     MB_LEN_MAX },
+         }
+       },
+       {
+         {
+           { 0,          0,  1,  1,   0x0000 },
+           { 0,          0,  1,  1,   0x0000 },
+           { 0,          0,  1,  0,   0x0000 },
+         }
+       }
+      },
+      { /*----------------- #05 -----------------*/
+       {
+         {
+           { 0, 1, "ABC",          MB_LEN_MAX },
+           { 0, 1, "\177",         MB_LEN_MAX },
+           { 0, 0, (char)NULL, MB_LEN_MAX },
+         }
+       },
+       {
+         {
+           { 0,          0,  1,  1,   0x0000 },
+           { 0,          0,  1,  1,   0x0000 },
+           { 0,          0,  0,  0,   0x0000 },
+         }
+       }
+      },
+      { is_last: 1 }
+    }
+  },
+  {
+    { Tmbtowc, TST_LOC_eucJP },
+    {
+      { /*----------------- #01 -----------------*/
+       {
+         {
+           { 1, 1, "\244\242A",      1          },
+           { 1, 1, "\244\242A",      2          },
+           { 1, 1, "\244\242A",      MB_LEN_MAX },
+         }
+       },
+       {
+         {
+           { 1, EILSEQ,  1, -1,   0x0000 },
+           { 0,          0,  1,  2,   0x3042 },
+           { 0,          0,  1,  2,   0x3042 },
+         }
+       }
+      },
+      { /*----------------- #02 -----------------*/
+       {
+         {
+           { 1, 1, "\177\244\242",   MB_LEN_MAX },
+           { 1, 1, "\200\244\242",   MB_LEN_MAX },
+           { 1, 1, "\201\244\242",   MB_LEN_MAX },
+         }
+       },
+       {
+         {
+           { 0,          0,  1, +1,   0x007F },
+           { 1, EILSEQ,  1, -1,   0x0000 },
+           { 1, EILSEQ,  1, -1,   0x0000 },
+         }
+       }
+      },
+      { /*----------------- #03 -----------------*/
+       {
+         {
+           { 1, 1, "",         MB_LEN_MAX },
+           { 0, 1, "\244\242A",      1          },
+           { 0, 1, "\244\242A",      2          },
+         }
+       },
+       {
+         {
+           { 0,          0,  1,  0,   0x0000 },
+           { 1, EILSEQ,  1, -1,   0x0000 },
+           { 0,          0,  1,  2,   0x0000 },
+         }
+       }
+      },
+      { /*----------------- #04 -----------------*/
+       {
+         {
+           { 0, 1, "\244\242A",      MB_LEN_MAX },
+           { 0, 1, "\177\244\242",   MB_LEN_MAX },
+           { 0, 1, "",         MB_LEN_MAX },
+         }
+       },
+       {
+         {
+           { 0,          0,  1,  2,   0x0000 },
+           { 0,          0,  1, +1,   0x0000 },
+           { 0,          0,  1,  0,   0x0000 },
+         }
+       }
+      },
+      { /*----------------- #05 -----------------*/
+       {
+         {
+           { 0, 1, "\244\242A",      MB_LEN_MAX },
+           { 0, 1, "\177\244\242",   MB_LEN_MAX },
+           { 0, 0, (char)NULL, MB_LEN_MAX },
+         }
+       },
+       {
+         {
+           { 0,          0,  1,  2,   0x0000 },
+           { 0,          0,  1, +1,   0x0000 },
+           { 0,          0,  0,  0,   0x0000 },
+         }
+       }
+      },
+      { is_last: 1 }
+    }
+  },
+  {
+    { Tmbtowc, TST_LOC_end }
+  }
+};
diff --git a/localedata/tests-mbwc/tst_mbtowc.c b/localedata/tests-mbwc/tst_mbtowc.c
new file mode 100644 (file)
index 0000000..c525941
--- /dev/null
@@ -0,0 +1,126 @@
+/*
+  MBTOWC: int mbtowc (wchar_t *wc, char *s, size_t n)
+*/
+
+#define TST_FUNCTION mbtowc
+
+#include "tsp_common.c"
+#include "dat_mbtowc.c"
+
+
+int
+tst_mbtowc (FILE * fp, int debug_flg)
+{
+  TST_DECL_VARS (int);
+  char w_flg, s_flg;
+  const char *s_in;
+  size_t n;
+  wchar_t wc, wc_ex, *wp;
+
+  TST_DO_TEST (mbtowc)
+  {
+    TST_HEAD_LOCALE (mbtowc, S_MBTOWC);
+    TST_DO_REC (mbtowc)
+    {
+      if (mbstowcs (NULL, "", 0) != 0)
+       {
+         err_count++;
+         Result (C_FAILURE, S_MBSTOWCS, CASE_3,
+                 "Initialization failed - skipping this test case.");
+         continue;
+       }
+
+      TST_DO_SEQ (MBTOWC_SEQNUM)
+      {
+       TST_GET_ERRET_SEQ (mbtowc);
+       w_flg = TST_INPUT_SEQ (mbtowc).w_flg;
+       s_flg = TST_INPUT_SEQ (mbtowc).s_flg;
+       n = TST_INPUT_SEQ (mbtowc).n;
+
+       if (n == USE_MBCURMAX)
+         {
+           n = MB_CUR_MAX;
+         }
+
+       if (s_flg == 0)
+         s_in = NULL;
+       else
+         s_in = TST_INPUT_SEQ (mbtowc).s;
+
+       wp = (wchar_t *) ((w_flg == 0) ? NULL : &wc);
+
+       TST_CLEAR_ERRNO;
+       ret = mbtowc (wp, s_in, n);
+       TST_SAVE_ERRNO;
+
+       if (debug_flg)
+         {
+           fprintf (stdout, "mbtowc() [ %s : %d ] ret = %d\n", locale,
+                    rec + 1, ret);
+           fprintf (stdout, "                     errno      = %d\n",
+                    errno_save);
+         }
+
+       TST_IF_RETURN (S_MBTOWC)
+       {
+         if (s_in == NULL)
+           {                   /* state dependency */
+             if (ret_exp == +1)
+               {               /* state-dependent  */
+                 if (ret != 0)
+                   {
+                     /* Non-zero: state-dependent encoding.  */
+                     Result (C_SUCCESS, S_MBTOWC, CASE_3, MS_PASSED);
+                   }
+                 else
+                   {
+                     err_count++;
+                     Result (C_FAILURE, S_MBTOWC, CASE_3,
+                             "should be state-dependent encoding, "
+                             "but a return value shows it is "
+                             "state-independent");
+                   }
+               }
+
+             if (ret_exp == 0)
+               {               /* state-independent */
+                 if (ret == 0)
+                   {
+                     /* Non-zero: state-dependent encoding.  */
+                     Result (C_SUCCESS, S_MBTOWC, CASE_3, MS_PASSED);
+                   }
+                 else
+                   {
+                     err_count++;
+                     Result (C_FAILURE, S_MBTOWC, CASE_3,
+                             "should be state-independent encoding, "
+                             "but a return value shows it is "
+                             "state-dependent");
+                   }
+               }
+           }
+       }
+
+       if ((wp == NULL || s_in == NULL || s_in[0] == 0) || ret <= 0)
+         {
+           continue;
+         }
+
+       wc_ex = TST_EXPECT_SEQ (mbtowc).wc;
+
+       if (wc_ex == wc)
+         {
+           Result (C_SUCCESS, S_MBTOWC, CASE_4, MS_PASSED);
+         }
+       else
+         {
+           err_count++;
+           Result (C_FAILURE, S_MBTOWC, CASE_4,
+                   "converted wc is different from an expected wc");
+         }
+      }
+    }
+  }
+
+  return err_count;
+}