Loading...
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 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); } } |