diff --git a/format.cc b/format.cc index d31db457..78b54d65 100644 --- a/format.cc +++ b/format.cc @@ -157,11 +157,14 @@ void fmt::Formatter::FormatDouble( T value, unsigned flags, int width, int precision, char type) { // Check type. switch (type) { + case 0: + type = 'g'; + break; case 'e': case 'E': case 'f': case 'F': case 'g': case 'G': break; default: - // TODO: error - break; + throw FormatError( + str(fmt::Format("unknown format code '{0}' for double") << type)); } // Build format string. @@ -181,7 +184,7 @@ void fmt::Formatter::FormatDouble( } if (IsLongDouble::VALUE) *format_ptr++ = 'L'; - *format_ptr++ = type ? type : 'g'; + *format_ptr++ = type; *format_ptr = '\0'; // Format using snprintf. diff --git a/format_test.cc b/format_test.cc index 83797877..6004ffc6 100644 --- a/format_test.cc +++ b/format_test.cc @@ -258,11 +258,19 @@ TEST(FormatterTest, Precision) { FormatError, "precision specifier requires floating-point argument"); } -TEST(FormatterTest, Type) { +TEST(FormatterTest, FormatInt) { EXPECT_THROW_MSG(Format("{0:v") << 42, FormatError, "unmatched '{' in format"); EXPECT_THROW_MSG(Format("{0:v}") << 42, FormatError, "unknown format code 'v' for integer"); + EXPECT_THROW_MSG(Format("{0:c}") << 42, + FormatError, "unknown format code 'c' for integer"); + EXPECT_THROW_MSG(Format("{0:e}") << 42, + FormatError, "unknown format code 'e' for integer"); + EXPECT_THROW_MSG(Format("{0:f}") << 42, + FormatError, "unknown format code 'f' for integer"); + EXPECT_THROW_MSG(Format("{0:g}") << 42, + FormatError, "unknown format code 'g' for integer"); } TEST(FormatterTest, FormatDec) { @@ -333,6 +341,40 @@ TEST(FormatterTest, FormatOct) { EXPECT_EQ(buffer, str(Format("{0:o}") << ULONG_MAX)); } +TEST(FormatterTest, FormatDouble) { + EXPECT_THROW_MSG(Format("{0:c}") << 1.2, + FormatError, "unknown format code 'c' for double"); + EXPECT_THROW_MSG(Format("{0:d}") << 1.2, + FormatError, "unknown format code 'd' for double"); + EXPECT_THROW_MSG(Format("{0:o}") << 1.2, + FormatError, "unknown format code 'o' for double"); + EXPECT_THROW_MSG(Format("{0:x}") << 1.2, + FormatError, "unknown format code 'x' for double"); + EXPECT_EQ("0", str(Format("{0:}") << 0.0)); + EXPECT_EQ("0.000000", str(Format("{0:f}") << 0.0)); + EXPECT_EQ("392.65", str(Format("{0:}") << 392.65)); + EXPECT_EQ("392.65", str(Format("{0:g}") << 392.65)); + EXPECT_EQ("392.65", str(Format("{0:G}") << 392.65)); + EXPECT_EQ("392.650000", str(Format("{0:f}") << 392.65)); + EXPECT_EQ("392.650000", str(Format("{0:F}") << 392.65)); + EXPECT_EQ("3.926500e+02", str(Format("{0:e}") << 392.65)); + EXPECT_EQ("3.926500E+02", str(Format("{0:E}") << 392.65)); + EXPECT_EQ("+0000392.6", str(Format("{0:+010.4g}") << 392.65)); +} + +TEST(FormatterTest, FormatLongDouble) { + EXPECT_EQ("0", str(Format("{0:}") << 0.0l)); + EXPECT_EQ("0.000000", str(Format("{0:f}") << 0.0l)); + EXPECT_EQ("392.65", str(Format("{0:}") << 392.65l)); + EXPECT_EQ("392.65", str(Format("{0:g}") << 392.65l)); + EXPECT_EQ("392.65", str(Format("{0:G}") << 392.65l)); + EXPECT_EQ("392.650000", str(Format("{0:f}") << 392.65l)); + EXPECT_EQ("392.650000", str(Format("{0:F}") << 392.65l)); + EXPECT_EQ("3.926500e+02", str(Format("{0:e}") << 392.65l)); + EXPECT_EQ("3.926500E+02", str(Format("{0:E}") << 392.65l)); + EXPECT_EQ("+0000392.6", str(Format("{0:+010.4g}") << 392.65l)); +} + TEST(FormatterTest, FormatChar) { EXPECT_EQ("a*b", str(Format("{0}{1}{2}") << 'a' << '*' << 'b')); }