about summary refs log tree commit diff
path: root/localedata/tests-mbwc/tst_funcs.h
diff options
context:
space:
mode:
Diffstat (limited to 'localedata/tests-mbwc/tst_funcs.h')
-rw-r--r--localedata/tests-mbwc/tst_funcs.h273
1 files changed, 273 insertions, 0 deletions
diff --git a/localedata/tests-mbwc/tst_funcs.h b/localedata/tests-mbwc/tst_funcs.h
new file mode 100644
index 0000000000..95d0787e5d
--- /dev/null
+++ b/localedata/tests-mbwc/tst_funcs.h
@@ -0,0 +1,273 @@
+/*
+ *  TEST SUITE FOR MB/WC FUNCTIONS IN C LIBRARY
+ *
+ *	 FILE:	tst_funcs.h
+ *
+ *	 Definitions of macros
+ */
+
+
+#ifndef TST_FUNCS_H
+#define TST_FUNCS_H
+
+#define C_SUCCESS	   'S'	/* test case test passed		 */
+#define C_FAILURE	   'F'	/* test case failed			 */
+#define C_IGNORED	   'I'	/* test case/result ignored (not tested) */
+#define C_INVALID	   'D'	/* test data may be wrong		 */
+#define C_LOCALES	   'L'	/* can't set locale (skip)		 */
+
+
+extern int result (FILE * fp, char res, const char *func, const char *loc,
+		   int rec_no, int seq_num, int case_no, const char *msg);
+
+#define Result(C, S, E, M) \
+  result (fp, (C), (S), locale, rec+1, seq_num+1, (E), (M))
+
+#define CASE_0	  0
+#define CASE_1	  1
+#define CASE_2	  2
+#define CASE_3	  3
+#define CASE_4	  4
+#define CASE_5	  5
+#define CASE_6	  6
+#define CASE_7	  7
+#define CASE_8	  8
+#define CASE_9	  9
+
+#define MS_PASSED "PASSED"
+#define MS_SPACE  "	 "
+#define MS_FAILED "	 "
+#define MS_NOTEST "NOTEST"
+#define MS_ABORTU "ABEND0"
+#define MS_ABORT  "ABEND1"
+
+#define MK_PASSED 0x00
+#define MK_SPACE  0x01
+#define MK_NOTEST 0x02
+#define MK_ABORTU 0x04
+#define MK_ABORT  0x08
+
+
+
+/* ------------------ COMMON MACROS ------------------ */
+
+#define TST_ABS(x)  (((x) > 0) ? (x) : -(x))
+
+#define TMD_ERRET(_type_)   int	  err_flg; \
+			    int	  err_val; \
+			    int	  ret_flg; \
+			    _type_ ret_val
+
+#define TMD_RECHEAD(_FUNC_)				      \
+									 \
+			      typedef struct {				 \
+				  TIN_##_FUNC_##_REC  input;		 \
+				  TEX_##_FUNC_##_REC  expect;		 \
+				  int is_last;				 \
+			      }	  TST_##_FUNC_##_REC;			 \
+			      typedef struct {				 \
+				  TST_HEAD	      hd;		 \
+				  TST_##_FUNC_##_REC  rec[ MAX_LOC_TEST ]; \
+			      }	  TST_##_FUNC_
+
+#define TST_FTYP(func)		tst_##func##_loc
+#define TST_HEAD(func)		tst_##func##_loc[ loc ].hd
+#define TST_INPUT(func)		tst_##func##_loc[ loc ].rec[ rec ].input
+#define TST_EXPECT(func)	tst_##func##_loc[ loc ].rec[ rec ].expect
+#define TST_INPUT_SEQ(func) \
+	tst_##func##_loc[ loc ].rec[ rec ].input.seq[ seq_num ]
+#define TST_EXPECT_SEQ(func) \
+	tst_##func##_loc[ loc ].rec[ rec ].expect.seq[ seq_num ]
+#define TST_IS_LAST(func) \
+	tst_##func##_loc[ loc ].rec[ rec ].is_last
+
+
+#define TST_DECL_VARS(_type_)				\
+	int   loc, rec, err_count = 0;			\
+	int   warn_count __attribute__ ((unused));	\
+	int   func_id, seq_num = 0;			\
+	const char *locale;				\
+	int   err_flg, err_exp, ret_flg;		\
+	int errno_save = 0;				\
+	_type_ ret_exp;					\
+	_type_ ret
+
+#define TST_DO_TEST(o_func) \
+	for (loc = 0; strcmp (TST_HEAD (o_func).locale, TST_LOC_end); ++loc)
+
+
+#define TST_HEAD_LOCALE(ofunc, s_func)						\
+  func_id = TST_HEAD (ofunc).func_id;						\
+  locale  = TST_HEAD (ofunc).locale;						\
+  if (setlocale (LC_ALL, locale) == NULL)					\
+    {										\
+      fprintf (stderr, "Warning : can't set locale: %s\nskipping ...\n",	\
+	       locale);								\
+      result (fp, C_LOCALES, s_func, locale, 0, 0, 0, "can't set locale");	\
+      continue;									\
+    }
+
+#define TST_DO_REC(ofunc) \
+	for (rec=0; !TST_IS_LAST (ofunc); ++rec)
+
+#define TST_DO_SEQ(_count_) \
+	for (seq_num=0; seq_num < _count_; seq_num++)
+
+#define TST_GET_ERRET(_ofunc_)			\
+	err_flg = TST_EXPECT (_ofunc_).err_flg; \
+	err_exp = TST_EXPECT (_ofunc_).err_val; \
+	ret_flg = TST_EXPECT (_ofunc_).ret_flg; \
+	ret_exp = TST_EXPECT (_ofunc_).ret_val
+
+#define TST_GET_ERRET_SEQ(_ofunc_)		    \
+	err_flg = TST_EXPECT_SEQ (_ofunc_).err_flg; \
+	err_exp = TST_EXPECT_SEQ (_ofunc_).err_val; \
+	ret_flg = TST_EXPECT_SEQ (_ofunc_).ret_flg; \
+	ret_exp = TST_EXPECT_SEQ (_ofunc_).ret_val
+
+#define TST_CLEAR_ERRNO \
+	errno = 0
+
+#define TST_SAVE_ERRNO \
+	errno_save = errno
+
+#define TST_IF_RETURN(_s_func_)							\
+  if (err_flg == 1)								\
+    {										\
+      if (errno_save == err_exp)						\
+	{									\
+	  result (fp, C_SUCCESS, _s_func_, locale, rec+1, seq_num+1, 1,		\
+		  MS_PASSED);							\
+	}									\
+      else									\
+	{									\
+	  err_count++;								\
+	  result (fp, C_FAILURE, _s_func_, locale, rec+1, seq_num+1, 1,		\
+		  "the value of errno is different from an expected value");	\
+	}									\
+    }										\
+										\
+  if (ret_flg == 1)								\
+    {										\
+      if (ret == ret_exp)							\
+	{									\
+	  result (fp, C_SUCCESS, _s_func_, locale, rec+1, seq_num+1, 2,		\
+		  MS_PASSED);							\
+	}									\
+      else									\
+	{									\
+	  err_count++;								\
+	  result (fp, C_FAILURE, _s_func_, locale, rec+1, seq_num+1, 2,		\
+		  "the return value is different from an expected value");	\
+	}									\
+    }										\
+  else
+
+#define TEX_ERRET_REC(_type_)			\
+	struct {				\
+	    TMD_ERRET (_type_);			\
+	}
+
+#define TEX_ERRET_REC_SEQ(_type_, _count_)	\
+	struct {				\
+	    struct {				\
+		TMD_ERRET (_type_);		\
+	    } seq[ _count_ ];			\
+	}
+
+
+
+/* ------------------ FUNCTION: ISW*() ------------------- */
+
+#define TST_ISW_STRUCT(_FUNC_, _func_)			\
+	typedef						\
+	struct {					\
+	    wint_t   wc;				\
+	} TIN_ISW##_FUNC_##_REC;			\
+	typedef						\
+	TEX_ERRET_REC (int)   TEX_ISW##_FUNC_##_REC;	\
+	TMD_RECHEAD (ISW##_FUNC_)
+
+#define TST_FUNC_ISW(_FUNC_, _func_)						\
+int										\
+tst_isw##_func_ (FILE *fp, int debug_flg)					\
+{										\
+  TST_DECL_VARS(int);								\
+  wint_t wc;									\
+  TST_DO_TEST (isw##_func_)							\
+    {										\
+      TST_HEAD_LOCALE (isw##_func_, S_ISW##_FUNC_);				\
+      TST_DO_REC(isw##_func_)							\
+	{									\
+	  TST_GET_ERRET (isw##_func_);						\
+	  wc = TST_INPUT (isw##_func_).wc;					\
+	  ret = isw##_func_ (wc);						\
+	  if (debug_flg)							\
+	    {									\
+	      fprintf (stdout, "isw*() [ %s : %d ] ret = %d\n", locale,		\
+		       rec+1, ret);						\
+	    }									\
+										\
+	  TST_IF_RETURN (S_ISW##_FUNC_)						\
+	    {									\
+	      if (ret != 0)							\
+		{								\
+		  result (fp, C_SUCCESS, S_ISW##_FUNC_, locale, rec+1,		\
+			  seq_num+1, 3, MS_PASSED);				\
+		}								\
+	      else								\
+		{								\
+		  err_count++;							\
+		  result (fp, C_FAILURE, S_ISW##_FUNC_, locale, rec+1,		\
+			  seq_num+1, 3,						\
+			  "the function returned 0, but should be non-zero");	\
+		}								\
+	    }									\
+	}									\
+    }										\
+										\
+  return err_count;								\
+}
+
+
+
+/* ------------------ FUNCTION: TOW*() ------------------ */
+
+#define TST_TOW_STRUCT(_FUNC_, _func_)			\
+	typedef						\
+	struct {					\
+	    wint_t   wc;				\
+	} TIN_TOW##_FUNC_##_REC;			\
+	typedef						\
+	TEX_ERRET_REC (wint_t)	TEX_TOW##_FUNC_##_REC;	\
+	TMD_RECHEAD (TOW##_FUNC_)
+
+#define TST_FUNC_TOW(_FUNC_, _func_)					\
+int									\
+tst_tow##_func_ (FILE *fp, int debug_flg)				\
+{									\
+  TST_DECL_VARS (wint_t);						\
+  wint_t wc;								\
+  TST_DO_TEST (tow##_func_)						\
+    {									\
+      TST_HEAD_LOCALE (tow##_func_, S_TOW##_FUNC_);			\
+      TST_DO_REC (tow##_func_)						\
+	{								\
+	  TST_GET_ERRET (tow##_func_);					\
+	  wc = TST_INPUT (tow##_func_).wc;				\
+	  ret = tow##_func_ (wc);					\
+	  if (debug_flg)						\
+	    {								\
+	      fprintf (stdout, "tow*() [ %s : %d ] ret = 0x%x\n",	\
+		       locale, rec+1, ret);				\
+	    }								\
+									\
+	  TST_IF_RETURN (S_TOW##_FUNC_) { };				\
+	}								\
+    }									\
+									\
+  return err_count;							\
+}
+
+
+#endif /* TST_FUNCS_H */