1*9356374aSAndroid Build Coastguard Worker // Copyright 2017 The Abseil Authors.
2*9356374aSAndroid Build Coastguard Worker //
3*9356374aSAndroid Build Coastguard Worker // Licensed under the Apache License, Version 2.0 (the "License");
4*9356374aSAndroid Build Coastguard Worker // you may not use this file except in compliance with the License.
5*9356374aSAndroid Build Coastguard Worker // You may obtain a copy of the License at
6*9356374aSAndroid Build Coastguard Worker //
7*9356374aSAndroid Build Coastguard Worker // https://www.apache.org/licenses/LICENSE-2.0
8*9356374aSAndroid Build Coastguard Worker //
9*9356374aSAndroid Build Coastguard Worker // Unless required by applicable law or agreed to in writing, software
10*9356374aSAndroid Build Coastguard Worker // distributed under the License is distributed on an "AS IS" BASIS,
11*9356374aSAndroid Build Coastguard Worker // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12*9356374aSAndroid Build Coastguard Worker // See the License for the specific language governing permissions and
13*9356374aSAndroid Build Coastguard Worker // limitations under the License.
14*9356374aSAndroid Build Coastguard Worker
15*9356374aSAndroid Build Coastguard Worker #include "absl/strings/substitute.h"
16*9356374aSAndroid Build Coastguard Worker
17*9356374aSAndroid Build Coastguard Worker #include <cstdint>
18*9356374aSAndroid Build Coastguard Worker #include <cstring>
19*9356374aSAndroid Build Coastguard Worker #include <string>
20*9356374aSAndroid Build Coastguard Worker #include <vector>
21*9356374aSAndroid Build Coastguard Worker
22*9356374aSAndroid Build Coastguard Worker #include "gtest/gtest.h"
23*9356374aSAndroid Build Coastguard Worker #include "absl/strings/str_cat.h"
24*9356374aSAndroid Build Coastguard Worker #include "absl/strings/string_view.h"
25*9356374aSAndroid Build Coastguard Worker
26*9356374aSAndroid Build Coastguard Worker namespace {
27*9356374aSAndroid Build Coastguard Worker
28*9356374aSAndroid Build Coastguard Worker struct MyStruct {
29*9356374aSAndroid Build Coastguard Worker template <typename Sink>
AbslStringify(Sink & sink,const MyStruct & s)30*9356374aSAndroid Build Coastguard Worker friend void AbslStringify(Sink& sink, const MyStruct& s) {
31*9356374aSAndroid Build Coastguard Worker sink.Append("MyStruct{.value = ");
32*9356374aSAndroid Build Coastguard Worker sink.Append(absl::StrCat(s.value));
33*9356374aSAndroid Build Coastguard Worker sink.Append("}");
34*9356374aSAndroid Build Coastguard Worker }
35*9356374aSAndroid Build Coastguard Worker int value;
36*9356374aSAndroid Build Coastguard Worker };
37*9356374aSAndroid Build Coastguard Worker
TEST(SubstituteTest,Substitute)38*9356374aSAndroid Build Coastguard Worker TEST(SubstituteTest, Substitute) {
39*9356374aSAndroid Build Coastguard Worker // Basic.
40*9356374aSAndroid Build Coastguard Worker EXPECT_EQ("Hello, world!", absl::Substitute("$0, $1!", "Hello", "world"));
41*9356374aSAndroid Build Coastguard Worker
42*9356374aSAndroid Build Coastguard Worker // Non-char* types.
43*9356374aSAndroid Build Coastguard Worker EXPECT_EQ("123 0.2 0.1 foo true false x",
44*9356374aSAndroid Build Coastguard Worker absl::Substitute("$0 $1 $2 $3 $4 $5 $6", 123, 0.2, 0.1f,
45*9356374aSAndroid Build Coastguard Worker std::string("foo"), true, false, 'x'));
46*9356374aSAndroid Build Coastguard Worker
47*9356374aSAndroid Build Coastguard Worker // All int types.
48*9356374aSAndroid Build Coastguard Worker EXPECT_EQ(
49*9356374aSAndroid Build Coastguard Worker "-32767 65535 "
50*9356374aSAndroid Build Coastguard Worker "-1234567890 3234567890 "
51*9356374aSAndroid Build Coastguard Worker "-1234567890 3234567890 "
52*9356374aSAndroid Build Coastguard Worker "-1234567890123456789 9234567890123456789",
53*9356374aSAndroid Build Coastguard Worker absl::Substitute(
54*9356374aSAndroid Build Coastguard Worker "$0 $1 $2 $3 $4 $5 $6 $7",
55*9356374aSAndroid Build Coastguard Worker static_cast<short>(-32767), // NOLINT(runtime/int)
56*9356374aSAndroid Build Coastguard Worker static_cast<unsigned short>(65535), // NOLINT(runtime/int)
57*9356374aSAndroid Build Coastguard Worker -1234567890, 3234567890U, -1234567890L, 3234567890UL,
58*9356374aSAndroid Build Coastguard Worker -int64_t{1234567890123456789}, uint64_t{9234567890123456789u}));
59*9356374aSAndroid Build Coastguard Worker
60*9356374aSAndroid Build Coastguard Worker // Hex format
61*9356374aSAndroid Build Coastguard Worker EXPECT_EQ("0 1 f ffff0ffff 0123456789abcdef",
62*9356374aSAndroid Build Coastguard Worker absl::Substitute("$0$1$2$3$4 $5", //
63*9356374aSAndroid Build Coastguard Worker absl::Hex(0), absl::Hex(1, absl::kSpacePad2),
64*9356374aSAndroid Build Coastguard Worker absl::Hex(0xf, absl::kSpacePad2),
65*9356374aSAndroid Build Coastguard Worker absl::Hex(int16_t{-1}, absl::kSpacePad5),
66*9356374aSAndroid Build Coastguard Worker absl::Hex(int16_t{-1}, absl::kZeroPad5),
67*9356374aSAndroid Build Coastguard Worker absl::Hex(0x123456789abcdef, absl::kZeroPad16)));
68*9356374aSAndroid Build Coastguard Worker
69*9356374aSAndroid Build Coastguard Worker // Dec format
70*9356374aSAndroid Build Coastguard Worker EXPECT_EQ("0 115 -1-0001 81985529216486895",
71*9356374aSAndroid Build Coastguard Worker absl::Substitute("$0$1$2$3$4 $5", //
72*9356374aSAndroid Build Coastguard Worker absl::Dec(0), absl::Dec(1, absl::kSpacePad2),
73*9356374aSAndroid Build Coastguard Worker absl::Dec(0xf, absl::kSpacePad2),
74*9356374aSAndroid Build Coastguard Worker absl::Dec(int16_t{-1}, absl::kSpacePad5),
75*9356374aSAndroid Build Coastguard Worker absl::Dec(int16_t{-1}, absl::kZeroPad5),
76*9356374aSAndroid Build Coastguard Worker absl::Dec(0x123456789abcdef, absl::kZeroPad16)));
77*9356374aSAndroid Build Coastguard Worker
78*9356374aSAndroid Build Coastguard Worker // Pointer.
79*9356374aSAndroid Build Coastguard Worker const int* int_p = reinterpret_cast<const int*>(0x12345);
80*9356374aSAndroid Build Coastguard Worker std::string str = absl::Substitute("$0", int_p);
81*9356374aSAndroid Build Coastguard Worker EXPECT_EQ(absl::StrCat("0x", absl::Hex(int_p)), str);
82*9356374aSAndroid Build Coastguard Worker
83*9356374aSAndroid Build Coastguard Worker // Volatile Pointer.
84*9356374aSAndroid Build Coastguard Worker // Like C++ streamed I/O, such pointers implicitly become bool
85*9356374aSAndroid Build Coastguard Worker volatile int vol = 237;
86*9356374aSAndroid Build Coastguard Worker volatile int* volatile volptr = &vol;
87*9356374aSAndroid Build Coastguard Worker str = absl::Substitute("$0", volptr);
88*9356374aSAndroid Build Coastguard Worker EXPECT_EQ("true", str);
89*9356374aSAndroid Build Coastguard Worker
90*9356374aSAndroid Build Coastguard Worker // null is special. StrCat prints 0x0. Substitute prints NULL.
91*9356374aSAndroid Build Coastguard Worker const uint64_t* null_p = nullptr;
92*9356374aSAndroid Build Coastguard Worker str = absl::Substitute("$0", null_p);
93*9356374aSAndroid Build Coastguard Worker EXPECT_EQ("NULL", str);
94*9356374aSAndroid Build Coastguard Worker
95*9356374aSAndroid Build Coastguard Worker // char* is also special.
96*9356374aSAndroid Build Coastguard Worker const char* char_p = "print me";
97*9356374aSAndroid Build Coastguard Worker str = absl::Substitute("$0", char_p);
98*9356374aSAndroid Build Coastguard Worker EXPECT_EQ("print me", str);
99*9356374aSAndroid Build Coastguard Worker
100*9356374aSAndroid Build Coastguard Worker char char_buf[16];
101*9356374aSAndroid Build Coastguard Worker strncpy(char_buf, "print me too", sizeof(char_buf));
102*9356374aSAndroid Build Coastguard Worker str = absl::Substitute("$0", char_buf);
103*9356374aSAndroid Build Coastguard Worker EXPECT_EQ("print me too", str);
104*9356374aSAndroid Build Coastguard Worker
105*9356374aSAndroid Build Coastguard Worker // null char* is "doubly" special. Represented as the empty string.
106*9356374aSAndroid Build Coastguard Worker char_p = nullptr;
107*9356374aSAndroid Build Coastguard Worker str = absl::Substitute("$0", char_p);
108*9356374aSAndroid Build Coastguard Worker EXPECT_EQ("", str);
109*9356374aSAndroid Build Coastguard Worker
110*9356374aSAndroid Build Coastguard Worker // Out-of-order.
111*9356374aSAndroid Build Coastguard Worker EXPECT_EQ("b, a, c, b", absl::Substitute("$1, $0, $2, $1", "a", "b", "c"));
112*9356374aSAndroid Build Coastguard Worker
113*9356374aSAndroid Build Coastguard Worker // Literal $
114*9356374aSAndroid Build Coastguard Worker EXPECT_EQ("$", absl::Substitute("$$"));
115*9356374aSAndroid Build Coastguard Worker
116*9356374aSAndroid Build Coastguard Worker EXPECT_EQ("$1", absl::Substitute("$$1"));
117*9356374aSAndroid Build Coastguard Worker
118*9356374aSAndroid Build Coastguard Worker // Test all overloads.
119*9356374aSAndroid Build Coastguard Worker EXPECT_EQ("a", absl::Substitute("$0", "a"));
120*9356374aSAndroid Build Coastguard Worker EXPECT_EQ("a b", absl::Substitute("$0 $1", "a", "b"));
121*9356374aSAndroid Build Coastguard Worker EXPECT_EQ("a b c", absl::Substitute("$0 $1 $2", "a", "b", "c"));
122*9356374aSAndroid Build Coastguard Worker EXPECT_EQ("a b c d", absl::Substitute("$0 $1 $2 $3", "a", "b", "c", "d"));
123*9356374aSAndroid Build Coastguard Worker EXPECT_EQ("a b c d e",
124*9356374aSAndroid Build Coastguard Worker absl::Substitute("$0 $1 $2 $3 $4", "a", "b", "c", "d", "e"));
125*9356374aSAndroid Build Coastguard Worker EXPECT_EQ("a b c d e f", absl::Substitute("$0 $1 $2 $3 $4 $5", "a", "b", "c",
126*9356374aSAndroid Build Coastguard Worker "d", "e", "f"));
127*9356374aSAndroid Build Coastguard Worker EXPECT_EQ("a b c d e f g", absl::Substitute("$0 $1 $2 $3 $4 $5 $6", "a", "b",
128*9356374aSAndroid Build Coastguard Worker "c", "d", "e", "f", "g"));
129*9356374aSAndroid Build Coastguard Worker EXPECT_EQ("a b c d e f g h",
130*9356374aSAndroid Build Coastguard Worker absl::Substitute("$0 $1 $2 $3 $4 $5 $6 $7", "a", "b", "c", "d", "e",
131*9356374aSAndroid Build Coastguard Worker "f", "g", "h"));
132*9356374aSAndroid Build Coastguard Worker EXPECT_EQ("a b c d e f g h i",
133*9356374aSAndroid Build Coastguard Worker absl::Substitute("$0 $1 $2 $3 $4 $5 $6 $7 $8", "a", "b", "c", "d",
134*9356374aSAndroid Build Coastguard Worker "e", "f", "g", "h", "i"));
135*9356374aSAndroid Build Coastguard Worker EXPECT_EQ("a b c d e f g h i j",
136*9356374aSAndroid Build Coastguard Worker absl::Substitute("$0 $1 $2 $3 $4 $5 $6 $7 $8 $9", "a", "b", "c",
137*9356374aSAndroid Build Coastguard Worker "d", "e", "f", "g", "h", "i", "j"));
138*9356374aSAndroid Build Coastguard Worker EXPECT_EQ("a b c d e f g h i j b0",
139*9356374aSAndroid Build Coastguard Worker absl::Substitute("$0 $1 $2 $3 $4 $5 $6 $7 $8 $9 $10", "a", "b", "c",
140*9356374aSAndroid Build Coastguard Worker "d", "e", "f", "g", "h", "i", "j"));
141*9356374aSAndroid Build Coastguard Worker
142*9356374aSAndroid Build Coastguard Worker const char* null_cstring = nullptr;
143*9356374aSAndroid Build Coastguard Worker EXPECT_EQ("Text: ''", absl::Substitute("Text: '$0'", null_cstring));
144*9356374aSAndroid Build Coastguard Worker
145*9356374aSAndroid Build Coastguard Worker MyStruct s1 = MyStruct{17};
146*9356374aSAndroid Build Coastguard Worker MyStruct s2 = MyStruct{1043};
147*9356374aSAndroid Build Coastguard Worker EXPECT_EQ("MyStruct{.value = 17}, MyStruct{.value = 1043}",
148*9356374aSAndroid Build Coastguard Worker absl::Substitute("$0, $1", s1, s2));
149*9356374aSAndroid Build Coastguard Worker }
150*9356374aSAndroid Build Coastguard Worker
TEST(SubstituteTest,SubstituteAndAppend)151*9356374aSAndroid Build Coastguard Worker TEST(SubstituteTest, SubstituteAndAppend) {
152*9356374aSAndroid Build Coastguard Worker std::string str = "Hello";
153*9356374aSAndroid Build Coastguard Worker absl::SubstituteAndAppend(&str, ", $0!", "world");
154*9356374aSAndroid Build Coastguard Worker EXPECT_EQ("Hello, world!", str);
155*9356374aSAndroid Build Coastguard Worker
156*9356374aSAndroid Build Coastguard Worker // Test all overloads.
157*9356374aSAndroid Build Coastguard Worker str.clear();
158*9356374aSAndroid Build Coastguard Worker absl::SubstituteAndAppend(&str, "$0", "a");
159*9356374aSAndroid Build Coastguard Worker EXPECT_EQ("a", str);
160*9356374aSAndroid Build Coastguard Worker str.clear();
161*9356374aSAndroid Build Coastguard Worker absl::SubstituteAndAppend(&str, "$0 $1", "a", "b");
162*9356374aSAndroid Build Coastguard Worker EXPECT_EQ("a b", str);
163*9356374aSAndroid Build Coastguard Worker str.clear();
164*9356374aSAndroid Build Coastguard Worker absl::SubstituteAndAppend(&str, "$0 $1 $2", "a", "b", "c");
165*9356374aSAndroid Build Coastguard Worker EXPECT_EQ("a b c", str);
166*9356374aSAndroid Build Coastguard Worker str.clear();
167*9356374aSAndroid Build Coastguard Worker absl::SubstituteAndAppend(&str, "$0 $1 $2 $3", "a", "b", "c", "d");
168*9356374aSAndroid Build Coastguard Worker EXPECT_EQ("a b c d", str);
169*9356374aSAndroid Build Coastguard Worker str.clear();
170*9356374aSAndroid Build Coastguard Worker absl::SubstituteAndAppend(&str, "$0 $1 $2 $3 $4", "a", "b", "c", "d", "e");
171*9356374aSAndroid Build Coastguard Worker EXPECT_EQ("a b c d e", str);
172*9356374aSAndroid Build Coastguard Worker str.clear();
173*9356374aSAndroid Build Coastguard Worker absl::SubstituteAndAppend(&str, "$0 $1 $2 $3 $4 $5", "a", "b", "c", "d", "e",
174*9356374aSAndroid Build Coastguard Worker "f");
175*9356374aSAndroid Build Coastguard Worker EXPECT_EQ("a b c d e f", str);
176*9356374aSAndroid Build Coastguard Worker str.clear();
177*9356374aSAndroid Build Coastguard Worker absl::SubstituteAndAppend(&str, "$0 $1 $2 $3 $4 $5 $6", "a", "b", "c", "d",
178*9356374aSAndroid Build Coastguard Worker "e", "f", "g");
179*9356374aSAndroid Build Coastguard Worker EXPECT_EQ("a b c d e f g", str);
180*9356374aSAndroid Build Coastguard Worker str.clear();
181*9356374aSAndroid Build Coastguard Worker absl::SubstituteAndAppend(&str, "$0 $1 $2 $3 $4 $5 $6 $7", "a", "b", "c", "d",
182*9356374aSAndroid Build Coastguard Worker "e", "f", "g", "h");
183*9356374aSAndroid Build Coastguard Worker EXPECT_EQ("a b c d e f g h", str);
184*9356374aSAndroid Build Coastguard Worker str.clear();
185*9356374aSAndroid Build Coastguard Worker absl::SubstituteAndAppend(&str, "$0 $1 $2 $3 $4 $5 $6 $7 $8", "a", "b", "c",
186*9356374aSAndroid Build Coastguard Worker "d", "e", "f", "g", "h", "i");
187*9356374aSAndroid Build Coastguard Worker EXPECT_EQ("a b c d e f g h i", str);
188*9356374aSAndroid Build Coastguard Worker str.clear();
189*9356374aSAndroid Build Coastguard Worker absl::SubstituteAndAppend(&str, "$0 $1 $2 $3 $4 $5 $6 $7 $8 $9", "a", "b",
190*9356374aSAndroid Build Coastguard Worker "c", "d", "e", "f", "g", "h", "i", "j");
191*9356374aSAndroid Build Coastguard Worker EXPECT_EQ("a b c d e f g h i j", str);
192*9356374aSAndroid Build Coastguard Worker
193*9356374aSAndroid Build Coastguard Worker str.clear();
194*9356374aSAndroid Build Coastguard Worker MyStruct s1 = MyStruct{17};
195*9356374aSAndroid Build Coastguard Worker MyStruct s2 = MyStruct{1043};
196*9356374aSAndroid Build Coastguard Worker absl::SubstituteAndAppend(&str, "$0, $1", s1, s2);
197*9356374aSAndroid Build Coastguard Worker EXPECT_EQ("MyStruct{.value = 17}, MyStruct{.value = 1043}", str);
198*9356374aSAndroid Build Coastguard Worker }
199*9356374aSAndroid Build Coastguard Worker
TEST(SubstituteTest,VectorBoolRef)200*9356374aSAndroid Build Coastguard Worker TEST(SubstituteTest, VectorBoolRef) {
201*9356374aSAndroid Build Coastguard Worker std::vector<bool> v = {true, false};
202*9356374aSAndroid Build Coastguard Worker const auto& cv = v;
203*9356374aSAndroid Build Coastguard Worker EXPECT_EQ("true false true false",
204*9356374aSAndroid Build Coastguard Worker absl::Substitute("$0 $1 $2 $3", v[0], v[1], cv[0], cv[1]));
205*9356374aSAndroid Build Coastguard Worker
206*9356374aSAndroid Build Coastguard Worker std::string str = "Logic be like: ";
207*9356374aSAndroid Build Coastguard Worker absl::SubstituteAndAppend(&str, "$0 $1 $2 $3", v[0], v[1], cv[0], cv[1]);
208*9356374aSAndroid Build Coastguard Worker EXPECT_EQ("Logic be like: true false true false", str);
209*9356374aSAndroid Build Coastguard Worker }
210*9356374aSAndroid Build Coastguard Worker
TEST(SubstituteTest,Enums)211*9356374aSAndroid Build Coastguard Worker TEST(SubstituteTest, Enums) {
212*9356374aSAndroid Build Coastguard Worker enum UnscopedEnum { kEnum0 = 0, kEnum1 = 1 };
213*9356374aSAndroid Build Coastguard Worker EXPECT_EQ("0 1", absl::Substitute("$0 $1", UnscopedEnum::kEnum0,
214*9356374aSAndroid Build Coastguard Worker UnscopedEnum::kEnum1));
215*9356374aSAndroid Build Coastguard Worker
216*9356374aSAndroid Build Coastguard Worker enum class ScopedEnum { kEnum0 = 0, kEnum1 = 1 };
217*9356374aSAndroid Build Coastguard Worker EXPECT_EQ("0 1",
218*9356374aSAndroid Build Coastguard Worker absl::Substitute("$0 $1", ScopedEnum::kEnum0, ScopedEnum::kEnum1));
219*9356374aSAndroid Build Coastguard Worker
220*9356374aSAndroid Build Coastguard Worker enum class ScopedEnumInt32 : int32_t { kEnum0 = 989, kEnum1 = INT32_MIN };
221*9356374aSAndroid Build Coastguard Worker EXPECT_EQ("989 -2147483648",
222*9356374aSAndroid Build Coastguard Worker absl::Substitute("$0 $1", ScopedEnumInt32::kEnum0,
223*9356374aSAndroid Build Coastguard Worker ScopedEnumInt32::kEnum1));
224*9356374aSAndroid Build Coastguard Worker
225*9356374aSAndroid Build Coastguard Worker enum class ScopedEnumUInt32 : uint32_t { kEnum0 = 1, kEnum1 = UINT32_MAX };
226*9356374aSAndroid Build Coastguard Worker EXPECT_EQ("1 4294967295", absl::Substitute("$0 $1", ScopedEnumUInt32::kEnum0,
227*9356374aSAndroid Build Coastguard Worker ScopedEnumUInt32::kEnum1));
228*9356374aSAndroid Build Coastguard Worker
229*9356374aSAndroid Build Coastguard Worker enum class ScopedEnumInt64 : int64_t { kEnum0 = -1, kEnum1 = 42949672950 };
230*9356374aSAndroid Build Coastguard Worker EXPECT_EQ("-1 42949672950", absl::Substitute("$0 $1", ScopedEnumInt64::kEnum0,
231*9356374aSAndroid Build Coastguard Worker ScopedEnumInt64::kEnum1));
232*9356374aSAndroid Build Coastguard Worker
233*9356374aSAndroid Build Coastguard Worker enum class ScopedEnumUInt64 : uint64_t { kEnum0 = 1, kEnum1 = 42949672950 };
234*9356374aSAndroid Build Coastguard Worker EXPECT_EQ("1 42949672950", absl::Substitute("$0 $1", ScopedEnumUInt64::kEnum0,
235*9356374aSAndroid Build Coastguard Worker ScopedEnumUInt64::kEnum1));
236*9356374aSAndroid Build Coastguard Worker
237*9356374aSAndroid Build Coastguard Worker enum class ScopedEnumChar : signed char { kEnum0 = -1, kEnum1 = 1 };
238*9356374aSAndroid Build Coastguard Worker EXPECT_EQ("-1 1", absl::Substitute("$0 $1", ScopedEnumChar::kEnum0,
239*9356374aSAndroid Build Coastguard Worker ScopedEnumChar::kEnum1));
240*9356374aSAndroid Build Coastguard Worker
241*9356374aSAndroid Build Coastguard Worker enum class ScopedEnumUChar : unsigned char {
242*9356374aSAndroid Build Coastguard Worker kEnum0 = 0,
243*9356374aSAndroid Build Coastguard Worker kEnum1 = 1,
244*9356374aSAndroid Build Coastguard Worker kEnumMax = 255
245*9356374aSAndroid Build Coastguard Worker };
246*9356374aSAndroid Build Coastguard Worker EXPECT_EQ("0 1 255", absl::Substitute("$0 $1 $2", ScopedEnumUChar::kEnum0,
247*9356374aSAndroid Build Coastguard Worker ScopedEnumUChar::kEnum1,
248*9356374aSAndroid Build Coastguard Worker ScopedEnumUChar::kEnumMax));
249*9356374aSAndroid Build Coastguard Worker
250*9356374aSAndroid Build Coastguard Worker enum class ScopedEnumInt16 : int16_t { kEnum0 = -100, kEnum1 = 10000 };
251*9356374aSAndroid Build Coastguard Worker EXPECT_EQ("-100 10000", absl::Substitute("$0 $1", ScopedEnumInt16::kEnum0,
252*9356374aSAndroid Build Coastguard Worker ScopedEnumInt16::kEnum1));
253*9356374aSAndroid Build Coastguard Worker
254*9356374aSAndroid Build Coastguard Worker enum class ScopedEnumUInt16 : uint16_t { kEnum0 = 0, kEnum1 = 10000 };
255*9356374aSAndroid Build Coastguard Worker EXPECT_EQ("0 10000", absl::Substitute("$0 $1", ScopedEnumUInt16::kEnum0,
256*9356374aSAndroid Build Coastguard Worker ScopedEnumUInt16::kEnum1));
257*9356374aSAndroid Build Coastguard Worker }
258*9356374aSAndroid Build Coastguard Worker
259*9356374aSAndroid Build Coastguard Worker enum class EnumWithStringify { Many = 0, Choices = 1 };
260*9356374aSAndroid Build Coastguard Worker
261*9356374aSAndroid Build Coastguard Worker template <typename Sink>
AbslStringify(Sink & sink,EnumWithStringify e)262*9356374aSAndroid Build Coastguard Worker void AbslStringify(Sink& sink, EnumWithStringify e) {
263*9356374aSAndroid Build Coastguard Worker sink.Append(e == EnumWithStringify::Many ? "Many" : "Choices");
264*9356374aSAndroid Build Coastguard Worker }
265*9356374aSAndroid Build Coastguard Worker
TEST(SubstituteTest,AbslStringifyWithEnum)266*9356374aSAndroid Build Coastguard Worker TEST(SubstituteTest, AbslStringifyWithEnum) {
267*9356374aSAndroid Build Coastguard Worker const auto e = EnumWithStringify::Choices;
268*9356374aSAndroid Build Coastguard Worker EXPECT_EQ(absl::Substitute("$0", e), "Choices");
269*9356374aSAndroid Build Coastguard Worker }
270*9356374aSAndroid Build Coastguard Worker
271*9356374aSAndroid Build Coastguard Worker #if GTEST_HAS_DEATH_TEST
272*9356374aSAndroid Build Coastguard Worker
TEST(SubstituteDeathTest,SubstituteDeath)273*9356374aSAndroid Build Coastguard Worker TEST(SubstituteDeathTest, SubstituteDeath) {
274*9356374aSAndroid Build Coastguard Worker EXPECT_DEBUG_DEATH(
275*9356374aSAndroid Build Coastguard Worker static_cast<void>(absl::Substitute(absl::string_view("-$2"), "a", "b")),
276*9356374aSAndroid Build Coastguard Worker "Invalid absl::Substitute\\(\\) format string: asked for \"\\$2\", "
277*9356374aSAndroid Build Coastguard Worker "but only 2 args were given.");
278*9356374aSAndroid Build Coastguard Worker EXPECT_DEBUG_DEATH(
279*9356374aSAndroid Build Coastguard Worker static_cast<void>(absl::Substitute(absl::string_view("-$z-"))),
280*9356374aSAndroid Build Coastguard Worker "Invalid absl::Substitute\\(\\) format string: \"-\\$z-\"");
281*9356374aSAndroid Build Coastguard Worker EXPECT_DEBUG_DEATH(
282*9356374aSAndroid Build Coastguard Worker static_cast<void>(absl::Substitute(absl::string_view("-$"))),
283*9356374aSAndroid Build Coastguard Worker "Invalid absl::Substitute\\(\\) format string: \"-\\$\"");
284*9356374aSAndroid Build Coastguard Worker }
285*9356374aSAndroid Build Coastguard Worker
286*9356374aSAndroid Build Coastguard Worker #endif // GTEST_HAS_DEATH_TEST
287*9356374aSAndroid Build Coastguard Worker
288*9356374aSAndroid Build Coastguard Worker } // namespace
289