Modified:
/src/Jayrock.Json/Json/JsonTextReader.cs
/tests/Jayrock/Json/TestJsonTextReader.cs
=======================================
--- /src/Jayrock.Json/Json/JsonTextReader.cs Fri Apr 15 16:09:54 2011
+++ /src/Jayrock.Json/Json/JsonTextReader.cs Fri Jul 1 09:52:22 2011
@@ -44,6 +44,9 @@
private BufferedCharReader _reader;
private Stack _stack;
+ private int _endLineNumber;
+ private int _endLinePosition;
+ private int _endCharCount;
private delegate JsonToken Continuation();
@@ -63,8 +66,9 @@
Push(ParseMethod);
}
- public int LineNumber { get { return _reader.LineNumber; } }
- public int LinePosition { get { return _reader.LinePosition; } }
+ public int LineNumber { get { return _reader != null ?
_reader.LineNumber : _endLineNumber; } }
+ public int LinePosition { get { return _reader != null ?
_reader.LinePosition : _endLinePosition; } }
+ public int CharCount { get { return _reader != null ?
_reader.CharCount : _endCharCount; } }
/// <summary>
/// Reads the next token and returns it.
@@ -79,6 +83,9 @@
else if (_stack.Count == 0)
{
_stack = null;
+ _endLineNumber = _reader.LineNumber;
+ _endLinePosition = _reader.LinePosition;
+ _endCharCount = _reader.CharCount;
_reader = null;
return JsonToken.EOF();
}
=======================================
--- /tests/Jayrock/Json/TestJsonTextReader.cs Fri Apr 15 16:09:54 2011
+++ /tests/Jayrock/Json/TestJsonTextReader.cs Fri Jul 1 09:52:22 2011
@@ -766,6 +766,34 @@
AssertTokenText(JsonTokenClass.Number, "1.79769313486232e+308");
AssertEOF();
}
+ [ Test ]
+ public void ReadPositionsAfterEof()
+ {
+ JsonTextReader reader = new JsonTextReader(new StringReader("[
\nhello ]"));
+ while (reader.Read()) { /* NOP */ }
+ Assert.AreEqual(2, reader.LineNumber, "Line number");
+ Assert.AreEqual(7, reader.LinePosition, "Line position");
+ Assert.AreEqual(10, reader.CharCount, "Character count");
+ }
+
+ [ Test ]
+ public void ReadTwoJsonTextsFromSameString()
+ {
+ const string json = @"{foo:bar/*baz*/}[foo,bar]";
+ JsonTextReader reader = _reader = new JsonTextReader(new
StringReader(json));
+ AssertToken(JsonTokenClass.Object);
+ AssertTokenText(JsonTokenClass.Member, "foo");
+ AssertTokenText(JsonTokenClass.String, "bar");
+ AssertToken(JsonTokenClass.EndObject);
+ AssertEOF();
+ Assert.AreEqual(16, reader.CharCount);
+ _reader = new JsonTextReader(new
StringReader(json.Substring(reader.CharCount)));
+ AssertToken(JsonTokenClass.Array);
+ AssertTokenText(JsonTokenClass.String, "foo");
+ AssertTokenText(JsonTokenClass.String, "bar");
+ AssertToken(JsonTokenClass.EndArray);
+ AssertEOF();
+ }
private void AssertTokenText(JsonTokenClass token, string text)
{