/*
 *  TEST SUITE FOR MB/WC FUNCTIONS IN C LIBRARY
 *
 *	 FILE:	dat_mblen.c
 *
 *	 MBLEN:	 int mblen (char *s, size_t n);
 */


/*
 *  NOTE:
 *	  int  mblen (char *s, size_t n);
 *
 *	  where	     n: a maximum number of bytes
 *
 *	  return - the number of bytes
 *
 *  CAUTION:
 *
 *	 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 set a 'NULL', it doens't mean a NULL pointer.
 *
 *	 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_mblen(), set
 *	   ret_flg=0 always. It's a special case, and the test
 *	   function takes care of it.
 *
 *	       s_flg=0		 ret_flg=0
 *	       |		 |
 *	     { 0, 0 },	 { 0, 0, 0,  x }
 *		  |		     |
 *		  not used	     ret_val: 0/+1
 *				     (expected val) */


TST_MBLEN tst_mblen_loc [] = {
  {
    { Tmblen, TST_LOC_de },
    {
      /* 01: a character.  */
      {	 { 1, "\300",	   USE_MBCURMAX }, { 0,	1,  1 }	 },
      /* 02: a character.  */
      {	 { 1, "\309",	   USE_MBCURMAX }, { 0,	1,  1 }	 },
      /* 03: a character + an invalid byte.  */
      {	 { 1, "Z\204",	   USE_MBCURMAX }, { 0,	1, +1 }	 },
      /* 04: control/invalid characters.  */
      {	 { 1, "\177\000",  USE_MBCURMAX }, { 0,	1, +1 }	 },
      /* 05: a null string.  */
      {	 { 1, "",	   USE_MBCURMAX }, { 0,	1,  0 }	 },
      /* 06: a null pointer.  */
      {	 { 0, "",	   USE_MBCURMAX }, { 0,	0,  0 }	 },
      /* Last element.	*/
      {	 .is_last = 1 }
    }
  },
  {
    { Tmblen, TST_LOC_enUS },
    {
      /* 01: a character.  */
      {	 { 1, "A",	   USE_MBCURMAX }, { 0,	1,  1 }	 },
      /* 02: a character.  */
      {	 { 1, "a",	   USE_MBCURMAX }, { 0,	1,  1 }	 },
      /* 03: a character + an invalid byte.  */
      {	 { 1, "Z\204",	   USE_MBCURMAX }, { 0,	1, +1 }	 },
      /* 04: control/invalid characters.  */ 
      {	 { 1, "\177\000",  USE_MBCURMAX }, { 0,	1, +1 }	 },
      /* 05: a null string.  */		     
      {	 { 1, "",	   USE_MBCURMAX }, { 0,	1,  0 }	 },
      /* 06: a null pointer.  */	     
      {	 { 0, "",	   USE_MBCURMAX }, { 0,	0,  0 }	 },
      /* Last element.	*/
      {	 .is_last = 1 }
    }
  },
  {
    { Tmblen, TST_LOC_eucJP },
    {
      /* 01: a character.  */
      {	 { 1, "\264\301",	   USE_MBCURMAX }, { 0, 1,  2 }	 },
      /* 02: a character.  */			     
      {	 { 1, "\216\261",	   USE_MBCURMAX }, { 0, 1,  2 }  },
      /* 03: a character + an invalid byte.  */	     
      {	 { 1, "\260\241\200",	   USE_MBCURMAX }, { 0, 1,  2 }	 },
      /* 04: control/invalid characters.  */
      {	 { 1, "\377\202",  USE_MBCURMAX }, { EILSEQ, 1, -1 }	 },
      /* 05: a null string.  */		     
      {	 { 1, "",	   USE_MBCURMAX }, { 0,	1,  0 }	 },
      /* 06: a null pointer.  */	     
      {	 { 0, "",	   USE_MBCURMAX }, { 0,	0,  0 }	 },
      /* Last element.	*/
      {	 .is_last = 1 }
    }
  },
  {
    { Tmblen, TST_LOC_end}
  }
};
