Loading...
tests/fwide.c /dev/null Libc-1583.0.14
--- /dev/null
+++ Libc/Libc-1583.0.14/tests/fwide.c
@@ -0,0 +1,52 @@
+#include <stdio.h>
+#include <wchar.h>
+
+#include <darwintest.h>
+#include <paths.h>
+
+#define	FWIDE_TEST_PATH	_PATH_DEV "zero"
+
+/*
+ * These mostly test fgets/fgetwc, but they can point to issues with the
+ * underlying orientation tracking.
+ */
+
+T_DECL(fwide_fgets,
+    "Test that fgets(3) sets the stream orientation to byte-oriented")
+{
+	FILE *fp;
+	char buf[1];
+
+	fp = fopen(FWIDE_TEST_PATH, "r");
+	T_WITH_ERRNO;
+	T_ASSERT_NOTNULL(fp, NULL);
+
+	T_ASSERT_EQ(fgets(&buf[0], sizeof(buf), fp), &buf[0], NULL);
+	T_ASSERT_LT(fwide(fp, 0), 0, NULL);
+}
+
+T_DECL(fwide_fgetwc,
+    "Test that fgetwc(3) sets the stream orientation to wide-oriented")
+{
+	FILE *fp;
+
+	fp = fopen(FWIDE_TEST_PATH, "r");
+	T_WITH_ERRNO;
+	T_ASSERT_NOTNULL(fp, NULL);
+
+	T_ASSERT_EQ(fgetwc(fp), 0, NULL);
+	T_ASSERT_GT(fwide(fp, 0), 0, NULL);
+}
+
+T_DECL(fwide_nop, "Test that fwide(3) is a nop after orientation is set")
+{
+	FILE *fp;
+
+	fp = fopen(FWIDE_TEST_PATH, "r");
+	T_WITH_ERRNO;
+	T_ASSERT_NOTNULL(fp, NULL);
+
+	T_ASSERT_EQ(fwide(fp, 0), 0, NULL);
+	T_ASSERT_EQ(fgetwc(fp), 0, NULL);
+	T_ASSERT_GT(fwide(fp, -1), 0, NULL);
+}