@@ -296,6 +296,35 @@ TEST(printf_test, dynamic_precision) {
296296 }
297297}
298298
299+ TEST (printf_test, positional_width) {
300+ EXPECT_EQ (" 42" , test_sprintf (" %2$*1$d" , 5 , 42 ));
301+ EXPECT_EQ (" 42 " , test_sprintf (" %2$*1$d" , -5 , 42 ));
302+ EXPECT_EQ (" abc" , test_sprintf (" %2$*1$s" , 5 , " abc" ));
303+ EXPECT_THROW_MSG (test_sprintf (" %2$*1$d" , 5.0 , 42 ), format_error,
304+ " width is not integer" );
305+ EXPECT_THROW_MSG (test_sprintf (" %2$*1$d" ), format_error, " argument not found" );
306+ EXPECT_THROW_MSG (test_sprintf (" %2$*1$d" , big_num, 42 ), format_error,
307+ " number is too big" );
308+ }
309+
310+ TEST (printf_test, positional_precision) {
311+ EXPECT_EQ (" 00042" , test_sprintf (" %2$.*1$d" , 5 , 42 ));
312+ EXPECT_EQ (" 42" , test_sprintf (" %2$.*1$d" , -5 , 42 ));
313+ EXPECT_EQ (" Hell" , test_sprintf (" %2$.*1$s" , 4 , " Hello" ));
314+ EXPECT_THROW_MSG (test_sprintf (" %2$.*1$d" , 5.0 , 42 ), format_error,
315+ " precision is not integer" );
316+ EXPECT_THROW_MSG (test_sprintf (" %2$.*1$d" ), format_error, " argument not found" );
317+ EXPECT_THROW_MSG (test_sprintf (" %2$.*1$d" , big_num, 42 ), format_error,
318+ " number is too big" );
319+ }
320+
321+ TEST (printf_test, positional_width_and_precision) {
322+ EXPECT_EQ (" 00042" , test_sprintf (" %3$*1$.*2$d" , 7 , 5 , 42 ));
323+ EXPECT_EQ (" ab" , test_sprintf (" %3$*1$.*2$s" , 7 , 2 , " abcdef" ));
324+ EXPECT_EQ (" 00042" , test_sprintf (" %3$*1$.*2$x" , 7 , 5 , 0x42 ));
325+ EXPECT_EQ (" 100.4400000" , test_sprintf (" %6$-*5$.*4$f%3$s%2$s%1$s" , " " , " " , " " , 7 , 4 , 100.44 ));
326+ }
327+
299328template <typename T> struct make_signed {
300329 using type = T;
301330};
0 commit comments