comparison unittests/Support/FormatVariadicTest.cpp @ 148:63bd29f05246

merged
author Shinji KONO <kono@ie.u-ryukyu.ac.jp>
date Wed, 14 Aug 2019 19:46:37 +0900
parents c2174574ed3a
children
comparison
equal deleted inserted replaced
146:3fc4d5c3e21e 148:63bd29f05246
1 //===- FormatVariadicTest.cpp - Unit tests for string formatting ----------===// 1 //===- FormatVariadicTest.cpp - Unit tests for string formatting ----------===//
2 // 2 //
3 // The LLVM Compiler Infrastructure 3 // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4 // 4 // See https://llvm.org/LICENSE.txt for license information.
5 // This file is distributed under the University of Illinois Open Source 5 // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6 // License. See LICENSE.TXT for details.
7 // 6 //
8 //===----------------------------------------------------------------------===// 7 //===----------------------------------------------------------------------===//
9 8
10 #include "llvm/Support/FormatVariadic.h" 9 #include "llvm/Support/FormatVariadic.h"
10 #include "llvm/Support/Error.h"
11 #include "llvm/Support/FormatAdapters.h" 11 #include "llvm/Support/FormatAdapters.h"
12 #include "gtest/gtest.h" 12 #include "gtest/gtest.h"
13 13
14 using namespace llvm; 14 using namespace llvm;
15 15
141 EXPECT_EQ(ReplacementType::Format, Replacements[0].Type); 141 EXPECT_EQ(ReplacementType::Format, Replacements[0].Type);
142 EXPECT_EQ(0u, Replacements[0].Index); 142 EXPECT_EQ(0u, Replacements[0].Index);
143 EXPECT_EQ(0u, Replacements[0].Align); 143 EXPECT_EQ(0u, Replacements[0].Align);
144 EXPECT_EQ(AlignStyle::Right, Replacements[0].Where); 144 EXPECT_EQ(AlignStyle::Right, Replacements[0].Where);
145 EXPECT_EQ("0:1", Replacements[0].Options); 145 EXPECT_EQ("0:1", Replacements[0].Options);
146
147 // 9. Custom padding character
148 Replacements = formatv_object_base::parseFormatString("{0,p+4:foo}");
149 ASSERT_EQ(1u, Replacements.size());
150 EXPECT_EQ("0,p+4:foo", Replacements[0].Spec);
151 EXPECT_EQ(ReplacementType::Format, Replacements[0].Type);
152 EXPECT_EQ(0u, Replacements[0].Index);
153 EXPECT_EQ(4u, Replacements[0].Align);
154 EXPECT_EQ(AlignStyle::Right, Replacements[0].Where);
155 EXPECT_EQ('p', Replacements[0].Pad);
156 EXPECT_EQ("foo", Replacements[0].Options);
157
158 // Format string special characters are allowed as padding character
159 Replacements = formatv_object_base::parseFormatString("{0,-+4:foo}");
160 ASSERT_EQ(1u, Replacements.size());
161 EXPECT_EQ("0,-+4:foo", Replacements[0].Spec);
162 EXPECT_EQ(ReplacementType::Format, Replacements[0].Type);
163 EXPECT_EQ(0u, Replacements[0].Index);
164 EXPECT_EQ(4u, Replacements[0].Align);
165 EXPECT_EQ(AlignStyle::Right, Replacements[0].Where);
166 EXPECT_EQ('-', Replacements[0].Pad);
167 EXPECT_EQ("foo", Replacements[0].Options);
168
169 Replacements = formatv_object_base::parseFormatString("{0,+-4:foo}");
170 ASSERT_EQ(1u, Replacements.size());
171 EXPECT_EQ("0,+-4:foo", Replacements[0].Spec);
172 EXPECT_EQ(ReplacementType::Format, Replacements[0].Type);
173 EXPECT_EQ(0u, Replacements[0].Index);
174 EXPECT_EQ(4u, Replacements[0].Align);
175 EXPECT_EQ(AlignStyle::Left, Replacements[0].Where);
176 EXPECT_EQ('+', Replacements[0].Pad);
177 EXPECT_EQ("foo", Replacements[0].Options);
178
179 Replacements = formatv_object_base::parseFormatString("{0,==4:foo}");
180 ASSERT_EQ(1u, Replacements.size());
181 EXPECT_EQ("0,==4:foo", Replacements[0].Spec);
182 EXPECT_EQ(ReplacementType::Format, Replacements[0].Type);
183 EXPECT_EQ(0u, Replacements[0].Index);
184 EXPECT_EQ(4u, Replacements[0].Align);
185 EXPECT_EQ(AlignStyle::Center, Replacements[0].Where);
186 EXPECT_EQ('=', Replacements[0].Pad);
187 EXPECT_EQ("foo", Replacements[0].Options);
188
189 Replacements = formatv_object_base::parseFormatString("{0,:=4:foo}");
190 ASSERT_EQ(1u, Replacements.size());
191 EXPECT_EQ("0,:=4:foo", Replacements[0].Spec);
192 EXPECT_EQ(ReplacementType::Format, Replacements[0].Type);
193 EXPECT_EQ(0u, Replacements[0].Index);
194 EXPECT_EQ(4u, Replacements[0].Align);
195 EXPECT_EQ(AlignStyle::Center, Replacements[0].Where);
196 EXPECT_EQ(':', Replacements[0].Pad);
197 EXPECT_EQ("foo", Replacements[0].Options);
146 } 198 }
147 199
148 TEST(FormatVariadicTest, DefaultReplacementValues) { 200 TEST(FormatVariadicTest, DefaultReplacementValues) {
149 // 2. If options string is missing, it defaults to empty. 201 // 2. If options string is missing, it defaults to empty.
150 auto Replacements = formatv_object_base::parseFormatString("{0,3}"); 202 auto Replacements = formatv_object_base::parseFormatString("{0,3}");
417 // 2. With padding and precision. 469 // 2. With padding and precision.
418 EXPECT_EQ(" 0.000", formatv("{0,8:F3}", 0.0).str()); 470 EXPECT_EQ(" 0.000", formatv("{0,8:F3}", 0.0).str());
419 EXPECT_EQ(" -1.100", formatv("{0,8:F3}", -1.1).str()); 471 EXPECT_EQ(" -1.100", formatv("{0,8:F3}", -1.1).str());
420 EXPECT_EQ("1234.568", formatv("{0,8:F3}", 1234.5678).str()); 472 EXPECT_EQ("1234.568", formatv("{0,8:F3}", 1234.5678).str());
421 EXPECT_EQ(" -0.001", formatv("{0,8:F3}", -.0012345678).str()); 473 EXPECT_EQ(" -0.001", formatv("{0,8:F3}", -.0012345678).str());
474 }
475
476 TEST(FormatVariadicTest, CustomPaddingCharacter) {
477 // 1. Padding with custom character
478 EXPECT_EQ("==123", formatv("{0,=+5}", 123).str());
479 EXPECT_EQ("=123=", formatv("{0,==5}", 123).str());
480 EXPECT_EQ("123==", formatv("{0,=-5}", 123).str());
481
482 // 2. Combined with zero padding
483 EXPECT_EQ("=00123=", formatv("{0,==7:5}", 123).str());
422 } 484 }
423 485
424 struct format_tuple { 486 struct format_tuple {
425 const char *Fmt; 487 const char *Fmt;
426 explicit format_tuple(const char *Fmt) : Fmt(Fmt) {} 488 explicit format_tuple(const char *Fmt) : Fmt(Fmt) {}
607 EXPECT_EQ("0C 3M", formatv("{0}", std::move(R)).str()); 669 EXPECT_EQ("0C 3M", formatv("{0}", std::move(R)).str());
608 EXPECT_EQ("0C 3M", formatv("{0}", Recorder()).str()); 670 EXPECT_EQ("0C 3M", formatv("{0}", Recorder()).str());
609 EXPECT_EQ(0, R.Copied); 671 EXPECT_EQ(0, R.Copied);
610 EXPECT_EQ(0, R.Moved); 672 EXPECT_EQ(0, R.Moved);
611 } 673 }
674
675 namespace adl {
676 struct X {};
677 raw_ostream &operator<<(raw_ostream &OS, const X &) { return OS << "X"; }
678 } // namespace adl
679 TEST(FormatVariadicTest, FormatStreamable) {
680 adl::X X;
681 EXPECT_EQ("X", formatv("{0}", X).str());
682 }
683
684 TEST(FormatVariadicTest, FormatError) {
685 auto E1 = make_error<StringError>("X", inconvertibleErrorCode());
686 EXPECT_EQ("X", formatv("{0}", E1).str());
687 EXPECT_TRUE(E1.isA<StringError>()); // not consumed
688 EXPECT_EQ("X", formatv("{0}", fmt_consume(std::move(E1))).str());
689 EXPECT_FALSE(E1.isA<StringError>()); // consumed
690 }