|
19 | 19 | #include "rapidjson/internal/itoa.h" |
20 | 20 | #include "rapidjson/memorystream.h" |
21 | 21 |
|
| 22 | +#include <limits> |
| 23 | + |
22 | 24 | using namespace rapidjson; |
23 | 25 |
|
24 | 26 | #ifdef __GNUC__ |
@@ -1774,6 +1776,69 @@ TEST(Reader, TrailingCommaHandlerTerminationIterative) { |
1774 | 1776 | TestTrailingCommaHandlerTermination<kParseIterativeFlag>(); |
1775 | 1777 | } |
1776 | 1778 |
|
| 1779 | +TEST(Reader, ParseNanAndInfinity) { |
| 1780 | +#define TEST_NAN_INF(str, x) \ |
| 1781 | + { \ |
| 1782 | + { \ |
| 1783 | + StringStream s(str); \ |
| 1784 | + ParseDoubleHandler h; \ |
| 1785 | + Reader reader; \ |
| 1786 | + ASSERT_EQ(kParseErrorNone, reader.Parse<kParseNanAndInfFlag>(s, h).Code()); \ |
| 1787 | + EXPECT_EQ(1u, h.step_); \ |
| 1788 | + internal::Double e(x), a(h.actual_); \ |
| 1789 | + EXPECT_EQ(e.IsNan(), a.IsNan()); \ |
| 1790 | + EXPECT_EQ(e.IsInf(), a.IsInf()); \ |
| 1791 | + if (!e.IsNan()) \ |
| 1792 | + EXPECT_EQ(e.Sign(), a.Sign()); \ |
| 1793 | + } \ |
| 1794 | + { \ |
| 1795 | + const char* json = "{ \"naninfdouble\": " str " } "; \ |
| 1796 | + StringStream s(json); \ |
| 1797 | + NumbersAsStringsHandler h(str); \ |
| 1798 | + Reader reader; \ |
| 1799 | + EXPECT_TRUE(reader.Parse<kParseNumbersAsStringsFlag|kParseNanAndInfFlag>(s, h)); \ |
| 1800 | + } \ |
| 1801 | + { \ |
| 1802 | + char* json = StrDup("{ \"naninfdouble\": " str " } "); \ |
| 1803 | + InsituStringStream s(json); \ |
| 1804 | + NumbersAsStringsHandler h(str); \ |
| 1805 | + Reader reader; \ |
| 1806 | + EXPECT_TRUE(reader.Parse<kParseInsituFlag|kParseNumbersAsStringsFlag|kParseNanAndInfFlag>(s, h)); \ |
| 1807 | + free(json); \ |
| 1808 | + } \ |
| 1809 | + } |
| 1810 | +#define TEST_NAN_INF_ERROR(errorCode, str, errorOffset) \ |
| 1811 | + { \ |
| 1812 | + int streamPos = errorOffset; \ |
| 1813 | + char buffer[1001]; \ |
| 1814 | + strncpy(buffer, str, 1000); \ |
| 1815 | + InsituStringStream s(buffer); \ |
| 1816 | + BaseReaderHandler<> h; \ |
| 1817 | + Reader reader; \ |
| 1818 | + EXPECT_FALSE(reader.Parse<kParseNanAndInfFlag>(s, h)); \ |
| 1819 | + EXPECT_EQ(errorCode, reader.GetParseErrorCode());\ |
| 1820 | + EXPECT_EQ(errorOffset, reader.GetErrorOffset());\ |
| 1821 | + EXPECT_EQ(streamPos, s.Tell());\ |
| 1822 | + } |
| 1823 | + |
| 1824 | + double nan = std::numeric_limits<double>::quiet_NaN(); |
| 1825 | + double inf = std::numeric_limits<double>::infinity(); |
| 1826 | + |
| 1827 | + TEST_NAN_INF("NaN", nan); |
| 1828 | + TEST_NAN_INF("-NaN", nan); |
| 1829 | + TEST_NAN_INF("Inf", inf); |
| 1830 | + TEST_NAN_INF("Infinity", inf); |
| 1831 | + TEST_NAN_INF("-Inf", -inf); |
| 1832 | + TEST_NAN_INF("-Infinity", -inf); |
| 1833 | + TEST_NAN_INF_ERROR(kParseErrorValueInvalid, "nan", 1); |
| 1834 | + TEST_NAN_INF_ERROR(kParseErrorValueInvalid, "-nan", 1); |
| 1835 | + TEST_NAN_INF_ERROR(kParseErrorValueInvalid, "NAN", 1); |
| 1836 | + TEST_NAN_INF_ERROR(kParseErrorValueInvalid, "-Infinty", 6); |
| 1837 | + |
| 1838 | +#undef TEST_NAN_INF_ERROR |
| 1839 | +#undef TEST_NAN_INF |
| 1840 | +} |
| 1841 | + |
1777 | 1842 | #ifdef __GNUC__ |
1778 | 1843 | RAPIDJSON_DIAG_POP |
1779 | 1844 | #endif |
|
0 commit comments