@@ -61,6 +61,126 @@ namespace Newtonsoft.Json.Tests
6161 [ TestFixture ]
6262 public class JsonTextReaderTest : TestFixtureBase
6363 {
64+ [ Test ]
65+ public void Float_NaN_Read ( )
66+ {
67+ const string testJson = "{float: NaN}" ;
68+
69+ JsonTextReader reader = new JsonTextReader ( new StringReader ( testJson ) ) ;
70+
71+ Assert . IsTrue ( reader . Read ( ) ) ;
72+ Assert . IsTrue ( reader . Read ( ) ) ;
73+ Assert . IsTrue ( reader . Read ( ) ) ;
74+
75+ Assert . AreEqual ( JsonToken . Float , reader . TokenType ) ;
76+ Assert . AreEqual ( double . NaN , reader . Value ) ;
77+
78+ Assert . IsTrue ( reader . Read ( ) ) ;
79+ Assert . IsFalse ( reader . Read ( ) ) ;
80+ }
81+
82+ [ Test ]
83+ public void Float_NaN_ReadAsInt32 ( )
84+ {
85+ const string testJson = "{float: NaN}" ;
86+
87+ JsonTextReader reader = new JsonTextReader ( new StringReader ( testJson ) ) ;
88+
89+ Assert . IsTrue ( reader . Read ( ) ) ;
90+ Assert . IsTrue ( reader . Read ( ) ) ;
91+
92+ ExceptionAssert . Throws < JsonReaderException > ( ( ) => reader . ReadAsInt32 ( ) , "Cannot read NaN value. Path 'float', line 1, position 11." ) ;
93+ }
94+
95+ [ Test ]
96+ public void Float_NaNAndInifinity_ReadAsDouble ( )
97+ {
98+ const string testJson = @"[
99+ NaN,
100+ Infinity,
101+ -Infinity
102+ ]" ; ;
103+
104+ JsonTextReader reader = new JsonTextReader ( new StringReader ( testJson ) ) ;
105+
106+ Assert . IsTrue ( reader . Read ( ) ) ;
107+
108+ Assert . AreEqual ( double . NaN , reader . ReadAsDouble ( ) ) ;
109+ Assert . AreEqual ( JsonToken . Float , reader . TokenType ) ;
110+ Assert . AreEqual ( double . NaN , reader . Value ) ;
111+
112+ Assert . AreEqual ( double . PositiveInfinity , reader . ReadAsDouble ( ) ) ;
113+ Assert . AreEqual ( JsonToken . Float , reader . TokenType ) ;
114+ Assert . AreEqual ( double . PositiveInfinity , reader . Value ) ;
115+
116+ Assert . AreEqual ( double . NegativeInfinity , reader . ReadAsDouble ( ) ) ;
117+ Assert . AreEqual ( JsonToken . Float , reader . TokenType ) ;
118+ Assert . AreEqual ( double . NegativeInfinity , reader . Value ) ;
119+
120+ Assert . IsTrue ( reader . Read ( ) ) ;
121+ Assert . IsFalse ( reader . Read ( ) ) ;
122+ }
123+
124+ [ Test ]
125+ public void Float_NaNAndInifinity_ReadAsString ( )
126+ {
127+ const string testJson = @"[
128+ NaN,
129+ Infinity,
130+ -Infinity
131+ ]" ; ;
132+
133+ JsonTextReader reader = new JsonTextReader ( new StringReader ( testJson ) ) ;
134+
135+ Assert . IsTrue ( reader . Read ( ) ) ;
136+
137+ Assert . AreEqual ( JsonConvert . NaN , reader . ReadAsString ( ) ) ;
138+ Assert . AreEqual ( JsonToken . String , reader . TokenType ) ;
139+ Assert . AreEqual ( JsonConvert . NaN , reader . Value ) ;
140+
141+ Assert . AreEqual ( JsonConvert . PositiveInfinity , reader . ReadAsString ( ) ) ;
142+ Assert . AreEqual ( JsonToken . String , reader . TokenType ) ;
143+ Assert . AreEqual ( JsonConvert . PositiveInfinity , reader . Value ) ;
144+
145+ Assert . AreEqual ( JsonConvert . NegativeInfinity , reader . ReadAsString ( ) ) ;
146+ Assert . AreEqual ( JsonToken . String , reader . TokenType ) ;
147+ Assert . AreEqual ( JsonConvert . NegativeInfinity , reader . Value ) ;
148+
149+ Assert . IsTrue ( reader . Read ( ) ) ;
150+ Assert . IsFalse ( reader . Read ( ) ) ;
151+ }
152+
153+ [ Test ]
154+ public void FloatParseHandling_ReadAsString ( )
155+ {
156+ string json = "[9223372036854775807, 1.7976931348623157E+308, 792281625142643375935439503.35, 792281625142643375935555555555555555555555555555555555555555555555555439503.35]" ;
157+
158+ JsonTextReader reader = new JsonTextReader ( new StringReader ( json ) ) ;
159+ reader . FloatParseHandling = Json . FloatParseHandling . Decimal ;
160+
161+ Assert . IsTrue ( reader . Read ( ) ) ;
162+ Assert . AreEqual ( JsonToken . StartArray , reader . TokenType ) ;
163+
164+ Assert . AreEqual ( "9223372036854775807" , reader . ReadAsString ( ) ) ;
165+ Assert . AreEqual ( JsonToken . String , reader . TokenType ) ;
166+ Assert . AreEqual ( "9223372036854775807" , reader . Value ) ;
167+
168+ Assert . AreEqual ( "1.7976931348623157E+308" , reader . ReadAsString ( ) ) ;
169+ Assert . AreEqual ( JsonToken . String , reader . TokenType ) ;
170+ Assert . AreEqual ( "1.7976931348623157E+308" , reader . Value ) ;
171+
172+ Assert . AreEqual ( "792281625142643375935439503.35" , reader . ReadAsString ( ) ) ;
173+ Assert . AreEqual ( JsonToken . String , reader . TokenType ) ;
174+ Assert . AreEqual ( "792281625142643375935439503.35" , reader . Value ) ;
175+
176+ Assert . AreEqual ( "792281625142643375935555555555555555555555555555555555555555555555555439503.35" , reader . ReadAsString ( ) ) ;
177+ Assert . AreEqual ( JsonToken . String , reader . TokenType ) ;
178+ Assert . AreEqual ( "792281625142643375935555555555555555555555555555555555555555555555555439503.35" , reader . Value ) ;
179+
180+ Assert . IsTrue ( reader . Read ( ) ) ;
181+ Assert . AreEqual ( JsonToken . EndArray , reader . TokenType ) ;
182+ }
183+
64184 [ Test ]
65185 public void LineInfoAndNewLines ( )
66186 {
@@ -455,7 +575,7 @@ public void FloatParseHandling_NaN()
455575 Assert . IsTrue ( reader . Read ( ) ) ;
456576 Assert . AreEqual ( JsonToken . StartArray , reader . TokenType ) ;
457577
458- ExceptionAssert . Throws < JsonReaderException > ( ( ) => reader . Read ( ) , "Cannot read NaN as a decimal ." ) ;
578+ ExceptionAssert . Throws < JsonReaderException > ( ( ) => reader . Read ( ) , "Cannot read NaN value. Path '', line 1, position 4 ." ) ;
459579 }
460580
461581 [ Test ]
0 commit comments