xref: /llvm-project/libcxx/test/std/utilities/format/format.functions/format.pass.cpp (revision 6a54dfbfe534276d644d7f9c027f0deeb748dd53)
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