1d7444d9fSMark de Wever //===----------------------------------------------------------------------===// 2*6a54dfbfSLouis Dionne // 3d7444d9fSMark de Wever // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. 4d7444d9fSMark de Wever // See https://llvm.org/LICENSE.txt for license information. 5d7444d9fSMark de Wever // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception 6d7444d9fSMark de Wever // 7d7444d9fSMark de Wever //===----------------------------------------------------------------------===// 8d7444d9fSMark de Wever 9d7444d9fSMark de Wever // UNSUPPORTED: c++03, c++11, c++14, c++17 10520c7fbbSLouis Dionne // UNSUPPORTED: GCC-ALWAYS_INLINE-FIXME 11d7444d9fSMark de Wever 12f0fc8c48SLouis Dionne // XFAIL: availability-fp_to_chars-missing 133d334df5SLouis Dionne 14d7444d9fSMark de Wever // Note this formatter shows additional information when tests are failing. 15d7444d9fSMark de Wever // This aids the development. Since other formatters fail in the same fashion 16d7444d9fSMark de Wever // they don't have this additional output. 17d7444d9fSMark de Wever 18d7444d9fSMark de Wever // <format> 19d7444d9fSMark de Wever 20d7444d9fSMark de Wever // template<class... Args> 21aed5ddf8SMark de Wever // string format(format-string<Args...> fmt, const Args&... args); 22d7444d9fSMark de Wever // template<class... Args> 23aed5ddf8SMark de Wever // wstring format(wformat-string<Args...> fmt, const Args&... args); 24d7444d9fSMark de Wever 25d7444d9fSMark de Wever #include <format> 26d7444d9fSMark de Wever #include <cassert> 27d550930aSMark de Wever #include <vector> 28d7444d9fSMark de Wever 29d7444d9fSMark de Wever #include "test_macros.h" 30d7444d9fSMark de Wever #include "format_tests.h" 317277b00aSMark de Wever #include "string_literal.h" 326195bdb9SMark de Wever #include "test_format_string.h" 33f8bed136SMark de Wever #include "assert_macros.h" 343476b56fSMark de Wever #include "concat_macros.h" 35fedbd264SMark de Wever 366195bdb9SMark de Wever auto test = 376195bdb9SMark de Wever []<class CharT, class... Args>( 386195bdb9SMark de Wever std::basic_string_view<CharT> expected, test_format_string<CharT, Args...> fmt, Args&&... args) constexpr { 396195bdb9SMark de Wever std::basic_string<CharT> out = std::format(fmt, std::forward<Args>(args)...); 40f8bed136SMark de Wever TEST_REQUIRE( 41f8bed136SMark de Wever out == expected, 423476b56fSMark de Wever TEST_WRITE_CONCATENATED( 43f8bed136SMark de Wever "\nFormat string ", fmt.get(), "\nExpected output ", expected, "\nActual output ", out, '\n')); 44d7444d9fSMark de Wever }; 45d7444d9fSMark de Wever 466195bdb9SMark de Wever auto test_exception = []<class CharT, class... Args>(std::string_view, std::basic_string_view<CharT>, Args&&...) { 47aed5ddf8SMark de Wever // After P2216 most exceptions thrown by std::format become ill-formed. 48aed5ddf8SMark de Wever // Therefore this tests does nothing. 49aed5ddf8SMark de Wever // A basic ill-formed test is done in format.verify.cpp 50aed5ddf8SMark de Wever // The exceptions are tested by other functions that don't use the basic-format-string as fmt argument. 51d7444d9fSMark de Wever }; 52d7444d9fSMark de Wever 53d7444d9fSMark de Wever int main(int, char**) { 5449d4fee9SMark de Wever format_tests<char, execution_modus::full>(test, test_exception); 55f4c1258dSLouis Dionne 56f4c1258dSLouis Dionne #ifndef TEST_HAS_NO_WIDE_CHARACTERS 57f4c1258dSLouis Dionne format_tests_char_to_wchar_t(test); 5849d4fee9SMark de Wever format_tests<wchar_t, execution_modus::full>(test, test_exception); 59f4c1258dSLouis Dionne #endif 60d7444d9fSMark de Wever 61d7444d9fSMark de Wever return 0; 62d7444d9fSMark de Wever } 63