1d7444d9fSMark de Wever //===----------------------------------------------------------------------===//
2d7444d9fSMark de Wever // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
3d7444d9fSMark de Wever // See https://llvm.org/LICENSE.txt for license information.
4d7444d9fSMark de Wever // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
5d7444d9fSMark de Wever //
6d7444d9fSMark de Wever //===----------------------------------------------------------------------===//
7d7444d9fSMark de Wever 
8d7444d9fSMark de Wever // UNSUPPORTED: c++03, c++11, c++14, c++17
9d7444d9fSMark de Wever // UNSUPPORTED: libcpp-has-no-incomplete-format
10*eb12ad9dSMark de Wever // TODO FMT Evaluate gcc-12 status
11*eb12ad9dSMark de Wever // UNSUPPORTED: gcc-12
127277b00aSMark de Wever // TODO FMT Investigate AppleClang ICE
137277b00aSMark de Wever // UNSUPPORTED: apple-clang-13
14d7444d9fSMark de Wever 
15d7444d9fSMark de Wever // Note this formatter shows additional information when tests are failing.
16d7444d9fSMark de Wever // This aids the development. Since other formatters fail in the same fashion
17d7444d9fSMark de Wever // they don't have this additional output.
18d7444d9fSMark de Wever 
19d7444d9fSMark de Wever // <format>
20d7444d9fSMark de Wever 
21d7444d9fSMark de Wever // template<class... Args>
22aed5ddf8SMark de Wever //   string format(format-string<Args...> fmt, const Args&... args);
23d7444d9fSMark de Wever // template<class... Args>
24aed5ddf8SMark de Wever //   wstring format(wformat-string<Args...> fmt, const Args&... args);
25d7444d9fSMark de Wever 
26d7444d9fSMark de Wever #include <format>
27d7444d9fSMark de Wever #include <cassert>
28d550930aSMark de Wever #include <vector>
29d7444d9fSMark de Wever 
30d7444d9fSMark de Wever #include "test_macros.h"
31d7444d9fSMark de Wever #include "format_tests.h"
327277b00aSMark de Wever #include "string_literal.h"
33d7444d9fSMark de Wever 
34fedbd264SMark de Wever #ifndef TEST_HAS_NO_LOCALIZATION
35fedbd264SMark de Wever #  include <iostream>
367277b00aSMark de Wever #  include <type_traits>
37fedbd264SMark de Wever #endif
38fedbd264SMark de Wever 
397277b00aSMark de Wever auto test = []<string_literal fmt, class CharT, class... Args>(std::basic_string_view<CharT> expected,
407277b00aSMark de Wever                                                                const Args&... args) constexpr {
417277b00aSMark de Wever   std::basic_string<CharT> out = std::format(fmt.template sv<CharT>(), args...);
42fedbd264SMark de Wever #ifndef TEST_HAS_NO_LOCALIZATION
43d7444d9fSMark de Wever   if constexpr (std::same_as<CharT, char>)
44d7444d9fSMark de Wever     if (out != expected)
457277b00aSMark de Wever       std::cerr << "\nFormat string   " << fmt.template sv<char>() << "\nExpected output " << expected
467277b00aSMark de Wever                 << "\nActual output   " << out << '\n';
47d7444d9fSMark de Wever #endif
48d7444d9fSMark de Wever   assert(out == expected);
49d7444d9fSMark de Wever };
50d7444d9fSMark de Wever 
51aed5ddf8SMark de Wever auto test_exception = []<class CharT, class... Args>(std::string_view, std::basic_string_view<CharT>, const Args&...) {
52aed5ddf8SMark de Wever   // After P2216 most exceptions thrown by std::format become ill-formed.
53aed5ddf8SMark de Wever   // Therefore this tests does nothing.
54aed5ddf8SMark de Wever   // A basic ill-formed test is done in format.verify.cpp
55aed5ddf8SMark de Wever   // The exceptions are tested by other functions that don't use the basic-format-string as fmt argument.
56d7444d9fSMark de Wever };
57d7444d9fSMark de Wever 
main(int,char **)58d7444d9fSMark de Wever int main(int, char**) {
59d7444d9fSMark de Wever   format_tests<char>(test, test_exception);
60f4c1258dSLouis Dionne 
61f4c1258dSLouis Dionne #ifndef TEST_HAS_NO_WIDE_CHARACTERS
62f4c1258dSLouis Dionne   format_tests_char_to_wchar_t(test);
63d7444d9fSMark de Wever   format_tests<wchar_t>(test, test_exception);
64f4c1258dSLouis Dionne #endif
65d7444d9fSMark de Wever 
66d7444d9fSMark de Wever   return 0;
67d7444d9fSMark de Wever }
68