@@ -490,8 +490,9 @@ TEST(StringDumperTest, SuppressControlChars) {
490490
491491TEST (StringDumperTest, EscapeControlChars) {
492492 Builder b;
493- b.add (Value (
494- " Before\n After\r\t\v\f\b\x01\x02 /\u00B0\uf0f9\u9095\uf0f9\u90b6\v\n\\\" " ));
493+ b.add (
494+ Value (" Before\n After\r\t\v\f\b\x01\x02 /"
495+ " \u00B0\uf0f9\u9095\uf0f9\u90b6\v\n\\\" " ));
495496 Options options;
496497 options.escapeControl = true ;
497498 ASSERT_EQ (std::string (" \" Before\\ nAfter\\ r\\ t\\ u000B\\ f\\ b\\ u0001\\ u0002/"
@@ -1958,3 +1959,95 @@ int main(int argc, char* argv[]) {
19581959
19591960 return RUN_ALL_TESTS ();
19601961}
1962+
1963+ TEST (DumperLargeDoubleTest, TwoToThePowerOf60Double) {
1964+ Options options;
1965+ std::string buffer;
1966+ StringSink sink (&buffer);
1967+ Dumper dumper (&sink, &options);
1968+ Builder builder;
1969+ builder.add (Value (ldexp (1.0 , 60 )));
1970+ dumper.dump (builder.slice ());
1971+ ASSERT_EQ (" 1152921504606846976.0" , buffer);
1972+ }
1973+
1974+ TEST (DumperLargeDoubleTest, TwoToThePowerOf60Plus1Double) {
1975+ Options options;
1976+ std::string buffer;
1977+ StringSink sink (&buffer);
1978+ Dumper dumper (&sink, &options);
1979+ Builder builder;
1980+ builder.add (Value (ldexp (1.0 , 60 ) + 1.0 ));
1981+ dumper.dump (builder.slice ());
1982+ ASSERT_EQ (" 1152921504606846976.0" , buffer);
1983+ }
1984+
1985+ TEST (DumperLargeDoubleTest, MinusTwoToThePowerOf60Double) {
1986+ Options options;
1987+ std::string buffer;
1988+ StringSink sink (&buffer);
1989+ Dumper dumper (&sink, &options);
1990+ Builder builder;
1991+ builder.add (Value (-ldexp (1.0 , 60 )));
1992+ dumper.dump (builder.slice ());
1993+ ASSERT_EQ (" -1152921504606846976.0" , buffer);
1994+ }
1995+
1996+ TEST (DumperLargeDoubleTest, MinusTwoToThePowerOf60Plus1Double) {
1997+ Options options;
1998+ std::string buffer;
1999+ StringSink sink (&buffer);
2000+ Dumper dumper (&sink, &options);
2001+ Builder builder;
2002+ builder.add (Value (-ldexp (1.0 , 60 ) + 1.0 ));
2003+ dumper.dump (builder.slice ());
2004+ ASSERT_EQ (" -1152921504606846976.0" , buffer);
2005+ }
2006+
2007+ TEST (DumperLargeDoubleTest, TwoToThePowerOf52Double) {
2008+ Options options;
2009+ std::string buffer;
2010+ StringSink sink (&buffer);
2011+ Dumper dumper (&sink, &options);
2012+ Builder builder;
2013+ builder.add (Value (ldexp (1.0 , 52 )));
2014+ dumper.dump (builder.slice ());
2015+ ASSERT_EQ (" 4503599627370496" , buffer);
2016+ }
2017+
2018+ TEST (DumperLargeDoubleTest, TwoToThePowerOf53Double) {
2019+ Options options;
2020+ std::string buffer;
2021+ StringSink sink (&buffer);
2022+ Dumper dumper (&sink, &options);
2023+ Builder builder;
2024+ builder.add (Value (ldexp (1.0 , 53 )));
2025+ dumper.dump (builder.slice ());
2026+ ASSERT_EQ (" 9007199254740992.0" , buffer);
2027+ }
2028+
2029+ TEST (DumperLargeDoubleTest, TwoToThePowerOf63Double) {
2030+ Options options;
2031+ std::string buffer;
2032+ StringSink sink (&buffer);
2033+ Dumper dumper (&sink, &options);
2034+ Builder builder;
2035+ builder.add (Value (ldexp (1.0 , 63 )));
2036+ dumper.dump (builder.slice ());
2037+ ASSERT_EQ (" 9223372036854775808.0" , buffer);
2038+ }
2039+
2040+ TEST (DumperLargeDoubleTest, TwoToThePowerOf64Double) {
2041+ Options options;
2042+ std::string buffer;
2043+ StringSink sink (&buffer);
2044+ Dumper dumper (&sink, &options);
2045+ Builder builder;
2046+ builder.add (Value (ldexp (1.0 , 64 )));
2047+ dumper.dump (builder.slice ());
2048+ // Note that this is, strictly speaking, not correct. But since this is
2049+ // at least 2^64, it will be parsed back to double anywa and then we
2050+ // get back the actual result. This is a sacrifice we make for performance.
2051+ ASSERT_EQ (" 18446744073709552000" , buffer);
2052+ }
2053+
0 commit comments