55import org .junit .jupiter .api .Test ;
66
77import com .fasterxml .jackson .core .JsonParser .NumberType ;
8+ import com .fasterxml .jackson .core .exc .StreamReadException ;
9+ import com .fasterxml .jackson .core .JsonParser ;
810import com .fasterxml .jackson .core .JsonToken ;
911import com .fasterxml .jackson .core .io .SerializedString ;
1012import com .fasterxml .jackson .dataformat .csv .*;
@@ -95,17 +97,21 @@ private void _testInts(boolean useBytes, int a, int b, int c) throws Exception {
9597 assertEquals (numStr .length (), parser .getText (w ));
9698 assertEquals (numStr , w .toString ());
9799
100+ // 31-May-2025, tatu: as per [dataformats-text#564] must coerce first
101+ assertTrue (parser .isExpectedNumberIntToken ());
98102 assertEquals (a , parser .getIntValue ());
99103 assertEquals ((long ) a , parser .getLongValue ());
100104
101105 assertEquals ("b" , parser .nextFieldName ());
102106 assertEquals ("" +b , parser .nextTextValue ());
107+ assertTrue (parser .isExpectedNumberIntToken ());
103108 assertEquals ((long ) b , parser .getLongValue ());
104109 assertEquals (b , parser .getIntValue ());
105110
106111 assertTrue (parser .nextFieldName (new SerializedString ("c" )));
107112
108113 assertToken (JsonToken .VALUE_STRING , parser .nextToken ());
114+ assertTrue (parser .isExpectedNumberIntToken ());
109115 assertEquals (c , parser .getIntValue ());
110116 assertEquals ((long ) c , parser .getLongValue ());
111117
@@ -117,13 +123,23 @@ private void _testInts(boolean useBytes, int a, int b, int c) throws Exception {
117123
118124 private void _testIntsExpected (boolean useBytes , int a , int b , int c ) throws Exception {
119125 try (CsvParser parser = _parser (String .format ("%d,%d,%d\n " , a , b , c ), useBytes , ABC_SCHEMA )) {
126+ _verifyGetNumberTypeFail (parser , "null" );
120127 assertToken (JsonToken .START_OBJECT , parser .nextToken ());
128+ _verifyGetNumberTypeFail (parser , "START_OBJECT" );
121129
122130 assertToken (JsonToken .FIELD_NAME , parser .nextToken ());
123131 assertEquals ("a" , parser .currentName ());
132+ _verifyGetNumberTypeFail (parser , "FIELD_NAME" );
124133
125134 // Reported as String BUT may be coerced
126135 assertToken (JsonToken .VALUE_STRING , parser .nextToken ());
136+ // Exception before conversion
137+ try {
138+ parser .getIntValue ();
139+ fail ("Should not pass" );
140+ } catch (StreamReadException e ) {
141+ _verifyNonNumberTypeException (e , "VALUE_STRING" );
142+ }
127143 assertTrue (parser .isExpectedNumberIntToken ());
128144 assertEquals (a , parser .getIntValue ());
129145 assertToken (JsonToken .VALUE_NUMBER_INT , parser .currentToken ());
@@ -143,7 +159,11 @@ private void _testIntsExpected(boolean useBytes, int a, int b, int c) throws Exc
143159 assertToken (JsonToken .VALUE_NUMBER_INT , parser .currentToken ());
144160
145161 assertToken (JsonToken .END_OBJECT , parser .nextToken ());
146- assertNull (parser .nextToken ());
162+ _verifyGetNumberTypeFail (parser , "END_OBJECT" );
163+
164+ parser .close ();
165+ _verifyGetNumberTypeFail (parser , "null" );
166+ assertNull (parser .currentToken ());
147167 }
148168 }
149169
@@ -156,10 +176,21 @@ private void _testLongs(boolean useBytes, long a, long b) throws Exception
156176 assertToken (JsonToken .FIELD_NAME , parser .nextToken ());
157177 assertEquals ("a" , parser .currentName ());
158178 assertEquals ("" +a , parser .nextTextValue ());
179+ // 31-May-2025, tatu: as per [dataformats-text#564] must coerce first
180+ assertTrue (parser .isExpectedNumberIntToken ());
159181 assertEquals (a , parser .getLongValue ());
160182
161183 assertEquals ("b" , parser .nextFieldName ());
162184 assertEquals ("" +b , parser .nextTextValue ());
185+ // Exception before conversion
186+ try {
187+ parser .getLongValue ();
188+ fail ("Should not pass" );
189+ } catch (StreamReadException e ) {
190+ _verifyNonNumberTypeException (e , "VALUE_STRING" );
191+ }
192+
193+ assertTrue (parser .isExpectedNumberIntToken ());
163194 assertEquals (b , parser .getLongValue ());
164195
165196 assertToken (JsonToken .END_OBJECT , parser .nextToken ());
@@ -178,19 +209,20 @@ private void _testDoubles(boolean useBytes, double a, double b, double c)
178209 assertToken (JsonToken .FIELD_NAME , parser .nextToken ());
179210 assertEquals ("a" , parser .currentName ());
180211 assertEquals ("" +a , parser .nextTextValue ());
181- assertEquals (a , parser .getDoubleValue ());
182- assertEquals ((float ) a , parser .getFloatValue ());
212+ // 31-May-2025, tatu: as per [dataformats-text#564] shouldn't work
213+ // assertEquals(a, parser.getDoubleValue());
214+ // assertEquals((float) a, parser.getFloatValue());
183215
184216 assertEquals ("b" , parser .nextFieldName ());
185217 assertEquals ("" +b , parser .nextTextValue ());
186- assertEquals ((float ) b , parser .getFloatValue ());
187- assertEquals (b , parser .getDoubleValue ());
218+ // assertEquals((float) b, parser.getFloatValue());
219+ // assertEquals(b, parser.getDoubleValue());
188220
189221 assertTrue (parser .nextFieldName (new SerializedString ("c" )));
190222
191223 assertToken (JsonToken .VALUE_STRING , parser .nextToken ());
192- assertEquals (c , parser .getDoubleValue ());
193- assertEquals ((float ) c , parser .getFloatValue ());
224+ // assertEquals(c, parser.getDoubleValue());
225+ // assertEquals((float) c, parser.getFloatValue());
194226
195227 assertToken (JsonToken .END_OBJECT , parser .nextToken ());
196228 assertNull (parser .nextToken ());
@@ -210,4 +242,20 @@ private CsvParser _parser(String csv, boolean useBytes, CsvSchema schema)
210242 p .setSchema (schema );
211243 return p ;
212244 }
245+
246+ // In Jackson 2.x, non-Number token should throw exception for parser.getNumberType()
247+ private void _verifyGetNumberTypeFail (JsonParser p , String token ) throws Exception
248+ {
249+ try {
250+ p .getNumberType ();
251+ fail ("Should not pass" );
252+ } catch (StreamReadException e ) {
253+ _verifyNonNumberTypeException (e , token );
254+ }
255+ }
256+
257+ private void _verifyNonNumberTypeException (Exception e , String token ) throws Exception
258+ {
259+ verifyException (e , "Current token (" +token +") not numeric, can not use numeric" );
260+ }
213261}
0 commit comments