1cb99919912c4af4eddfab6769ee0419256cf5f6aVictor Zverovich/*
2cb99919912c4af4eddfab6769ee0419256cf5f6aVictor Zverovich Formatting library tests.
3faccb4c765ec41ca20b3f4ba64821c4a88303d48Victor Zverovich
49cf43ccdaddcbd2cd856b52f0a0dd62825b19a89Victor Zverovich Copyright (c) 2012-2014, Victor Zverovich
5faccb4c765ec41ca20b3f4ba64821c4a88303d48Victor Zverovich All rights reserved.
6faccb4c765ec41ca20b3f4ba64821c4a88303d48Victor Zverovich
7faccb4c765ec41ca20b3f4ba64821c4a88303d48Victor Zverovich Redistribution and use in source and binary forms, with or without
8faccb4c765ec41ca20b3f4ba64821c4a88303d48Victor Zverovich modification, are permitted provided that the following conditions are met:
9faccb4c765ec41ca20b3f4ba64821c4a88303d48Victor Zverovich
10faccb4c765ec41ca20b3f4ba64821c4a88303d48Victor Zverovich 1. Redistributions of source code must retain the above copyright notice, this
11faccb4c765ec41ca20b3f4ba64821c4a88303d48Victor Zverovich    list of conditions and the following disclaimer.
12faccb4c765ec41ca20b3f4ba64821c4a88303d48Victor Zverovich 2. Redistributions in binary form must reproduce the above copyright notice,
13faccb4c765ec41ca20b3f4ba64821c4a88303d48Victor Zverovich    this list of conditions and the following disclaimer in the documentation
14faccb4c765ec41ca20b3f4ba64821c4a88303d48Victor Zverovich    and/or other materials provided with the distribution.
15faccb4c765ec41ca20b3f4ba64821c4a88303d48Victor Zverovich
16faccb4c765ec41ca20b3f4ba64821c4a88303d48Victor Zverovich THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
17faccb4c765ec41ca20b3f4ba64821c4a88303d48Victor Zverovich ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
18faccb4c765ec41ca20b3f4ba64821c4a88303d48Victor Zverovich WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
19faccb4c765ec41ca20b3f4ba64821c4a88303d48Victor Zverovich DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR
20faccb4c765ec41ca20b3f4ba64821c4a88303d48Victor Zverovich ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
21faccb4c765ec41ca20b3f4ba64821c4a88303d48Victor Zverovich (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
22faccb4c765ec41ca20b3f4ba64821c4a88303d48Victor Zverovich LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
23faccb4c765ec41ca20b3f4ba64821c4a88303d48Victor Zverovich ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
24faccb4c765ec41ca20b3f4ba64821c4a88303d48Victor Zverovich (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
25faccb4c765ec41ca20b3f4ba64821c4a88303d48Victor Zverovich SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
26cb99919912c4af4eddfab6769ee0419256cf5f6aVictor Zverovich */
27cb99919912c4af4eddfab6769ee0419256cf5f6aVictor Zverovich
2863d1fca94f91b8989e0a16c72fe2eae88141ec46Victor Zverovich#include <cctype>
29cb99919912c4af4eddfab6769ee0419256cf5f6aVictor Zverovich#include <cfloat>
30cb99919912c4af4eddfab6769ee0419256cf5f6aVictor Zverovich#include <climits>
31f68771abe4b536a15889477b428985125a8cc5f2vitaut#include <clocale>
32acf94abffdfe9a0953fad22d70b6ab096f6af0d1Victor Zverovich#include <cmath>
33cb99919912c4af4eddfab6769ee0419256cf5f6aVictor Zverovich#include <cstring>
3459536b154c7c0a789d9c3a3a0b4bdca0254910a2Victor Zverovich#include <memory>
356a98f42336843f3c020ed22d26bcb36964262e0aVictor Zverovich#include <stdint.h>
366a98f42336843f3c020ed22d26bcb36964262e0aVictor Zverovich
37313b259891d9f784c817db397de462bccb397bc6Victor Zverovich#if FMT_USE_TYPE_TRAITS
38313b259891d9f784c817db397de462bccb397bc6Victor Zverovich# include <type_traits>
39313b259891d9f784c817db397de462bccb397bc6Victor Zverovich#endif
40313b259891d9f784c817db397de462bccb397bc6Victor Zverovich
416a98f42336843f3c020ed22d26bcb36964262e0aVictor Zverovich#include "gmock/gmock.h"
42c7f2c658a01cb0f8126f7d2f9775363d53af8d8fVictor Zverovich
43c669cbedf88157f7660d97083f6f389909327cc2vitaut// Test that the library compiles if None is defined to 0 as done by xlib.h.
44c669cbedf88157f7660d97083f6f389909327cc2vitaut#define None 0
45c669cbedf88157f7660d97083f6f389909327cc2vitaut
46e2a332e5df1783580c42f62eb7f4bef04d8000b2Victor Zverovichstruct LocaleMock {
47e2a332e5df1783580c42f62eb7f4bef04d8000b2Victor Zverovich  static LocaleMock *instance;
48e2a332e5df1783580c42f62eb7f4bef04d8000b2Victor Zverovich
49e2a332e5df1783580c42f62eb7f4bef04d8000b2Victor Zverovich  MOCK_METHOD0(localeconv, lconv *());
50e2a332e5df1783580c42f62eb7f4bef04d8000b2Victor Zverovich} *LocaleMock::instance;
51e2a332e5df1783580c42f62eb7f4bef04d8000b2Victor Zverovich
52e2a332e5df1783580c42f62eb7f4bef04d8000b2Victor Zverovichnamespace fmt {
53e2a332e5df1783580c42f62eb7f4bef04d8000b2Victor Zverovichnamespace std {
54e2a332e5df1783580c42f62eb7f4bef04d8000b2Victor Zverovichusing namespace ::std;
55e2a332e5df1783580c42f62eb7f4bef04d8000b2Victor Zverovichlconv *localeconv() {
56e2a332e5df1783580c42f62eb7f4bef04d8000b2Victor Zverovich  return LocaleMock::instance ?
57e2a332e5df1783580c42f62eb7f4bef04d8000b2Victor Zverovich        LocaleMock::instance->localeconv() : ::std::localeconv();
58e2a332e5df1783580c42f62eb7f4bef04d8000b2Victor Zverovich}
59e2a332e5df1783580c42f62eb7f4bef04d8000b2Victor Zverovich}
60e2a332e5df1783580c42f62eb7f4bef04d8000b2Victor Zverovich}
61e2a332e5df1783580c42f62eb7f4bef04d8000b2Victor Zverovich
62afd67497deba09b4890339a6349bab24b0ecdb1cVictor Zverovich#include "fmt/format.h"
63fa5ebd27d40348f019a58cc9035d7d6bf68b8ccfVictor Zverovich
64fb32161fa49d038886812833bcc828fa65059826Victor Zverovich#include "util.h"
65d1ded569ff012d950023de62288925258663b65bVictor Zverovich#include "mock-allocator.h"
66fb32161fa49d038886812833bcc828fa65059826Victor Zverovich#include "gtest-extra.h"
67fb32161fa49d038886812833bcc828fa65059826Victor Zverovich
688308da46e6890f28de12ef587f9bc069bf8c0157Victor Zverovich#undef min
698308da46e6890f28de12ef587f9bc069bf8c0157Victor Zverovich#undef max
708308da46e6890f28de12ef587f9bc069bf8c0157Victor Zverovich
71cb99919912c4af4eddfab6769ee0419256cf5f6aVictor Zverovichusing std::size_t;
72cb99919912c4af4eddfab6769ee0419256cf5f6aVictor Zverovich
7303dccc3c918c67cfbebadd3a774f59701fc1485aVictor Zverovichusing fmt::BasicWriter;
74e06e9f885c966528e0fecd1531abe0012d71ed73Victor Zverovichusing fmt::format;
755f3ed207da5a2e716177e1ee8e6a9d39c628d8c6Victor Zverovichusing fmt::FormatError;
762baf6d3030d3ebc3b34eed12cb9138a5ac84489fVictor Zverovichusing fmt::StringRef;
77438bd9b0e6328f63fc50dab09b74b657491c1189vitautusing fmt::CStringRef;
78d1ded569ff012d950023de62288925258663b65bVictor Zverovichusing fmt::MemoryWriter;
79d1ded569ff012d950023de62288925258663b65bVictor Zverovichusing fmt::WMemoryWriter;
80877abaf301cab9d422d4942ec5878cd48912bacdVictor Zverovichusing fmt::pad;
815f3ed207da5a2e716177e1ee8e6a9d39c628d8c6Victor Zverovich
82063d0077b3194c8846c896804ffdc38e30d8946dVictor Zverovichnamespace {
83063d0077b3194c8846c896804ffdc38e30d8946dVictor Zverovich
84673a4525f6383e2bdb7b98d5153206c23b88cebfvitaut// Format value using the standard library.
85673a4525f6383e2bdb7b98d5153206c23b88cebfvitauttemplate <typename Char, typename T>
863e379829a0581a6163ee6a5bbff7e3b715d9c704vitautvoid std_format(const T &value, std::basic_string<Char> &result) {
87673a4525f6383e2bdb7b98d5153206c23b88cebfvitaut  std::basic_ostringstream<Char> os;
88673a4525f6383e2bdb7b98d5153206c23b88cebfvitaut  os << value;
893e379829a0581a6163ee6a5bbff7e3b715d9c704vitaut  result = os.str();
90673a4525f6383e2bdb7b98d5153206c23b88cebfvitaut}
91673a4525f6383e2bdb7b98d5153206c23b88cebfvitaut
92673a4525f6383e2bdb7b98d5153206c23b88cebfvitaut#ifdef __MINGW32__
93673a4525f6383e2bdb7b98d5153206c23b88cebfvitaut// Workaround a bug in formatting long double in MinGW.
943e379829a0581a6163ee6a5bbff7e3b715d9c704vitautvoid std_format(long double value, std::string &result) {
95673a4525f6383e2bdb7b98d5153206c23b88cebfvitaut  char buffer[100];
9685b985e9f28c059f53fdc464ccb1f1304d4ce0e7vitaut  safe_sprintf(buffer, "%Lg", value);
973e379829a0581a6163ee6a5bbff7e3b715d9c704vitaut  result = buffer;
98673a4525f6383e2bdb7b98d5153206c23b88cebfvitaut}
993e03934d15dd1c135e1a3766c6906e7c84d111b5vitautvoid std_format(long double value, std::wstring &result) {
1003e03934d15dd1c135e1a3766c6906e7c84d111b5vitaut  wchar_t buffer[100];
1013e03934d15dd1c135e1a3766c6906e7c84d111b5vitaut  swprintf(buffer, L"%Lg", value);
1023e03934d15dd1c135e1a3766c6906e7c84d111b5vitaut  result = buffer;
1033e03934d15dd1c135e1a3766c6906e7c84d111b5vitaut}
104673a4525f6383e2bdb7b98d5153206c23b88cebfvitaut#endif
105673a4525f6383e2bdb7b98d5153206c23b88cebfvitaut
106b605b3980c078f2fca9dc1313db02841c4a470a7Victor Zverovich// Checks if writing value to BasicWriter<Char> produces the same result
107b605b3980c078f2fca9dc1313db02841c4a470a7Victor Zverovich// as writing it to std::basic_ostringstream<Char>.
108b605b3980c078f2fca9dc1313db02841c4a470a7Victor Zverovichtemplate <typename Char, typename T>
1098f8fd769eef9b47339a3232e34b2696ccdc1b20bVictor Zverovich::testing::AssertionResult check_write(const T &value, const char *type) {
110d1ded569ff012d950023de62288925258663b65bVictor Zverovich  std::basic_string<Char> actual =
111d1ded569ff012d950023de62288925258663b65bVictor Zverovich      (fmt::BasicMemoryWriter<Char>() << value).str();
1123e379829a0581a6163ee6a5bbff7e3b715d9c704vitaut  std::basic_string<Char> expected;
11385b985e9f28c059f53fdc464ccb1f1304d4ce0e7vitaut  std_format(value, expected);
114b605b3980c078f2fca9dc1313db02841c4a470a7Victor Zverovich  if (expected == actual)
115b605b3980c078f2fca9dc1313db02841c4a470a7Victor Zverovich    return ::testing::AssertionSuccess();
116b605b3980c078f2fca9dc1313db02841c4a470a7Victor Zverovich  return ::testing::AssertionFailure()
117e63a0ff12564ed2a1567d5bf11875d28580292fbVictor Zverovich      << "Value of: (Writer<" << type << ">() << value).str()\n"
118b605b3980c078f2fca9dc1313db02841c4a470a7Victor Zverovich      << "  Actual: " << actual << "\n"
119b605b3980c078f2fca9dc1313db02841c4a470a7Victor Zverovich      << "Expected: " << expected << "\n";
120b605b3980c078f2fca9dc1313db02841c4a470a7Victor Zverovich}
121b605b3980c078f2fca9dc1313db02841c4a470a7Victor Zverovich
122b605b3980c078f2fca9dc1313db02841c4a470a7Victor Zverovichstruct AnyWriteChecker {
123aefb3bb918bc93ca3c76135f8b421118761490b1Victor Zverovich  template <typename T>
124aefb3bb918bc93ca3c76135f8b421118761490b1Victor Zverovich  ::testing::AssertionResult operator()(const char *, const T &value) const {
1258f8fd769eef9b47339a3232e34b2696ccdc1b20bVictor Zverovich    ::testing::AssertionResult result = check_write<char>(value, "char");
1268f8fd769eef9b47339a3232e34b2696ccdc1b20bVictor Zverovich    return result ? check_write<wchar_t>(value, "wchar_t") : result;
127aefb3bb918bc93ca3c76135f8b421118761490b1Victor Zverovich  }
128aefb3bb918bc93ca3c76135f8b421118761490b1Victor Zverovich};
129aefb3bb918bc93ca3c76135f8b421118761490b1Victor Zverovich
13000c9fcf1fed36971f30890f65d41be2f41ea0d16Victor Zverovichtemplate <typename Char>
13100c9fcf1fed36971f30890f65d41be2f41ea0d16Victor Zverovichstruct WriteChecker {
132b605b3980c078f2fca9dc1313db02841c4a470a7Victor Zverovich  template <typename T>
133b605b3980c078f2fca9dc1313db02841c4a470a7Victor Zverovich  ::testing::AssertionResult operator()(const char *, const T &value) const {
1348f8fd769eef9b47339a3232e34b2696ccdc1b20bVictor Zverovich    return check_write<Char>(value, "char");
135b605b3980c078f2fca9dc1313db02841c4a470a7Victor Zverovich  }
136b605b3980c078f2fca9dc1313db02841c4a470a7Victor Zverovich};
137b605b3980c078f2fca9dc1313db02841c4a470a7Victor Zverovich
138b605b3980c078f2fca9dc1313db02841c4a470a7Victor Zverovich// Checks if writing value to BasicWriter produces the same result
139b605b3980c078f2fca9dc1313db02841c4a470a7Victor Zverovich// as writing it to std::ostringstream both for char and wchar_t.
14000c9fcf1fed36971f30890f65d41be2f41ea0d16Victor Zverovich#define CHECK_WRITE(value) EXPECT_PRED_FORMAT1(AnyWriteChecker(), value)
141b605b3980c078f2fca9dc1313db02841c4a470a7Victor Zverovich
1421cc61329aefc13822db90c67c545d90210073bc0Victor Zverovich#define CHECK_WRITE_CHAR(value) \
1431cc61329aefc13822db90c67c545d90210073bc0Victor Zverovich  EXPECT_PRED_FORMAT1(WriteChecker<char>(), value)
1441cc61329aefc13822db90c67c545d90210073bc0Victor Zverovich#define CHECK_WRITE_WCHAR(value) \
1451cc61329aefc13822db90c67c545d90210073bc0Victor Zverovich  EXPECT_PRED_FORMAT1(WriteChecker<wchar_t>(), value)
1468f8fd769eef9b47339a3232e34b2696ccdc1b20bVictor Zverovich}  // namespace
1475c639eb4c40016742b4c34372a534a97e03be422Victor Zverovich
148438bd9b0e6328f63fc50dab09b74b657491c1189vitautTEST(StringRefTest, Ctor) {
149438bd9b0e6328f63fc50dab09b74b657491c1189vitaut  EXPECT_STREQ("abc", StringRef("abc").data());
150438bd9b0e6328f63fc50dab09b74b657491c1189vitaut  EXPECT_EQ(3u, StringRef("abc").size());
151438bd9b0e6328f63fc50dab09b74b657491c1189vitaut
152438bd9b0e6328f63fc50dab09b74b657491c1189vitaut  EXPECT_STREQ("defg", StringRef(std::string("defg")).data());
153438bd9b0e6328f63fc50dab09b74b657491c1189vitaut  EXPECT_EQ(4u, StringRef(std::string("defg")).size());
154438bd9b0e6328f63fc50dab09b74b657491c1189vitaut}
155438bd9b0e6328f63fc50dab09b74b657491c1189vitaut
156438bd9b0e6328f63fc50dab09b74b657491c1189vitautTEST(StringRefTest, ConvertToString) {
157438bd9b0e6328f63fc50dab09b74b657491c1189vitaut  std::string s = StringRef("abc").to_string();
158438bd9b0e6328f63fc50dab09b74b657491c1189vitaut  EXPECT_EQ("abc", s);
159438bd9b0e6328f63fc50dab09b74b657491c1189vitaut}
160438bd9b0e6328f63fc50dab09b74b657491c1189vitaut
161438bd9b0e6328f63fc50dab09b74b657491c1189vitautTEST(CStringRefTest, Ctor) {
162438bd9b0e6328f63fc50dab09b74b657491c1189vitaut  EXPECT_STREQ("abc", CStringRef("abc").c_str());
163438bd9b0e6328f63fc50dab09b74b657491c1189vitaut  EXPECT_STREQ("defg", CStringRef(std::string("defg")).c_str());
164438bd9b0e6328f63fc50dab09b74b657491c1189vitaut}
165438bd9b0e6328f63fc50dab09b74b657491c1189vitaut
166313b259891d9f784c817db397de462bccb397bc6Victor Zverovich#if FMT_USE_TYPE_TRAITS
167313b259891d9f784c817db397de462bccb397bc6Victor ZverovichTEST(WriterTest, NotCopyConstructible) {
168313b259891d9f784c817db397de462bccb397bc6Victor Zverovich  EXPECT_FALSE(std::is_copy_constructible<BasicWriter<char> >::value);
169313b259891d9f784c817db397de462bccb397bc6Victor Zverovich}
170313b259891d9f784c817db397de462bccb397bc6Victor Zverovich
171313b259891d9f784c817db397de462bccb397bc6Victor ZverovichTEST(WriterTest, NotCopyAssignable) {
172313b259891d9f784c817db397de462bccb397bc6Victor Zverovich  EXPECT_FALSE(std::is_copy_assignable<BasicWriter<char> >::value);
173313b259891d9f784c817db397de462bccb397bc6Victor Zverovich}
174313b259891d9f784c817db397de462bccb397bc6Victor Zverovich#endif
175313b259891d9f784c817db397de462bccb397bc6Victor Zverovich
176bcef11c0d1311e93d399b1f48eb06197f5e90747Victor ZverovichTEST(WriterTest, Ctor) {
177d1ded569ff012d950023de62288925258663b65bVictor Zverovich  MemoryWriter w;
178ca171307f3bee845aba1e6293fb45ca907f74ec4Victor Zverovich  EXPECT_EQ(0u, w.size());
179ca171307f3bee845aba1e6293fb45ca907f74ec4Victor Zverovich  EXPECT_STREQ("", w.c_str());
180ca171307f3bee845aba1e6293fb45ca907f74ec4Victor Zverovich  EXPECT_EQ("", w.str());
181ca171307f3bee845aba1e6293fb45ca907f74ec4Victor Zverovich}
182ca171307f3bee845aba1e6293fb45ca907f74ec4Victor Zverovich
18308b0741fa7a3082ec60a9198dd4e7310db69523bVictor Zverovich#if FMT_USE_RVALUE_REFERENCES
18408b0741fa7a3082ec60a9198dd4e7310db69523bVictor Zverovich
185d1ded569ff012d950023de62288925258663b65bVictor Zverovichvoid check_move_writer(const std::string &str, MemoryWriter &w) {
186d1ded569ff012d950023de62288925258663b65bVictor Zverovich  MemoryWriter w2(std::move(w));
18708b0741fa7a3082ec60a9198dd4e7310db69523bVictor Zverovich  // Move shouldn't destroy the inline content of the first writer.
18808b0741fa7a3082ec60a9198dd4e7310db69523bVictor Zverovich  EXPECT_EQ(str, w.str());
18908b0741fa7a3082ec60a9198dd4e7310db69523bVictor Zverovich  EXPECT_EQ(str, w2.str());
19008b0741fa7a3082ec60a9198dd4e7310db69523bVictor Zverovich}
19108b0741fa7a3082ec60a9198dd4e7310db69523bVictor Zverovich
19208b0741fa7a3082ec60a9198dd4e7310db69523bVictor ZverovichTEST(WriterTest, MoveCtor) {
193d1ded569ff012d950023de62288925258663b65bVictor Zverovich  MemoryWriter w;
19408b0741fa7a3082ec60a9198dd4e7310db69523bVictor Zverovich  w << "test";
1958f8fd769eef9b47339a3232e34b2696ccdc1b20bVictor Zverovich  check_move_writer("test", w);
19608b0741fa7a3082ec60a9198dd4e7310db69523bVictor Zverovich  // This fills the inline buffer, but doesn't cause dynamic allocation.
19708b0741fa7a3082ec60a9198dd4e7310db69523bVictor Zverovich  std::string s;
19808b0741fa7a3082ec60a9198dd4e7310db69523bVictor Zverovich  for (int i = 0; i < fmt::internal::INLINE_BUFFER_SIZE; ++i)
19908b0741fa7a3082ec60a9198dd4e7310db69523bVictor Zverovich    s += '*';
200c649007ed8288ea237342f49ce7afe556f8d0e20Victor Zverovich  w.clear();
20108b0741fa7a3082ec60a9198dd4e7310db69523bVictor Zverovich  w << s;
2028f8fd769eef9b47339a3232e34b2696ccdc1b20bVictor Zverovich  check_move_writer(s, w);
20326277c8ab34344fb20d546ac1b1dd51058a233ddVictor Zverovich  const char *inline_buffer_ptr = w.data();
20408b0741fa7a3082ec60a9198dd4e7310db69523bVictor Zverovich  // Adding one more character causes the content to move from the inline to
20508b0741fa7a3082ec60a9198dd4e7310db69523bVictor Zverovich  // a dynamically allocated buffer.
20608b0741fa7a3082ec60a9198dd4e7310db69523bVictor Zverovich  w << '*';
207d1ded569ff012d950023de62288925258663b65bVictor Zverovich  MemoryWriter w2(std::move(w));
20808b0741fa7a3082ec60a9198dd4e7310db69523bVictor Zverovich  // Move should rip the guts of the first writer.
20926277c8ab34344fb20d546ac1b1dd51058a233ddVictor Zverovich  EXPECT_EQ(inline_buffer_ptr, w.data());
21008b0741fa7a3082ec60a9198dd4e7310db69523bVictor Zverovich  EXPECT_EQ(s + '*', w2.str());
21108b0741fa7a3082ec60a9198dd4e7310db69523bVictor Zverovich}
21208b0741fa7a3082ec60a9198dd4e7310db69523bVictor Zverovich
213d1ded569ff012d950023de62288925258663b65bVictor Zverovichvoid CheckMoveAssignWriter(const std::string &str, MemoryWriter &w) {
214d1ded569ff012d950023de62288925258663b65bVictor Zverovich  MemoryWriter w2;
215f153f6f4b5f803e337e8ed61bcfedd852367cfefVictor Zverovich  w2 = std::move(w);
216f153f6f4b5f803e337e8ed61bcfedd852367cfefVictor Zverovich  // Move shouldn't destroy the inline content of the first writer.
217f153f6f4b5f803e337e8ed61bcfedd852367cfefVictor Zverovich  EXPECT_EQ(str, w.str());
218f153f6f4b5f803e337e8ed61bcfedd852367cfefVictor Zverovich  EXPECT_EQ(str, w2.str());
219f153f6f4b5f803e337e8ed61bcfedd852367cfefVictor Zverovich}
220f153f6f4b5f803e337e8ed61bcfedd852367cfefVictor Zverovich
221f153f6f4b5f803e337e8ed61bcfedd852367cfefVictor ZverovichTEST(WriterTest, MoveAssignment) {
222d1ded569ff012d950023de62288925258663b65bVictor Zverovich  MemoryWriter w;
223f153f6f4b5f803e337e8ed61bcfedd852367cfefVictor Zverovich  w << "test";
224f153f6f4b5f803e337e8ed61bcfedd852367cfefVictor Zverovich  CheckMoveAssignWriter("test", w);
225f153f6f4b5f803e337e8ed61bcfedd852367cfefVictor Zverovich  // This fills the inline buffer, but doesn't cause dynamic allocation.
226f153f6f4b5f803e337e8ed61bcfedd852367cfefVictor Zverovich  std::string s;
227f153f6f4b5f803e337e8ed61bcfedd852367cfefVictor Zverovich  for (int i = 0; i < fmt::internal::INLINE_BUFFER_SIZE; ++i)
228f153f6f4b5f803e337e8ed61bcfedd852367cfefVictor Zverovich    s += '*';
229c649007ed8288ea237342f49ce7afe556f8d0e20Victor Zverovich  w.clear();
230f153f6f4b5f803e337e8ed61bcfedd852367cfefVictor Zverovich  w << s;
231f153f6f4b5f803e337e8ed61bcfedd852367cfefVictor Zverovich  CheckMoveAssignWriter(s, w);
232f153f6f4b5f803e337e8ed61bcfedd852367cfefVictor Zverovich  const char *inline_buffer_ptr = w.data();
233f153f6f4b5f803e337e8ed61bcfedd852367cfefVictor Zverovich  // Adding one more character causes the content to move from the inline to
234f153f6f4b5f803e337e8ed61bcfedd852367cfefVictor Zverovich  // a dynamically allocated buffer.
235f153f6f4b5f803e337e8ed61bcfedd852367cfefVictor Zverovich  w << '*';
236d1ded569ff012d950023de62288925258663b65bVictor Zverovich  MemoryWriter w2;
237f153f6f4b5f803e337e8ed61bcfedd852367cfefVictor Zverovich  w2 = std::move(w);
238f153f6f4b5f803e337e8ed61bcfedd852367cfefVictor Zverovich  // Move should rip the guts of the first writer.
239f153f6f4b5f803e337e8ed61bcfedd852367cfefVictor Zverovich  EXPECT_EQ(inline_buffer_ptr, w.data());
240f153f6f4b5f803e337e8ed61bcfedd852367cfefVictor Zverovich  EXPECT_EQ(s + '*', w2.str());
241f153f6f4b5f803e337e8ed61bcfedd852367cfefVictor Zverovich}
242f153f6f4b5f803e337e8ed61bcfedd852367cfefVictor Zverovich
24308b0741fa7a3082ec60a9198dd4e7310db69523bVictor Zverovich#endif  // FMT_USE_RVALUE_REFERENCES
24408b0741fa7a3082ec60a9198dd4e7310db69523bVictor Zverovich
245b9a568b1dd02e09734d6b418306ffe6e58450badVictor ZverovichTEST(WriterTest, Allocator) {
24649222dc0c7ba1d426de608d45272093e0785d710Victor Zverovich  typedef testing::StrictMock< MockAllocator<char> > MockAllocator;
24749222dc0c7ba1d426de608d45272093e0785d710Victor Zverovich  typedef AllocatorRef<MockAllocator> TestAllocator;
24849222dc0c7ba1d426de608d45272093e0785d710Victor Zverovich  MockAllocator alloc;
249d1ded569ff012d950023de62288925258663b65bVictor Zverovich  fmt::BasicMemoryWriter<char, TestAllocator> w((TestAllocator(&alloc)));
250fb12cfd1966a27224bafac2dfddd13ded1e53de0Victor Zverovich  std::size_t size =
251fb12cfd1966a27224bafac2dfddd13ded1e53de0Victor Zverovich      static_cast<std::size_t>(1.5 * fmt::internal::INLINE_BUFFER_SIZE);
252b9a568b1dd02e09734d6b418306ffe6e58450badVictor Zverovich  std::vector<char> mem(size);
25349ccb2e4497ce3d2acae9c0cca81756aa341627dalabuzhev  EXPECT_CALL(alloc, allocate(size, 0)).WillOnce(testing::Return(&mem[0]));
254b9a568b1dd02e09734d6b418306ffe6e58450badVictor Zverovich  for (int i = 0; i < fmt::internal::INLINE_BUFFER_SIZE + 1; ++i)
255b9a568b1dd02e09734d6b418306ffe6e58450badVictor Zverovich    w << '*';
25649222dc0c7ba1d426de608d45272093e0785d710Victor Zverovich  EXPECT_CALL(alloc, deallocate(&mem[0], size));
257b9a568b1dd02e09734d6b418306ffe6e58450badVictor Zverovich}
258b9a568b1dd02e09734d6b418306ffe6e58450badVictor Zverovich
259bcef11c0d1311e93d399b1f48eb06197f5e90747Victor ZverovichTEST(WriterTest, Data) {
260d1ded569ff012d950023de62288925258663b65bVictor Zverovich  MemoryWriter w;
2612a9f358d7e48589cdc71583b4012deaedd6d40c6Victor Zverovich  w << 42;
2622a9f358d7e48589cdc71583b4012deaedd6d40c6Victor Zverovich  EXPECT_EQ("42", std::string(w.data(), w.size()));
2632a9f358d7e48589cdc71583b4012deaedd6d40c6Victor Zverovich}
2642a9f358d7e48589cdc71583b4012deaedd6d40c6Victor Zverovich
265bd133382f0e12a9c024547d4257e7a559cc3e9ecVictor ZverovichTEST(WriterTest, WriteWithoutArgs) {
266bd133382f0e12a9c024547d4257e7a559cc3e9ecVictor Zverovich  MemoryWriter w;
267bd133382f0e12a9c024547d4257e7a559cc3e9ecVictor Zverovich  w.write("test");
268bd133382f0e12a9c024547d4257e7a559cc3e9ecVictor Zverovich  EXPECT_EQ("test", std::string(w.data(), w.size()));
269bd133382f0e12a9c024547d4257e7a559cc3e9ecVictor Zverovich}
270bd133382f0e12a9c024547d4257e7a559cc3e9ecVictor Zverovich
2711e58ebf1b7a720c5967979034a720bf928ce1af9Victor ZverovichTEST(WriterTest, WriteInt) {
272aefb3bb918bc93ca3c76135f8b421118761490b1Victor Zverovich  CHECK_WRITE(42);
273aefb3bb918bc93ca3c76135f8b421118761490b1Victor Zverovich  CHECK_WRITE(-42);
274aefb3bb918bc93ca3c76135f8b421118761490b1Victor Zverovich  CHECK_WRITE(static_cast<short>(12));
275aefb3bb918bc93ca3c76135f8b421118761490b1Victor Zverovich  CHECK_WRITE(34u);
276aefb3bb918bc93ca3c76135f8b421118761490b1Victor Zverovich  CHECK_WRITE(std::numeric_limits<int>::min());
277aefb3bb918bc93ca3c76135f8b421118761490b1Victor Zverovich  CHECK_WRITE(std::numeric_limits<int>::max());
278aefb3bb918bc93ca3c76135f8b421118761490b1Victor Zverovich  CHECK_WRITE(std::numeric_limits<unsigned>::max());
279aefb3bb918bc93ca3c76135f8b421118761490b1Victor Zverovich}
2802a9f358d7e48589cdc71583b4012deaedd6d40c6Victor Zverovich
281aefb3bb918bc93ca3c76135f8b421118761490b1Victor ZverovichTEST(WriterTest, WriteLong) {
282aefb3bb918bc93ca3c76135f8b421118761490b1Victor Zverovich  CHECK_WRITE(56l);
283aefb3bb918bc93ca3c76135f8b421118761490b1Victor Zverovich  CHECK_WRITE(78ul);
284aefb3bb918bc93ca3c76135f8b421118761490b1Victor Zverovich  CHECK_WRITE(std::numeric_limits<long>::min());
285aefb3bb918bc93ca3c76135f8b421118761490b1Victor Zverovich  CHECK_WRITE(std::numeric_limits<long>::max());
286aefb3bb918bc93ca3c76135f8b421118761490b1Victor Zverovich  CHECK_WRITE(std::numeric_limits<unsigned long>::max());
2871e58ebf1b7a720c5967979034a720bf928ce1af9Victor Zverovich}
2881e58ebf1b7a720c5967979034a720bf928ce1af9Victor Zverovich
289aefb3bb918bc93ca3c76135f8b421118761490b1Victor ZverovichTEST(WriterTest, WriteLongLong) {
290aefb3bb918bc93ca3c76135f8b421118761490b1Victor Zverovich  CHECK_WRITE(56ll);
291aefb3bb918bc93ca3c76135f8b421118761490b1Victor Zverovich  CHECK_WRITE(78ull);
292aefb3bb918bc93ca3c76135f8b421118761490b1Victor Zverovich  CHECK_WRITE(std::numeric_limits<long long>::min());
293aefb3bb918bc93ca3c76135f8b421118761490b1Victor Zverovich  CHECK_WRITE(std::numeric_limits<long long>::max());
294aefb3bb918bc93ca3c76135f8b421118761490b1Victor Zverovich  CHECK_WRITE(std::numeric_limits<unsigned long long>::max());
295aefb3bb918bc93ca3c76135f8b421118761490b1Victor Zverovich}
296bcef11c0d1311e93d399b1f48eb06197f5e90747Victor Zverovich
297bcef11c0d1311e93d399b1f48eb06197f5e90747Victor ZverovichTEST(WriterTest, WriteDouble) {
298aefb3bb918bc93ca3c76135f8b421118761490b1Victor Zverovich  CHECK_WRITE(4.2);
299aefb3bb918bc93ca3c76135f8b421118761490b1Victor Zverovich  CHECK_WRITE(-4.2);
300c7cfa7d4e7df247a2f4e09405d3e48900a53aa31Victor Zverovich  CHECK_WRITE(std::numeric_limits<double>::min());
301c7cfa7d4e7df247a2f4e09405d3e48900a53aa31Victor Zverovich  CHECK_WRITE(std::numeric_limits<double>::max());
3021a0c76a81addcb2401c76ea88ef75b2695c3657aVictor Zverovich}
3031a0c76a81addcb2401c76ea88ef75b2695c3657aVictor Zverovich
3041a0c76a81addcb2401c76ea88ef75b2695c3657aVictor ZverovichTEST(WriterTest, WriteLongDouble) {
305aefb3bb918bc93ca3c76135f8b421118761490b1Victor Zverovich  CHECK_WRITE(4.2l);
3063e03934d15dd1c135e1a3766c6906e7c84d111b5vitaut  CHECK_WRITE_CHAR(-4.2l);
3073e03934d15dd1c135e1a3766c6906e7c84d111b5vitaut  std::wstring str;
3083e03934d15dd1c135e1a3766c6906e7c84d111b5vitaut  std_format(4.2l, str);
3093e03934d15dd1c135e1a3766c6906e7c84d111b5vitaut  if (str[0] != '-')
3103e03934d15dd1c135e1a3766c6906e7c84d111b5vitaut    CHECK_WRITE_WCHAR(-4.2l);
3113e03934d15dd1c135e1a3766c6906e7c84d111b5vitaut  else
3123e03934d15dd1c135e1a3766c6906e7c84d111b5vitaut    fmt::print("warning: long double formatting with std::swprintf is broken");
313c7cfa7d4e7df247a2f4e09405d3e48900a53aa31Victor Zverovich  CHECK_WRITE(std::numeric_limits<long double>::min());
3141a0c76a81addcb2401c76ea88ef75b2695c3657aVictor Zverovich  CHECK_WRITE(std::numeric_limits<long double>::max());
315bcef11c0d1311e93d399b1f48eb06197f5e90747Victor Zverovich}
316bcef11c0d1311e93d399b1f48eb06197f5e90747Victor Zverovich
317b6f383907bde7e84da67d8ab6779dbd023b8b7e4Victor ZverovichTEST(WriterTest, WriteDoubleAtBufferBoundary) {
318d1ded569ff012d950023de62288925258663b65bVictor Zverovich  MemoryWriter writer;
319d052bdae029dad310758f59c2a79eae4c2825afaVictor Zverovich  for (int i = 0; i < 100; ++i)
320d052bdae029dad310758f59c2a79eae4c2825afaVictor Zverovich    writer << 1.23456789;
321b6f383907bde7e84da67d8ab6779dbd023b8b7e4Victor Zverovich}
322b6f383907bde7e84da67d8ab6779dbd023b8b7e4Victor Zverovich
3235f9574c3c18e227f5bea05823ca492d34c729efeVictor ZverovichTEST(WriterTest, WriteDoubleWithFilledBuffer) {
324d1ded569ff012d950023de62288925258663b65bVictor Zverovich  MemoryWriter writer;
3255f9574c3c18e227f5bea05823ca492d34c729efeVictor Zverovich  // Fill the buffer.
3265f9574c3c18e227f5bea05823ca492d34c729efeVictor Zverovich  for (int i = 0; i < fmt::internal::INLINE_BUFFER_SIZE; ++i)
3275f9574c3c18e227f5bea05823ca492d34c729efeVictor Zverovich    writer << ' ';
3285f9574c3c18e227f5bea05823ca492d34c729efeVictor Zverovich  writer << 1.2;
329648dba0a78f9e1afea741f841ab9dbe7bcc9fe65Victor Zverovich  EXPECT_STREQ("1.2", writer.c_str() + fmt::internal::INLINE_BUFFER_SIZE);
3305f9574c3c18e227f5bea05823ca492d34c729efeVictor Zverovich}
3315f9574c3c18e227f5bea05823ca492d34c729efeVictor Zverovich
332b605b3980c078f2fca9dc1313db02841c4a470a7Victor ZverovichTEST(WriterTest, WriteChar) {
333b605b3980c078f2fca9dc1313db02841c4a470a7Victor Zverovich  CHECK_WRITE('a');
334b605b3980c078f2fca9dc1313db02841c4a470a7Victor Zverovich}
335b605b3980c078f2fca9dc1313db02841c4a470a7Victor Zverovich
336e3b4a3f1665197a5488d07f6950189ca4bb3372dVictor ZverovichTEST(WriterTest, WriteWideChar) {
3376038c852314433178f2127460ed1a8503bf48246Victor Zverovich  CHECK_WRITE_WCHAR(L'a');
338e3b4a3f1665197a5488d07f6950189ca4bb3372dVictor Zverovich}
339e3b4a3f1665197a5488d07f6950189ca4bb3372dVictor Zverovich
340bcef11c0d1311e93d399b1f48eb06197f5e90747Victor ZverovichTEST(WriterTest, WriteString) {
341b605b3980c078f2fca9dc1313db02841c4a470a7Victor Zverovich  CHECK_WRITE_CHAR("abc");
342ed2dfe512422c7473759618228f71f67019475b5vitaut  CHECK_WRITE_WCHAR("abc");
343b605b3980c078f2fca9dc1313db02841c4a470a7Victor Zverovich  // The following line shouldn't compile:
344d1ded569ff012d950023de62288925258663b65bVictor Zverovich  //MemoryWriter() << L"abc";
345b605b3980c078f2fca9dc1313db02841c4a470a7Victor Zverovich}
346b605b3980c078f2fca9dc1313db02841c4a470a7Victor Zverovich
347b605b3980c078f2fca9dc1313db02841c4a470a7Victor ZverovichTEST(WriterTest, WriteWideString) {
348b605b3980c078f2fca9dc1313db02841c4a470a7Victor Zverovich  CHECK_WRITE_WCHAR(L"abc");
349b605b3980c078f2fca9dc1313db02841c4a470a7Victor Zverovich  // The following line shouldn't compile:
350d1ded569ff012d950023de62288925258663b65bVictor Zverovich  //fmt::WMemoryWriter() << "abc";
351bcef11c0d1311e93d399b1f48eb06197f5e90747Victor Zverovich}
352bcef11c0d1311e93d399b1f48eb06197f5e90747Victor Zverovich
353f184ad0a2c16b5aa471ee48c09efdb9d7ae8350cVictor ZverovichTEST(WriterTest, bin) {
354f184ad0a2c16b5aa471ee48c09efdb9d7ae8350cVictor Zverovich  using fmt::bin;
355d1ded569ff012d950023de62288925258663b65bVictor Zverovich  EXPECT_EQ("1100101011111110", (MemoryWriter() << bin(0xcafe)).str());
356d1ded569ff012d950023de62288925258663b65bVictor Zverovich  EXPECT_EQ("1011101010111110", (MemoryWriter() << bin(0xbabeu)).str());
357d1ded569ff012d950023de62288925258663b65bVictor Zverovich  EXPECT_EQ("1101111010101101", (MemoryWriter() << bin(0xdeadl)).str());
358d1ded569ff012d950023de62288925258663b65bVictor Zverovich  EXPECT_EQ("1011111011101111", (MemoryWriter() << bin(0xbeeful)).str());
35956f12b737cd39354f0f6d42c0ae7af275d2ad9a4Victor Zverovich  EXPECT_EQ("11001010111111101011101010111110",
360d1ded569ff012d950023de62288925258663b65bVictor Zverovich            (MemoryWriter() << bin(0xcafebabell)).str());
36156f12b737cd39354f0f6d42c0ae7af275d2ad9a4Victor Zverovich  EXPECT_EQ("11011110101011011011111011101111",
362d1ded569ff012d950023de62288925258663b65bVictor Zverovich            (MemoryWriter() << bin(0xdeadbeefull)).str());
363f184ad0a2c16b5aa471ee48c09efdb9d7ae8350cVictor Zverovich}
364f184ad0a2c16b5aa471ee48c09efdb9d7ae8350cVictor Zverovich
3651e58ebf1b7a720c5967979034a720bf928ce1af9Victor ZverovichTEST(WriterTest, oct) {
3661e58ebf1b7a720c5967979034a720bf928ce1af9Victor Zverovich  using fmt::oct;
367d1ded569ff012d950023de62288925258663b65bVictor Zverovich  EXPECT_EQ("12", (MemoryWriter() << oct(static_cast<short>(012))).str());
368d1ded569ff012d950023de62288925258663b65bVictor Zverovich  EXPECT_EQ("12", (MemoryWriter() << oct(012)).str());
369d1ded569ff012d950023de62288925258663b65bVictor Zverovich  EXPECT_EQ("34", (MemoryWriter() << oct(034u)).str());
370d1ded569ff012d950023de62288925258663b65bVictor Zverovich  EXPECT_EQ("56", (MemoryWriter() << oct(056l)).str());
371d1ded569ff012d950023de62288925258663b65bVictor Zverovich  EXPECT_EQ("70", (MemoryWriter() << oct(070ul)).str());
372d1ded569ff012d950023de62288925258663b65bVictor Zverovich  EXPECT_EQ("1234", (MemoryWriter() << oct(01234ll)).str());
373d1ded569ff012d950023de62288925258663b65bVictor Zverovich  EXPECT_EQ("5670", (MemoryWriter() << oct(05670ull)).str());
3741e58ebf1b7a720c5967979034a720bf928ce1af9Victor Zverovich}
3751e58ebf1b7a720c5967979034a720bf928ce1af9Victor Zverovich
3761e58ebf1b7a720c5967979034a720bf928ce1af9Victor ZverovichTEST(WriterTest, hex) {
3771e58ebf1b7a720c5967979034a720bf928ce1af9Victor Zverovich  using fmt::hex;
378136ee89bb4e31c8004f4cc87fa7324bb7221e840Victor Zverovich  fmt::IntFormatSpec<int, fmt::TypeSpec<'x'> > (*phex)(int value) = hex;
3791e58ebf1b7a720c5967979034a720bf928ce1af9Victor Zverovich  phex(42);
3801e58ebf1b7a720c5967979034a720bf928ce1af9Victor Zverovich  // This shouldn't compile:
381136ee89bb4e31c8004f4cc87fa7324bb7221e840Victor Zverovich  //fmt::IntFormatSpec<short, fmt::TypeSpec<'x'> > (*phex2)(short value) = hex;
3821e58ebf1b7a720c5967979034a720bf928ce1af9Victor Zverovich
383d1ded569ff012d950023de62288925258663b65bVictor Zverovich  EXPECT_EQ("cafe", (MemoryWriter() << hex(0xcafe)).str());
384d1ded569ff012d950023de62288925258663b65bVictor Zverovich  EXPECT_EQ("babe", (MemoryWriter() << hex(0xbabeu)).str());
385d1ded569ff012d950023de62288925258663b65bVictor Zverovich  EXPECT_EQ("dead", (MemoryWriter() << hex(0xdeadl)).str());
386d1ded569ff012d950023de62288925258663b65bVictor Zverovich  EXPECT_EQ("beef", (MemoryWriter() << hex(0xbeeful)).str());
387d1ded569ff012d950023de62288925258663b65bVictor Zverovich  EXPECT_EQ("cafebabe", (MemoryWriter() << hex(0xcafebabell)).str());
388d1ded569ff012d950023de62288925258663b65bVictor Zverovich  EXPECT_EQ("deadbeef", (MemoryWriter() << hex(0xdeadbeefull)).str());
3891e58ebf1b7a720c5967979034a720bf928ce1af9Victor Zverovich}
3901e58ebf1b7a720c5967979034a720bf928ce1af9Victor Zverovich
3911e58ebf1b7a720c5967979034a720bf928ce1af9Victor ZverovichTEST(WriterTest, hexu) {
3921e58ebf1b7a720c5967979034a720bf928ce1af9Victor Zverovich  using fmt::hexu;
393d1ded569ff012d950023de62288925258663b65bVictor Zverovich  EXPECT_EQ("CAFE", (MemoryWriter() << hexu(0xcafe)).str());
394d1ded569ff012d950023de62288925258663b65bVictor Zverovich  EXPECT_EQ("BABE", (MemoryWriter() << hexu(0xbabeu)).str());
395d1ded569ff012d950023de62288925258663b65bVictor Zverovich  EXPECT_EQ("DEAD", (MemoryWriter() << hexu(0xdeadl)).str());
396d1ded569ff012d950023de62288925258663b65bVictor Zverovich  EXPECT_EQ("BEEF", (MemoryWriter() << hexu(0xbeeful)).str());
397d1ded569ff012d950023de62288925258663b65bVictor Zverovich  EXPECT_EQ("CAFEBABE", (MemoryWriter() << hexu(0xcafebabell)).str());
398d1ded569ff012d950023de62288925258663b65bVictor Zverovich  EXPECT_EQ("DEADBEEF", (MemoryWriter() << hexu(0xdeadbeefull)).str());
3991e58ebf1b7a720c5967979034a720bf928ce1af9Victor Zverovich}
4001e58ebf1b7a720c5967979034a720bf928ce1af9Victor Zverovich
40190730e706b8f47cc6279ab0465110d7ddbc1ac80Victor Zverovichtemplate <typename Char>
40290730e706b8f47cc6279ab0465110d7ddbc1ac80Victor ZverovichBasicWriter<Char> &operator<<(BasicWriter<Char> &f, const Date &d) {
40390730e706b8f47cc6279ab0465110d7ddbc1ac80Victor Zverovich  return f << d.year() << '-' << d.month() << '-' << d.day();
40490730e706b8f47cc6279ab0465110d7ddbc1ac80Victor Zverovich}
4051e58ebf1b7a720c5967979034a720bf928ce1af9Victor Zverovich
4061e58ebf1b7a720c5967979034a720bf928ce1af9Victor Zverovichclass ISO8601DateFormatter {
4071e58ebf1b7a720c5967979034a720bf928ce1af9Victor Zverovich const Date *date_;
4081e58ebf1b7a720c5967979034a720bf928ce1af9Victor Zverovich
4091e58ebf1b7a720c5967979034a720bf928ce1af9Victor Zverovichpublic:
4101e58ebf1b7a720c5967979034a720bf928ce1af9Victor Zverovich  ISO8601DateFormatter(const Date &d) : date_(&d) {}
4111e58ebf1b7a720c5967979034a720bf928ce1af9Victor Zverovich
4121e58ebf1b7a720c5967979034a720bf928ce1af9Victor Zverovich  template <typename Char>
4131e58ebf1b7a720c5967979034a720bf928ce1af9Victor Zverovich  friend BasicWriter<Char> &operator<<(
4141e58ebf1b7a720c5967979034a720bf928ce1af9Victor Zverovich      BasicWriter<Char> &w, const ISO8601DateFormatter &d) {
4151e58ebf1b7a720c5967979034a720bf928ce1af9Victor Zverovich    return w << pad(d.date_->year(), 4, '0') << '-'
4161e58ebf1b7a720c5967979034a720bf928ce1af9Victor Zverovich        << pad(d.date_->month(), 2, '0') << '-' << pad(d.date_->day(), 2, '0');
4171e58ebf1b7a720c5967979034a720bf928ce1af9Victor Zverovich  }
4181e58ebf1b7a720c5967979034a720bf928ce1af9Victor Zverovich};
4191e58ebf1b7a720c5967979034a720bf928ce1af9Victor Zverovich
4201e58ebf1b7a720c5967979034a720bf928ce1af9Victor ZverovichISO8601DateFormatter iso8601(const Date &d) { return ISO8601DateFormatter(d); }
4211e58ebf1b7a720c5967979034a720bf928ce1af9Victor Zverovich
4221e58ebf1b7a720c5967979034a720bf928ce1af9Victor ZverovichTEST(WriterTest, pad) {
4231e58ebf1b7a720c5967979034a720bf928ce1af9Victor Zverovich  using fmt::hex;
424d1ded569ff012d950023de62288925258663b65bVictor Zverovich  EXPECT_EQ("    cafe", (MemoryWriter() << pad(hex(0xcafe), 8)).str());
425d1ded569ff012d950023de62288925258663b65bVictor Zverovich  EXPECT_EQ("    babe", (MemoryWriter() << pad(hex(0xbabeu), 8)).str());
426d1ded569ff012d950023de62288925258663b65bVictor Zverovich  EXPECT_EQ("    dead", (MemoryWriter() << pad(hex(0xdeadl), 8)).str());
427d1ded569ff012d950023de62288925258663b65bVictor Zverovich  EXPECT_EQ("    beef", (MemoryWriter() << pad(hex(0xbeeful), 8)).str());
428d1ded569ff012d950023de62288925258663b65bVictor Zverovich  EXPECT_EQ("    dead", (MemoryWriter() << pad(hex(0xdeadll), 8)).str());
429d1ded569ff012d950023de62288925258663b65bVictor Zverovich  EXPECT_EQ("    beef", (MemoryWriter() << pad(hex(0xbeefull), 8)).str());
430d1ded569ff012d950023de62288925258663b65bVictor Zverovich
431d1ded569ff012d950023de62288925258663b65bVictor Zverovich  EXPECT_EQ("     11", (MemoryWriter() << pad(11, 7)).str());
432d1ded569ff012d950023de62288925258663b65bVictor Zverovich  EXPECT_EQ("     22", (MemoryWriter() << pad(22u, 7)).str());
433d1ded569ff012d950023de62288925258663b65bVictor Zverovich  EXPECT_EQ("     33", (MemoryWriter() << pad(33l, 7)).str());
434d1ded569ff012d950023de62288925258663b65bVictor Zverovich  EXPECT_EQ("     44", (MemoryWriter() << pad(44ul, 7)).str());
435d1ded569ff012d950023de62288925258663b65bVictor Zverovich  EXPECT_EQ("     33", (MemoryWriter() << pad(33ll, 7)).str());
436d1ded569ff012d950023de62288925258663b65bVictor Zverovich  EXPECT_EQ("     44", (MemoryWriter() << pad(44ull, 7)).str());
437d1ded569ff012d950023de62288925258663b65bVictor Zverovich
438d1ded569ff012d950023de62288925258663b65bVictor Zverovich  MemoryWriter w;
439c649007ed8288ea237342f49ce7afe556f8d0e20Victor Zverovich  w.clear();
440c649007ed8288ea237342f49ce7afe556f8d0e20Victor Zverovich  w << pad(42, 5, '0');
441c649007ed8288ea237342f49ce7afe556f8d0e20Victor Zverovich  EXPECT_EQ("00042", w.str());
442c649007ed8288ea237342f49ce7afe556f8d0e20Victor Zverovich  w.clear();
443c649007ed8288ea237342f49ce7afe556f8d0e20Victor Zverovich  w << Date(2012, 12, 9);
444c649007ed8288ea237342f49ce7afe556f8d0e20Victor Zverovich  EXPECT_EQ("2012-12-9", w.str());
445c649007ed8288ea237342f49ce7afe556f8d0e20Victor Zverovich  w.clear();
446c649007ed8288ea237342f49ce7afe556f8d0e20Victor Zverovich  w << iso8601(Date(2012, 1, 9));
447c649007ed8288ea237342f49ce7afe556f8d0e20Victor Zverovich  EXPECT_EQ("2012-01-09", w.str());
4481e58ebf1b7a720c5967979034a720bf928ce1af9Victor Zverovich}
4491e58ebf1b7a720c5967979034a720bf928ce1af9Victor Zverovich
450641df9549131493fcf31df40d00f2864c1bc87b4Victor ZverovichTEST(WriterTest, PadString) {
451d1ded569ff012d950023de62288925258663b65bVictor Zverovich  EXPECT_EQ("test    ", (MemoryWriter() << pad("test", 8)).str());
452d1ded569ff012d950023de62288925258663b65bVictor Zverovich  EXPECT_EQ("test******", (MemoryWriter() << pad("test", 10, '*')).str());
453641df9549131493fcf31df40d00f2864c1bc87b4Victor Zverovich}
454641df9549131493fcf31df40d00f2864c1bc87b4Victor Zverovich
455342b76d2783b8931f29b87c67be27286e7970d93Victor ZverovichTEST(WriterTest, PadWString) {
456d1ded569ff012d950023de62288925258663b65bVictor Zverovich  EXPECT_EQ(L"test    ", (WMemoryWriter() << pad(L"test", 8)).str());
457d1ded569ff012d950023de62288925258663b65bVictor Zverovich  EXPECT_EQ(L"test******", (WMemoryWriter() << pad(L"test", 10, '*')).str());
458d1ded569ff012d950023de62288925258663b65bVictor Zverovich  EXPECT_EQ(L"test******", (WMemoryWriter() << pad(L"test", 10, L'*')).str());
459342b76d2783b8931f29b87c67be27286e7970d93Victor Zverovich}
460342b76d2783b8931f29b87c67be27286e7970d93Victor Zverovich
4611e58ebf1b7a720c5967979034a720bf928ce1af9Victor ZverovichTEST(WriterTest, NoConflictWithIOManip) {
4621e58ebf1b7a720c5967979034a720bf928ce1af9Victor Zverovich  using namespace std;
4631e58ebf1b7a720c5967979034a720bf928ce1af9Victor Zverovich  using namespace fmt;
464d1ded569ff012d950023de62288925258663b65bVictor Zverovich  EXPECT_EQ("cafe", (MemoryWriter() << hex(0xcafe)).str());
465d1ded569ff012d950023de62288925258663b65bVictor Zverovich  EXPECT_EQ("12", (MemoryWriter() << oct(012)).str());
4661e58ebf1b7a720c5967979034a720bf928ce1af9Victor Zverovich}
4671e58ebf1b7a720c5967979034a720bf928ce1af9Victor Zverovich
468ca171307f3bee845aba1e6293fb45ca907f74ec4Victor ZverovichTEST(WriterTest, Format) {
469d1ded569ff012d950023de62288925258663b65bVictor Zverovich  MemoryWriter w;
470a1264926a0a76016fea7cc3051c84f8dbd972a93Victor Zverovich  w.write("part{0}", 1);
471ca171307f3bee845aba1e6293fb45ca907f74ec4Victor Zverovich  EXPECT_EQ(strlen("part1"), w.size());
472ca171307f3bee845aba1e6293fb45ca907f74ec4Victor Zverovich  EXPECT_STREQ("part1", w.c_str());
473ca171307f3bee845aba1e6293fb45ca907f74ec4Victor Zverovich  EXPECT_STREQ("part1", w.data());
474ca171307f3bee845aba1e6293fb45ca907f74ec4Victor Zverovich  EXPECT_EQ("part1", w.str());
475a1264926a0a76016fea7cc3051c84f8dbd972a93Victor Zverovich  w.write("part{0}", 2);
476ca171307f3bee845aba1e6293fb45ca907f74ec4Victor Zverovich  EXPECT_EQ(strlen("part1part2"), w.size());
477ca171307f3bee845aba1e6293fb45ca907f74ec4Victor Zverovich  EXPECT_STREQ("part1part2", w.c_str());
478ca171307f3bee845aba1e6293fb45ca907f74ec4Victor Zverovich  EXPECT_STREQ("part1part2", w.data());
479ca171307f3bee845aba1e6293fb45ca907f74ec4Victor Zverovich  EXPECT_EQ("part1part2", w.str());
480ca171307f3bee845aba1e6293fb45ca907f74ec4Victor Zverovich}
481ca171307f3bee845aba1e6293fb45ca907f74ec4Victor Zverovich
4821e58ebf1b7a720c5967979034a720bf928ce1af9Victor ZverovichTEST(WriterTest, WWriter) {
483d1ded569ff012d950023de62288925258663b65bVictor Zverovich  EXPECT_EQ(L"cafe", (fmt::WMemoryWriter() << fmt::hex(0xcafe)).str());
4841e58ebf1b7a720c5967979034a720bf928ce1af9Victor Zverovich}
4851e58ebf1b7a720c5967979034a720bf928ce1af9Victor Zverovich
486beaf6f74369a51a9879c6edc96bb06877a370837Victor ZverovichTEST(ArrayWriterTest, Ctor) {
487beaf6f74369a51a9879c6edc96bb06877a370837Victor Zverovich  char array[10] = "garbage";
488beaf6f74369a51a9879c6edc96bb06877a370837Victor Zverovich  fmt::ArrayWriter w(array, sizeof(array));
489beaf6f74369a51a9879c6edc96bb06877a370837Victor Zverovich  EXPECT_EQ(0u, w.size());
490beaf6f74369a51a9879c6edc96bb06877a370837Victor Zverovich  EXPECT_STREQ("", w.c_str());
491beaf6f74369a51a9879c6edc96bb06877a370837Victor Zverovich}
492beaf6f74369a51a9879c6edc96bb06877a370837Victor Zverovich
493beaf6f74369a51a9879c6edc96bb06877a370837Victor ZverovichTEST(ArrayWriterTest, CompileTimeSizeCtor) {
494beaf6f74369a51a9879c6edc96bb06877a370837Victor Zverovich  char array[10] = "garbage";
495beaf6f74369a51a9879c6edc96bb06877a370837Victor Zverovich  fmt::ArrayWriter w(array);
496beaf6f74369a51a9879c6edc96bb06877a370837Victor Zverovich  EXPECT_EQ(0u, w.size());
497beaf6f74369a51a9879c6edc96bb06877a370837Victor Zverovich  EXPECT_STREQ("", w.c_str());
498beaf6f74369a51a9879c6edc96bb06877a370837Victor Zverovich  w.write("{:10}", 1);
499beaf6f74369a51a9879c6edc96bb06877a370837Victor Zverovich}
500beaf6f74369a51a9879c6edc96bb06877a370837Victor Zverovich
501beaf6f74369a51a9879c6edc96bb06877a370837Victor ZverovichTEST(ArrayWriterTest, Write) {
502beaf6f74369a51a9879c6edc96bb06877a370837Victor Zverovich  char array[10];
503beaf6f74369a51a9879c6edc96bb06877a370837Victor Zverovich  fmt::ArrayWriter w(array, sizeof(array));
504beaf6f74369a51a9879c6edc96bb06877a370837Victor Zverovich  w.write("{}", 42);
505beaf6f74369a51a9879c6edc96bb06877a370837Victor Zverovich  EXPECT_EQ("42", w.str());
506beaf6f74369a51a9879c6edc96bb06877a370837Victor Zverovich}
507beaf6f74369a51a9879c6edc96bb06877a370837Victor Zverovich
508beaf6f74369a51a9879c6edc96bb06877a370837Victor ZverovichTEST(ArrayWriterTest, BufferOverflow) {
509beaf6f74369a51a9879c6edc96bb06877a370837Victor Zverovich  char array[10];
510beaf6f74369a51a9879c6edc96bb06877a370837Victor Zverovich  fmt::ArrayWriter w(array, sizeof(array));
511beaf6f74369a51a9879c6edc96bb06877a370837Victor Zverovich  w.write("{:10}", 1);
512beaf6f74369a51a9879c6edc96bb06877a370837Victor Zverovich  EXPECT_THROW_MSG(w.write("{}", 1), std::runtime_error, "buffer overflow");
513beaf6f74369a51a9879c6edc96bb06877a370837Victor Zverovich}
514beaf6f74369a51a9879c6edc96bb06877a370837Victor Zverovich
515beaf6f74369a51a9879c6edc96bb06877a370837Victor ZverovichTEST(ArrayWriterTest, WChar) {
516beaf6f74369a51a9879c6edc96bb06877a370837Victor Zverovich  wchar_t array[10];
517beaf6f74369a51a9879c6edc96bb06877a370837Victor Zverovich  fmt::WArrayWriter w(array);
518beaf6f74369a51a9879c6edc96bb06877a370837Victor Zverovich  w.write(L"{}", 42);
519beaf6f74369a51a9879c6edc96bb06877a370837Victor Zverovich  EXPECT_EQ(L"42", w.str());
520beaf6f74369a51a9879c6edc96bb06877a370837Victor Zverovich}
521beaf6f74369a51a9879c6edc96bb06877a370837Victor Zverovich
52231a507034e34c9f15d4478e0cb556b979f28bf7aVictor ZverovichTEST(FormatterTest, Escape) {
523a1264926a0a76016fea7cc3051c84f8dbd972a93Victor Zverovich  EXPECT_EQ("{", format("{{"));
524a1264926a0a76016fea7cc3051c84f8dbd972a93Victor Zverovich  EXPECT_EQ("before {", format("before {{"));
525a1264926a0a76016fea7cc3051c84f8dbd972a93Victor Zverovich  EXPECT_EQ("{ after", format("{{ after"));
526a1264926a0a76016fea7cc3051c84f8dbd972a93Victor Zverovich  EXPECT_EQ("before { after", format("before {{ after"));
52731a507034e34c9f15d4478e0cb556b979f28bf7aVictor Zverovich
528a1264926a0a76016fea7cc3051c84f8dbd972a93Victor Zverovich  EXPECT_EQ("}", format("}}"));
529a1264926a0a76016fea7cc3051c84f8dbd972a93Victor Zverovich  EXPECT_EQ("before }", format("before }}"));
530a1264926a0a76016fea7cc3051c84f8dbd972a93Victor Zverovich  EXPECT_EQ("} after", format("}} after"));
531a1264926a0a76016fea7cc3051c84f8dbd972a93Victor Zverovich  EXPECT_EQ("before } after", format("before }} after"));
53231a507034e34c9f15d4478e0cb556b979f28bf7aVictor Zverovich
533a1264926a0a76016fea7cc3051c84f8dbd972a93Victor Zverovich  EXPECT_EQ("{}", format("{{}}"));
534a1264926a0a76016fea7cc3051c84f8dbd972a93Victor Zverovich  EXPECT_EQ("{42}", format("{{{0}}}", 42));
53531a507034e34c9f15d4478e0cb556b979f28bf7aVictor Zverovich}
53631a507034e34c9f15d4478e0cb556b979f28bf7aVictor Zverovich
53731a507034e34c9f15d4478e0cb556b979f28bf7aVictor ZverovichTEST(FormatterTest, UnmatchedBraces) {
53842de4f1f7d6c89d09bdaef1b42fe9f9299712f9fVictor Zverovich  EXPECT_THROW_MSG(format("{"), FormatError, "invalid format string");
539605d2600f8ca631ce06caa6a3ff16a49d695ad7cVictor Zverovich  EXPECT_THROW_MSG(format("}"), FormatError, "unmatched '}' in format string");
540da0f7c0a511e1d7430203b5e9be1684e991d2c97Victor Zverovich  EXPECT_THROW_MSG(format("{0{}"), FormatError, "invalid format string");
54131a507034e34c9f15d4478e0cb556b979f28bf7aVictor Zverovich}
54231a507034e34c9f15d4478e0cb556b979f28bf7aVictor Zverovich
543095b43a8f03d447ddb3bba2db10703aa19173835Victor ZverovichTEST(FormatterTest, NoArgs) {
544a1264926a0a76016fea7cc3051c84f8dbd972a93Victor Zverovich  EXPECT_EQ("test", format("test"));
5455f3ed207da5a2e716177e1ee8e6a9d39c628d8c6Victor Zverovich}
5465f3ed207da5a2e716177e1ee8e6a9d39c628d8c6Victor Zverovich
547b98b2e984286ac9ece9f63d460a6f138c33be84fVictor ZverovichTEST(FormatterTest, ArgsInDifferentPositions) {
548a1264926a0a76016fea7cc3051c84f8dbd972a93Victor Zverovich  EXPECT_EQ("42", format("{0}", 42));
549a1264926a0a76016fea7cc3051c84f8dbd972a93Victor Zverovich  EXPECT_EQ("before 42", format("before {0}", 42));
550a1264926a0a76016fea7cc3051c84f8dbd972a93Victor Zverovich  EXPECT_EQ("42 after", format("{0} after", 42));
551a1264926a0a76016fea7cc3051c84f8dbd972a93Victor Zverovich  EXPECT_EQ("before 42 after", format("before {0} after", 42));
552a1264926a0a76016fea7cc3051c84f8dbd972a93Victor Zverovich  EXPECT_EQ("answer = 42", format("{0} = {1}", "answer", 42));
553a1264926a0a76016fea7cc3051c84f8dbd972a93Victor Zverovich  EXPECT_EQ("42 is the answer", format("{1} is the {0}", "answer", 42));
554a1264926a0a76016fea7cc3051c84f8dbd972a93Victor Zverovich  EXPECT_EQ("abracadabra", format("{0}{1}{0}", "abra", "cad"));
5555f3ed207da5a2e716177e1ee8e6a9d39c628d8c6Victor Zverovich}
5565f3ed207da5a2e716177e1ee8e6a9d39c628d8c6Victor Zverovich
557095b43a8f03d447ddb3bba2db10703aa19173835Victor ZverovichTEST(FormatterTest, ArgErrors) {
55842de4f1f7d6c89d09bdaef1b42fe9f9299712f9fVictor Zverovich  EXPECT_THROW_MSG(format("{"), FormatError, "invalid format string");
5597487bde5871f0b44a40edcceda8276eed0952246jamboree  EXPECT_THROW_MSG(format("{?}"), FormatError, "invalid format string");
560da0f7c0a511e1d7430203b5e9be1684e991d2c97Victor Zverovich  EXPECT_THROW_MSG(format("{0"), FormatError, "invalid format string");
561605d2600f8ca631ce06caa6a3ff16a49d695ad7cVictor Zverovich  EXPECT_THROW_MSG(format("{0}"), FormatError, "argument index out of range");
5626e1d142a5651e649307f7626f0331c5dbd66d2b8Victor Zverovich
5634d5b1e8a13211049af1505525ecd5228ab7b2829Victor Zverovich  char format_str[BUFFER_SIZE];
5648f8fd769eef9b47339a3232e34b2696ccdc1b20bVictor Zverovich  safe_sprintf(format_str, "{%u", INT_MAX);
565da0f7c0a511e1d7430203b5e9be1684e991d2c97Victor Zverovich  EXPECT_THROW_MSG(format(format_str), FormatError, "invalid format string");
5668f8fd769eef9b47339a3232e34b2696ccdc1b20bVictor Zverovich  safe_sprintf(format_str, "{%u}", INT_MAX);
5674d5b1e8a13211049af1505525ecd5228ab7b2829Victor Zverovich  EXPECT_THROW_MSG(format(format_str), FormatError,
568605d2600f8ca631ce06caa6a3ff16a49d695ad7cVictor Zverovich      "argument index out of range");
5696e1d142a5651e649307f7626f0331c5dbd66d2b8Victor Zverovich
5708f8fd769eef9b47339a3232e34b2696ccdc1b20bVictor Zverovich  safe_sprintf(format_str, "{%u", INT_MAX + 1u);
571279c7a6e6ae3331dcad27fb8840ce953e91c3dc6Victor Zverovich  EXPECT_THROW_MSG(format(format_str), FormatError, "number is too big");
5728f8fd769eef9b47339a3232e34b2696ccdc1b20bVictor Zverovich  safe_sprintf(format_str, "{%u}", INT_MAX + 1u);
573279c7a6e6ae3331dcad27fb8840ce953e91c3dc6Victor Zverovich  EXPECT_THROW_MSG(format(format_str), FormatError, "number is too big");
5748b1c7098ec4e534cf94924a04a2bc504c81fcc41Victor Zverovich}
5758b1c7098ec4e534cf94924a04a2bc504c81fcc41Victor Zverovich
576cf04d98d0663296b4d4c56fd24f617aa14e079f3vitaut#if FMT_USE_VARIADIC_TEMPLATES
577cf04d98d0663296b4d4c56fd24f617aa14e079f3vitauttemplate <int N>
578cf04d98d0663296b4d4c56fd24f617aa14e079f3vitautstruct TestFormat {
579cf04d98d0663296b4d4c56fd24f617aa14e079f3vitaut  template <typename... Args>
580438bd9b0e6328f63fc50dab09b74b657491c1189vitaut  static std::string format(fmt::CStringRef format_str, const Args & ... args) {
581cf04d98d0663296b4d4c56fd24f617aa14e079f3vitaut    return TestFormat<N - 1>::format(format_str, N - 1, args...);
582cf04d98d0663296b4d4c56fd24f617aa14e079f3vitaut  }
583cf04d98d0663296b4d4c56fd24f617aa14e079f3vitaut};
584cf04d98d0663296b4d4c56fd24f617aa14e079f3vitaut
585cf04d98d0663296b4d4c56fd24f617aa14e079f3vitauttemplate <>
586cf04d98d0663296b4d4c56fd24f617aa14e079f3vitautstruct TestFormat<0> {
587cf04d98d0663296b4d4c56fd24f617aa14e079f3vitaut  template <typename... Args>
588438bd9b0e6328f63fc50dab09b74b657491c1189vitaut  static std::string format(fmt::CStringRef format_str, const Args & ... args) {
589cf04d98d0663296b4d4c56fd24f617aa14e079f3vitaut    return fmt::format(format_str, args...);
590cf04d98d0663296b4d4c56fd24f617aa14e079f3vitaut  }
591cf04d98d0663296b4d4c56fd24f617aa14e079f3vitaut};
592cf04d98d0663296b4d4c56fd24f617aa14e079f3vitaut
593cf04d98d0663296b4d4c56fd24f617aa14e079f3vitautTEST(FormatterTest, ManyArgs) {
594cf04d98d0663296b4d4c56fd24f617aa14e079f3vitaut  EXPECT_EQ("19", TestFormat<20>::format("{19}"));
595cf04d98d0663296b4d4c56fd24f617aa14e079f3vitaut  EXPECT_THROW_MSG(TestFormat<20>::format("{20}"),
596cf04d98d0663296b4d4c56fd24f617aa14e079f3vitaut                   FormatError, "argument index out of range");
597cf04d98d0663296b4d4c56fd24f617aa14e079f3vitaut  EXPECT_THROW_MSG(TestFormat<21>::format("{21}"),
598cf04d98d0663296b4d4c56fd24f617aa14e079f3vitaut                   FormatError, "argument index out of range");
59987cb2935f8150d9190e4298ee00309f562cb2803vitaut  enum { MAX_PACKED_ARGS = fmt::ArgList::MAX_PACKED_ARGS };
60087cb2935f8150d9190e4298ee00309f562cb2803vitaut  std::string format_str = fmt::format("{{{}}}", MAX_PACKED_ARGS + 1);
60187cb2935f8150d9190e4298ee00309f562cb2803vitaut  EXPECT_THROW_MSG(TestFormat<MAX_PACKED_ARGS>::format(format_str),
60287cb2935f8150d9190e4298ee00309f562cb2803vitaut                   FormatError, "argument index out of range");
603cf04d98d0663296b4d4c56fd24f617aa14e079f3vitaut}
604cf04d98d0663296b4d4c56fd24f617aa14e079f3vitaut#endif
605cf04d98d0663296b4d4c56fd24f617aa14e079f3vitaut
6067487bde5871f0b44a40edcceda8276eed0952246jamboreeTEST(FormatterTest, NamedArg) {
607b83ab1667605732604fc6808770c80aff119a871vitaut  EXPECT_EQ("1/a/A", format("{_1}/{a_}/{A_}", fmt::arg("a_", 'a'),
608b83ab1667605732604fc6808770c80aff119a871vitaut                            fmt::arg("A_", "A"), fmt::arg("_1", 1)));
6097487bde5871f0b44a40edcceda8276eed0952246jamboree  char a = 'A', b = 'B', c = 'C';
6103c99ed44982bcf3837ddf6eabb5cb18136c582b2jamboree  EXPECT_EQ("BB/AA/CC", format("{1}{b}/{0}{a}/{2}{c}", FMT_CAPTURE(a, b, c)));
6117487bde5871f0b44a40edcceda8276eed0952246jamboree  EXPECT_EQ(" A", format("{a:>2}", FMT_CAPTURE(a)));
612b83ab1667605732604fc6808770c80aff119a871vitaut  EXPECT_THROW_MSG(format("{a+}", FMT_CAPTURE(a)), FormatError,
613b83ab1667605732604fc6808770c80aff119a871vitaut                   "missing '}' in format string");
6147487bde5871f0b44a40edcceda8276eed0952246jamboree  EXPECT_THROW_MSG(format("{a}"), FormatError, "argument not found");
615b83ab1667605732604fc6808770c80aff119a871vitaut  EXPECT_THROW_MSG(format("{d}", FMT_CAPTURE(a, b, c)), FormatError,
616b83ab1667605732604fc6808770c80aff119a871vitaut                   "argument not found");
6177487bde5871f0b44a40edcceda8276eed0952246jamboree  EXPECT_THROW_MSG(format("{a}{}", FMT_CAPTURE(a)),
6187487bde5871f0b44a40edcceda8276eed0952246jamboree    FormatError, "cannot switch from manual to automatic argument indexing");
6197487bde5871f0b44a40edcceda8276eed0952246jamboree  EXPECT_THROW_MSG(format("{}{a}", FMT_CAPTURE(a)),
6207487bde5871f0b44a40edcceda8276eed0952246jamboree    FormatError, "cannot switch from automatic to manual argument indexing");
6217487bde5871f0b44a40edcceda8276eed0952246jamboree  EXPECT_EQ(" -42", format("{0:{width}}", -42, fmt::arg("width", 4)));
6227487bde5871f0b44a40edcceda8276eed0952246jamboree  EXPECT_EQ("st", format("{0:.{precision}}", "str", fmt::arg("precision", 2)));
6237487bde5871f0b44a40edcceda8276eed0952246jamboree  int n = 100;
6247487bde5871f0b44a40edcceda8276eed0952246jamboree  EXPECT_EQ(L"n=100", format(L"n={n}", FMT_CAPTURE_W(n)));
6257487bde5871f0b44a40edcceda8276eed0952246jamboree}
6267487bde5871f0b44a40edcceda8276eed0952246jamboree
6278412ad6aeb7a3805baa136f04cedc55c5c2b8e35Victor ZverovichTEST(FormatterTest, AutoArgIndex) {
628a1264926a0a76016fea7cc3051c84f8dbd972a93Victor Zverovich  EXPECT_EQ("abc", format("{}{}{}", 'a', 'b', 'c'));
629876a5d1f430fd5d7e3759529ba05df28ed5e4ad0Victor Zverovich  EXPECT_THROW_MSG(format("{0}{}", 'a', 'b'),
6308412ad6aeb7a3805baa136f04cedc55c5c2b8e35Victor Zverovich      FormatError, "cannot switch from manual to automatic argument indexing");
631876a5d1f430fd5d7e3759529ba05df28ed5e4ad0Victor Zverovich  EXPECT_THROW_MSG(format("{}{0}", 'a', 'b'),
6328412ad6aeb7a3805baa136f04cedc55c5c2b8e35Victor Zverovich      FormatError, "cannot switch from automatic to manual argument indexing");
633a1264926a0a76016fea7cc3051c84f8dbd972a93Victor Zverovich  EXPECT_EQ("1.2", format("{:.{}}", 1.2345, 2));
634876a5d1f430fd5d7e3759529ba05df28ed5e4ad0Victor Zverovich  EXPECT_THROW_MSG(format("{0}:.{}", 1.2345, 2),
6358412ad6aeb7a3805baa136f04cedc55c5c2b8e35Victor Zverovich      FormatError, "cannot switch from manual to automatic argument indexing");
636876a5d1f430fd5d7e3759529ba05df28ed5e4ad0Victor Zverovich  EXPECT_THROW_MSG(format("{:.{0}}", 1.2345, 2),
6378412ad6aeb7a3805baa136f04cedc55c5c2b8e35Victor Zverovich      FormatError, "cannot switch from automatic to manual argument indexing");
638605d2600f8ca631ce06caa6a3ff16a49d695ad7cVictor Zverovich  EXPECT_THROW_MSG(format("{}"), FormatError, "argument index out of range");
6398412ad6aeb7a3805baa136f04cedc55c5c2b8e35Victor Zverovich}
6408412ad6aeb7a3805baa136f04cedc55c5c2b8e35Victor Zverovich
641095b43a8f03d447ddb3bba2db10703aa19173835Victor ZverovichTEST(FormatterTest, EmptySpecs) {
642a1264926a0a76016fea7cc3051c84f8dbd972a93Victor Zverovich  EXPECT_EQ("42", format("{0:}", 42));
643095b43a8f03d447ddb3bba2db10703aa19173835Victor Zverovich}
644095b43a8f03d447ddb3bba2db10703aa19173835Victor Zverovich
645be6e54de36aa2f218b3d6106100cfdad33b9ba32Victor ZverovichTEST(FormatterTest, LeftAlign) {
646a1264926a0a76016fea7cc3051c84f8dbd972a93Victor Zverovich  EXPECT_EQ("42  ", format("{0:<4}", 42));
647a1264926a0a76016fea7cc3051c84f8dbd972a93Victor Zverovich  EXPECT_EQ("42  ", format("{0:<4o}", 042));
648a1264926a0a76016fea7cc3051c84f8dbd972a93Victor Zverovich  EXPECT_EQ("42  ", format("{0:<4x}", 0x42));
649a1264926a0a76016fea7cc3051c84f8dbd972a93Victor Zverovich  EXPECT_EQ("-42  ", format("{0:<5}", -42));
650a1264926a0a76016fea7cc3051c84f8dbd972a93Victor Zverovich  EXPECT_EQ("42   ", format("{0:<5}", 42u));
651a1264926a0a76016fea7cc3051c84f8dbd972a93Victor Zverovich  EXPECT_EQ("-42  ", format("{0:<5}", -42l));
652a1264926a0a76016fea7cc3051c84f8dbd972a93Victor Zverovich  EXPECT_EQ("42   ", format("{0:<5}", 42ul));
653a1264926a0a76016fea7cc3051c84f8dbd972a93Victor Zverovich  EXPECT_EQ("-42  ", format("{0:<5}", -42ll));
654a1264926a0a76016fea7cc3051c84f8dbd972a93Victor Zverovich  EXPECT_EQ("42   ", format("{0:<5}", 42ull));
655a1264926a0a76016fea7cc3051c84f8dbd972a93Victor Zverovich  EXPECT_EQ("-42  ", format("{0:<5}", -42.0));
656a1264926a0a76016fea7cc3051c84f8dbd972a93Victor Zverovich  EXPECT_EQ("-42  ", format("{0:<5}", -42.0l));
657a1264926a0a76016fea7cc3051c84f8dbd972a93Victor Zverovich  EXPECT_EQ("c    ", format("{0:<5}", 'c'));
658a1264926a0a76016fea7cc3051c84f8dbd972a93Victor Zverovich  EXPECT_EQ("abc  ", format("{0:<5}", "abc"));
659a1264926a0a76016fea7cc3051c84f8dbd972a93Victor Zverovich  EXPECT_EQ("0xface  ", format("{0:<8}", reinterpret_cast<void*>(0xface)));
66064236894ce3c0cf84b2331500ca9fb17e75f698bVictor Zverovich}
66164236894ce3c0cf84b2331500ca9fb17e75f698bVictor Zverovich
6621b9c22c161c1113d6609418eb02d58d056260cb7Victor ZverovichTEST(FormatterTest, RightAlign) {
663a1264926a0a76016fea7cc3051c84f8dbd972a93Victor Zverovich  EXPECT_EQ("  42", format("{0:>4}", 42));
664a1264926a0a76016fea7cc3051c84f8dbd972a93Victor Zverovich  EXPECT_EQ("  42", format("{0:>4o}", 042));
665a1264926a0a76016fea7cc3051c84f8dbd972a93Victor Zverovich  EXPECT_EQ("  42", format("{0:>4x}", 0x42));
666a1264926a0a76016fea7cc3051c84f8dbd972a93Victor Zverovich  EXPECT_EQ("  -42", format("{0:>5}", -42));
667a1264926a0a76016fea7cc3051c84f8dbd972a93Victor Zverovich  EXPECT_EQ("   42", format("{0:>5}", 42u));
668a1264926a0a76016fea7cc3051c84f8dbd972a93Victor Zverovich  EXPECT_EQ("  -42", format("{0:>5}", -42l));
669a1264926a0a76016fea7cc3051c84f8dbd972a93Victor Zverovich  EXPECT_EQ("   42", format("{0:>5}", 42ul));
670a1264926a0a76016fea7cc3051c84f8dbd972a93Victor Zverovich  EXPECT_EQ("  -42", format("{0:>5}", -42ll));
671a1264926a0a76016fea7cc3051c84f8dbd972a93Victor Zverovich  EXPECT_EQ("   42", format("{0:>5}", 42ull));
672a1264926a0a76016fea7cc3051c84f8dbd972a93Victor Zverovich  EXPECT_EQ("  -42", format("{0:>5}", -42.0));
673a1264926a0a76016fea7cc3051c84f8dbd972a93Victor Zverovich  EXPECT_EQ("  -42", format("{0:>5}", -42.0l));
674a1264926a0a76016fea7cc3051c84f8dbd972a93Victor Zverovich  EXPECT_EQ("    c", format("{0:>5}", 'c'));
675a1264926a0a76016fea7cc3051c84f8dbd972a93Victor Zverovich  EXPECT_EQ("  abc", format("{0:>5}", "abc"));
676a1264926a0a76016fea7cc3051c84f8dbd972a93Victor Zverovich  EXPECT_EQ("  0xface", format("{0:>8}", reinterpret_cast<void*>(0xface)));
6771b9c22c161c1113d6609418eb02d58d056260cb7Victor Zverovich}
6781b9c22c161c1113d6609418eb02d58d056260cb7Victor Zverovich
679ccbe94189c09aabe5a7511d89388a1a64ef16dc6Victor ZverovichTEST(FormatterTest, NumericAlign) {
680a1264926a0a76016fea7cc3051c84f8dbd972a93Victor Zverovich  EXPECT_EQ("  42", format("{0:=4}", 42));
681a1264926a0a76016fea7cc3051c84f8dbd972a93Victor Zverovich  EXPECT_EQ("+ 42", format("{0:=+4}", 42));
682a1264926a0a76016fea7cc3051c84f8dbd972a93Victor Zverovich  EXPECT_EQ("  42", format("{0:=4o}", 042));
683a1264926a0a76016fea7cc3051c84f8dbd972a93Victor Zverovich  EXPECT_EQ("+ 42", format("{0:=+4o}", 042));
684a1264926a0a76016fea7cc3051c84f8dbd972a93Victor Zverovich  EXPECT_EQ("  42", format("{0:=4x}", 0x42));
685a1264926a0a76016fea7cc3051c84f8dbd972a93Victor Zverovich  EXPECT_EQ("+ 42", format("{0:=+4x}", 0x42));
686a1264926a0a76016fea7cc3051c84f8dbd972a93Victor Zverovich  EXPECT_EQ("-  42", format("{0:=5}", -42));
687a1264926a0a76016fea7cc3051c84f8dbd972a93Victor Zverovich  EXPECT_EQ("   42", format("{0:=5}", 42u));
688a1264926a0a76016fea7cc3051c84f8dbd972a93Victor Zverovich  EXPECT_EQ("-  42", format("{0:=5}", -42l));
689a1264926a0a76016fea7cc3051c84f8dbd972a93Victor Zverovich  EXPECT_EQ("   42", format("{0:=5}", 42ul));
690a1264926a0a76016fea7cc3051c84f8dbd972a93Victor Zverovich  EXPECT_EQ("-  42", format("{0:=5}", -42ll));
691a1264926a0a76016fea7cc3051c84f8dbd972a93Victor Zverovich  EXPECT_EQ("   42", format("{0:=5}", 42ull));
692a1264926a0a76016fea7cc3051c84f8dbd972a93Victor Zverovich  EXPECT_EQ("-  42", format("{0:=5}", -42.0));
693a1264926a0a76016fea7cc3051c84f8dbd972a93Victor Zverovich  EXPECT_EQ("-  42", format("{0:=5}", -42.0l));
694876a5d1f430fd5d7e3759529ba05df28ed5e4ad0Victor Zverovich  EXPECT_THROW_MSG(format("{0:=5", 'c'),
695605d2600f8ca631ce06caa6a3ff16a49d695ad7cVictor Zverovich      FormatError, "missing '}' in format string");
696876a5d1f430fd5d7e3759529ba05df28ed5e4ad0Victor Zverovich  EXPECT_THROW_MSG(format("{0:=5}", 'c'),
697a7d94f0c61f1cb10c3b76889acc6aac16c0f257bVictor Zverovich      FormatError, "invalid format specifier for char");
698876a5d1f430fd5d7e3759529ba05df28ed5e4ad0Victor Zverovich  EXPECT_THROW_MSG(format("{0:=5}", "abc"),
699ccbe94189c09aabe5a7511d89388a1a64ef16dc6Victor Zverovich      FormatError, "format specifier '=' requires numeric argument");
700876a5d1f430fd5d7e3759529ba05df28ed5e4ad0Victor Zverovich  EXPECT_THROW_MSG(format("{0:=8}", reinterpret_cast<void*>(0xface)),
701ccbe94189c09aabe5a7511d89388a1a64ef16dc6Victor Zverovich      FormatError, "format specifier '=' requires numeric argument");
702ccbe94189c09aabe5a7511d89388a1a64ef16dc6Victor Zverovich}
703ccbe94189c09aabe5a7511d89388a1a64ef16dc6Victor Zverovich
70484310c3a8470b718495a9550c356778a73ab7efbVictor ZverovichTEST(FormatterTest, CenterAlign) {
705a1264926a0a76016fea7cc3051c84f8dbd972a93Victor Zverovich  EXPECT_EQ(" 42  ", format("{0:^5}", 42));
706a1264926a0a76016fea7cc3051c84f8dbd972a93Victor Zverovich  EXPECT_EQ(" 42  ", format("{0:^5o}", 042));
707a1264926a0a76016fea7cc3051c84f8dbd972a93Victor Zverovich  EXPECT_EQ(" 42  ", format("{0:^5x}", 0x42));
708a1264926a0a76016fea7cc3051c84f8dbd972a93Victor Zverovich  EXPECT_EQ(" -42 ", format("{0:^5}", -42));
709a1264926a0a76016fea7cc3051c84f8dbd972a93Victor Zverovich  EXPECT_EQ(" 42  ", format("{0:^5}", 42u));
710a1264926a0a76016fea7cc3051c84f8dbd972a93Victor Zverovich  EXPECT_EQ(" -42 ", format("{0:^5}", -42l));
711a1264926a0a76016fea7cc3051c84f8dbd972a93Victor Zverovich  EXPECT_EQ(" 42  ", format("{0:^5}", 42ul));
712a1264926a0a76016fea7cc3051c84f8dbd972a93Victor Zverovich  EXPECT_EQ(" -42 ", format("{0:^5}", -42ll));
713a1264926a0a76016fea7cc3051c84f8dbd972a93Victor Zverovich  EXPECT_EQ(" 42  ", format("{0:^5}", 42ull));
714a1264926a0a76016fea7cc3051c84f8dbd972a93Victor Zverovich  EXPECT_EQ(" -42  ", format("{0:^6}", -42.0));
715a1264926a0a76016fea7cc3051c84f8dbd972a93Victor Zverovich  EXPECT_EQ(" -42 ", format("{0:^5}", -42.0l));
716a1264926a0a76016fea7cc3051c84f8dbd972a93Victor Zverovich  EXPECT_EQ("  c  ", format("{0:^5}", 'c'));
717a1264926a0a76016fea7cc3051c84f8dbd972a93Victor Zverovich  EXPECT_EQ(" abc  ", format("{0:^6}", "abc"));
718a1264926a0a76016fea7cc3051c84f8dbd972a93Victor Zverovich  EXPECT_EQ(" 0xface ", format("{0:^8}", reinterpret_cast<void*>(0xface)));
71984310c3a8470b718495a9550c356778a73ab7efbVictor Zverovich}
72084310c3a8470b718495a9550c356778a73ab7efbVictor Zverovich
721a0d685c7102759e90148a2b4cd831eb50a221fdcVictor ZverovichTEST(FormatterTest, Fill) {
7224d5b1e8a13211049af1505525ecd5228ab7b2829Victor Zverovich  EXPECT_THROW_MSG(format("{0:{<5}", 'c'),
72342de4f1f7d6c89d09bdaef1b42fe9f9299712f9fVictor Zverovich      FormatError, "invalid fill character '{'");
7244d5b1e8a13211049af1505525ecd5228ab7b2829Victor Zverovich  EXPECT_THROW_MSG(format("{0:{<5}}", 'c'),
725ccbe94189c09aabe5a7511d89388a1a64ef16dc6Victor Zverovich      FormatError, "invalid fill character '{'");
726a1264926a0a76016fea7cc3051c84f8dbd972a93Victor Zverovich  EXPECT_EQ("**42", format("{0:*>4}", 42));
727a1264926a0a76016fea7cc3051c84f8dbd972a93Victor Zverovich  EXPECT_EQ("**-42", format("{0:*>5}", -42));
728a1264926a0a76016fea7cc3051c84f8dbd972a93Victor Zverovich  EXPECT_EQ("***42", format("{0:*>5}", 42u));
729a1264926a0a76016fea7cc3051c84f8dbd972a93Victor Zverovich  EXPECT_EQ("**-42", format("{0:*>5}", -42l));
730a1264926a0a76016fea7cc3051c84f8dbd972a93Victor Zverovich  EXPECT_EQ("***42", format("{0:*>5}", 42ul));
731a1264926a0a76016fea7cc3051c84f8dbd972a93Victor Zverovich  EXPECT_EQ("**-42", format("{0:*>5}", -42ll));
732a1264926a0a76016fea7cc3051c84f8dbd972a93Victor Zverovich  EXPECT_EQ("***42", format("{0:*>5}", 42ull));
733a1264926a0a76016fea7cc3051c84f8dbd972a93Victor Zverovich  EXPECT_EQ("**-42", format("{0:*>5}", -42.0));
734a1264926a0a76016fea7cc3051c84f8dbd972a93Victor Zverovich  EXPECT_EQ("**-42", format("{0:*>5}", -42.0l));
735a1264926a0a76016fea7cc3051c84f8dbd972a93Victor Zverovich  EXPECT_EQ("c****", format("{0:*<5}", 'c'));
736a1264926a0a76016fea7cc3051c84f8dbd972a93Victor Zverovich  EXPECT_EQ("abc**", format("{0:*<5}", "abc"));
737a1264926a0a76016fea7cc3051c84f8dbd972a93Victor Zverovich  EXPECT_EQ("**0xface", format("{0:*>8}", reinterpret_cast<void*>(0xface)));
738a0d685c7102759e90148a2b4cd831eb50a221fdcVictor Zverovich}
739a0d685c7102759e90148a2b4cd831eb50a221fdcVictor Zverovich
7400a138ad86500c42cab37f72848fc87b585c98cd2Victor ZverovichTEST(FormatterTest, PlusSign) {
741a1264926a0a76016fea7cc3051c84f8dbd972a93Victor Zverovich  EXPECT_EQ("+42", format("{0:+}", 42));
742a1264926a0a76016fea7cc3051c84f8dbd972a93Victor Zverovich  EXPECT_EQ("-42", format("{0:+}", -42));
743a1264926a0a76016fea7cc3051c84f8dbd972a93Victor Zverovich  EXPECT_EQ("+42", format("{0:+}", 42));
7444d5b1e8a13211049af1505525ecd5228ab7b2829Victor Zverovich  EXPECT_THROW_MSG(format("{0:+}", 42u),
745bbd13a492b623c2a60e0a28733f1733e3698920dVictor Zverovich      FormatError, "format specifier '+' requires signed argument");
746a1264926a0a76016fea7cc3051c84f8dbd972a93Victor Zverovich  EXPECT_EQ("+42", format("{0:+}", 42l));
7474d5b1e8a13211049af1505525ecd5228ab7b2829Victor Zverovich  EXPECT_THROW_MSG(format("{0:+}", 42ul),
748bbd13a492b623c2a60e0a28733f1733e3698920dVictor Zverovich      FormatError, "format specifier '+' requires signed argument");
749a1264926a0a76016fea7cc3051c84f8dbd972a93Victor Zverovich  EXPECT_EQ("+42", format("{0:+}", 42ll));
7504d5b1e8a13211049af1505525ecd5228ab7b2829Victor Zverovich  EXPECT_THROW_MSG(format("{0:+}", 42ull),
75156f12b737cd39354f0f6d42c0ae7af275d2ad9a4Victor Zverovich      FormatError, "format specifier '+' requires signed argument");
752a1264926a0a76016fea7cc3051c84f8dbd972a93Victor Zverovich  EXPECT_EQ("+42", format("{0:+}", 42.0));
753a1264926a0a76016fea7cc3051c84f8dbd972a93Victor Zverovich  EXPECT_EQ("+42", format("{0:+}", 42.0l));
7544d5b1e8a13211049af1505525ecd5228ab7b2829Victor Zverovich  EXPECT_THROW_MSG(format("{0:+", 'c'),
755605d2600f8ca631ce06caa6a3ff16a49d695ad7cVictor Zverovich      FormatError, "missing '}' in format string");
7564d5b1e8a13211049af1505525ecd5228ab7b2829Victor Zverovich  EXPECT_THROW_MSG(format("{0:+}", 'c'),
757a7d94f0c61f1cb10c3b76889acc6aac16c0f257bVictor Zverovich      FormatError, "invalid format specifier for char");
7584d5b1e8a13211049af1505525ecd5228ab7b2829Victor Zverovich  EXPECT_THROW_MSG(format("{0:+}", "abc"),
759bbd13a492b623c2a60e0a28733f1733e3698920dVictor Zverovich      FormatError, "format specifier '+' requires numeric argument");
7604d5b1e8a13211049af1505525ecd5228ab7b2829Victor Zverovich  EXPECT_THROW_MSG(format("{0:+}", reinterpret_cast<void*>(0x42)),
761bbd13a492b623c2a60e0a28733f1733e3698920dVictor Zverovich      FormatError, "format specifier '+' requires numeric argument");
7628b1c7098ec4e534cf94924a04a2bc504c81fcc41Victor Zverovich}
7638b1c7098ec4e534cf94924a04a2bc504c81fcc41Victor Zverovich
7640a138ad86500c42cab37f72848fc87b585c98cd2Victor ZverovichTEST(FormatterTest, MinusSign) {
765a1264926a0a76016fea7cc3051c84f8dbd972a93Victor Zverovich  EXPECT_EQ("42", format("{0:-}", 42));
766a1264926a0a76016fea7cc3051c84f8dbd972a93Victor Zverovich  EXPECT_EQ("-42", format("{0:-}", -42));
767a1264926a0a76016fea7cc3051c84f8dbd972a93Victor Zverovich  EXPECT_EQ("42", format("{0:-}", 42));
7684d5b1e8a13211049af1505525ecd5228ab7b2829Victor Zverovich  EXPECT_THROW_MSG(format("{0:-}", 42u),
7690a138ad86500c42cab37f72848fc87b585c98cd2Victor Zverovich      FormatError, "format specifier '-' requires signed argument");
770a1264926a0a76016fea7cc3051c84f8dbd972a93Victor Zverovich  EXPECT_EQ("42", format("{0:-}", 42l));
7714d5b1e8a13211049af1505525ecd5228ab7b2829Victor Zverovich  EXPECT_THROW_MSG(format("{0:-}", 42ul),
7720a138ad86500c42cab37f72848fc87b585c98cd2Victor Zverovich      FormatError, "format specifier '-' requires signed argument");
773a1264926a0a76016fea7cc3051c84f8dbd972a93Victor Zverovich  EXPECT_EQ("42", format("{0:-}", 42ll));
7744d5b1e8a13211049af1505525ecd5228ab7b2829Victor Zverovich  EXPECT_THROW_MSG(format("{0:-}", 42ull),
77556f12b737cd39354f0f6d42c0ae7af275d2ad9a4Victor Zverovich      FormatError, "format specifier '-' requires signed argument");
776a1264926a0a76016fea7cc3051c84f8dbd972a93Victor Zverovich  EXPECT_EQ("42", format("{0:-}", 42.0));
777a1264926a0a76016fea7cc3051c84f8dbd972a93Victor Zverovich  EXPECT_EQ("42", format("{0:-}", 42.0l));
7784d5b1e8a13211049af1505525ecd5228ab7b2829Victor Zverovich  EXPECT_THROW_MSG(format("{0:-", 'c'),
779605d2600f8ca631ce06caa6a3ff16a49d695ad7cVictor Zverovich      FormatError, "missing '}' in format string");
7804d5b1e8a13211049af1505525ecd5228ab7b2829Victor Zverovich  EXPECT_THROW_MSG(format("{0:-}", 'c'),
781a7d94f0c61f1cb10c3b76889acc6aac16c0f257bVictor Zverovich      FormatError, "invalid format specifier for char");
7824d5b1e8a13211049af1505525ecd5228ab7b2829Victor Zverovich  EXPECT_THROW_MSG(format("{0:-}", "abc"),
7830a138ad86500c42cab37f72848fc87b585c98cd2Victor Zverovich      FormatError, "format specifier '-' requires numeric argument");
7844d5b1e8a13211049af1505525ecd5228ab7b2829Victor Zverovich  EXPECT_THROW_MSG(format("{0:-}", reinterpret_cast<void*>(0x42)),
7850a138ad86500c42cab37f72848fc87b585c98cd2Victor Zverovich      FormatError, "format specifier '-' requires numeric argument");
7860a138ad86500c42cab37f72848fc87b585c98cd2Victor Zverovich}
7870a138ad86500c42cab37f72848fc87b585c98cd2Victor Zverovich
78817ca809135af233c55a8181e17464d0b61719371Victor ZverovichTEST(FormatterTest, SpaceSign) {
789a1264926a0a76016fea7cc3051c84f8dbd972a93Victor Zverovich  EXPECT_EQ(" 42", format("{0: }", 42));
790a1264926a0a76016fea7cc3051c84f8dbd972a93Victor Zverovich  EXPECT_EQ("-42", format("{0: }", -42));
791a1264926a0a76016fea7cc3051c84f8dbd972a93Victor Zverovich  EXPECT_EQ(" 42", format("{0: }", 42));
7924d5b1e8a13211049af1505525ecd5228ab7b2829Victor Zverovich  EXPECT_THROW_MSG(format("{0: }", 42u),
79317ca809135af233c55a8181e17464d0b61719371Victor Zverovich      FormatError, "format specifier ' ' requires signed argument");
794a1264926a0a76016fea7cc3051c84f8dbd972a93Victor Zverovich  EXPECT_EQ(" 42", format("{0: }", 42l));
7954d5b1e8a13211049af1505525ecd5228ab7b2829Victor Zverovich  EXPECT_THROW_MSG(format("{0: }", 42ul),
79617ca809135af233c55a8181e17464d0b61719371Victor Zverovich      FormatError, "format specifier ' ' requires signed argument");
797a1264926a0a76016fea7cc3051c84f8dbd972a93Victor Zverovich  EXPECT_EQ(" 42", format("{0: }", 42ll));
7984d5b1e8a13211049af1505525ecd5228ab7b2829Victor Zverovich  EXPECT_THROW_MSG(format("{0: }", 42ull),
79956f12b737cd39354f0f6d42c0ae7af275d2ad9a4Victor Zverovich      FormatError, "format specifier ' ' requires signed argument");
800a1264926a0a76016fea7cc3051c84f8dbd972a93Victor Zverovich  EXPECT_EQ(" 42", format("{0: }", 42.0));
801a1264926a0a76016fea7cc3051c84f8dbd972a93Victor Zverovich  EXPECT_EQ(" 42", format("{0: }", 42.0l));
8024d5b1e8a13211049af1505525ecd5228ab7b2829Victor Zverovich  EXPECT_THROW_MSG(format("{0: ", 'c'),
803605d2600f8ca631ce06caa6a3ff16a49d695ad7cVictor Zverovich      FormatError, "missing '}' in format string");
8044d5b1e8a13211049af1505525ecd5228ab7b2829Victor Zverovich  EXPECT_THROW_MSG(format("{0: }", 'c'),
805a7d94f0c61f1cb10c3b76889acc6aac16c0f257bVictor Zverovich      FormatError, "invalid format specifier for char");
8064d5b1e8a13211049af1505525ecd5228ab7b2829Victor Zverovich  EXPECT_THROW_MSG(format("{0: }", "abc"),
80717ca809135af233c55a8181e17464d0b61719371Victor Zverovich      FormatError, "format specifier ' ' requires numeric argument");
8084d5b1e8a13211049af1505525ecd5228ab7b2829Victor Zverovich  EXPECT_THROW_MSG(format("{0: }", reinterpret_cast<void*>(0x42)),
80917ca809135af233c55a8181e17464d0b61719371Victor Zverovich      FormatError, "format specifier ' ' requires numeric argument");
81017ca809135af233c55a8181e17464d0b61719371Victor Zverovich}
81117ca809135af233c55a8181e17464d0b61719371Victor Zverovich
81273f13eeb5b023fd81ace27da86a144236f1955f1Victor ZverovichTEST(FormatterTest, HashFlag) {
813a1264926a0a76016fea7cc3051c84f8dbd972a93Victor Zverovich  EXPECT_EQ("42", format("{0:#}", 42));
814a1264926a0a76016fea7cc3051c84f8dbd972a93Victor Zverovich  EXPECT_EQ("-42", format("{0:#}", -42));
815a1264926a0a76016fea7cc3051c84f8dbd972a93Victor Zverovich  EXPECT_EQ("0b101010", format("{0:#b}", 42));
816a1264926a0a76016fea7cc3051c84f8dbd972a93Victor Zverovich  EXPECT_EQ("0B101010", format("{0:#B}", 42));
817a1264926a0a76016fea7cc3051c84f8dbd972a93Victor Zverovich  EXPECT_EQ("-0b101010", format("{0:#b}", -42));
818a1264926a0a76016fea7cc3051c84f8dbd972a93Victor Zverovich  EXPECT_EQ("0x42", format("{0:#x}", 0x42));
819a1264926a0a76016fea7cc3051c84f8dbd972a93Victor Zverovich  EXPECT_EQ("0X42", format("{0:#X}", 0x42));
820a1264926a0a76016fea7cc3051c84f8dbd972a93Victor Zverovich  EXPECT_EQ("-0x42", format("{0:#x}", -0x42));
821a1264926a0a76016fea7cc3051c84f8dbd972a93Victor Zverovich  EXPECT_EQ("042", format("{0:#o}", 042));
822a1264926a0a76016fea7cc3051c84f8dbd972a93Victor Zverovich  EXPECT_EQ("-042", format("{0:#o}", -042));
823a1264926a0a76016fea7cc3051c84f8dbd972a93Victor Zverovich  EXPECT_EQ("42", format("{0:#}", 42u));
824a1264926a0a76016fea7cc3051c84f8dbd972a93Victor Zverovich  EXPECT_EQ("0x42", format("{0:#x}", 0x42u));
825a1264926a0a76016fea7cc3051c84f8dbd972a93Victor Zverovich  EXPECT_EQ("042", format("{0:#o}", 042u));
826a1264926a0a76016fea7cc3051c84f8dbd972a93Victor Zverovich
827a1264926a0a76016fea7cc3051c84f8dbd972a93Victor Zverovich  EXPECT_EQ("-42", format("{0:#}", -42l));
828a1264926a0a76016fea7cc3051c84f8dbd972a93Victor Zverovich  EXPECT_EQ("0x42", format("{0:#x}", 0x42l));
829a1264926a0a76016fea7cc3051c84f8dbd972a93Victor Zverovich  EXPECT_EQ("-0x42", format("{0:#x}", -0x42l));
830a1264926a0a76016fea7cc3051c84f8dbd972a93Victor Zverovich  EXPECT_EQ("042", format("{0:#o}", 042l));
831a1264926a0a76016fea7cc3051c84f8dbd972a93Victor Zverovich  EXPECT_EQ("-042", format("{0:#o}", -042l));
832a1264926a0a76016fea7cc3051c84f8dbd972a93Victor Zverovich  EXPECT_EQ("42", format("{0:#}", 42ul));
833a1264926a0a76016fea7cc3051c84f8dbd972a93Victor Zverovich  EXPECT_EQ("0x42", format("{0:#x}", 0x42ul));
834a1264926a0a76016fea7cc3051c84f8dbd972a93Victor Zverovich  EXPECT_EQ("042", format("{0:#o}", 042ul));
835a1264926a0a76016fea7cc3051c84f8dbd972a93Victor Zverovich
836a1264926a0a76016fea7cc3051c84f8dbd972a93Victor Zverovich  EXPECT_EQ("-42", format("{0:#}", -42ll));
837a1264926a0a76016fea7cc3051c84f8dbd972a93Victor Zverovich  EXPECT_EQ("0x42", format("{0:#x}", 0x42ll));
838a1264926a0a76016fea7cc3051c84f8dbd972a93Victor Zverovich  EXPECT_EQ("-0x42", format("{0:#x}", -0x42ll));
839a1264926a0a76016fea7cc3051c84f8dbd972a93Victor Zverovich  EXPECT_EQ("042", format("{0:#o}", 042ll));
840a1264926a0a76016fea7cc3051c84f8dbd972a93Victor Zverovich  EXPECT_EQ("-042", format("{0:#o}", -042ll));
841a1264926a0a76016fea7cc3051c84f8dbd972a93Victor Zverovich  EXPECT_EQ("42", format("{0:#}", 42ull));
842a1264926a0a76016fea7cc3051c84f8dbd972a93Victor Zverovich  EXPECT_EQ("0x42", format("{0:#x}", 0x42ull));
843a1264926a0a76016fea7cc3051c84f8dbd972a93Victor Zverovich  EXPECT_EQ("042", format("{0:#o}", 042ull));
844a1264926a0a76016fea7cc3051c84f8dbd972a93Victor Zverovich
845a1264926a0a76016fea7cc3051c84f8dbd972a93Victor Zverovich  EXPECT_EQ("-42.0000", format("{0:#}", -42.0));
846a1264926a0a76016fea7cc3051c84f8dbd972a93Victor Zverovich  EXPECT_EQ("-42.0000", format("{0:#}", -42.0l));
847e06e9f885c966528e0fecd1531abe0012d71ed73Victor Zverovich  EXPECT_THROW_MSG(format("{0:#", 'c'),
848605d2600f8ca631ce06caa6a3ff16a49d695ad7cVictor Zverovich      FormatError, "missing '}' in format string");
849e06e9f885c966528e0fecd1531abe0012d71ed73Victor Zverovich  EXPECT_THROW_MSG(format("{0:#}", 'c'),
850a7d94f0c61f1cb10c3b76889acc6aac16c0f257bVictor Zverovich      FormatError, "invalid format specifier for char");
851e06e9f885c966528e0fecd1531abe0012d71ed73Victor Zverovich  EXPECT_THROW_MSG(format("{0:#}", "abc"),
85273f13eeb5b023fd81ace27da86a144236f1955f1Victor Zverovich      FormatError, "format specifier '#' requires numeric argument");
853e06e9f885c966528e0fecd1531abe0012d71ed73Victor Zverovich  EXPECT_THROW_MSG(format("{0:#}", reinterpret_cast<void*>(0x42)),
85473f13eeb5b023fd81ace27da86a144236f1955f1Victor Zverovich      FormatError, "format specifier '#' requires numeric argument");
85573f13eeb5b023fd81ace27da86a144236f1955f1Victor Zverovich}
85673f13eeb5b023fd81ace27da86a144236f1955f1Victor Zverovich
857095b43a8f03d447ddb3bba2db10703aa19173835Victor ZverovichTEST(FormatterTest, ZeroFlag) {
858a1264926a0a76016fea7cc3051c84f8dbd972a93Victor Zverovich  EXPECT_EQ("42", format("{0:0}", 42));
859a1264926a0a76016fea7cc3051c84f8dbd972a93Victor Zverovich  EXPECT_EQ("-0042", format("{0:05}", -42));
860a1264926a0a76016fea7cc3051c84f8dbd972a93Victor Zverovich  EXPECT_EQ("00042", format("{0:05}", 42u));
861a1264926a0a76016fea7cc3051c84f8dbd972a93Victor Zverovich  EXPECT_EQ("-0042", format("{0:05}", -42l));
862a1264926a0a76016fea7cc3051c84f8dbd972a93Victor Zverovich  EXPECT_EQ("00042", format("{0:05}", 42ul));
863a1264926a0a76016fea7cc3051c84f8dbd972a93Victor Zverovich  EXPECT_EQ("-0042", format("{0:05}", -42ll));
864a1264926a0a76016fea7cc3051c84f8dbd972a93Victor Zverovich  EXPECT_EQ("00042", format("{0:05}", 42ull));
865a1264926a0a76016fea7cc3051c84f8dbd972a93Victor Zverovich  EXPECT_EQ("-0042", format("{0:05}", -42.0));
866a1264926a0a76016fea7cc3051c84f8dbd972a93Victor Zverovich  EXPECT_EQ("-0042", format("{0:05}", -42.0l));
867e06e9f885c966528e0fecd1531abe0012d71ed73Victor Zverovich  EXPECT_THROW_MSG(format("{0:0", 'c'),
868605d2600f8ca631ce06caa6a3ff16a49d695ad7cVictor Zverovich      FormatError, "missing '}' in format string");
869e06e9f885c966528e0fecd1531abe0012d71ed73Victor Zverovich  EXPECT_THROW_MSG(format("{0:05}", 'c'),
870a7d94f0c61f1cb10c3b76889acc6aac16c0f257bVictor Zverovich      FormatError, "invalid format specifier for char");
871e06e9f885c966528e0fecd1531abe0012d71ed73Victor Zverovich  EXPECT_THROW_MSG(format("{0:05}", "abc"),
872bbd13a492b623c2a60e0a28733f1733e3698920dVictor Zverovich      FormatError, "format specifier '0' requires numeric argument");
873e06e9f885c966528e0fecd1531abe0012d71ed73Victor Zverovich  EXPECT_THROW_MSG(format("{0:05}", reinterpret_cast<void*>(0x42)),
874bbd13a492b623c2a60e0a28733f1733e3698920dVictor Zverovich      FormatError, "format specifier '0' requires numeric argument");
875cb99919912c4af4eddfab6769ee0419256cf5f6aVictor Zverovich}
876cb99919912c4af4eddfab6769ee0419256cf5f6aVictor Zverovich
877095b43a8f03d447ddb3bba2db10703aa19173835Victor ZverovichTEST(FormatterTest, Width) {
878e06e9f885c966528e0fecd1531abe0012d71ed73Victor Zverovich  char format_str[BUFFER_SIZE];
8798f8fd769eef9b47339a3232e34b2696ccdc1b20bVictor Zverovich  safe_sprintf(format_str, "{0:%u", UINT_MAX);
8808f8fd769eef9b47339a3232e34b2696ccdc1b20bVictor Zverovich  increment(format_str + 3);
881279c7a6e6ae3331dcad27fb8840ce953e91c3dc6Victor Zverovich  EXPECT_THROW_MSG(format(format_str, 0), FormatError, "number is too big");
882e06e9f885c966528e0fecd1531abe0012d71ed73Victor Zverovich  std::size_t size = std::strlen(format_str);
883e06e9f885c966528e0fecd1531abe0012d71ed73Victor Zverovich  format_str[size] = '}';
884e06e9f885c966528e0fecd1531abe0012d71ed73Victor Zverovich  format_str[size + 1] = 0;
885279c7a6e6ae3331dcad27fb8840ce953e91c3dc6Victor Zverovich  EXPECT_THROW_MSG(format(format_str, 0), FormatError, "number is too big");
8866e1d142a5651e649307f7626f0331c5dbd66d2b8Victor Zverovich
8878f8fd769eef9b47339a3232e34b2696ccdc1b20bVictor Zverovich  safe_sprintf(format_str, "{0:%u", INT_MAX + 1u);
888279c7a6e6ae3331dcad27fb8840ce953e91c3dc6Victor Zverovich  EXPECT_THROW_MSG(format(format_str, 0), FormatError, "number is too big");
8898f8fd769eef9b47339a3232e34b2696ccdc1b20bVictor Zverovich  safe_sprintf(format_str, "{0:%u}", INT_MAX + 1u);
890279c7a6e6ae3331dcad27fb8840ce953e91c3dc6Victor Zverovich  EXPECT_THROW_MSG(format(format_str, 0), FormatError, "number is too big");
891a1264926a0a76016fea7cc3051c84f8dbd972a93Victor Zverovich  EXPECT_EQ(" -42", format("{0:4}", -42));
892a1264926a0a76016fea7cc3051c84f8dbd972a93Victor Zverovich  EXPECT_EQ("   42", format("{0:5}", 42u));
893a1264926a0a76016fea7cc3051c84f8dbd972a93Victor Zverovich  EXPECT_EQ("   -42", format("{0:6}", -42l));
894a1264926a0a76016fea7cc3051c84f8dbd972a93Victor Zverovich  EXPECT_EQ("     42", format("{0:7}", 42ul));
895a1264926a0a76016fea7cc3051c84f8dbd972a93Victor Zverovich  EXPECT_EQ("   -42", format("{0:6}", -42ll));
896a1264926a0a76016fea7cc3051c84f8dbd972a93Victor Zverovich  EXPECT_EQ("     42", format("{0:7}", 42ull));
897a1264926a0a76016fea7cc3051c84f8dbd972a93Victor Zverovich  EXPECT_EQ("   -1.23", format("{0:8}", -1.23));
898a1264926a0a76016fea7cc3051c84f8dbd972a93Victor Zverovich  EXPECT_EQ("    -1.23", format("{0:9}", -1.23l));
899a1264926a0a76016fea7cc3051c84f8dbd972a93Victor Zverovich  EXPECT_EQ("    0xcafe", format("{0:10}", reinterpret_cast<void*>(0xcafe)));
900a1264926a0a76016fea7cc3051c84f8dbd972a93Victor Zverovich  EXPECT_EQ("x          ", format("{0:11}", 'x'));
901a1264926a0a76016fea7cc3051c84f8dbd972a93Victor Zverovich  EXPECT_EQ("str         ", format("{0:12}", "str"));
902cb99919912c4af4eddfab6769ee0419256cf5f6aVictor Zverovich}
903cb99919912c4af4eddfab6769ee0419256cf5f6aVictor Zverovich
90454a6cb34c7e7179dbd0655f7d0823f1eae5abbadjamboreeTEST(FormatterTest, RuntimeWidth) {
9058949a2e9416e7f81f28b92187ad9dbef9d8408d1vitaut  char format_str[BUFFER_SIZE];
9068949a2e9416e7f81f28b92187ad9dbef9d8408d1vitaut  safe_sprintf(format_str, "{0:{%u", UINT_MAX);
9078949a2e9416e7f81f28b92187ad9dbef9d8408d1vitaut  increment(format_str + 4);
9088949a2e9416e7f81f28b92187ad9dbef9d8408d1vitaut  EXPECT_THROW_MSG(format(format_str, 0), FormatError, "number is too big");
9098949a2e9416e7f81f28b92187ad9dbef9d8408d1vitaut  std::size_t size = std::strlen(format_str);
9108949a2e9416e7f81f28b92187ad9dbef9d8408d1vitaut  format_str[size] = '}';
9118949a2e9416e7f81f28b92187ad9dbef9d8408d1vitaut  format_str[size + 1] = 0;
9128949a2e9416e7f81f28b92187ad9dbef9d8408d1vitaut  EXPECT_THROW_MSG(format(format_str, 0), FormatError, "number is too big");
9138949a2e9416e7f81f28b92187ad9dbef9d8408d1vitaut  format_str[size + 1] = '}';
9148949a2e9416e7f81f28b92187ad9dbef9d8408d1vitaut  format_str[size + 2] = 0;
9158949a2e9416e7f81f28b92187ad9dbef9d8408d1vitaut  EXPECT_THROW_MSG(format(format_str, 0), FormatError, "number is too big");
91654a6cb34c7e7179dbd0655f7d0823f1eae5abbadjamboree
9178949a2e9416e7f81f28b92187ad9dbef9d8408d1vitaut  EXPECT_THROW_MSG(format("{0:{", 0),
9188949a2e9416e7f81f28b92187ad9dbef9d8408d1vitaut      FormatError, "invalid format string");
9198949a2e9416e7f81f28b92187ad9dbef9d8408d1vitaut  EXPECT_THROW_MSG(format("{0:{}", 0),
9208949a2e9416e7f81f28b92187ad9dbef9d8408d1vitaut      FormatError, "cannot switch from manual to automatic argument indexing");
9217487bde5871f0b44a40edcceda8276eed0952246jamboree  EXPECT_THROW_MSG(format("{0:{?}}", 0),
9228949a2e9416e7f81f28b92187ad9dbef9d8408d1vitaut      FormatError, "invalid format string");
9238949a2e9416e7f81f28b92187ad9dbef9d8408d1vitaut  EXPECT_THROW_MSG(format("{0:{1}}", 0),
9248949a2e9416e7f81f28b92187ad9dbef9d8408d1vitaut      FormatError, "argument index out of range");
9258949a2e9416e7f81f28b92187ad9dbef9d8408d1vitaut
9268949a2e9416e7f81f28b92187ad9dbef9d8408d1vitaut  EXPECT_THROW_MSG(format("{0:{0:}}", 0),
9278949a2e9416e7f81f28b92187ad9dbef9d8408d1vitaut      FormatError, "invalid format string");
9288949a2e9416e7f81f28b92187ad9dbef9d8408d1vitaut
9298949a2e9416e7f81f28b92187ad9dbef9d8408d1vitaut  EXPECT_THROW_MSG(format("{0:{1}}", 0, -1),
9308949a2e9416e7f81f28b92187ad9dbef9d8408d1vitaut      FormatError, "negative width");
9318949a2e9416e7f81f28b92187ad9dbef9d8408d1vitaut  EXPECT_THROW_MSG(format("{0:{1}}", 0, (INT_MAX + 1u)),
9328949a2e9416e7f81f28b92187ad9dbef9d8408d1vitaut      FormatError, "number is too big");
9338949a2e9416e7f81f28b92187ad9dbef9d8408d1vitaut  EXPECT_THROW_MSG(format("{0:{1}}", 0, -1l),
9348949a2e9416e7f81f28b92187ad9dbef9d8408d1vitaut      FormatError, "negative width");
9358631694021ccba79b6907b27ccca6f23575ea31aVictor Zverovich  if (fmt::internal::const_check(sizeof(long) > sizeof(int))) {
9368949a2e9416e7f81f28b92187ad9dbef9d8408d1vitaut    long value = INT_MAX;
9378949a2e9416e7f81f28b92187ad9dbef9d8408d1vitaut    EXPECT_THROW_MSG(format("{0:{1}}", 0, (value + 1)),
9388949a2e9416e7f81f28b92187ad9dbef9d8408d1vitaut        FormatError, "number is too big");
9398949a2e9416e7f81f28b92187ad9dbef9d8408d1vitaut  }
9408949a2e9416e7f81f28b92187ad9dbef9d8408d1vitaut  EXPECT_THROW_MSG(format("{0:{1}}", 0, (INT_MAX + 1ul)),
9418949a2e9416e7f81f28b92187ad9dbef9d8408d1vitaut      FormatError, "number is too big");
9428949a2e9416e7f81f28b92187ad9dbef9d8408d1vitaut
9438949a2e9416e7f81f28b92187ad9dbef9d8408d1vitaut  EXPECT_THROW_MSG(format("{0:{1}}", 0, '0'),
9448949a2e9416e7f81f28b92187ad9dbef9d8408d1vitaut      FormatError, "width is not integer");
9458949a2e9416e7f81f28b92187ad9dbef9d8408d1vitaut  EXPECT_THROW_MSG(format("{0:{1}}", 0, 0.0),
9468949a2e9416e7f81f28b92187ad9dbef9d8408d1vitaut      FormatError, "width is not integer");
9478949a2e9416e7f81f28b92187ad9dbef9d8408d1vitaut
9488949a2e9416e7f81f28b92187ad9dbef9d8408d1vitaut  EXPECT_EQ(" -42", format("{0:{1}}", -42, 4));
9498949a2e9416e7f81f28b92187ad9dbef9d8408d1vitaut  EXPECT_EQ("   42", format("{0:{1}}", 42u, 5));
9508949a2e9416e7f81f28b92187ad9dbef9d8408d1vitaut  EXPECT_EQ("   -42", format("{0:{1}}", -42l, 6));
9518949a2e9416e7f81f28b92187ad9dbef9d8408d1vitaut  EXPECT_EQ("     42", format("{0:{1}}", 42ul, 7));
9528949a2e9416e7f81f28b92187ad9dbef9d8408d1vitaut  EXPECT_EQ("   -42", format("{0:{1}}", -42ll, 6));
9538949a2e9416e7f81f28b92187ad9dbef9d8408d1vitaut  EXPECT_EQ("     42", format("{0:{1}}", 42ull, 7));
9548949a2e9416e7f81f28b92187ad9dbef9d8408d1vitaut  EXPECT_EQ("   -1.23", format("{0:{1}}", -1.23, 8));
9558949a2e9416e7f81f28b92187ad9dbef9d8408d1vitaut  EXPECT_EQ("    -1.23", format("{0:{1}}", -1.23l, 9));
956b83ab1667605732604fc6808770c80aff119a871vitaut  EXPECT_EQ("    0xcafe",
957b83ab1667605732604fc6808770c80aff119a871vitaut            format("{0:{1}}", reinterpret_cast<void*>(0xcafe), 10));
9588949a2e9416e7f81f28b92187ad9dbef9d8408d1vitaut  EXPECT_EQ("x          ", format("{0:{1}}", 'x', 11));
9598949a2e9416e7f81f28b92187ad9dbef9d8408d1vitaut  EXPECT_EQ("str         ", format("{0:{1}}", "str", 12));
96054a6cb34c7e7179dbd0655f7d0823f1eae5abbadjamboree}
96154a6cb34c7e7179dbd0655f7d0823f1eae5abbadjamboree
962bbd13a492b623c2a60e0a28733f1733e3698920dVictor ZverovichTEST(FormatterTest, Precision) {
963e06e9f885c966528e0fecd1531abe0012d71ed73Victor Zverovich  char format_str[BUFFER_SIZE];
9648f8fd769eef9b47339a3232e34b2696ccdc1b20bVictor Zverovich  safe_sprintf(format_str, "{0:.%u", UINT_MAX);
9658f8fd769eef9b47339a3232e34b2696ccdc1b20bVictor Zverovich  increment(format_str + 4);
966279c7a6e6ae3331dcad27fb8840ce953e91c3dc6Victor Zverovich  EXPECT_THROW_MSG(format(format_str, 0), FormatError, "number is too big");
967e06e9f885c966528e0fecd1531abe0012d71ed73Victor Zverovich  std::size_t size = std::strlen(format_str);
968e06e9f885c966528e0fecd1531abe0012d71ed73Victor Zverovich  format_str[size] = '}';
969e06e9f885c966528e0fecd1531abe0012d71ed73Victor Zverovich  format_str[size + 1] = 0;
970279c7a6e6ae3331dcad27fb8840ce953e91c3dc6Victor Zverovich  EXPECT_THROW_MSG(format(format_str, 0), FormatError, "number is too big");
971bbd13a492b623c2a60e0a28733f1733e3698920dVictor Zverovich
9728f8fd769eef9b47339a3232e34b2696ccdc1b20bVictor Zverovich  safe_sprintf(format_str, "{0:.%u", INT_MAX + 1u);
973279c7a6e6ae3331dcad27fb8840ce953e91c3dc6Victor Zverovich  EXPECT_THROW_MSG(format(format_str, 0), FormatError, "number is too big");
9748f8fd769eef9b47339a3232e34b2696ccdc1b20bVictor Zverovich  safe_sprintf(format_str, "{0:.%u}", INT_MAX + 1u);
975279c7a6e6ae3331dcad27fb8840ce953e91c3dc6Victor Zverovich  EXPECT_THROW_MSG(format(format_str, 0), FormatError, "number is too big");
976bbd13a492b623c2a60e0a28733f1733e3698920dVictor Zverovich
977e06e9f885c966528e0fecd1531abe0012d71ed73Victor Zverovich  EXPECT_THROW_MSG(format("{0:.", 0),
978605d2600f8ca631ce06caa6a3ff16a49d695ad7cVictor Zverovich      FormatError, "missing precision specifier");
979e06e9f885c966528e0fecd1531abe0012d71ed73Victor Zverovich  EXPECT_THROW_MSG(format("{0:.}", 0),
980605d2600f8ca631ce06caa6a3ff16a49d695ad7cVictor Zverovich      FormatError, "missing precision specifier");
981bbd13a492b623c2a60e0a28733f1733e3698920dVictor Zverovich
98242de4f1f7d6c89d09bdaef1b42fe9f9299712f9fVictor Zverovich  EXPECT_THROW_MSG(format("{0:.2", 0),
98343aebf51d60bc57b5d70d9097d0109300243e225Victor Zverovich      FormatError, "precision not allowed in integer format specifier");
984e06e9f885c966528e0fecd1531abe0012d71ed73Victor Zverovich  EXPECT_THROW_MSG(format("{0:.2}", 42),
98543aebf51d60bc57b5d70d9097d0109300243e225Victor Zverovich      FormatError, "precision not allowed in integer format specifier");
986e06e9f885c966528e0fecd1531abe0012d71ed73Victor Zverovich  EXPECT_THROW_MSG(format("{0:.2f}", 42),
98743aebf51d60bc57b5d70d9097d0109300243e225Victor Zverovich      FormatError, "precision not allowed in integer format specifier");
988e06e9f885c966528e0fecd1531abe0012d71ed73Victor Zverovich  EXPECT_THROW_MSG(format("{0:.2}", 42u),
98943aebf51d60bc57b5d70d9097d0109300243e225Victor Zverovich      FormatError, "precision not allowed in integer format specifier");
990e06e9f885c966528e0fecd1531abe0012d71ed73Victor Zverovich  EXPECT_THROW_MSG(format("{0:.2f}", 42u),
99143aebf51d60bc57b5d70d9097d0109300243e225Victor Zverovich      FormatError, "precision not allowed in integer format specifier");
992e06e9f885c966528e0fecd1531abe0012d71ed73Victor Zverovich  EXPECT_THROW_MSG(format("{0:.2}", 42l),
99343aebf51d60bc57b5d70d9097d0109300243e225Victor Zverovich      FormatError, "precision not allowed in integer format specifier");
994e06e9f885c966528e0fecd1531abe0012d71ed73Victor Zverovich  EXPECT_THROW_MSG(format("{0:.2f}", 42l),
99543aebf51d60bc57b5d70d9097d0109300243e225Victor Zverovich      FormatError, "precision not allowed in integer format specifier");
996e06e9f885c966528e0fecd1531abe0012d71ed73Victor Zverovich  EXPECT_THROW_MSG(format("{0:.2}", 42ul),
99743aebf51d60bc57b5d70d9097d0109300243e225Victor Zverovich      FormatError, "precision not allowed in integer format specifier");
998e06e9f885c966528e0fecd1531abe0012d71ed73Victor Zverovich  EXPECT_THROW_MSG(format("{0:.2f}", 42ul),
99943aebf51d60bc57b5d70d9097d0109300243e225Victor Zverovich      FormatError, "precision not allowed in integer format specifier");
1000e06e9f885c966528e0fecd1531abe0012d71ed73Victor Zverovich  EXPECT_THROW_MSG(format("{0:.2}", 42ll),
100143aebf51d60bc57b5d70d9097d0109300243e225Victor Zverovich      FormatError, "precision not allowed in integer format specifier");
1002e06e9f885c966528e0fecd1531abe0012d71ed73Victor Zverovich  EXPECT_THROW_MSG(format("{0:.2f}", 42ll),
100343aebf51d60bc57b5d70d9097d0109300243e225Victor Zverovich      FormatError, "precision not allowed in integer format specifier");
1004e06e9f885c966528e0fecd1531abe0012d71ed73Victor Zverovich  EXPECT_THROW_MSG(format("{0:.2}", 42ull),
100543aebf51d60bc57b5d70d9097d0109300243e225Victor Zverovich      FormatError, "precision not allowed in integer format specifier");
1006e06e9f885c966528e0fecd1531abe0012d71ed73Victor Zverovich  EXPECT_THROW_MSG(format("{0:.2f}", 42ull),
100743aebf51d60bc57b5d70d9097d0109300243e225Victor Zverovich      FormatError, "precision not allowed in integer format specifier");
1008fd5c2e909bd8c3d533b10d648a1e805af98253a8vitaut  EXPECT_THROW_MSG(format("{0:3.0}", 'x'),
1009fd5c2e909bd8c3d533b10d648a1e805af98253a8vitaut      FormatError, "precision not allowed in integer format specifier");
1010a1264926a0a76016fea7cc3051c84f8dbd972a93Victor Zverovich  EXPECT_EQ("1.2", format("{0:.2}", 1.2345));
1011a1264926a0a76016fea7cc3051c84f8dbd972a93Victor Zverovich  EXPECT_EQ("1.2", format("{0:.2}", 1.2345l));
1012bbd13a492b623c2a60e0a28733f1733e3698920dVictor Zverovich
1013e06e9f885c966528e0fecd1531abe0012d71ed73Victor Zverovich  EXPECT_THROW_MSG(format("{0:.2}", reinterpret_cast<void*>(0xcafe)),
101443aebf51d60bc57b5d70d9097d0109300243e225Victor Zverovich      FormatError, "precision not allowed in pointer format specifier");
1015e06e9f885c966528e0fecd1531abe0012d71ed73Victor Zverovich  EXPECT_THROW_MSG(format("{0:.2f}", reinterpret_cast<void*>(0xcafe)),
101643aebf51d60bc57b5d70d9097d0109300243e225Victor Zverovich      FormatError, "precision not allowed in pointer format specifier");
1017bbd13a492b623c2a60e0a28733f1733e3698920dVictor Zverovich
101843aebf51d60bc57b5d70d9097d0109300243e225Victor Zverovich  EXPECT_EQ("st", format("{0:.2}", "str"));
1019b98b2e984286ac9ece9f63d460a6f138c33be84fVictor Zverovich}
1020b98b2e984286ac9ece9f63d460a6f138c33be84fVictor Zverovich
1021363352754cceb8910566696708baa09bb9e06c8eVictor ZverovichTEST(FormatterTest, RuntimePrecision) {
1022e06e9f885c966528e0fecd1531abe0012d71ed73Victor Zverovich  char format_str[BUFFER_SIZE];
10238f8fd769eef9b47339a3232e34b2696ccdc1b20bVictor Zverovich  safe_sprintf(format_str, "{0:.{%u", UINT_MAX);
102442de4f1f7d6c89d09bdaef1b42fe9f9299712f9fVictor Zverovich  increment(format_str + 5);
1025279c7a6e6ae3331dcad27fb8840ce953e91c3dc6Victor Zverovich  EXPECT_THROW_MSG(format(format_str, 0), FormatError, "number is too big");
1026e06e9f885c966528e0fecd1531abe0012d71ed73Victor Zverovich  std::size_t size = std::strlen(format_str);
1027e06e9f885c966528e0fecd1531abe0012d71ed73Victor Zverovich  format_str[size] = '}';
1028e06e9f885c966528e0fecd1531abe0012d71ed73Victor Zverovich  format_str[size + 1] = 0;
1029279c7a6e6ae3331dcad27fb8840ce953e91c3dc6Victor Zverovich  EXPECT_THROW_MSG(format(format_str, 0), FormatError, "number is too big");
1030e06e9f885c966528e0fecd1531abe0012d71ed73Victor Zverovich  format_str[size + 1] = '}';
1031e06e9f885c966528e0fecd1531abe0012d71ed73Victor Zverovich  format_str[size + 2] = 0;
1032279c7a6e6ae3331dcad27fb8840ce953e91c3dc6Victor Zverovich  EXPECT_THROW_MSG(format(format_str, 0), FormatError, "number is too big");
1033363352754cceb8910566696708baa09bb9e06c8eVictor Zverovich
1034e06e9f885c966528e0fecd1531abe0012d71ed73Victor Zverovich  EXPECT_THROW_MSG(format("{0:.{", 0),
103542de4f1f7d6c89d09bdaef1b42fe9f9299712f9fVictor Zverovich      FormatError, "invalid format string");
1036e06e9f885c966528e0fecd1531abe0012d71ed73Victor Zverovich  EXPECT_THROW_MSG(format("{0:.{}", 0),
103742de4f1f7d6c89d09bdaef1b42fe9f9299712f9fVictor Zverovich      FormatError, "cannot switch from manual to automatic argument indexing");
10387487bde5871f0b44a40edcceda8276eed0952246jamboree  EXPECT_THROW_MSG(format("{0:.{?}}", 0),
103942de4f1f7d6c89d09bdaef1b42fe9f9299712f9fVictor Zverovich      FormatError, "invalid format string");
1040e06e9f885c966528e0fecd1531abe0012d71ed73Victor Zverovich  EXPECT_THROW_MSG(format("{0:.{1}", 0, 0),
104143aebf51d60bc57b5d70d9097d0109300243e225Victor Zverovich      FormatError, "precision not allowed in integer format specifier");
1042e06e9f885c966528e0fecd1531abe0012d71ed73Victor Zverovich  EXPECT_THROW_MSG(format("{0:.{1}}", 0),
1043605d2600f8ca631ce06caa6a3ff16a49d695ad7cVictor Zverovich      FormatError, "argument index out of range");
1044605d2600f8ca631ce06caa6a3ff16a49d695ad7cVictor Zverovich
1045605d2600f8ca631ce06caa6a3ff16a49d695ad7cVictor Zverovich  EXPECT_THROW_MSG(format("{0:.{0:}}", 0),
1046605d2600f8ca631ce06caa6a3ff16a49d695ad7cVictor Zverovich      FormatError, "invalid format string");
1047363352754cceb8910566696708baa09bb9e06c8eVictor Zverovich
1048e06e9f885c966528e0fecd1531abe0012d71ed73Victor Zverovich  EXPECT_THROW_MSG(format("{0:.{1}}", 0, -1),
1049605d2600f8ca631ce06caa6a3ff16a49d695ad7cVictor Zverovich      FormatError, "negative precision");
1050e06e9f885c966528e0fecd1531abe0012d71ed73Victor Zverovich  EXPECT_THROW_MSG(format("{0:.{1}}", 0, (INT_MAX + 1u)),
1051279c7a6e6ae3331dcad27fb8840ce953e91c3dc6Victor Zverovich      FormatError, "number is too big");
1052e06e9f885c966528e0fecd1531abe0012d71ed73Victor Zverovich  EXPECT_THROW_MSG(format("{0:.{1}}", 0, -1l),
1053605d2600f8ca631ce06caa6a3ff16a49d695ad7cVictor Zverovich      FormatError, "negative precision");
10548631694021ccba79b6907b27ccca6f23575ea31aVictor Zverovich  if (fmt::internal::const_check(sizeof(long) > sizeof(int))) {
1055c240a129a2a4fb6f27632d0de5df47562ffb3a5bVictor Zverovich    long value = INT_MAX;
1056e06e9f885c966528e0fecd1531abe0012d71ed73Victor Zverovich    EXPECT_THROW_MSG(format("{0:.{1}}", 0, (value + 1)),
1057279c7a6e6ae3331dcad27fb8840ce953e91c3dc6Victor Zverovich        FormatError, "number is too big");
1058363352754cceb8910566696708baa09bb9e06c8eVictor Zverovich  }
1059e06e9f885c966528e0fecd1531abe0012d71ed73Victor Zverovich  EXPECT_THROW_MSG(format("{0:.{1}}", 0, (INT_MAX + 1ul)),
1060279c7a6e6ae3331dcad27fb8840ce953e91c3dc6Victor Zverovich      FormatError, "number is too big");
1061363352754cceb8910566696708baa09bb9e06c8eVictor Zverovich
1062e06e9f885c966528e0fecd1531abe0012d71ed73Victor Zverovich  EXPECT_THROW_MSG(format("{0:.{1}}", 0, '0'),
1063363352754cceb8910566696708baa09bb9e06c8eVictor Zverovich      FormatError, "precision is not integer");
1064e06e9f885c966528e0fecd1531abe0012d71ed73Victor Zverovich  EXPECT_THROW_MSG(format("{0:.{1}}", 0, 0.0),
1065363352754cceb8910566696708baa09bb9e06c8eVictor Zverovich      FormatError, "precision is not integer");
1066363352754cceb8910566696708baa09bb9e06c8eVictor Zverovich
1067e06e9f885c966528e0fecd1531abe0012d71ed73Victor Zverovich  EXPECT_THROW_MSG(format("{0:.{1}}", 42, 2),
106843aebf51d60bc57b5d70d9097d0109300243e225Victor Zverovich      FormatError, "precision not allowed in integer format specifier");
1069e06e9f885c966528e0fecd1531abe0012d71ed73Victor Zverovich  EXPECT_THROW_MSG(format("{0:.{1}f}", 42, 2),
107043aebf51d60bc57b5d70d9097d0109300243e225Victor Zverovich      FormatError, "precision not allowed in integer format specifier");
1071e06e9f885c966528e0fecd1531abe0012d71ed73Victor Zverovich  EXPECT_THROW_MSG(format("{0:.{1}}", 42u, 2),
107243aebf51d60bc57b5d70d9097d0109300243e225Victor Zverovich      FormatError, "precision not allowed in integer format specifier");
1073e06e9f885c966528e0fecd1531abe0012d71ed73Victor Zverovich  EXPECT_THROW_MSG(format("{0:.{1}f}", 42u, 2),
107443aebf51d60bc57b5d70d9097d0109300243e225Victor Zverovich      FormatError, "precision not allowed in integer format specifier");
1075e06e9f885c966528e0fecd1531abe0012d71ed73Victor Zverovich  EXPECT_THROW_MSG(format("{0:.{1}}", 42l, 2),
107643aebf51d60bc57b5d70d9097d0109300243e225Victor Zverovich      FormatError, "precision not allowed in integer format specifier");
1077e06e9f885c966528e0fecd1531abe0012d71ed73Victor Zverovich  EXPECT_THROW_MSG(format("{0:.{1}f}", 42l, 2),
107843aebf51d60bc57b5d70d9097d0109300243e225Victor Zverovich      FormatError, "precision not allowed in integer format specifier");
1079e06e9f885c966528e0fecd1531abe0012d71ed73Victor Zverovich  EXPECT_THROW_MSG(format("{0:.{1}}", 42ul, 2),
108043aebf51d60bc57b5d70d9097d0109300243e225Victor Zverovich      FormatError, "precision not allowed in integer format specifier");
1081e06e9f885c966528e0fecd1531abe0012d71ed73Victor Zverovich  EXPECT_THROW_MSG(format("{0:.{1}f}", 42ul, 2),
108243aebf51d60bc57b5d70d9097d0109300243e225Victor Zverovich      FormatError, "precision not allowed in integer format specifier");
1083e06e9f885c966528e0fecd1531abe0012d71ed73Victor Zverovich  EXPECT_THROW_MSG(format("{0:.{1}}", 42ll, 2),
108443aebf51d60bc57b5d70d9097d0109300243e225Victor Zverovich      FormatError, "precision not allowed in integer format specifier");
1085e06e9f885c966528e0fecd1531abe0012d71ed73Victor Zverovich  EXPECT_THROW_MSG(format("{0:.{1}f}", 42ll, 2),
108643aebf51d60bc57b5d70d9097d0109300243e225Victor Zverovich      FormatError, "precision not allowed in integer format specifier");
1087e06e9f885c966528e0fecd1531abe0012d71ed73Victor Zverovich  EXPECT_THROW_MSG(format("{0:.{1}}", 42ull, 2),
108843aebf51d60bc57b5d70d9097d0109300243e225Victor Zverovich      FormatError, "precision not allowed in integer format specifier");
1089e06e9f885c966528e0fecd1531abe0012d71ed73Victor Zverovich  EXPECT_THROW_MSG(format("{0:.{1}f}", 42ull, 2),
109043aebf51d60bc57b5d70d9097d0109300243e225Victor Zverovich      FormatError, "precision not allowed in integer format specifier");
1091fd5c2e909bd8c3d533b10d648a1e805af98253a8vitaut  EXPECT_THROW_MSG(format("{0:3.{1}}", 'x', 0),
1092fd5c2e909bd8c3d533b10d648a1e805af98253a8vitaut      FormatError, "precision not allowed in integer format specifier");
1093a1264926a0a76016fea7cc3051c84f8dbd972a93Victor Zverovich  EXPECT_EQ("1.2", format("{0:.{1}}", 1.2345, 2));
1094a1264926a0a76016fea7cc3051c84f8dbd972a93Victor Zverovich  EXPECT_EQ("1.2", format("{1:.{0}}", 2, 1.2345l));
1095363352754cceb8910566696708baa09bb9e06c8eVictor Zverovich
10964d5b1e8a13211049af1505525ecd5228ab7b2829Victor Zverovich  EXPECT_THROW_MSG(format("{0:.{1}}", reinterpret_cast<void*>(0xcafe), 2),
109743aebf51d60bc57b5d70d9097d0109300243e225Victor Zverovich      FormatError, "precision not allowed in pointer format specifier");
10984d5b1e8a13211049af1505525ecd5228ab7b2829Victor Zverovich  EXPECT_THROW_MSG(format("{0:.{1}f}", reinterpret_cast<void*>(0xcafe), 2),
109943aebf51d60bc57b5d70d9097d0109300243e225Victor Zverovich      FormatError, "precision not allowed in pointer format specifier");
110043aebf51d60bc57b5d70d9097d0109300243e225Victor Zverovich
110143aebf51d60bc57b5d70d9097d0109300243e225Victor Zverovich  EXPECT_EQ("st", format("{0:.{1}}", "str", 2));
1102363352754cceb8910566696708baa09bb9e06c8eVictor Zverovich}
1103363352754cceb8910566696708baa09bb9e06c8eVictor Zverovich
1104d599e3b2628e7b205b5b3827d2ff5eeb3d3e267cVictor Zverovichtemplate <typename T>
11058f8fd769eef9b47339a3232e34b2696ccdc1b20bVictor Zverovichvoid check_unknown_types(
1106d599e3b2628e7b205b5b3827d2ff5eeb3d3e267cVictor Zverovich    const T &value, const char *types, const char *type_name) {
11074d5b1e8a13211049af1505525ecd5228ab7b2829Victor Zverovich  char format_str[BUFFER_SIZE], message[BUFFER_SIZE];
1108d599e3b2628e7b205b5b3827d2ff5eeb3d3e267cVictor Zverovich  const char *special = ".0123456789}";
1109bd274a3b7ab6a38119a13d2e8f56a9d22c82e43fVictor Zverovich  for (int i = CHAR_MIN; i <= CHAR_MAX; ++i) {
111090a12b1bb22b28eaf5dc2ed5e664234f7b332eadvitaut    char c = static_cast<char>(i);
1111d599e3b2628e7b205b5b3827d2ff5eeb3d3e267cVictor Zverovich    if (std::strchr(types, c) || std::strchr(special, c) || !c) continue;
11128f8fd769eef9b47339a3232e34b2696ccdc1b20bVictor Zverovich    safe_sprintf(format_str, "{0:10%c}", c);
1113b83ab1667605732604fc6808770c80aff119a871vitaut    if (std::isprint(static_cast<unsigned char>(c))) {
11148f8fd769eef9b47339a3232e34b2696ccdc1b20bVictor Zverovich      safe_sprintf(message, "unknown format code '%c' for %s", c, type_name);
1115b83ab1667605732604fc6808770c80aff119a871vitaut    } else {
1116b83ab1667605732604fc6808770c80aff119a871vitaut      safe_sprintf(message, "unknown format code '\\x%02x' for %s", c,
1117b83ab1667605732604fc6808770c80aff119a871vitaut                   type_name);
1118b83ab1667605732604fc6808770c80aff119a871vitaut    }
11194d5b1e8a13211049af1505525ecd5228ab7b2829Victor Zverovich    EXPECT_THROW_MSG(format(format_str, value), FormatError, message)
11204d5b1e8a13211049af1505525ecd5228ab7b2829Victor Zverovich      << format_str << " " << message;
1121d599e3b2628e7b205b5b3827d2ff5eeb3d3e267cVictor Zverovich  }
1122d599e3b2628e7b205b5b3827d2ff5eeb3d3e267cVictor Zverovich}
1123d599e3b2628e7b205b5b3827d2ff5eeb3d3e267cVictor Zverovich
11249d09214e7aefdf2daf529a91632488d17933811evitautTEST(BoolTest, FormatBool) {
11259d09214e7aefdf2daf529a91632488d17933811evitaut  EXPECT_EQ("true", format("{}", true));
11269d09214e7aefdf2daf529a91632488d17933811evitaut  EXPECT_EQ("false", format("{}", false));
11279d09214e7aefdf2daf529a91632488d17933811evitaut  EXPECT_EQ("1", format("{:d}", true));
11289d09214e7aefdf2daf529a91632488d17933811evitaut  EXPECT_EQ("true ", format("{:5}", true));
11299d09214e7aefdf2daf529a91632488d17933811evitaut  EXPECT_EQ(L"true", format(L"{}", true));
1130c3f5dce8d5461c24c377eeb8b74fab2a556f382aVictor Zverovich}
1131c3f5dce8d5461c24c377eeb8b74fab2a556f382aVictor Zverovich
1132d3be932534d70a818bcaf456fd5ce7c11c785f49Victor ZverovichTEST(FormatterTest, FormatShort) {
1133d3be932534d70a818bcaf456fd5ce7c11c785f49Victor Zverovich  short s = 42;
1134a1264926a0a76016fea7cc3051c84f8dbd972a93Victor Zverovich  EXPECT_EQ("42", format("{0:d}", s));
1135d3be932534d70a818bcaf456fd5ce7c11c785f49Victor Zverovich  unsigned short us = 42;
1136a1264926a0a76016fea7cc3051c84f8dbd972a93Victor Zverovich  EXPECT_EQ("42", format("{0:d}", us));
1137d3be932534d70a818bcaf456fd5ce7c11c785f49Victor Zverovich}
1138d3be932534d70a818bcaf456fd5ce7c11c785f49Victor Zverovich
1139d73306bdce881793a5b8ee5a32f95e0e21a11f18Victor ZverovichTEST(FormatterTest, FormatInt) {
11404d5b1e8a13211049af1505525ecd5228ab7b2829Victor Zverovich  EXPECT_THROW_MSG(format("{0:v", 42),
1141605d2600f8ca631ce06caa6a3ff16a49d695ad7cVictor Zverovich      FormatError, "missing '}' in format string");
1142f68771abe4b536a15889477b428985125a8cc5f2vitaut  check_unknown_types(42, "bBdoxXn", "integer");
11435e7f59b5631db0242ca9dd4c70b89c53d52a15e6Victor Zverovich}
11445e7f59b5631db0242ca9dd4c70b89c53d52a15e6Victor Zverovich
11455e7f59b5631db0242ca9dd4c70b89c53d52a15e6Victor ZverovichTEST(FormatterTest, FormatBin) {
1146a1264926a0a76016fea7cc3051c84f8dbd972a93Victor Zverovich  EXPECT_EQ("0", format("{0:b}", 0));
1147a1264926a0a76016fea7cc3051c84f8dbd972a93Victor Zverovich  EXPECT_EQ("101010", format("{0:b}", 42));
1148a1264926a0a76016fea7cc3051c84f8dbd972a93Victor Zverovich  EXPECT_EQ("101010", format("{0:b}", 42u));
1149a1264926a0a76016fea7cc3051c84f8dbd972a93Victor Zverovich  EXPECT_EQ("-101010", format("{0:b}", -42));
1150a1264926a0a76016fea7cc3051c84f8dbd972a93Victor Zverovich  EXPECT_EQ("11000000111001", format("{0:b}", 12345));
1151a1264926a0a76016fea7cc3051c84f8dbd972a93Victor Zverovich  EXPECT_EQ("10010001101000101011001111000", format("{0:b}", 0x12345678));
1152a1264926a0a76016fea7cc3051c84f8dbd972a93Victor Zverovich  EXPECT_EQ("10010000101010111100110111101111", format("{0:b}", 0x90ABCDEF));
11535e7f59b5631db0242ca9dd4c70b89c53d52a15e6Victor Zverovich  EXPECT_EQ("11111111111111111111111111111111",
1154a1264926a0a76016fea7cc3051c84f8dbd972a93Victor Zverovich            format("{0:b}", std::numeric_limits<uint32_t>::max()));
1155bbd13a492b623c2a60e0a28733f1733e3698920dVictor Zverovich}
1156bbd13a492b623c2a60e0a28733f1733e3698920dVictor Zverovich
1157b98b2e984286ac9ece9f63d460a6f138c33be84fVictor ZverovichTEST(FormatterTest, FormatDec) {
1158a1264926a0a76016fea7cc3051c84f8dbd972a93Victor Zverovich  EXPECT_EQ("0", format("{0}", 0));
1159a1264926a0a76016fea7cc3051c84f8dbd972a93Victor Zverovich  EXPECT_EQ("42", format("{0}", 42));
1160a1264926a0a76016fea7cc3051c84f8dbd972a93Victor Zverovich  EXPECT_EQ("42", format("{0:d}", 42));
1161a1264926a0a76016fea7cc3051c84f8dbd972a93Victor Zverovich  EXPECT_EQ("42", format("{0}", 42u));
1162a1264926a0a76016fea7cc3051c84f8dbd972a93Victor Zverovich  EXPECT_EQ("-42", format("{0}", -42));
1163a1264926a0a76016fea7cc3051c84f8dbd972a93Victor Zverovich  EXPECT_EQ("12345", format("{0}", 12345));
1164a1264926a0a76016fea7cc3051c84f8dbd972a93Victor Zverovich  EXPECT_EQ("67890", format("{0}", 67890));
1165478d004c1d33aebdecf862fd336cc9f0c39b65d6Victor Zverovich  char buffer[BUFFER_SIZE];
11668f8fd769eef9b47339a3232e34b2696ccdc1b20bVictor Zverovich  safe_sprintf(buffer, "%d", INT_MIN);
1167a1264926a0a76016fea7cc3051c84f8dbd972a93Victor Zverovich  EXPECT_EQ(buffer, format("{0}", INT_MIN));
11688f8fd769eef9b47339a3232e34b2696ccdc1b20bVictor Zverovich  safe_sprintf(buffer, "%d", INT_MAX);
1169a1264926a0a76016fea7cc3051c84f8dbd972a93Victor Zverovich  EXPECT_EQ(buffer, format("{0}", INT_MAX));
11708f8fd769eef9b47339a3232e34b2696ccdc1b20bVictor Zverovich  safe_sprintf(buffer, "%u", UINT_MAX);
1171a1264926a0a76016fea7cc3051c84f8dbd972a93Victor Zverovich  EXPECT_EQ(buffer, format("{0}", UINT_MAX));
11728f8fd769eef9b47339a3232e34b2696ccdc1b20bVictor Zverovich  safe_sprintf(buffer, "%ld", 0 - static_cast<unsigned long>(LONG_MIN));
1173a1264926a0a76016fea7cc3051c84f8dbd972a93Victor Zverovich  EXPECT_EQ(buffer, format("{0}", LONG_MIN));
11748f8fd769eef9b47339a3232e34b2696ccdc1b20bVictor Zverovich  safe_sprintf(buffer, "%ld", LONG_MAX);
1175a1264926a0a76016fea7cc3051c84f8dbd972a93Victor Zverovich  EXPECT_EQ(buffer, format("{0}", LONG_MAX));
11768f8fd769eef9b47339a3232e34b2696ccdc1b20bVictor Zverovich  safe_sprintf(buffer, "%lu", ULONG_MAX);
1177a1264926a0a76016fea7cc3051c84f8dbd972a93Victor Zverovich  EXPECT_EQ(buffer, format("{0}", ULONG_MAX));
1178b98b2e984286ac9ece9f63d460a6f138c33be84fVictor Zverovich}
1179b98b2e984286ac9ece9f63d460a6f138c33be84fVictor Zverovich
1180b98b2e984286ac9ece9f63d460a6f138c33be84fVictor ZverovichTEST(FormatterTest, FormatHex) {
1181a1264926a0a76016fea7cc3051c84f8dbd972a93Victor Zverovich  EXPECT_EQ("0", format("{0:x}", 0));
1182a1264926a0a76016fea7cc3051c84f8dbd972a93Victor Zverovich  EXPECT_EQ("42", format("{0:x}", 0x42));
1183a1264926a0a76016fea7cc3051c84f8dbd972a93Victor Zverovich  EXPECT_EQ("42", format("{0:x}", 0x42u));
1184a1264926a0a76016fea7cc3051c84f8dbd972a93Victor Zverovich  EXPECT_EQ("-42", format("{0:x}", -0x42));
1185a1264926a0a76016fea7cc3051c84f8dbd972a93Victor Zverovich  EXPECT_EQ("12345678", format("{0:x}", 0x12345678));
1186a1264926a0a76016fea7cc3051c84f8dbd972a93Victor Zverovich  EXPECT_EQ("90abcdef", format("{0:x}", 0x90abcdef));
1187a1264926a0a76016fea7cc3051c84f8dbd972a93Victor Zverovich  EXPECT_EQ("12345678", format("{0:X}", 0x12345678));
1188a1264926a0a76016fea7cc3051c84f8dbd972a93Victor Zverovich  EXPECT_EQ("90ABCDEF", format("{0:X}", 0x90ABCDEF));
1189e4ffc068754f4d4da2472dec3579e795fa281412Gregory Czajkowski
1190478d004c1d33aebdecf862fd336cc9f0c39b65d6Victor Zverovich  char buffer[BUFFER_SIZE];
11918f8fd769eef9b47339a3232e34b2696ccdc1b20bVictor Zverovich  safe_sprintf(buffer, "-%x", 0 - static_cast<unsigned>(INT_MIN));
1192a1264926a0a76016fea7cc3051c84f8dbd972a93Victor Zverovich  EXPECT_EQ(buffer, format("{0:x}", INT_MIN));
11938f8fd769eef9b47339a3232e34b2696ccdc1b20bVictor Zverovich  safe_sprintf(buffer, "%x", INT_MAX);
1194a1264926a0a76016fea7cc3051c84f8dbd972a93Victor Zverovich  EXPECT_EQ(buffer, format("{0:x}", INT_MAX));
11958f8fd769eef9b47339a3232e34b2696ccdc1b20bVictor Zverovich  safe_sprintf(buffer, "%x", UINT_MAX);
1196a1264926a0a76016fea7cc3051c84f8dbd972a93Victor Zverovich  EXPECT_EQ(buffer, format("{0:x}", UINT_MAX));
11978f8fd769eef9b47339a3232e34b2696ccdc1b20bVictor Zverovich  safe_sprintf(buffer, "-%lx", 0 - static_cast<unsigned long>(LONG_MIN));
1198a1264926a0a76016fea7cc3051c84f8dbd972a93Victor Zverovich  EXPECT_EQ(buffer, format("{0:x}", LONG_MIN));
11998f8fd769eef9b47339a3232e34b2696ccdc1b20bVictor Zverovich  safe_sprintf(buffer, "%lx", LONG_MAX);
1200a1264926a0a76016fea7cc3051c84f8dbd972a93Victor Zverovich  EXPECT_EQ(buffer, format("{0:x}", LONG_MAX));
12018f8fd769eef9b47339a3232e34b2696ccdc1b20bVictor Zverovich  safe_sprintf(buffer, "%lx", ULONG_MAX);
1202a1264926a0a76016fea7cc3051c84f8dbd972a93Victor Zverovich  EXPECT_EQ(buffer, format("{0:x}", ULONG_MAX));
1203280ea8b5c5fb711baed38d24df1253345c8a46bcVictor Zverovich}
1204280ea8b5c5fb711baed38d24df1253345c8a46bcVictor Zverovich
120527b8ba06e8939302244a8b564686fd42e5e2f017Victor ZverovichTEST(FormatterTest, FormatOct) {
1206a1264926a0a76016fea7cc3051c84f8dbd972a93Victor Zverovich  EXPECT_EQ("0", format("{0:o}", 0));
1207a1264926a0a76016fea7cc3051c84f8dbd972a93Victor Zverovich  EXPECT_EQ("42", format("{0:o}", 042));
1208a1264926a0a76016fea7cc3051c84f8dbd972a93Victor Zverovich  EXPECT_EQ("42", format("{0:o}", 042u));
1209a1264926a0a76016fea7cc3051c84f8dbd972a93Victor Zverovich  EXPECT_EQ("-42", format("{0:o}", -042));
1210a1264926a0a76016fea7cc3051c84f8dbd972a93Victor Zverovich  EXPECT_EQ("12345670", format("{0:o}", 012345670));
1211478d004c1d33aebdecf862fd336cc9f0c39b65d6Victor Zverovich  char buffer[BUFFER_SIZE];
12128f8fd769eef9b47339a3232e34b2696ccdc1b20bVictor Zverovich  safe_sprintf(buffer, "-%o", 0 - static_cast<unsigned>(INT_MIN));
1213a1264926a0a76016fea7cc3051c84f8dbd972a93Victor Zverovich  EXPECT_EQ(buffer, format("{0:o}", INT_MIN));
12148f8fd769eef9b47339a3232e34b2696ccdc1b20bVictor Zverovich  safe_sprintf(buffer, "%o", INT_MAX);
1215a1264926a0a76016fea7cc3051c84f8dbd972a93Victor Zverovich  EXPECT_EQ(buffer, format("{0:o}", INT_MAX));
12168f8fd769eef9b47339a3232e34b2696ccdc1b20bVictor Zverovich  safe_sprintf(buffer, "%o", UINT_MAX);
1217a1264926a0a76016fea7cc3051c84f8dbd972a93Victor Zverovich  EXPECT_EQ(buffer, format("{0:o}", UINT_MAX));
12188f8fd769eef9b47339a3232e34b2696ccdc1b20bVictor Zverovich  safe_sprintf(buffer, "-%lo", 0 - static_cast<unsigned long>(LONG_MIN));
1219a1264926a0a76016fea7cc3051c84f8dbd972a93Victor Zverovich  EXPECT_EQ(buffer, format("{0:o}", LONG_MIN));
12208f8fd769eef9b47339a3232e34b2696ccdc1b20bVictor Zverovich  safe_sprintf(buffer, "%lo", LONG_MAX);
1221a1264926a0a76016fea7cc3051c84f8dbd972a93Victor Zverovich  EXPECT_EQ(buffer, format("{0:o}", LONG_MAX));
12228f8fd769eef9b47339a3232e34b2696ccdc1b20bVictor Zverovich  safe_sprintf(buffer, "%lo", ULONG_MAX);
1223a1264926a0a76016fea7cc3051c84f8dbd972a93Victor Zverovich  EXPECT_EQ(buffer, format("{0:o}", ULONG_MAX));
122427b8ba06e8939302244a8b564686fd42e5e2f017Victor Zverovich}
122527b8ba06e8939302244a8b564686fd42e5e2f017Victor Zverovich
1226f68771abe4b536a15889477b428985125a8cc5f2vitautTEST(FormatterTest, FormatIntLocale) {
1227e2a332e5df1783580c42f62eb7f4bef04d8000b2Victor Zverovich  ScopedMock<LocaleMock> mock;
1228627440191950c2cda518dfdb0482aeb75fc623adVictor Zverovich  lconv lc = lconv();
1229e2a332e5df1783580c42f62eb7f4bef04d8000b2Victor Zverovich  char sep[] = "--";
1230e2a332e5df1783580c42f62eb7f4bef04d8000b2Victor Zverovich  lc.thousands_sep = sep;
12310e6df7e5119fe463b2bb692f13b7aff2f67c5660Victor Zverovich  EXPECT_CALL(mock, localeconv()).Times(3).WillRepeatedly(testing::Return(&lc));
12320e6df7e5119fe463b2bb692f13b7aff2f67c5660Victor Zverovich  EXPECT_EQ("123", format("{:n}", 123));
12330e6df7e5119fe463b2bb692f13b7aff2f67c5660Victor Zverovich  EXPECT_EQ("1--234", format("{:n}", 1234));
1234e2a332e5df1783580c42f62eb7f4bef04d8000b2Victor Zverovich  EXPECT_EQ("1--234--567", format("{:n}", 1234567));
1235f68771abe4b536a15889477b428985125a8cc5f2vitaut}
1236f68771abe4b536a15889477b428985125a8cc5f2vitaut
1237d3be932534d70a818bcaf456fd5ce7c11c785f49Victor ZverovichTEST(FormatterTest, FormatFloat) {
1238a1264926a0a76016fea7cc3051c84f8dbd972a93Victor Zverovich  EXPECT_EQ("392.500000", format("{0:f}", 392.5f));
1239d3be932534d70a818bcaf456fd5ce7c11c785f49Victor Zverovich}
1240d3be932534d70a818bcaf456fd5ce7c11c785f49Victor Zverovich
1241d73306bdce881793a5b8ee5a32f95e0e21a11f18Victor ZverovichTEST(FormatterTest, FormatDouble) {
12428f8fd769eef9b47339a3232e34b2696ccdc1b20bVictor Zverovich  check_unknown_types(1.2, "eEfFgGaA", "double");
1243a1264926a0a76016fea7cc3051c84f8dbd972a93Victor Zverovich  EXPECT_EQ("0", format("{0:}", 0.0));
1244a1264926a0a76016fea7cc3051c84f8dbd972a93Victor Zverovich  EXPECT_EQ("0.000000", format("{0:f}", 0.0));
1245a1264926a0a76016fea7cc3051c84f8dbd972a93Victor Zverovich  EXPECT_EQ("392.65", format("{0:}", 392.65));
1246a1264926a0a76016fea7cc3051c84f8dbd972a93Victor Zverovich  EXPECT_EQ("392.65", format("{0:g}", 392.65));
1247a1264926a0a76016fea7cc3051c84f8dbd972a93Victor Zverovich  EXPECT_EQ("392.65", format("{0:G}", 392.65));
1248a1264926a0a76016fea7cc3051c84f8dbd972a93Victor Zverovich  EXPECT_EQ("392.650000", format("{0:f}", 392.65));
1249a1264926a0a76016fea7cc3051c84f8dbd972a93Victor Zverovich  EXPECT_EQ("392.650000", format("{0:F}", 392.65));
1250478d004c1d33aebdecf862fd336cc9f0c39b65d6Victor Zverovich  char buffer[BUFFER_SIZE];
12518f8fd769eef9b47339a3232e34b2696ccdc1b20bVictor Zverovich  safe_sprintf(buffer, "%e", 392.65);
1252a1264926a0a76016fea7cc3051c84f8dbd972a93Victor Zverovich  EXPECT_EQ(buffer, format("{0:e}", 392.65));
12538f8fd769eef9b47339a3232e34b2696ccdc1b20bVictor Zverovich  safe_sprintf(buffer, "%E", 392.65);
1254a1264926a0a76016fea7cc3051c84f8dbd972a93Victor Zverovich  EXPECT_EQ(buffer, format("{0:E}", 392.65));
1255a1264926a0a76016fea7cc3051c84f8dbd972a93Victor Zverovich  EXPECT_EQ("+0000392.6", format("{0:+010.4g}", 392.65));
12568f8fd769eef9b47339a3232e34b2696ccdc1b20bVictor Zverovich  safe_sprintf(buffer, "%a", -42.0);
1257a1264926a0a76016fea7cc3051c84f8dbd972a93Victor Zverovich  EXPECT_EQ(buffer, format("{:a}", -42.0));
12588f8fd769eef9b47339a3232e34b2696ccdc1b20bVictor Zverovich  safe_sprintf(buffer, "%A", -42.0);
1259a1264926a0a76016fea7cc3051c84f8dbd972a93Victor Zverovich  EXPECT_EQ(buffer, format("{:A}", -42.0));
1260d73306bdce881793a5b8ee5a32f95e0e21a11f18Victor Zverovich}
1261d73306bdce881793a5b8ee5a32f95e0e21a11f18Victor Zverovich
1262ce604838335d72e59b29ad94d0398ec905493427Victor ZverovichTEST(FormatterTest, FormatNaN) {
1263ce604838335d72e59b29ad94d0398ec905493427Victor Zverovich  double nan = std::numeric_limits<double>::quiet_NaN();
1264a1264926a0a76016fea7cc3051c84f8dbd972a93Victor Zverovich  EXPECT_EQ("nan", format("{}", nan));
1265a1264926a0a76016fea7cc3051c84f8dbd972a93Victor Zverovich  EXPECT_EQ("+nan", format("{:+}", nan));
1266a1264926a0a76016fea7cc3051c84f8dbd972a93Victor Zverovich  EXPECT_EQ(" nan", format("{: }", nan));
1267a1264926a0a76016fea7cc3051c84f8dbd972a93Victor Zverovich  EXPECT_EQ("NAN", format("{:F}", nan));
1268a1264926a0a76016fea7cc3051c84f8dbd972a93Victor Zverovich  EXPECT_EQ("nan    ", format("{:<7}", nan));
1269a1264926a0a76016fea7cc3051c84f8dbd972a93Victor Zverovich  EXPECT_EQ("  nan  ", format("{:^7}", nan));
1270a1264926a0a76016fea7cc3051c84f8dbd972a93Victor Zverovich  EXPECT_EQ("    nan", format("{:>7}", nan));
1271ce604838335d72e59b29ad94d0398ec905493427Victor Zverovich}
1272ce604838335d72e59b29ad94d0398ec905493427Victor Zverovich
12734762a8afd0f9e46be36f67ffc3925bf002d484deVictor ZverovichTEST(FormatterTest, FormatInfinity) {
12744762a8afd0f9e46be36f67ffc3925bf002d484deVictor Zverovich  double inf = std::numeric_limits<double>::infinity();
1275a1264926a0a76016fea7cc3051c84f8dbd972a93Victor Zverovich  EXPECT_EQ("inf", format("{}", inf));
1276a1264926a0a76016fea7cc3051c84f8dbd972a93Victor Zverovich  EXPECT_EQ("+inf", format("{:+}", inf));
1277a1264926a0a76016fea7cc3051c84f8dbd972a93Victor Zverovich  EXPECT_EQ("-inf", format("{}", -inf));
1278a1264926a0a76016fea7cc3051c84f8dbd972a93Victor Zverovich  EXPECT_EQ(" inf", format("{: }", inf));
1279a1264926a0a76016fea7cc3051c84f8dbd972a93Victor Zverovich  EXPECT_EQ("INF", format("{:F}", inf));
1280a1264926a0a76016fea7cc3051c84f8dbd972a93Victor Zverovich  EXPECT_EQ("inf    ", format("{:<7}", inf));
1281a1264926a0a76016fea7cc3051c84f8dbd972a93Victor Zverovich  EXPECT_EQ("  inf  ", format("{:^7}", inf));
1282a1264926a0a76016fea7cc3051c84f8dbd972a93Victor Zverovich  EXPECT_EQ("    inf", format("{:>7}", inf));
12834762a8afd0f9e46be36f67ffc3925bf002d484deVictor Zverovich}
12844762a8afd0f9e46be36f67ffc3925bf002d484deVictor Zverovich
1285d73306bdce881793a5b8ee5a32f95e0e21a11f18Victor ZverovichTEST(FormatterTest, FormatLongDouble) {
1286a1264926a0a76016fea7cc3051c84f8dbd972a93Victor Zverovich  EXPECT_EQ("0", format("{0:}", 0.0l));
1287a1264926a0a76016fea7cc3051c84f8dbd972a93Victor Zverovich  EXPECT_EQ("0.000000", format("{0:f}", 0.0l));
1288a1264926a0a76016fea7cc3051c84f8dbd972a93Victor Zverovich  EXPECT_EQ("392.65", format("{0:}", 392.65l));
1289a1264926a0a76016fea7cc3051c84f8dbd972a93Victor Zverovich  EXPECT_EQ("392.65", format("{0:g}", 392.65l));
1290a1264926a0a76016fea7cc3051c84f8dbd972a93Victor Zverovich  EXPECT_EQ("392.65", format("{0:G}", 392.65l));
1291a1264926a0a76016fea7cc3051c84f8dbd972a93Victor Zverovich  EXPECT_EQ("392.650000", format("{0:f}", 392.65l));
1292a1264926a0a76016fea7cc3051c84f8dbd972a93Victor Zverovich  EXPECT_EQ("392.650000", format("{0:F}", 392.65l));
1293478d004c1d33aebdecf862fd336cc9f0c39b65d6Victor Zverovich  char buffer[BUFFER_SIZE];
12948f8fd769eef9b47339a3232e34b2696ccdc1b20bVictor Zverovich  safe_sprintf(buffer, "%Le", 392.65l);
1295a1264926a0a76016fea7cc3051c84f8dbd972a93Victor Zverovich  EXPECT_EQ(buffer, format("{0:e}", 392.65l));
1296948317b6dd668b137a199e560ddbcd0109dda31cvitaut  EXPECT_EQ("+0000392.6", format("{0:+010.4g}", 392.64l));
1297d73306bdce881793a5b8ee5a32f95e0e21a11f18Victor Zverovich}
1298d73306bdce881793a5b8ee5a32f95e0e21a11f18Victor Zverovich
1299095b43a8f03d447ddb3bba2db10703aa19173835Victor ZverovichTEST(FormatterTest, FormatChar) {
1300f68771abe4b536a15889477b428985125a8cc5f2vitaut  const char types[] = "cbBdoxXn";
13018f8fd769eef9b47339a3232e34b2696ccdc1b20bVictor Zverovich  check_unknown_types('a', types, "char");
1302a1264926a0a76016fea7cc3051c84f8dbd972a93Victor Zverovich  EXPECT_EQ("a", format("{0}", 'a'));
1303a1264926a0a76016fea7cc3051c84f8dbd972a93Victor Zverovich  EXPECT_EQ("z", format("{0:c}", 'z'));
1304a1264926a0a76016fea7cc3051c84f8dbd972a93Victor Zverovich  EXPECT_EQ(L"a", format(L"{0}", 'a'));
1305a997de90eb737d9573d7d7ee99433cc160660a16Victor Zverovich  int n = 'x';
1306a997de90eb737d9573d7d7ee99433cc160660a16Victor Zverovich  for (const char *type = types + 1; *type; ++type) {
1307a997de90eb737d9573d7d7ee99433cc160660a16Victor Zverovich    std::string format_str = fmt::format("{{:{}}}", *type);
1308a997de90eb737d9573d7d7ee99433cc160660a16Victor Zverovich    EXPECT_EQ(fmt::format(format_str, n), fmt::format(format_str, 'x'));
1309a997de90eb737d9573d7d7ee99433cc160660a16Victor Zverovich  }
1310a997de90eb737d9573d7d7ee99433cc160660a16Victor Zverovich  EXPECT_EQ(fmt::format("{:02X}", n), fmt::format("{:02X}", 'x'));
1311e3b4a3f1665197a5488d07f6950189ca4bb3372dVictor Zverovich}
1312e3b4a3f1665197a5488d07f6950189ca4bb3372dVictor Zverovich
13137c2497363773249217cf201f1dec708416fbc15avitautTEST(FormatterTest, FormatUnsignedChar) {
13147c2497363773249217cf201f1dec708416fbc15avitaut  EXPECT_EQ("42", format("{}", static_cast<unsigned char>(42)));
13157c2497363773249217cf201f1dec708416fbc15avitaut  EXPECT_EQ("42", format("{}", static_cast<uint8_t>(42)));
13167c2497363773249217cf201f1dec708416fbc15avitaut}
13177c2497363773249217cf201f1dec708416fbc15avitaut
1318e3b4a3f1665197a5488d07f6950189ca4bb3372dVictor ZverovichTEST(FormatterTest, FormatWChar) {
1319a1264926a0a76016fea7cc3051c84f8dbd972a93Victor Zverovich  EXPECT_EQ(L"a", format(L"{0}", L'a'));
1320e3b4a3f1665197a5488d07f6950189ca4bb3372dVictor Zverovich  // This shouldn't compile:
13214d5b1e8a13211049af1505525ecd5228ab7b2829Victor Zverovich  //format("{}", L'a');
1322095b43a8f03d447ddb3bba2db10703aa19173835Victor Zverovich}
1323095b43a8f03d447ddb3bba2db10703aa19173835Victor Zverovich
1324d599e3b2628e7b205b5b3827d2ff5eeb3d3e267cVictor ZverovichTEST(FormatterTest, FormatCString) {
13258b86a74ad5988be4dcefecfc794e2b79f94624abvitaut  check_unknown_types("test", "sp", "string");
1326a1264926a0a76016fea7cc3051c84f8dbd972a93Victor Zverovich  EXPECT_EQ("test", format("{0}", "test"));
1327a1264926a0a76016fea7cc3051c84f8dbd972a93Victor Zverovich  EXPECT_EQ("test", format("{0:s}", "test"));
13281b3c197bffd59f2eec9ba02560ebeea802b7436fVictor Zverovich  char nonconst[] = "nonconst";
1329a1264926a0a76016fea7cc3051c84f8dbd972a93Victor Zverovich  EXPECT_EQ("nonconst", format("{0}", nonconst));
13304d5b1e8a13211049af1505525ecd5228ab7b2829Victor Zverovich  EXPECT_THROW_MSG(format("{0}", reinterpret_cast<const char*>(0)),
13311b3c197bffd59f2eec9ba02560ebeea802b7436fVictor Zverovich      FormatError, "string pointer is null");
1332280ea8b5c5fb711baed38d24df1253345c8a46bcVictor Zverovich}
1333280ea8b5c5fb711baed38d24df1253345c8a46bcVictor Zverovich
133474dc571ba03c3cdf35e1f6280eda507375cb03ccVictor ZverovichTEST(FormatterTest, FormatSCharString) {
133574dc571ba03c3cdf35e1f6280eda507375cb03ccVictor Zverovich  signed char str[] = "test";
133674dc571ba03c3cdf35e1f6280eda507375cb03ccVictor Zverovich  EXPECT_EQ("test", format("{0:s}", str));
133774dc571ba03c3cdf35e1f6280eda507375cb03ccVictor Zverovich  const signed char *const_str = str;
133874dc571ba03c3cdf35e1f6280eda507375cb03ccVictor Zverovich  EXPECT_EQ("test", format("{0:s}", const_str));
133974dc571ba03c3cdf35e1f6280eda507375cb03ccVictor Zverovich}
134074dc571ba03c3cdf35e1f6280eda507375cb03ccVictor Zverovich
134174dc571ba03c3cdf35e1f6280eda507375cb03ccVictor ZverovichTEST(FormatterTest, FormatUCharString) {
134274dc571ba03c3cdf35e1f6280eda507375cb03ccVictor Zverovich  unsigned char str[] = "test";
134374dc571ba03c3cdf35e1f6280eda507375cb03ccVictor Zverovich  EXPECT_EQ("test", format("{0:s}", str));
134474dc571ba03c3cdf35e1f6280eda507375cb03ccVictor Zverovich  const unsigned char *const_str = str;
134574dc571ba03c3cdf35e1f6280eda507375cb03ccVictor Zverovich  EXPECT_EQ("test", format("{0:s}", const_str));
1346a79c7b4e8fb2c1b512b38a6da22c69fe5680fd19Victor Zverovich  unsigned char *ptr = str;
1347a79c7b4e8fb2c1b512b38a6da22c69fe5680fd19Victor Zverovich  EXPECT_EQ("test", format("{0:s}", ptr));
134874dc571ba03c3cdf35e1f6280eda507375cb03ccVictor Zverovich}
134974dc571ba03c3cdf35e1f6280eda507375cb03ccVictor Zverovich
1350b98b2e984286ac9ece9f63d460a6f138c33be84fVictor ZverovichTEST(FormatterTest, FormatPointer) {
13518f8fd769eef9b47339a3232e34b2696ccdc1b20bVictor Zverovich  check_unknown_types(reinterpret_cast<void*>(0x1234), "p", "pointer");
1352a1264926a0a76016fea7cc3051c84f8dbd972a93Victor Zverovich  EXPECT_EQ("0x0", format("{0}", reinterpret_cast<void*>(0)));
1353a1264926a0a76016fea7cc3051c84f8dbd972a93Victor Zverovich  EXPECT_EQ("0x1234", format("{0}", reinterpret_cast<void*>(0x1234)));
1354a1264926a0a76016fea7cc3051c84f8dbd972a93Victor Zverovich  EXPECT_EQ("0x1234", format("{0:p}", reinterpret_cast<void*>(0x1234)));
135505a4b4fda9d2a8780c13a991c07b7719d9cf1608Victor Zverovich  EXPECT_EQ("0x" + std::string(sizeof(void*) * CHAR_BIT / 4, 'f'),
1356a1264926a0a76016fea7cc3051c84f8dbd972a93Victor Zverovich      format("{0}", reinterpret_cast<void*>(~uintptr_t())));
1357d599e3b2628e7b205b5b3827d2ff5eeb3d3e267cVictor Zverovich}
1358d599e3b2628e7b205b5b3827d2ff5eeb3d3e267cVictor Zverovich
1359d599e3b2628e7b205b5b3827d2ff5eeb3d3e267cVictor ZverovichTEST(FormatterTest, FormatString) {
1360a1264926a0a76016fea7cc3051c84f8dbd972a93Victor Zverovich  EXPECT_EQ("test", format("{0}", std::string("test")));
1361b98b2e984286ac9ece9f63d460a6f138c33be84fVictor Zverovich}
1362b98b2e984286ac9ece9f63d460a6f138c33be84fVictor Zverovich
1363d3ec9a13167ea2919ff05a63a948590b304bbe63Victor ZverovichTEST(FormatterTest, FormatStringRef) {
1364a1264926a0a76016fea7cc3051c84f8dbd972a93Victor Zverovich  EXPECT_EQ("test", format("{0}", StringRef("test")));
1365d3ec9a13167ea2919ff05a63a948590b304bbe63Victor Zverovich}
1366d3ec9a13167ea2919ff05a63a948590b304bbe63Victor Zverovich
1367438bd9b0e6328f63fc50dab09b74b657491c1189vitautTEST(FormatterTest, FormatCStringRef) {
1368438bd9b0e6328f63fc50dab09b74b657491c1189vitaut  EXPECT_EQ("test", format("{0}", CStringRef("test")));
1369438bd9b0e6328f63fc50dab09b74b657491c1189vitaut}
1370438bd9b0e6328f63fc50dab09b74b657491c1189vitaut
1371f19d8f9655d550234f19c6c1f5a99c7eda798c0eVictor Zverovichvoid format_arg(fmt::BasicFormatter<char> &f, const char *, const Date &d) {
137290730e706b8f47cc6279ab0465110d7ddbc1ac80Victor Zverovich  f.writer() << d.year() << '-' << d.month() << '-' << d.day();
137390730e706b8f47cc6279ab0465110d7ddbc1ac80Victor Zverovich}
137490730e706b8f47cc6279ab0465110d7ddbc1ac80Victor Zverovich
137590730e706b8f47cc6279ab0465110d7ddbc1ac80Victor ZverovichTEST(FormatterTest, FormatCustom) {
1376d599e3b2628e7b205b5b3827d2ff5eeb3d3e267cVictor Zverovich  Date date(2012, 12, 9);
137790730e706b8f47cc6279ab0465110d7ddbc1ac80Victor Zverovich  EXPECT_THROW_MSG(fmt::format("{:s}", date), FormatError,
137890730e706b8f47cc6279ab0465110d7ddbc1ac80Victor Zverovich                   "unmatched '}' in format string");
1379280ea8b5c5fb711baed38d24df1253345c8a46bcVictor Zverovich}
1380280ea8b5c5fb711baed38d24df1253345c8a46bcVictor Zverovich
1381ade5381f9ac1c89dab356fabbb7b2a8a67e2542bVictor Zverovichclass Answer {};
1382ade5381f9ac1c89dab356fabbb7b2a8a67e2542bVictor Zverovich
1383687301c51618b80427910e8e292f7954d6838a05Victor Zverovichtemplate <typename Char>
1384f19d8f9655d550234f19c6c1f5a99c7eda798c0eVictor Zverovichvoid format_arg(fmt::BasicFormatter<Char> &f, const Char *, Answer) {
1385e825156add816c776eae1b7d279746a669cbf390Victor Zverovich  f.writer() << "42";
1386ade5381f9ac1c89dab356fabbb7b2a8a67e2542bVictor Zverovich}
1387ade5381f9ac1c89dab356fabbb7b2a8a67e2542bVictor Zverovich
1388ade5381f9ac1c89dab356fabbb7b2a8a67e2542bVictor ZverovichTEST(FormatterTest, CustomFormat) {
1389a1264926a0a76016fea7cc3051c84f8dbd972a93Victor Zverovich  EXPECT_EQ("42", format("{0}", Answer()));
1390ade5381f9ac1c89dab356fabbb7b2a8a67e2542bVictor Zverovich}
1391ade5381f9ac1c89dab356fabbb7b2a8a67e2542bVictor Zverovich
1392bc6c1c17cc52cfe6673ab4484532a2f182ea1121Victor ZverovichTEST(FormatterTest, WideFormatString) {
1393a1264926a0a76016fea7cc3051c84f8dbd972a93Victor Zverovich  EXPECT_EQ(L"42", format(L"{}", 42));
1394a1264926a0a76016fea7cc3051c84f8dbd972a93Victor Zverovich  EXPECT_EQ(L"4.2", format(L"{}", 4.2));
1395a1264926a0a76016fea7cc3051c84f8dbd972a93Victor Zverovich  EXPECT_EQ(L"abc", format(L"{}", L"abc"));
1396a1264926a0a76016fea7cc3051c84f8dbd972a93Victor Zverovich  EXPECT_EQ(L"z", format(L"{}", L'z'));
1397bc6c1c17cc52cfe6673ab4484532a2f182ea1121Victor Zverovich}
1398bc6c1c17cc52cfe6673ab4484532a2f182ea1121Victor Zverovich
1399280ea8b5c5fb711baed38d24df1253345c8a46bcVictor ZverovichTEST(FormatterTest, FormatStringFromSpeedTest) {
1400280ea8b5c5fb711baed38d24df1253345c8a46bcVictor Zverovich  EXPECT_EQ("1.2340000000:0042:+3.13:str:0x3e8:X:%",
1401a1264926a0a76016fea7cc3051c84f8dbd972a93Victor Zverovich      format("{0:0.10f}:{1:04}:{2:+g}:{3}:{4}:{5}:%",
1402a1264926a0a76016fea7cc3051c84f8dbd972a93Victor Zverovich          1.234, 42, 3.13, "str", reinterpret_cast<void*>(1000), 'X'));
1403cb99919912c4af4eddfab6769ee0419256cf5f6aVictor Zverovich}
14040996e98727be706b7bcf831422d95f63510d83daVictor Zverovich
1405ca171307f3bee845aba1e6293fb45ca907f74ec4Victor ZverovichTEST(FormatterTest, FormatExamples) {
1406dbfd021ae21f62a67147eb997737c9ba2aa63398Victor Zverovich  using fmt::hex;
1407d1ded569ff012d950023de62288925258663b65bVictor Zverovich  EXPECT_EQ("0000cafe", (MemoryWriter() << pad(hex(0xcafe), 8, '0')).str());
1408dbfd021ae21f62a67147eb997737c9ba2aa63398Victor Zverovich
1409a1264926a0a76016fea7cc3051c84f8dbd972a93Victor Zverovich  std::string message = format("The answer is {}", 42);
14104f96062c5a66a61b417caf116c0154f22e388247Victor Zverovich  EXPECT_EQ("The answer is 42", message);
14114f96062c5a66a61b417caf116c0154f22e388247Victor Zverovich
1412a1264926a0a76016fea7cc3051c84f8dbd972a93Victor Zverovich  EXPECT_EQ("42", format("{}", 42));
1413a1264926a0a76016fea7cc3051c84f8dbd972a93Victor Zverovich  EXPECT_EQ("42", format(std::string("{}"), 42));
1414de17baae2d8204148fc7b8df7a4fcfe0a4c5fda4Victor Zverovich
1415d1ded569ff012d950023de62288925258663b65bVictor Zverovich  MemoryWriter out;
1416e06e9f885c966528e0fecd1531abe0012d71ed73Victor Zverovich  out << "The answer is " << 42 << "\n";
1417a1264926a0a76016fea7cc3051c84f8dbd972a93Victor Zverovich  out.write("({:+f}, {:+f})", -3.14, 3.14);
1418e06e9f885c966528e0fecd1531abe0012d71ed73Victor Zverovich  EXPECT_EQ("The answer is 42\n(-3.140000, +3.140000)", out.str());
1419d29f31851e784bd81a3a06bfe9d43b402e68ea79Victor Zverovich
1420d29f31851e784bd81a3a06bfe9d43b402e68ea79Victor Zverovich  {
1421d1ded569ff012d950023de62288925258663b65bVictor Zverovich    MemoryWriter writer;
1422d29f31851e784bd81a3a06bfe9d43b402e68ea79Victor Zverovich    for (int i = 0; i < 10; i++)
1423a1264926a0a76016fea7cc3051c84f8dbd972a93Victor Zverovich      writer.write("{}", i);
1424ca171307f3bee845aba1e6293fb45ca907f74ec4Victor Zverovich    std::string s = writer.str(); // s == 0123456789
1425d29f31851e784bd81a3a06bfe9d43b402e68ea79Victor Zverovich    EXPECT_EQ("0123456789", s);
1426ca171307f3bee845aba1e6293fb45ca907f74ec4Victor Zverovich  }
1427400812a905f11e808a5addbe532a226b8c50796fVictor Zverovich
1428e1c86f0b5de96a33d24a1dc139318db5bc5d0d5dVictor Zverovich  const char *filename = "nonexistent";
14296cf24c7f920eff03688ff9544644117e249f4e85vitaut  FILE *ftest = safe_fopen(filename, "r");
14305b8d0a7aa9eebcfc33c064aa91e1ea7c59ff61a5vitaut  if (ftest) fclose(ftest);
1431e1c86f0b5de96a33d24a1dc139318db5bc5d0d5dVictor Zverovich  int error_code = errno;
1432e1c86f0b5de96a33d24a1dc139318db5bc5d0d5dVictor Zverovich  EXPECT_TRUE(ftest == 0);
1433e1c86f0b5de96a33d24a1dc139318db5bc5d0d5dVictor Zverovich  EXPECT_SYSTEM_ERROR({
14346cf24c7f920eff03688ff9544644117e249f4e85vitaut    FILE *f = safe_fopen(filename, "r");
14350bece9425749902680abc323e9a539d0b6d6d8b4Victor Zverovich    if (!f)
143653201033f2a13ae1ce528275f72789a03c6fdbe8Victor Zverovich      throw fmt::SystemError(errno, "Cannot open file '{}'", filename);
14375b8d0a7aa9eebcfc33c064aa91e1ea7c59ff61a5vitaut    fclose(f);
1438e1c86f0b5de96a33d24a1dc139318db5bc5d0d5dVictor Zverovich  }, error_code, "Cannot open file 'nonexistent'");
143987b5ebfc4ac5ed6f198099b691b838d7ed2b829fVictor Zverovich}
144087b5ebfc4ac5ed6f198099b691b838d7ed2b829fVictor Zverovich
1441525de513206d579112fe4917563348559ffc2b6bVictor ZverovichTEST(FormatterTest, Examples) {
14425d4ef3387f38de93946dda30c9ee1108d9f5d052Victor Zverovich  EXPECT_EQ("First, thou shalt count to three",
1443a1264926a0a76016fea7cc3051c84f8dbd972a93Victor Zverovich      format("First, thou shalt count to {0}", "three"));
14445d4ef3387f38de93946dda30c9ee1108d9f5d052Victor Zverovich  EXPECT_EQ("Bring me a shrubbery",
1445a1264926a0a76016fea7cc3051c84f8dbd972a93Victor Zverovich      format("Bring me a {}", "shrubbery"));
1446a1264926a0a76016fea7cc3051c84f8dbd972a93Victor Zverovich  EXPECT_EQ("From 1 to 3", format("From {} to {}", 1, 3));
14475d4ef3387f38de93946dda30c9ee1108d9f5d052Victor Zverovich
1448478d004c1d33aebdecf862fd336cc9f0c39b65d6Victor Zverovich  char buffer[BUFFER_SIZE];
14498f8fd769eef9b47339a3232e34b2696ccdc1b20bVictor Zverovich  safe_sprintf(buffer, "%03.2f", -1.2);
1450a1264926a0a76016fea7cc3051c84f8dbd972a93Victor Zverovich  EXPECT_EQ(buffer, format("{:03.2f}", -1.2));
14515d4ef3387f38de93946dda30c9ee1108d9f5d052Victor Zverovich
1452a1264926a0a76016fea7cc3051c84f8dbd972a93Victor Zverovich  EXPECT_EQ("a, b, c", format("{0}, {1}, {2}", 'a', 'b', 'c'));
1453a1264926a0a76016fea7cc3051c84f8dbd972a93Victor Zverovich  EXPECT_EQ("a, b, c", format("{}, {}, {}", 'a', 'b', 'c'));
1454a1264926a0a76016fea7cc3051c84f8dbd972a93Victor Zverovich  EXPECT_EQ("c, b, a", format("{2}, {1}, {0}", 'a', 'b', 'c'));
1455a1264926a0a76016fea7cc3051c84f8dbd972a93Victor Zverovich  EXPECT_EQ("abracadabra", format("{0}{1}{0}", "abra", "cad"));
14565d4ef3387f38de93946dda30c9ee1108d9f5d052Victor Zverovich
14575d4ef3387f38de93946dda30c9ee1108d9f5d052Victor Zverovich  EXPECT_EQ("left aligned                  ",
1458a1264926a0a76016fea7cc3051c84f8dbd972a93Victor Zverovich      format("{:<30}", "left aligned"));
14595d4ef3387f38de93946dda30c9ee1108d9f5d052Victor Zverovich  EXPECT_EQ("                 right aligned",
1460a1264926a0a76016fea7cc3051c84f8dbd972a93Victor Zverovich      format("{:>30}", "right aligned"));
14615d4ef3387f38de93946dda30c9ee1108d9f5d052Victor Zverovich  EXPECT_EQ("           centered           ",
1462a1264926a0a76016fea7cc3051c84f8dbd972a93Victor Zverovich      format("{:^30}", "centered"));
14635d4ef3387f38de93946dda30c9ee1108d9f5d052Victor Zverovich  EXPECT_EQ("***********centered***********",
1464a1264926a0a76016fea7cc3051c84f8dbd972a93Victor Zverovich      format("{:*^30}", "centered"));
14655d4ef3387f38de93946dda30c9ee1108d9f5d052Victor Zverovich
14665d4ef3387f38de93946dda30c9ee1108d9f5d052Victor Zverovich  EXPECT_EQ("+3.140000; -3.140000",
1467a1264926a0a76016fea7cc3051c84f8dbd972a93Victor Zverovich      format("{:+f}; {:+f}", 3.14, -3.14));
14685d4ef3387f38de93946dda30c9ee1108d9f5d052Victor Zverovich  EXPECT_EQ(" 3.140000; -3.140000",
1469a1264926a0a76016fea7cc3051c84f8dbd972a93Victor Zverovich      format("{: f}; {: f}", 3.14, -3.14));
14705d4ef3387f38de93946dda30c9ee1108d9f5d052Victor Zverovich  EXPECT_EQ("3.140000; -3.140000",
1471a1264926a0a76016fea7cc3051c84f8dbd972a93Victor Zverovich      format("{:-f}; {:-f}", 3.14, -3.14));
14725d4ef3387f38de93946dda30c9ee1108d9f5d052Victor Zverovich
14735d4ef3387f38de93946dda30c9ee1108d9f5d052Victor Zverovich  EXPECT_EQ("int: 42;  hex: 2a;  oct: 52",
1474a1264926a0a76016fea7cc3051c84f8dbd972a93Victor Zverovich      format("int: {0:d};  hex: {0:x};  oct: {0:o}", 42));
14755d4ef3387f38de93946dda30c9ee1108d9f5d052Victor Zverovich  EXPECT_EQ("int: 42;  hex: 0x2a;  oct: 052",
1476a1264926a0a76016fea7cc3051c84f8dbd972a93Victor Zverovich      format("int: {0:d};  hex: {0:#x};  oct: {0:#o}", 42));
14775d4ef3387f38de93946dda30c9ee1108d9f5d052Victor Zverovich
1478a1264926a0a76016fea7cc3051c84f8dbd972a93Victor Zverovich  EXPECT_EQ("The answer is 42", format("The answer is {}", 42));
14797f622c118d76e17a158dc682ab31f7e901d6ff20Victor Zverovich  EXPECT_THROW_MSG(
14805edda531f65c12f163d7232c8899305b276d36c8Victor Zverovich    format("The answer is {:d}", "forty-two"), FormatError,
14817f622c118d76e17a158dc682ab31f7e901d6ff20Victor Zverovich    "unknown format code 'd' for string");
1482c164cb6ecddd8f92cad88fff6e98423efee3d7cbVictor Zverovich
14839514da06e79615b3ce66fd1f5800eac04ce7536fVictor Zverovich  EXPECT_EQ(L"Cyrillic letter \x42e",
1484a1264926a0a76016fea7cc3051c84f8dbd972a93Victor Zverovich    format(L"Cyrillic letter {}", L'\x42e'));
1485bb93cf12a7fe1b6cde4c0b8e0e8f36dc245cda89Victor Zverovich
1486bb93cf12a7fe1b6cde4c0b8e0e8f36dc245cda89Victor Zverovich  EXPECT_WRITE(stdout,
1487c649007ed8288ea237342f49ce7afe556f8d0e20Victor Zverovich      fmt::print("{}", std::numeric_limits<double>::infinity()), "inf");
148887b5ebfc4ac5ed6f198099b691b838d7ed2b829fVictor Zverovich}
14894226b64c7dffa79cc7cde0d0860b59c45fc7dd6bVictor Zverovich
1490eadd2ee4210f4650cc081533ac3a828c57d93e1bVictor ZverovichTEST(FormatIntTest, Data) {
1491eadd2ee4210f4650cc081533ac3a828c57d93e1bVictor Zverovich  fmt::FormatInt format_int(42);
1492eadd2ee4210f4650cc081533ac3a828c57d93e1bVictor Zverovich  EXPECT_EQ("42", std::string(format_int.data(), format_int.size()));
1493eadd2ee4210f4650cc081533ac3a828c57d93e1bVictor Zverovich}
1494eadd2ee4210f4650cc081533ac3a828c57d93e1bVictor Zverovich
1495aefb3bb918bc93ca3c76135f8b421118761490b1Victor ZverovichTEST(FormatIntTest, FormatInt) {
1496aefb3bb918bc93ca3c76135f8b421118761490b1Victor Zverovich  EXPECT_EQ("42", fmt::FormatInt(42).str());
14976f6fe519e24bc8a1cf4db830e3214412e56c9387Victor Zverovich  EXPECT_EQ(2u, fmt::FormatInt(42).size());
1498eded10cf31d471d9ccc96d2ecbe74e2e7c211c28Victor Zverovich  EXPECT_EQ("-42", fmt::FormatInt(-42).str());
14996f6fe519e24bc8a1cf4db830e3214412e56c9387Victor Zverovich  EXPECT_EQ(3u, fmt::FormatInt(-42).size());
1500d473a79581f8b1b6248771fbe4f2c83e249d3336Victor Zverovich  EXPECT_EQ("42", fmt::FormatInt(42ul).str());
1501d473a79581f8b1b6248771fbe4f2c83e249d3336Victor Zverovich  EXPECT_EQ("-42", fmt::FormatInt(-42l).str());
1502d473a79581f8b1b6248771fbe4f2c83e249d3336Victor Zverovich  EXPECT_EQ("42", fmt::FormatInt(42ull).str());
1503d473a79581f8b1b6248771fbe4f2c83e249d3336Victor Zverovich  EXPECT_EQ("-42", fmt::FormatInt(-42ll).str());
1504bfedba5a0a8d563458a42f4150ba3056ff71fee6Victor Zverovich  std::ostringstream os;
1505bfedba5a0a8d563458a42f4150ba3056ff71fee6Victor Zverovich  os << std::numeric_limits<int64_t>::max();
1506b83ab1667605732604fc6808770c80aff119a871vitaut  EXPECT_EQ(os.str(),
1507b83ab1667605732604fc6808770c80aff119a871vitaut            fmt::FormatInt(std::numeric_limits<int64_t>::max()).str());
1508aefb3bb918bc93ca3c76135f8b421118761490b1Victor Zverovich}
1509aefb3bb918bc93ca3c76135f8b421118761490b1Victor Zverovich
1510e9b21916895546061cd4ddd247b8f00fa352eda2Victor Zverovichtemplate <typename T>
1511d346a4120d21cce41d504b05415218babdfa039eVictor Zverovichstd::string format_decimal(T value) {
15126f0387fc227c186d06dfe1767439e0b091bbcb43Victor Zverovich  char buffer[10];
15136f0387fc227c186d06dfe1767439e0b091bbcb43Victor Zverovich  char *ptr = buffer;
1514d346a4120d21cce41d504b05415218babdfa039eVictor Zverovich  fmt::format_decimal(ptr, value);
1515e9b21916895546061cd4ddd247b8f00fa352eda2Victor Zverovich  return std::string(buffer, ptr);
1516e9b21916895546061cd4ddd247b8f00fa352eda2Victor Zverovich}
1517e9b21916895546061cd4ddd247b8f00fa352eda2Victor Zverovich
1518e9b21916895546061cd4ddd247b8f00fa352eda2Victor ZverovichTEST(FormatIntTest, FormatDec) {
15198450f5e1d314565a3290089a2af9498363f164b0vitaut  EXPECT_EQ("-42", format_decimal(static_cast<signed char>(-42)));
1520d346a4120d21cce41d504b05415218babdfa039eVictor Zverovich  EXPECT_EQ("-42", format_decimal(static_cast<short>(-42)));
152190d0c50eb372978d9afc65425fae42159c35288bVictor Zverovich  std::ostringstream os;
152290d0c50eb372978d9afc65425fae42159c35288bVictor Zverovich  os << std::numeric_limits<unsigned short>::max();
1523d346a4120d21cce41d504b05415218babdfa039eVictor Zverovich  EXPECT_EQ(os.str(),
1524d346a4120d21cce41d504b05415218babdfa039eVictor Zverovich            format_decimal(std::numeric_limits<unsigned short>::max()));
1525d346a4120d21cce41d504b05415218babdfa039eVictor Zverovich  EXPECT_EQ("1", format_decimal(1));
1526d346a4120d21cce41d504b05415218babdfa039eVictor Zverovich  EXPECT_EQ("-1", format_decimal(-1));
1527d346a4120d21cce41d504b05415218babdfa039eVictor Zverovich  EXPECT_EQ("42", format_decimal(42));
1528d346a4120d21cce41d504b05415218babdfa039eVictor Zverovich  EXPECT_EQ("-42", format_decimal(-42));
1529d346a4120d21cce41d504b05415218babdfa039eVictor Zverovich  EXPECT_EQ("42", format_decimal(42l));
1530d346a4120d21cce41d504b05415218babdfa039eVictor Zverovich  EXPECT_EQ("42", format_decimal(42ul));
1531d346a4120d21cce41d504b05415218babdfa039eVictor Zverovich  EXPECT_EQ("42", format_decimal(42ll));
1532d346a4120d21cce41d504b05415218babdfa039eVictor Zverovich  EXPECT_EQ("42", format_decimal(42ull));
15336f0387fc227c186d06dfe1767439e0b091bbcb43Victor Zverovich}
15346f0387fc227c186d06dfe1767439e0b091bbcb43Victor Zverovich
15355cf3b6dc7d3b682abd8a16793b2692cc5f6764d1Victor ZverovichTEST(FormatTest, Print) {
1536e3a44c11f67ed82a80495517a384ad876ec8f877Victor Zverovich#if FMT_USE_FILE_DESCRIPTORS
1537c649007ed8288ea237342f49ce7afe556f8d0e20Victor Zverovich  EXPECT_WRITE(stdout, fmt::print("Don't {}!", "panic"), "Don't panic!");
15385cf3b6dc7d3b682abd8a16793b2692cc5f6764d1Victor Zverovich  EXPECT_WRITE(stderr,
1539d5b819674948092411da2955c8459d50a1ad64bdVictor Zverovich      fmt::print(stderr, "Don't {}!", "panic"), "Don't panic!");
1540e3a44c11f67ed82a80495517a384ad876ec8f877Victor Zverovich#endif
15415cf3b6dc7d3b682abd8a16793b2692cc5f6764d1Victor Zverovich}
15425cf3b6dc7d3b682abd8a16793b2692cc5f6764d1Victor Zverovich
1543e3a44c11f67ed82a80495517a384ad876ec8f877Victor Zverovich#if FMT_USE_FILE_DESCRIPTORS
1544d9db89814f5a1de13898da1a250ecf09f3ca7e74Victor ZverovichTEST(FormatTest, PrintColored) {
15455a9dc8f99110ee5ae8d17b9d8e896a1a9560ff4bRyuuke  EXPECT_WRITE(stdout, fmt::print_colored(fmt::RED, "Hello, {}!\n", "world"),
15465a9dc8f99110ee5ae8d17b9d8e896a1a9560ff4bRyuuke    "\x1b[31mHello, world!\n\x1b[0m");
15476968ef3bb3ce86ef5f2f0a8effbf8ae2270d6cdaVictor Zverovich}
15488641461c9838530d97e00247f889072e1edd341aVictor Zverovich#endif
15498641461c9838530d97e00247f889072e1edd341aVictor Zverovich
1550d9db89814f5a1de13898da1a250ecf09f3ca7e74Victor ZverovichTEST(FormatTest, Variadic) {
1551a1264926a0a76016fea7cc3051c84f8dbd972a93Victor Zverovich  EXPECT_EQ("abc1", format("{}c{}", "ab", 1));
1552a1264926a0a76016fea7cc3051c84f8dbd972a93Victor Zverovich  EXPECT_EQ(L"abc1", format(L"{}c{}", L"ab", 1));
1553d9db89814f5a1de13898da1a250ecf09f3ca7e74Victor Zverovich}
1554d9db89814f5a1de13898da1a250ecf09f3ca7e74Victor Zverovich
15553d9b0f07572a7da9ce1665e31d41a30b79704ee7Victor Zverovichtemplate <typename T>
15563d9b0f07572a7da9ce1665e31d41a30b79704ee7Victor Zverovichstd::string str(const T &value) {
1557e63a0ff12564ed2a1567d5bf11875d28580292fbVictor Zverovich  return fmt::format("{}", value);
15583d9b0f07572a7da9ce1665e31d41a30b79704ee7Victor Zverovich}
15593d9b0f07572a7da9ce1665e31d41a30b79704ee7Victor Zverovich
15603d9b0f07572a7da9ce1665e31d41a30b79704ee7Victor ZverovichTEST(StrTest, Convert) {
15613d9b0f07572a7da9ce1665e31d41a30b79704ee7Victor Zverovich  EXPECT_EQ("42", str(42));
15623d9b0f07572a7da9ce1665e31d41a30b79704ee7Victor Zverovich  std::string s = str(Date(2012, 12, 9));
15633d9b0f07572a7da9ce1665e31d41a30b79704ee7Victor Zverovich  EXPECT_EQ("2012-12-9", s);
15643d9b0f07572a7da9ce1665e31d41a30b79704ee7Victor Zverovich}
15650195f543d9e1bdeb94234ebb75fc40bcb9381e2aVictor Zverovich
15668f8fd769eef9b47339a3232e34b2696ccdc1b20bVictor Zverovichstd::string format_message(int id, const char *format,
15672f6dddd6fdff0f23a01c69cf3438022ef6ae6639Victor Zverovich    const fmt::ArgList &args) {
1568d1ded569ff012d950023de62288925258663b65bVictor Zverovich  MemoryWriter w;
1569a1264926a0a76016fea7cc3051c84f8dbd972a93Victor Zverovich  w.write("[{}] ", id);
1570a1264926a0a76016fea7cc3051c84f8dbd972a93Victor Zverovich  w.write(format, args);
15712f6dddd6fdff0f23a01c69cf3438022ef6ae6639Victor Zverovich  return w.str();
15722f6dddd6fdff0f23a01c69cf3438022ef6ae6639Victor Zverovich}
15732f6dddd6fdff0f23a01c69cf3438022ef6ae6639Victor Zverovich
15748f8fd769eef9b47339a3232e34b2696ccdc1b20bVictor ZverovichFMT_VARIADIC(std::string, format_message, int, const char *)
15752f6dddd6fdff0f23a01c69cf3438022ef6ae6639Victor Zverovich
15764f4e6c965f460f80e392fc1c00948ef2883f3a94Victor ZverovichTEST(FormatTest, FormatMessageExample) {
15774f4e6c965f460f80e392fc1c00948ef2883f3a94Victor Zverovich  EXPECT_EQ("[42] something happened",
15788f8fd769eef9b47339a3232e34b2696ccdc1b20bVictor Zverovich      format_message(42, "{} happened", "something"));
15794f4e6c965f460f80e392fc1c00948ef2883f3a94Victor Zverovich}
1580c978d88183e2176e2aca66768be7934556f87e99Victor Zverovich
1581f9561671cfaf9107942575b30c2422e9b675c8baVictor Zverovich#if FMT_USE_VARIADIC_TEMPLATES
1582f9561671cfaf9107942575b30c2422e9b675c8baVictor Zverovichtemplate<typename... Args>
1583f9561671cfaf9107942575b30c2422e9b675c8baVictor Zverovichvoid print_error(const char *file, int line, const char *format,
1584f9561671cfaf9107942575b30c2422e9b675c8baVictor Zverovich                 const Args & ... args) {
1585f9561671cfaf9107942575b30c2422e9b675c8baVictor Zverovich  fmt::print("{}: {}: ", file, line);
1586f9561671cfaf9107942575b30c2422e9b675c8baVictor Zverovich  fmt::print(format, args...);
1587f9561671cfaf9107942575b30c2422e9b675c8baVictor Zverovich}
1588f9561671cfaf9107942575b30c2422e9b675c8baVictor Zverovich#endif
1589d59fbdcd4a785094a11f3482078a82b02ea7892aVictor Zverovich
1590d59fbdcd4a785094a11f3482078a82b02ea7892aVictor ZverovichTEST(FormatTest, MaxArgs) {
1591d59fbdcd4a785094a11f3482078a82b02ea7892aVictor Zverovich  EXPECT_EQ("0123456789abcde",
15928ea9f068c7a2090ad97e7a53a21d3094e39581b0Victor Zverovich            fmt::format("{}{}{}{}{}{}{}{}{}{}{}{}{}{}{}",
1593d59fbdcd4a785094a11f3482078a82b02ea7892aVictor Zverovich                        0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 'a', 'b', 'c', 'd', 'e'));
1594d59fbdcd4a785094a11f3482078a82b02ea7892aVictor Zverovich}
1595a63a24f2d7d9a425c20857e7089d54a3cf8789d2Dean Moldovan
1596a63a24f2d7d9a425c20857e7089d54a3cf8789d2Dean Moldovan#if FMT_USE_USER_DEFINED_LITERALS
1597c0813c59f303152dcec3af9a702bc92d551e5248Dean Moldovan// Passing user-defined literals directly to EXPECT_EQ causes problems
1598c0813c59f303152dcec3af9a702bc92d551e5248Dean Moldovan// with macro argument stringification (#) on some versions of GCC.
1599c0813c59f303152dcec3af9a702bc92d551e5248Dean Moldovan// Workaround: Assing the UDL result to a variable before the macro.
1600c0813c59f303152dcec3af9a702bc92d551e5248Dean Moldovan
1601a63a24f2d7d9a425c20857e7089d54a3cf8789d2Dean Moldovanusing namespace fmt::literals;
1602a63a24f2d7d9a425c20857e7089d54a3cf8789d2Dean Moldovan
1603a63a24f2d7d9a425c20857e7089d54a3cf8789d2Dean MoldovanTEST(LiteralsTest, Format) {
1604c0813c59f303152dcec3af9a702bc92d551e5248Dean Moldovan  auto udl_format = "{}c{}"_format("ab", 1);
1605c0813c59f303152dcec3af9a702bc92d551e5248Dean Moldovan  EXPECT_EQ(format("{}c{}", "ab", 1), udl_format);
1606c0813c59f303152dcec3af9a702bc92d551e5248Dean Moldovan  auto udl_format_w = L"{}c{}"_format(L"ab", 1);
1607c0813c59f303152dcec3af9a702bc92d551e5248Dean Moldovan  EXPECT_EQ(format(L"{}c{}", L"ab", 1), udl_format_w);
1608a63a24f2d7d9a425c20857e7089d54a3cf8789d2Dean Moldovan}
1609bc6010cc211e20942948ae9bce4939dc1eea590fDean Moldovan
1610bc6010cc211e20942948ae9bce4939dc1eea590fDean MoldovanTEST(LiteralsTest, NamedArg) {
1611c0813c59f303152dcec3af9a702bc92d551e5248Dean Moldovan  auto udl_a = format("{first}{second}{first}{third}",
1612c0813c59f303152dcec3af9a702bc92d551e5248Dean Moldovan                      "first"_a="abra", "second"_a="cad", "third"_a=99);
1613bc6010cc211e20942948ae9bce4939dc1eea590fDean Moldovan  EXPECT_EQ(format("{first}{second}{first}{third}",
1614bc6010cc211e20942948ae9bce4939dc1eea590fDean Moldovan                   fmt::arg("first", "abra"), fmt::arg("second", "cad"),
1615bc6010cc211e20942948ae9bce4939dc1eea590fDean Moldovan                   fmt::arg("third", 99)),
1616c0813c59f303152dcec3af9a702bc92d551e5248Dean Moldovan            udl_a);
1617c0813c59f303152dcec3af9a702bc92d551e5248Dean Moldovan  auto udl_a_w = format(L"{first}{second}{first}{third}",
1618c0813c59f303152dcec3af9a702bc92d551e5248Dean Moldovan                        L"first"_a=L"abra", L"second"_a=L"cad", L"third"_a=99);
1619bc6010cc211e20942948ae9bce4939dc1eea590fDean Moldovan  EXPECT_EQ(format(L"{first}{second}{first}{third}",
1620bc6010cc211e20942948ae9bce4939dc1eea590fDean Moldovan                   fmt::arg(L"first", L"abra"), fmt::arg(L"second", L"cad"),
1621bc6010cc211e20942948ae9bce4939dc1eea590fDean Moldovan                   fmt::arg(L"third", 99)),
1622c0813c59f303152dcec3af9a702bc92d551e5248Dean Moldovan            udl_a_w);
1623bc6010cc211e20942948ae9bce4939dc1eea590fDean Moldovan}
1624a63a24f2d7d9a425c20857e7089d54a3cf8789d2Dean Moldovan#endif // FMT_USE_USER_DEFINED_LITERALS
16256cff6d81374fef37bedc3f82eefb9a01ee48e60bvitaut
162690730e706b8f47cc6279ab0465110d7ddbc1ac80Victor Zverovichenum TestEnum { A };
16276cff6d81374fef37bedc3f82eefb9a01ee48e60bvitaut
16286cff6d81374fef37bedc3f82eefb9a01ee48e60bvitautTEST(FormatTest, Enum) {
16296cff6d81374fef37bedc3f82eefb9a01ee48e60bvitaut  EXPECT_EQ("0", fmt::format("{}", A));
16306cff6d81374fef37bedc3f82eefb9a01ee48e60bvitaut}
1631b8bd80ff28e4c0df0322f4ddd86c6455ab6835f1vitaut
1632a99891e7a5f6c8a164d271b1aa0f09e7d13c7de4vitautclass MockArgFormatter :
1633b69e6dcead82f0e15751346ee2c3aadfcbfde9a5vitaut    public fmt::internal::ArgFormatterBase<MockArgFormatter, char> {
163452f89065e1843f4123198df326b480380d993312vitaut public:
1635a99891e7a5f6c8a164d271b1aa0f09e7d13c7de4vitaut  typedef fmt::internal::ArgFormatterBase<MockArgFormatter, char> Base;
163652f89065e1843f4123198df326b480380d993312vitaut
1637a99891e7a5f6c8a164d271b1aa0f09e7d13c7de4vitaut  MockArgFormatter(fmt::BasicFormatter<char, MockArgFormatter> &f,
1638a99891e7a5f6c8a164d271b1aa0f09e7d13c7de4vitaut                   fmt::FormatSpec &s, const char *)
1639a99891e7a5f6c8a164d271b1aa0f09e7d13c7de4vitaut    : fmt::internal::ArgFormatterBase<MockArgFormatter, char>(f.writer(), s) {
1640a99891e7a5f6c8a164d271b1aa0f09e7d13c7de4vitaut    EXPECT_CALL(*this, visit_int(42));
164152f89065e1843f4123198df326b480380d993312vitaut  }
164252f89065e1843f4123198df326b480380d993312vitaut
1643a99891e7a5f6c8a164d271b1aa0f09e7d13c7de4vitaut  MOCK_METHOD1(visit_int, void (int value));
164452f89065e1843f4123198df326b480380d993312vitaut};
164552f89065e1843f4123198df326b480380d993312vitaut
1646a99891e7a5f6c8a164d271b1aa0f09e7d13c7de4vitautvoid custom_format(const char *format_str, fmt::ArgList args) {
164752f89065e1843f4123198df326b480380d993312vitaut  fmt::MemoryWriter writer;
1648a99891e7a5f6c8a164d271b1aa0f09e7d13c7de4vitaut  fmt::BasicFormatter<char, MockArgFormatter> formatter(args, writer);
164952f89065e1843f4123198df326b480380d993312vitaut  formatter.format(format_str);
165052f89065e1843f4123198df326b480380d993312vitaut}
1651a99891e7a5f6c8a164d271b1aa0f09e7d13c7de4vitautFMT_VARIADIC(void, custom_format, const char *)
165252f89065e1843f4123198df326b480380d993312vitaut
165352f89065e1843f4123198df326b480380d993312vitautTEST(FormatTest, CustomArgFormatter) {
1654a99891e7a5f6c8a164d271b1aa0f09e7d13c7de4vitaut  custom_format("{}", 42);
165552f89065e1843f4123198df326b480380d993312vitaut}
1656796beaaddb5226162fe00c2c55e322d80d26f3d8Victor Zverovich
1657796beaaddb5226162fe00c2c55e322d80d26f3d8Victor Zverovichvoid convert(int);
1658796beaaddb5226162fe00c2c55e322d80d26f3d8Victor Zverovich
1659796beaaddb5226162fe00c2c55e322d80d26f3d8Victor Zverovich// Check if there is no collision with convert function in the global namespace.
1660796beaaddb5226162fe00c2c55e322d80d26f3d8Victor ZverovichTEST(FormatTest, ConvertCollision) {
1661796beaaddb5226162fe00c2c55e322d80d26f3d8Victor Zverovich  fmt::format("{}", 42);
1662796beaaddb5226162fe00c2c55e322d80d26f3d8Victor Zverovich}
1663796beaaddb5226162fe00c2c55e322d80d26f3d8Victor Zverovich
1664