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