@@ -269,14 +269,50 @@ TEST(FormatVariadicTest, MultipleReplacements) {
269269 EXPECT_EQ (ReplacementType::Literal, Replacements[3 ].Type );
270270 EXPECT_EQ (" -" , Replacements[3 ].Spec );
271271
272- // {2:bar ,-3} - Options=bar, Align=-3
272+ // {2,-3:bar } - Options=bar, Align=-3
273273 EXPECT_EQ (ReplacementType::Format, Replacements[4 ].Type );
274274 EXPECT_EQ (2u , Replacements[4 ].Index );
275275 EXPECT_EQ (3u , Replacements[4 ].Width );
276276 EXPECT_EQ (AlignStyle::Left, Replacements[4 ].Where );
277277 EXPECT_EQ (" bar" , Replacements[4 ].Options );
278278}
279279
280+ TEST (FormatVariadicTest, AutomaticIndices) {
281+ auto Replacements = parseFormatString (" {}" );
282+ ASSERT_EQ (1u , Replacements.size ());
283+ EXPECT_EQ (ReplacementType::Format, Replacements[0 ].Type );
284+ EXPECT_EQ (0u , Replacements[0 ].Index );
285+
286+ Replacements = parseFormatString (" {}{}" );
287+ ASSERT_EQ (2u , Replacements.size ());
288+ EXPECT_EQ (ReplacementType::Format, Replacements[0 ].Type );
289+ EXPECT_EQ (0u , Replacements[0 ].Index );
290+ EXPECT_EQ (ReplacementType::Format, Replacements[1 ].Type );
291+ EXPECT_EQ (1u , Replacements[1 ].Index );
292+
293+ Replacements = parseFormatString (" {}{:foo}{,-3:bar}" );
294+ ASSERT_EQ (3u , Replacements.size ());
295+ EXPECT_EQ (ReplacementType::Format, Replacements[0 ].Type );
296+ EXPECT_EQ (0u , Replacements[0 ].Index );
297+ EXPECT_EQ (0u , Replacements[0 ].Width );
298+ EXPECT_EQ (AlignStyle::Right, Replacements[0 ].Where );
299+ EXPECT_EQ (" " , Replacements[0 ].Options );
300+
301+ // {:foo} - Options=foo
302+ EXPECT_EQ (ReplacementType::Format, Replacements[1 ].Type );
303+ EXPECT_EQ (1u , Replacements[1 ].Index );
304+ EXPECT_EQ (0u , Replacements[1 ].Width );
305+ EXPECT_EQ (AlignStyle::Right, Replacements[1 ].Where );
306+ EXPECT_EQ (" foo" , Replacements[1 ].Options );
307+
308+ // {,-3:bar} - Options=bar, Align=-3
309+ EXPECT_EQ (ReplacementType::Format, Replacements[2 ].Type );
310+ EXPECT_EQ (2u , Replacements[2 ].Index );
311+ EXPECT_EQ (3u , Replacements[2 ].Width );
312+ EXPECT_EQ (AlignStyle::Left, Replacements[2 ].Where );
313+ EXPECT_EQ (" bar" , Replacements[2 ].Options );
314+ }
315+
280316TEST (FormatVariadicTest, FormatNoReplacements) {
281317 EXPECT_EQ (" " , formatv (" " ).str ());
282318 EXPECT_EQ (" Test" , formatv (" Test" ).str ());
@@ -291,6 +327,12 @@ TEST(FormatVariadicTest, FormatBasicTypesOneReplacement) {
291327 EXPECT_EQ (" Test3" , formatv (" {0}" , std::string (" Test3" )).str ());
292328}
293329
330+ TEST (FormatVariadicTest, FormatAutomaticIndices) {
331+ EXPECT_EQ (" 1" , formatv (" {}" , 1 ).str ());
332+ EXPECT_EQ (" c1" , formatv (" {}{}" , ' c' , 1 ).str ());
333+ EXPECT_EQ (" c-1rrr-0xFF" , formatv (" {}-{,r-4}-{:X}" , ' c' , 1 , 255 ).str ());
334+ }
335+
294336TEST (FormatVariadicTest, IntegralHexFormatting) {
295337 // 1. Trivial cases. Make sure hex is not the default.
296338 EXPECT_EQ (" 0" , formatv (" {0}" , 0 ).str ());
@@ -717,13 +759,16 @@ TEST(FormatVariadicTest, Validate) {
717759 EXPECT_DEATH (formatv (" {0}" , 1 , 2 ).str (), " Expected 1 Args, but got 2" );
718760 EXPECT_DEATH (formatv (" {0} {2}" , 1 , 2 , 3 ).str (),
719761 " Replacement field indices cannot have holes" );
762+ EXPECT_DEATH (formatv (" {}{1}" , 0 , 1 ).str (),
763+ " Cannot mix automatic and explicit indices" );
720764#else // GTEST_HAS_DEATH_TEST
721765 GTEST_SKIP () << " No support for EXPECT_DEATH" ;
722766#endif // GTEST_HAS_DEATH_TEST
723767#else // NDEBUG
724768 // If asserts are disabled, verify that validation is disabled.
725769 EXPECT_EQ (formatv (" {0}" , 1 , 2 ).str (), " 1" );
726770 EXPECT_EQ (formatv (" {0} {2}" , 1 , 2 , 3 ).str (), " 1 3" );
771+ EXPECT_EQ (formatv (" {}{1}" , 0 , 1 ).str (), " 01" );
727772#endif // NDEBUG
728773}
729774
0 commit comments