1 //===----------------------------------------------------------------------===// 2 // 3 // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. 4 // See https://llvm.org/LICENSE.txt for license information. 5 // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception 6 // 7 //===----------------------------------------------------------------------===// 8 9 #ifndef TEST_STD_THREAD_THREAD_THREADS_THREAD_THREAD_CLASS_THREAD_THREAD_ID_FORMAT_FUNCTIONS_TESTS_H 10 #define TEST_STD_THREAD_THREAD_THREADS_THREAD_THREAD_CLASS_THREAD_THREAD_ID_FORMAT_FUNCTIONS_TESTS_H 11 12 #include <thread> 13 14 #include "format.functions.common.h" 15 #include "test_macros.h" 16 17 template <class CharT, class TestFunction, class ExceptionTest> 18 void format_tests(TestFunction check, ExceptionTest check_exception) { 19 // Note the output of std::thread::id is unspecified. The output text is the 20 // same as the stream operator. Since that format is already released this 21 // test follows the practice on existing systems. 22 std::thread::id input{}; 23 24 /***** Test the type specific part *****/ 25 #if !defined(__APPLE__) && !defined(__FreeBSD__) 26 check(SV("0"), SV("{}"), input); 27 check(SV("0^42"), SV("{}^42"), input); 28 check(SV("0^42"), SV("{:}^42"), input); 29 30 // *** align-fill & width *** 31 check(SV(" 0"), SV("{:5}"), input); 32 check(SV("0****"), SV("{:*<5}"), input); 33 check(SV("__0__"), SV("{:_^5}"), input); 34 check(SV("::::0"), SV("{::>5}"), input); // This is not a range, so : is allowed as fill character. 35 36 check(SV(" 0"), SV("{:{}}"), input, 5); 37 check(SV("0****"), SV("{:*<{}}"), input, 5); 38 check(SV("__0__"), SV("{:_^{}}"), input, 5); 39 check(SV("####0"), SV("{:#>{}}"), input, 5); 40 #else // !defined(__APPLE__) && !defined(__FreeBSD__) 41 check(SV("0x0"), SV("{}"), input); 42 check(SV("0x0^42"), SV("{}^42"), input); 43 check(SV("0x0^42"), SV("{:}^42"), input); 44 45 // *** align-fill & width *** 46 check(SV(" 0x0"), SV("{:7}"), input); 47 check(SV("0x0****"), SV("{:*<7}"), input); 48 check(SV("__0x0__"), SV("{:_^7}"), input); 49 check(SV("::::0x0"), SV("{::>7}"), input); // This is not a range, so : is allowed as fill character. 50 51 check(SV(" 0x0"), SV("{:{}}"), input, 7); 52 check(SV("0x0****"), SV("{:*<{}}"), input, 7); 53 check(SV("__0x0__"), SV("{:_^{}}"), input, 7); 54 check(SV("####0x0"), SV("{:#>{}}"), input, 7); 55 #endif // !defined(__APPLE__) && !defined(__FreeBSD__) 56 57 /***** Test the type generic part *****/ 58 check_exception("The format string contains an invalid escape sequence", SV("{:}<}"), input); 59 check_exception("The fill option contains an invalid value", SV("{:{<}"), input); 60 61 // *** sign *** 62 check_exception("The replacement field misses a terminating '}'", SV("{:-}"), input); 63 check_exception("The replacement field misses a terminating '}'", SV("{:+}"), input); 64 check_exception("The replacement field misses a terminating '}'", SV("{: }"), input); 65 66 // *** alternate form *** 67 check_exception("The replacement field misses a terminating '}'", SV("{:#}"), input); 68 69 // *** zero-padding *** 70 check_exception("The width option should not have a leading zero", SV("{:0}"), input); 71 72 // *** precision *** 73 check_exception("The replacement field misses a terminating '}'", SV("{:.}"), input); 74 75 // *** locale-specific form *** 76 check_exception("The replacement field misses a terminating '}'", SV("{:L}"), input); 77 78 // *** type *** 79 for (std::basic_string_view<CharT> fmt : fmt_invalid_types<CharT>("")) 80 check_exception("The replacement field misses a terminating '}'", fmt, input); 81 } 82 83 #endif // TEST_STD_THREAD_THREAD_THREADS_THREAD_THREAD_CLASS_THREAD_THREAD_ID_FORMAT_FUNCTIONS_TESTS_H 84