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 // <format>
16d7444d9fSMark de Wever
17d7444d9fSMark de Wever // string vformat(string_view fmt, format_args args);
18d7444d9fSMark de Wever // wstring vformat(wstring_view fmt, wformat_args args);
19d7444d9fSMark de Wever
20d7444d9fSMark de Wever #include <format>
21d7444d9fSMark de Wever #include <cassert>
22d550930aSMark de Wever #include <vector>
23d7444d9fSMark de Wever
24d7444d9fSMark de Wever #include "test_macros.h"
25d7444d9fSMark de Wever #include "format_tests.h"
267277b00aSMark de Wever #include "string_literal.h"
27d7444d9fSMark de Wever
287277b00aSMark de Wever auto test = []<string_literal fmt, class CharT, class... Args>(std::basic_string_view<CharT> expected,
297277b00aSMark de Wever const Args&... args) constexpr {
307277b00aSMark de Wever std::basic_string<CharT> out =
317277b00aSMark de Wever std::vformat(fmt.template sv<CharT>(), std::make_format_args<context_t<CharT>>(args...));
32d7444d9fSMark de Wever assert(out == expected);
33d7444d9fSMark de Wever };
34d7444d9fSMark de Wever
35e885b113SMark de Wever auto test_exception = []<class CharT, class... Args>(std::string_view what, std::basic_string_view<CharT> fmt,
36e885b113SMark de Wever const Args&... args) {
37d7444d9fSMark de Wever #ifndef TEST_HAS_NO_EXCEPTIONS
38d7444d9fSMark de Wever try {
39cb71d77cSCasey Carter TEST_IGNORE_NODISCARD std::vformat(fmt, std::make_format_args<context_t<CharT>>(args...));
40d7444d9fSMark de Wever assert(false);
41e885b113SMark de Wever } catch ([[maybe_unused]] const std::format_error& e) {
42d7444d9fSMark de Wever LIBCPP_ASSERT(e.what() == what);
43d7444d9fSMark de Wever return;
44d7444d9fSMark de Wever }
45d7444d9fSMark de Wever assert(false);
46cb71d77cSCasey Carter #endif
47d7444d9fSMark de Wever (void)what;
48d7444d9fSMark de Wever (void)fmt;
49d7444d9fSMark de Wever (void)sizeof...(args);
50d7444d9fSMark de Wever };
51d7444d9fSMark de Wever
main(int,char **)52d7444d9fSMark de Wever int main(int, char**) {
53d7444d9fSMark de Wever format_tests<char>(test, test_exception);
54f4c1258dSLouis Dionne
55f4c1258dSLouis Dionne #ifndef TEST_HAS_NO_WIDE_CHARACTERS
56f4c1258dSLouis Dionne format_tests_char_to_wchar_t(test);
57d7444d9fSMark de Wever format_tests<wchar_t>(test, test_exception);
58f4c1258dSLouis Dionne #endif
59d7444d9fSMark de Wever
60d7444d9fSMark de Wever return 0;
61d7444d9fSMark de Wever }
62