11package org .json .junit ;
22
33import static org .junit .Assert .assertEquals ;
4+ import static org .junit .Assert .assertFalse ;
5+ import static org .junit .Assert .assertTrue ;
46import static org .junit .Assert .fail ;
57
68import java .io .BufferedReader ;
@@ -121,7 +123,12 @@ public void testSkipToSuccessWithStringReader() throws IOException {
121123 @ Test
122124 public void testNextBackComboWithNewLines () {
123125 final String testString = "this is\n A test\r \n With some different\r New Lines" ;
126+ // ^ ^ ^ ^
127+ // index positions 0 8 16 36
124128 final JSONTokener tokener = new JSONTokener (testString );
129+ assertEquals (" at 0 [character 1 line 1]" , tokener .toString ());
130+ assertEquals ('t' ,tokener .next ());
131+ assertEquals (" at 1 [character 2 line 1]" , tokener .toString ());
125132 tokener .skipTo ('\n' );
126133 assertEquals ("skipTo() improperly modifying indexes" ," at 7 [character 8 line 1]" , tokener .toString ());
127134 assertEquals ('\n' ,tokener .next ());
@@ -132,10 +139,12 @@ public void testNextBackComboWithNewLines() {
132139 assertEquals (" at 8 [character 0 line 2]" , tokener .toString ());
133140 tokener .skipTo ('\r' );
134141 assertEquals ("skipTo() improperly modifying indexes" ," at 14 [character 6 line 2]" , tokener .toString ());
142+ // verify \r\n combo doesn't increment the line twice
135143 assertEquals ('\r' , tokener .next ());
136144 assertEquals (" at 15 [character 0 line 3]" , tokener .toString ());
137145 assertEquals ('\n' , tokener .next ());
138146 assertEquals (" at 16 [character 0 line 3]" , tokener .toString ());
147+ // verify stepping back after reading the \n of an \r\n combo doesn't increment the line incorrectly
139148 tokener .back ();
140149 assertEquals (" at 15 [character 6 line 2]" , tokener .toString ());
141150 assertEquals ('\n' , tokener .next ());
@@ -154,5 +163,39 @@ public void testNextBackComboWithNewLines() {
154163 assertEquals (" at 36 [character 0 line 4]" , tokener .toString ());
155164 assertEquals ('N' , tokener .next ());
156165 assertEquals (" at 37 [character 1 line 4]" , tokener .toString ());
166+
167+ // verify we get the same data just walking though, no calls to back
168+ final JSONTokener t2 = new JSONTokener (testString );
169+ for (int i =0 ; i <7 ; i ++) {
170+ assertTrue (t2 .toString ().startsWith (" at " + i + " " ));
171+ assertEquals (testString .charAt (i ), t2 .next ());
172+ }
173+ assertEquals (" at 7 [character 8 line 1]" , t2 .toString ());
174+ assertEquals (testString .charAt (7 ), t2 .next ());
175+ assertEquals (" at 8 [character 0 line 2]" , t2 .toString ());
176+ for (int i =8 ; i <14 ; i ++) {
177+ assertTrue (t2 .toString ().startsWith (" at " + i + " " ));
178+ assertEquals (testString .charAt (i ), t2 .next ());
179+ }
180+ assertEquals (" at 14 [character 6 line 2]" , t2 .toString ());
181+ assertEquals ('\r' , t2 .next ());
182+ assertEquals (" at 15 [character 0 line 3]" , t2 .toString ());
183+ assertEquals ('\n' , t2 .next ());
184+ assertEquals (" at 16 [character 0 line 3]" , t2 .toString ());
185+ assertEquals ('W' , t2 .next ());
186+ assertEquals (" at 17 [character 1 line 3]" , t2 .toString ());
187+ for (int i =17 ; i <37 ; i ++) {
188+ assertTrue (t2 .toString ().startsWith (" at " + i + " " ));
189+ assertEquals (testString .charAt (i ), t2 .next ());
190+ }
191+ assertEquals (" at 37 [character 1 line 4]" , t2 .toString ());
192+ for (int i =37 ; i <testString .length (); i ++) {
193+ assertTrue (t2 .toString ().startsWith (" at " + i + " " ));
194+ assertEquals (testString .charAt (i ), t2 .next ());
195+ }
196+ assertEquals (" at " + testString .length () +" [character 9 line 4]" , t2 .toString ());
197+ // end of the input
198+ assertEquals (0 , t2 .next ());
199+ assertFalse (t2 .more ());
157200 }
158201}
0 commit comments