public void YahooFinance()
        {
            JObject o =
                new JObject(
                    new JProperty("Test1", new DateTime(2000, 10, 15, 5, 5, 5, DateTimeKind.Utc)),
                    new JProperty("Test2", new DateTimeOffset(2000, 10, 15, 5, 5, 5, new TimeSpan(11, 11, 0))),
                    new JProperty("Test3", "Test3Value"),
                    new JProperty("Test4", null)
                    );

            using (JTokenReader jsonReader = new JTokenReader(o))
            {
                IJsonLineInfo lineInfo = jsonReader;

                jsonReader.Read();
                Assert.Equal(JsonToken.StartObject, jsonReader.TokenType);
                Assert.Equal(false, lineInfo.HasLineInfo());

                jsonReader.Read();
                Assert.Equal(JsonToken.PropertyName, jsonReader.TokenType);
                Assert.Equal("Test1", jsonReader.Value);
                Assert.Equal(false, lineInfo.HasLineInfo());

                jsonReader.Read();
                Assert.Equal(JsonToken.Date, jsonReader.TokenType);
                Assert.Equal(new DateTime(2000, 10, 15, 5, 5, 5, DateTimeKind.Utc), jsonReader.Value);
                Assert.Equal(false, lineInfo.HasLineInfo());
                Assert.Equal(0, lineInfo.LinePosition);
                Assert.Equal(0, lineInfo.LineNumber);

                jsonReader.Read();
                Assert.Equal(JsonToken.PropertyName, jsonReader.TokenType);
                Assert.Equal("Test2", jsonReader.Value);

                jsonReader.Read();
                Assert.Equal(JsonToken.Date, jsonReader.TokenType);
                Assert.Equal(new DateTimeOffset(2000, 10, 15, 5, 5, 5, new TimeSpan(11, 11, 0)), jsonReader.Value);

                jsonReader.Read();
                Assert.Equal(JsonToken.PropertyName, jsonReader.TokenType);
                Assert.Equal("Test3", jsonReader.Value);

                jsonReader.Read();
                Assert.Equal(JsonToken.String, jsonReader.TokenType);
                Assert.Equal("Test3Value", jsonReader.Value);

                jsonReader.Read();
                Assert.Equal(JsonToken.PropertyName, jsonReader.TokenType);
                Assert.Equal("Test4", jsonReader.Value);

                jsonReader.Read();
                Assert.Equal(JsonToken.Null, jsonReader.TokenType);
                Assert.Equal(null, jsonReader.Value);

                Assert.True(jsonReader.Read());
                Assert.Equal(JsonToken.EndObject, jsonReader.TokenType);

                Assert.False(jsonReader.Read());
                Assert.Equal(JsonToken.None, jsonReader.TokenType);
            }

            using (JsonReader jsonReader = new JTokenReader(o.Property("Test2")))
            {
                Assert.True(jsonReader.Read());
                Assert.Equal(JsonToken.PropertyName, jsonReader.TokenType);
                Assert.Equal("Test2", jsonReader.Value);

                Assert.True(jsonReader.Read());
                Assert.Equal(JsonToken.Date, jsonReader.TokenType);
                Assert.Equal(new DateTimeOffset(2000, 10, 15, 5, 5, 5, new TimeSpan(11, 11, 0)), jsonReader.Value);

                Assert.False(jsonReader.Read());
                Assert.Equal(JsonToken.None, jsonReader.TokenType);
            }
        }
        public void ReadBytesFailure()
        {
            AssertException.Throws<JsonReaderException>(() =>
            {
                JObject o =
                    new JObject(
                        new JProperty("Test1", 1)
                        );

                using (JTokenReader jsonReader = new JTokenReader(o))
                {
                    jsonReader.Read();
                    Assert.Equal(JsonToken.StartObject, jsonReader.TokenType);

                    jsonReader.Read();
                    Assert.Equal(JsonToken.PropertyName, jsonReader.TokenType);
                    Assert.Equal("Test1", jsonReader.Value);

                    jsonReader.ReadAsBytes();
                }
            }, "Error reading bytes. Unexpected token: Integer. Path 'Test1'.");
        }
        public void ReadLineInfo()
        {
            string input = @"{
  CPU: 'Intel',
  Drives: [
    'DVD read/writer',
    ""500 gigabyte hard drive""
  ]
}";

            StringReader sr = new StringReader(input);

            JObject o = JObject.Parse(input);

            using (JTokenReader jsonReader = new JTokenReader(o))
            {
                IJsonLineInfo lineInfo = jsonReader;

                Assert.Equal(jsonReader.TokenType, JsonToken.None);
                Assert.Equal(0, lineInfo.LineNumber);
                Assert.Equal(0, lineInfo.LinePosition);
                Assert.Equal(false, lineInfo.HasLineInfo());

                jsonReader.Read();
                Assert.Equal(jsonReader.TokenType, JsonToken.StartObject);
                Assert.Equal(1, lineInfo.LineNumber);
                Assert.Equal(1, lineInfo.LinePosition);
                Assert.Equal(true, lineInfo.HasLineInfo());

                jsonReader.Read();
                Assert.Equal(jsonReader.TokenType, JsonToken.PropertyName);
                Assert.Equal(jsonReader.Value, "CPU");
                Assert.Equal(2, lineInfo.LineNumber);
                Assert.Equal(7, lineInfo.LinePosition);
                Assert.Equal(true, lineInfo.HasLineInfo());

                jsonReader.Read();
                Assert.Equal(jsonReader.TokenType, JsonToken.String);
                Assert.Equal(jsonReader.Value, "Intel");
                Assert.Equal(2, lineInfo.LineNumber);
                Assert.Equal(15, lineInfo.LinePosition);
                Assert.Equal(true, lineInfo.HasLineInfo());

                jsonReader.Read();
                Assert.Equal(jsonReader.TokenType, JsonToken.PropertyName);
                Assert.Equal(jsonReader.Value, "Drives");
                Assert.Equal(3, lineInfo.LineNumber);
                Assert.Equal(10, lineInfo.LinePosition);
                Assert.Equal(true, lineInfo.HasLineInfo());

                jsonReader.Read();
                Assert.Equal(jsonReader.TokenType, JsonToken.StartArray);
                Assert.Equal(3, lineInfo.LineNumber);
                Assert.Equal(12, lineInfo.LinePosition);
                Assert.Equal(true, lineInfo.HasLineInfo());

                jsonReader.Read();
                Assert.Equal(jsonReader.TokenType, JsonToken.String);
                Assert.Equal(jsonReader.Value, "DVD read/writer");
                Assert.Equal(4, lineInfo.LineNumber);
                Assert.Equal(22, lineInfo.LinePosition);
                Assert.Equal(true, lineInfo.HasLineInfo());

                jsonReader.Read();
                Assert.Equal(jsonReader.TokenType, JsonToken.String);
                Assert.Equal(jsonReader.Value, "500 gigabyte hard drive");
                Assert.Equal(5, lineInfo.LineNumber);
                Assert.Equal(30, lineInfo.LinePosition);
                Assert.Equal(true, lineInfo.HasLineInfo());

                jsonReader.Read();
                Assert.Equal(jsonReader.TokenType, JsonToken.EndArray);
                Assert.Equal(3, lineInfo.LineNumber);
                Assert.Equal(12, lineInfo.LinePosition);
                Assert.Equal(true, lineInfo.HasLineInfo());

                jsonReader.Read();
                Assert.Equal(jsonReader.TokenType, JsonToken.EndObject);
                Assert.Equal(1, lineInfo.LineNumber);
                Assert.Equal(1, lineInfo.LinePosition);
                Assert.Equal(true, lineInfo.HasLineInfo());

                jsonReader.Read();
                Assert.Equal(jsonReader.TokenType, JsonToken.None);
            }
        }
        public void ReadBytes()
        {
            byte[] data = Encoding.UTF8.GetBytes("Hello world!");

            JObject o =
                new JObject(
                    new JProperty("Test1", data)
                    );

            using (JTokenReader jsonReader = new JTokenReader(o))
            {
                jsonReader.Read();
                Assert.Equal(JsonToken.StartObject, jsonReader.TokenType);

                jsonReader.Read();
                Assert.Equal(JsonToken.PropertyName, jsonReader.TokenType);
                Assert.Equal("Test1", jsonReader.Value);

                byte[] readBytes = jsonReader.ReadAsBytes();
                Assert.Equal(data, readBytes);

                Assert.True(jsonReader.Read());
                Assert.Equal(JsonToken.EndObject, jsonReader.TokenType);

                Assert.False(jsonReader.Read());
                Assert.Equal(JsonToken.None, jsonReader.TokenType);
            }
        }
        public void JTokenReader()
        {
            PersonRaw raw = new PersonRaw
            {
                FirstName = "FirstNameValue",
                RawContent = new JRaw("[1,2,3,4,5]"),
                LastName = "LastNameValue"
            };

            JObject o = JObject.FromObject(raw);

            JsonReader reader = new JTokenReader(o);

            Assert.True(reader.Read());
            Assert.Equal(JsonToken.StartObject, reader.TokenType);

            Assert.True(reader.Read());
            Assert.Equal(JsonToken.PropertyName, reader.TokenType);

            Assert.True(reader.Read());
            Assert.Equal(JsonToken.String, reader.TokenType);

            Assert.True(reader.Read());
            Assert.Equal(JsonToken.PropertyName, reader.TokenType);

            Assert.True(reader.Read());
            Assert.Equal(JsonToken.Raw, reader.TokenType);

            Assert.True(reader.Read());
            Assert.Equal(JsonToken.PropertyName, reader.TokenType);

            Assert.True(reader.Read());
            Assert.Equal(JsonToken.String, reader.TokenType);

            Assert.True(reader.Read());
            Assert.Equal(JsonToken.EndObject, reader.TokenType);

            Assert.False(reader.Read());
        }