Loading...
tests/querylocale.c /dev/null Libc-1698.100.8
--- /dev/null
+++ Libc/Libc-1698.100.8/tests/querylocale.c
@@ -0,0 +1,104 @@
+/*
+* Copyright (c) 2023 Apple Inc. All rights reserved.
+*
+* @APPLE_LICENSE_HEADER_START@
+*
+* This file contains Original Code and/or Modifications of Original Code
+* as defined in and that are subject to the Apple Public Source License
+* Version 2.0 (the 'License'). You may not use this file except in
+* compliance with the License. Please obtain a copy of the License at
+* http://www.opensource.apple.com/apsl/ and read it before using this
+* file.
+*
+* The Original Code and all software distributed under the License are
+* distributed on an 'AS IS' basis, WITHOUT WARRANTY OF ANY KIND, EITHER
+* EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES,
+* INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY,
+* FITNESS FOR A PARTICULAR PURPOSE, QUIET ENJOYMENT OR NON-INFRINGEMENT.
+* Please see the License for the specific language governing rights and
+* limitations under the License.
+*
+* @APPLE_LICENSE_HEADER_END@
+*/
+
+#include <locale.h>
+#include <xlocale.h>
+
+#include <darwintest.h>
+#include <TargetConditionals.h>
+
+#ifndef nitems
+#define	nitems(x)	(sizeof((x)) / sizeof((x)[0]))
+#endif
+
+/*
+ * We don't install the necessary localedata on embedded platforms to be able to
+ * usefully run this tests, so just limit it to macOS.
+ */
+T_DECL(querylocale_names, "Check that querylocale() returns names",
+    T_META_ENABLED(TARGET_OS_OSX))
+{
+	const char *lcat;
+	int mask = LC_ALL_MASK;
+
+	T_ASSERT_EQ_STR("en_US.UTF-8", setlocale(LC_ALL, "en_US.UTF-8"), NULL);
+
+	while (mask != 0) {
+		lcat = querylocale(mask, NULL);
+
+		T_ASSERT_EQ_STR("en_US.UTF-8", lcat, NULL);
+		mask &= ~(1 << (ffs(mask) - 1));
+	}
+}
+
+T_DECL(querylocale_newlocale_names,
+    "Check that querylocale() returns names for newlocale() locales",
+    T_META_ENABLED(TARGET_OS_OSX))
+{
+	const char *lcat;
+	locale_t nlocale;
+	int mask = LC_ALL_MASK;
+
+	nlocale = newlocale(LC_ALL_MASK, "en_US.UTF-8", NULL);
+
+	while (mask != 0) {
+		lcat = querylocale(mask, nlocale);
+
+		T_ASSERT_EQ_STR("en_US.UTF-8", lcat, NULL);
+		mask &= ~(1 << (ffs(mask) - 1));
+	}
+
+	freelocale(nlocale);
+}
+
+/* We expect alphabetical order. */
+static int order_mapping[] = {
+	[0] = LC_COLLATE,
+	[1] = LC_CTYPE,
+	[2] = LC_MESSAGES,
+	[3] = LC_MONETARY,
+	[4] = LC_NUMERIC,
+	[5] = LC_TIME,
+};
+
+T_DECL(querylocale_order, "Check the querylocale() mask mapping",
+    T_META_ENABLED(TARGET_OS_OSX))
+{
+	const char *lcat;
+	int cat;
+
+	for (size_t i = 0; i < nitems(order_mapping); i++) {
+		cat = order_mapping[i];
+
+		T_QUIET;
+		T_ASSERT_EQ_STR("C", setlocale(cat, NULL), NULL);
+
+		T_ASSERT_EQ_STR("en_US.UTF-8", setlocale(cat, "en_US.UTF-8"),
+		    NULL);
+
+		lcat = querylocale(1 << i, NULL);
+		T_ASSERT_EQ_STR("en_US.UTF-8", lcat, NULL);
+
+		T_ASSERT_EQ_STR("C", setlocale(cat, "C"), NULL);
+	}
+}