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