diff --git a/Src/Newtonsoft.Json.Tests/JsonTextReaderTest.cs b/Src/Newtonsoft.Json.Tests/JsonTextReaderTest.cs
new file mode 100644
index 00000000..c521df24
--- /dev/null
+++ b/Src/Newtonsoft.Json.Tests/JsonTextReaderTest.cs
@@ -0,0 +1,219 @@
+#region License
+// Copyright (c) 2007 James Newton-King
+//
+// Permission is hereby granted, free of charge, to any person
+// obtaining a copy of this software and associated documentation
+// files (the "Software"), to deal in the Software without
+// restriction, including without limitation the rights to use,
+// copy, modify, merge, publish, distribute, sublicense, and/or sell
+// copies of the Software, and to permit persons to whom the
+// Software is furnished to do so, subject to the following
+// conditions:
+//
+// The above copyright notice and this permission notice shall be
+// included in all copies or substantial portions of the Software.
+//
+// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+// EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES
+// OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+// NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT
+// HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
+// WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
+// FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
+// OTHER DEALINGS IN THE SOFTWARE.
+#endregion
+
+using System;
+using System.Collections.Generic;
+using System.Text;
+using NUnit.Framework;
+using Newtonsoft.Json;
+using System.IO;
+
+namespace Newtonsoft.Json.Tests
+{
+ public class JsonTextReaderTest : TestFixtureBase
+ {
+ [Test]
+ public void YahooFinance()
+ {
+ string input = @"{
+""matches"" : [
+{""t"":""C"", ""n"":""Citigroup Inc."", ""e"":""NYSE"", ""id"":""662713""}
+,{""t"":""CHL"", ""n"":""China Mobile Ltd. (ADR)"", ""e"":""NYSE"", ""id"":""660998""}
+,{""t"":""PTR"", ""n"":""PetroChina Company Limited (ADR)"", ""e"":""NYSE"", ""id"":""664536""}
+,{""t"":""RIO"", ""n"":""Companhia Vale do Rio Doce (ADR)"", ""e"":""NYSE"", ""id"":""671472""}
+,{""t"":""RIOPR"", ""n"":""Companhia Vale do Rio Doce (ADR)"", ""e"":""NYSE"", ""id"":""3512643""}
+,{""t"":""CSCO"", ""n"":""Cisco Systems, Inc."", ""e"":""NASDAQ"", ""id"":""99624""}
+,{""t"":""CVX"", ""n"":""Chevron Corporation"", ""e"":""NYSE"", ""id"":""667226""}
+,{""t"":""TM"", ""n"":""Toyota Motor Corporation (ADR)"", ""e"":""NYSE"", ""id"":""655880""}
+,{""t"":""JPM"", ""n"":""JPMorgan Chase \x26 Co."", ""e"":""NYSE"", ""id"":""665639""}
+,{""t"":""COP"", ""n"":""ConocoPhillips"", ""e"":""NYSE"", ""id"":""1691168""}
+,{""t"":""LFC"", ""n"":""China Life Insurance Company Ltd. (ADR)"", ""e"":""NYSE"", ""id"":""688679""}
+,{""t"":""NOK"", ""n"":""Nokia Corporation (ADR)"", ""e"":""NYSE"", ""id"":""657729""}
+,{""t"":""KO"", ""n"":""The Coca-Cola Company"", ""e"":""NYSE"", ""id"":""6550""}
+,{""t"":""VZ"", ""n"":""Verizon Communications Inc."", ""e"":""NYSE"", ""id"":""664887""}
+,{""t"":""AMX"", ""n"":""America Movil S.A.B de C.V. (ADR)"", ""e"":""NYSE"", ""id"":""665834""}],
+""all"" : false
+}
+";
+
+ using (JsonReader jsonReader = new JsonTextReader(new StringReader(input)))
+ {
+ while (jsonReader.Read())
+ {
+ Console.WriteLine(jsonReader.Value);
+ }
+ }
+ }
+
+ [Test]
+ public void ReadingIndented()
+ {
+ string input = @"{
+ CPU: 'Intel',
+ Drives: [
+ 'DVD read/writer',
+ ""500 gigabyte hard drive""
+ ]
+}";
+
+ StringReader sr = new StringReader(input);
+
+ using (JsonReader jsonReader = new JsonTextReader(sr))
+ {
+ Assert.AreEqual(jsonReader.TokenType, JsonToken.None);
+
+ jsonReader.Read();
+ Assert.AreEqual(jsonReader.TokenType, JsonToken.StartObject);
+
+ jsonReader.Read();
+ Assert.AreEqual(jsonReader.TokenType, JsonToken.PropertyName);
+ Assert.AreEqual(jsonReader.Value, "CPU");
+
+ jsonReader.Read();
+ Assert.AreEqual(jsonReader.TokenType, JsonToken.String);
+ Assert.AreEqual(jsonReader.Value, "Intel");
+
+ jsonReader.Read();
+ Assert.AreEqual(jsonReader.TokenType, JsonToken.PropertyName);
+ Assert.AreEqual(jsonReader.Value, "Drives");
+
+ jsonReader.Read();
+ Assert.AreEqual(jsonReader.TokenType, JsonToken.StartArray);
+
+ jsonReader.Read();
+ Assert.AreEqual(jsonReader.TokenType, JsonToken.String);
+ Assert.AreEqual(jsonReader.Value, "DVD read/writer");
+ Assert.AreEqual(jsonReader.QuoteChar, '\'');
+
+ jsonReader.Read();
+ Assert.AreEqual(jsonReader.TokenType, JsonToken.String);
+ Assert.AreEqual(jsonReader.Value, "500 gigabyte hard drive");
+ Assert.AreEqual(jsonReader.QuoteChar, '"');
+
+ jsonReader.Read();
+ Assert.AreEqual(jsonReader.TokenType, JsonToken.EndArray);
+
+ jsonReader.Read();
+ Assert.AreEqual(jsonReader.TokenType, JsonToken.EndObject);
+ }
+ }
+
+ [Test]
+ public void ReadingEscapedStrings()
+ {
+ string input = "{value:'Purple\\r \\n monkey\\'s:\\tdishwasher'}";
+
+ StringReader sr = new StringReader(input);
+
+ using (JsonReader jsonReader = new JsonTextReader(sr))
+ {
+ jsonReader.Read();
+ Assert.AreEqual(jsonReader.TokenType, JsonToken.StartObject);
+
+ jsonReader.Read();
+ Assert.AreEqual(jsonReader.TokenType, JsonToken.PropertyName);
+
+ jsonReader.Read();
+ Assert.AreEqual(jsonReader.TokenType, JsonToken.String);
+ Assert.AreEqual(jsonReader.Value, "Purple\r \n monkey's:\tdishwasher");
+ Assert.AreEqual(jsonReader.QuoteChar, '\'');
+
+ jsonReader.Read();
+ Assert.AreEqual(jsonReader.TokenType, JsonToken.EndObject);
+ }
+ }
+
+ [Test]
+ public void ReadNewlineLastCharacter()
+ {
+ string input = @"{
+ CPU: 'Intel',
+ Drives: [
+ 'DVD read/writer',
+ ""500 gigabyte hard drive""
+ ]
+}" + '\n';
+
+ object o = JavaScriptConvert.DeserializeObject(input);
+ }
+
+ [Test]
+ public void WriteReadWrite()
+ {
+ StringBuilder sb = new StringBuilder();
+ StringWriter sw = new StringWriter(sb);
+
+ using (JsonWriter jsonWriter = new JsonTextWriter(sw))
+ {
+ jsonWriter.WriteStartArray();
+ jsonWriter.WriteValue(true);
+
+ jsonWriter.WriteStartObject();
+ jsonWriter.WritePropertyName("integer");
+ jsonWriter.WriteValue(99);
+ jsonWriter.WritePropertyName("string");
+ jsonWriter.WriteValue("how now brown cow?");
+ jsonWriter.WritePropertyName("array");
+
+ jsonWriter.WriteStartArray();
+ for (int i = 0; i < 5; i++)
+ {
+ jsonWriter.WriteValue(i);
+ }
+
+ jsonWriter.WriteStartObject();
+ jsonWriter.WritePropertyName("decimal");
+ jsonWriter.WriteValue(990.00990099m);
+ jsonWriter.WriteEndObject();
+
+ jsonWriter.WriteValue(5);
+ jsonWriter.WriteEndArray();
+
+ jsonWriter.WriteEndObject();
+
+ jsonWriter.WriteValue("This is a string.");
+ jsonWriter.WriteNull();
+ jsonWriter.WriteNull();
+ jsonWriter.WriteEndArray();
+ }
+
+ string json = sb.ToString();
+
+ JsonSerializer serializer = new JsonSerializer();
+
+ object jsonObject = serializer.Deserialize(new JsonTextReader(new StringReader(json)));
+
+ sb = new StringBuilder();
+ sw = new StringWriter(sb);
+
+ using (JsonWriter jsonWriter = new JsonTextWriter(sw))
+ {
+ serializer.Serialize(sw, jsonObject);
+ }
+
+ Assert.AreEqual(json, sb.ToString());
+ }
+ }
+}
\ No newline at end of file
diff --git a/Src/Newtonsoft.Json.Tests/JsonTextWriterTest.cs b/Src/Newtonsoft.Json.Tests/JsonTextWriterTest.cs
new file mode 100644
index 00000000..1090a2f8
--- /dev/null
+++ b/Src/Newtonsoft.Json.Tests/JsonTextWriterTest.cs
@@ -0,0 +1,176 @@
+#region License
+// Copyright (c) 2007 James Newton-King
+//
+// Permission is hereby granted, free of charge, to any person
+// obtaining a copy of this software and associated documentation
+// files (the "Software"), to deal in the Software without
+// restriction, including without limitation the rights to use,
+// copy, modify, merge, publish, distribute, sublicense, and/or sell
+// copies of the Software, and to permit persons to whom the
+// Software is furnished to do so, subject to the following
+// conditions:
+//
+// The above copyright notice and this permission notice shall be
+// included in all copies or substantial portions of the Software.
+//
+// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+// EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES
+// OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+// NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT
+// HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
+// WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
+// FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
+// OTHER DEALINGS IN THE SOFTWARE.
+#endregion
+
+using System;
+using System.Collections.Generic;
+using System.Text;
+using NUnit.Framework;
+using Newtonsoft.Json;
+using System.IO;
+using System.Runtime.Serialization.Json;
+
+namespace Newtonsoft.Json.Tests
+{
+ public class JsonTextWriterTest : TestFixtureBase
+ {
+ [Test]
+ public void ValueFormatting()
+ {
+ StringBuilder sb = new StringBuilder();
+ StringWriter sw = new StringWriter(sb);
+
+ using (JsonWriter jsonWriter = new JsonTextWriter(sw))
+ {
+ jsonWriter.WriteStartArray();
+ jsonWriter.WriteValue('@');
+ jsonWriter.WriteValue("\r\n\t\f\b?{\\r\\n\"\'");
+ jsonWriter.WriteValue(true);
+ jsonWriter.WriteValue(10);
+ jsonWriter.WriteValue(10.99);
+ jsonWriter.WriteValue(0.99);
+ jsonWriter.WriteValue(0.000000000000000001d);
+ jsonWriter.WriteValue(0.000000000000000001m);
+ jsonWriter.WriteValue(null);
+ jsonWriter.WriteValue("This is a string.");
+ jsonWriter.WriteNull();
+ jsonWriter.WriteUndefined();
+ jsonWriter.WriteEndArray();
+ }
+
+ string expected = @"[""@"",""\r\n\t\f\b?{\\r\\n\""'"",true,10,10.99,0.99,1E-18,0.000000000000000001,"""",""This is a string."",null,undefined]";
+ string result = sb.ToString();
+
+ Console.WriteLine("ValueFormatting");
+ Console.WriteLine(result);
+
+ Assert.AreEqual(expected, result);
+ }
+
+ [Test]
+ public void StringEscaping()
+ {
+ StringBuilder sb = new StringBuilder();
+ StringWriter sw = new StringWriter(sb);
+
+ using (JsonWriter jsonWriter = new JsonTextWriter(sw))
+ {
+ jsonWriter.WriteStartArray();
+ jsonWriter.WriteValue(@"""These pretzels are making me thirsty!""");
+ jsonWriter.WriteValue("Jeff's house was burninated.");
+ jsonWriter.WriteValue(@"1. You don't talk about fight club.
+2. You don't talk about fight club.");
+ jsonWriter.WriteValue("35% of\t statistics\n are made\r up.");
+ jsonWriter.WriteEndArray();
+ }
+
+ string expected = @"[""\""These pretzels are making me thirsty!\"""",""Jeff's house was burninated."",""1. You don't talk about fight club.\r\n2. You don't talk about fight club."",""35% of\t statistics\n are made\r up.""]";
+ string result = sb.ToString();
+
+ Console.WriteLine("StringEscaping");
+ Console.WriteLine(result);
+
+ Assert.AreEqual(expected, result);
+ }
+
+ [Test]
+ public void Indenting()
+ {
+ StringBuilder sb = new StringBuilder();
+ StringWriter sw = new StringWriter(sb);
+
+ using (JsonWriter jsonWriter = new JsonTextWriter(sw))
+ {
+ jsonWriter.Formatting = Formatting.Indented;
+
+ jsonWriter.WriteStartObject();
+ jsonWriter.WritePropertyName("CPU");
+ jsonWriter.WriteValue("Intel");
+ jsonWriter.WritePropertyName("PSU");
+ jsonWriter.WriteValue("500W");
+ jsonWriter.WritePropertyName("Drives");
+ jsonWriter.WriteStartArray();
+ jsonWriter.WriteValue("DVD read/writer");
+ jsonWriter.WriteComment("(broken)");
+ jsonWriter.WriteValue("500 gigabyte hard drive");
+ jsonWriter.WriteValue("200 gigabype hard drive");
+ jsonWriter.WriteEnd();
+ jsonWriter.WriteEndObject();
+ }
+
+ string expected = @"{
+ ""CPU"": ""Intel"",
+ ""PSU"": ""500W"",
+ ""Drives"": [
+ ""DVD read/writer""
+ /*(broken)*/,
+ ""500 gigabyte hard drive"",
+ ""200 gigabype hard drive""
+ ]
+}";
+ string result = sb.ToString();
+
+ Console.WriteLine("Indenting");
+ Console.WriteLine(result);
+
+ Assert.AreEqual(expected, result);
+ }
+
+ [Test]
+ public void State()
+ {
+ StringBuilder sb = new StringBuilder();
+ StringWriter sw = new StringWriter(sb);
+
+ using (JsonWriter jsonWriter = new JsonTextWriter(sw))
+ {
+ Assert.AreEqual(WriteState.Start, jsonWriter.WriteState);
+
+ jsonWriter.WriteStartObject();
+ Assert.AreEqual(WriteState.Object, jsonWriter.WriteState);
+
+ jsonWriter.WritePropertyName("CPU");
+ Assert.AreEqual(WriteState.Property, jsonWriter.WriteState);
+
+ jsonWriter.WriteValue("Intel");
+ Assert.AreEqual(WriteState.Object, jsonWriter.WriteState);
+
+ jsonWriter.WritePropertyName("Drives");
+ Assert.AreEqual(WriteState.Property, jsonWriter.WriteState);
+
+ jsonWriter.WriteStartArray();
+ Assert.AreEqual(WriteState.Array, jsonWriter.WriteState);
+
+ jsonWriter.WriteValue("DVD read/writer");
+ Assert.AreEqual(WriteState.Array, jsonWriter.WriteState);
+
+ jsonWriter.WriteEnd();
+ Assert.AreEqual(WriteState.Object, jsonWriter.WriteState);
+
+ jsonWriter.WriteEndObject();
+ Assert.AreEqual(WriteState.Start, jsonWriter.WriteState);
+ }
+ }
+ }
+}
\ No newline at end of file
diff --git a/Src/Newtonsoft.Json.Tests/JsonTokenReaderTest.cs b/Src/Newtonsoft.Json.Tests/JsonTokenReaderTest.cs
new file mode 100644
index 00000000..69b96db2
--- /dev/null
+++ b/Src/Newtonsoft.Json.Tests/JsonTokenReaderTest.cs
@@ -0,0 +1,255 @@
+#region License
+// Copyright (c) 2007 James Newton-King
+//
+// Permission is hereby granted, free of charge, to any person
+// obtaining a copy of this software and associated documentation
+// files (the "Software"), to deal in the Software without
+// restriction, including without limitation the rights to use,
+// copy, modify, merge, publish, distribute, sublicense, and/or sell
+// copies of the Software, and to permit persons to whom the
+// Software is furnished to do so, subject to the following
+// conditions:
+//
+// The above copyright notice and this permission notice shall be
+// included in all copies or substantial portions of the Software.
+//
+// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+// EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES
+// OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+// NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT
+// HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
+// WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
+// FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
+// OTHER DEALINGS IN THE SOFTWARE.
+#endregion
+
+using System;
+using System.Collections.Generic;
+using System.Text;
+using NUnit.Framework;
+using Newtonsoft.Json;
+using System.IO;
+using Newtonsoft.Json.Linq;
+
+namespace Newtonsoft.Json.Tests
+{
+ public class JsonTokenReaderTest : TestFixtureBase
+ {
+ [Test]
+ 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 (JsonReader jsonReader = new JsonTokenReader(o))
+ {
+ jsonReader.Read();
+ Assert.AreEqual(JsonToken.StartObject, jsonReader.TokenType);
+
+ jsonReader.Read();
+ Assert.AreEqual(JsonToken.PropertyName, jsonReader.TokenType);
+ Assert.AreEqual("Test1", jsonReader.Value);
+
+ jsonReader.Read();
+ Assert.AreEqual(JsonToken.Date, jsonReader.TokenType);
+ Assert.AreEqual(new DateTime(2000, 10, 15, 5, 5, 5, DateTimeKind.Utc), jsonReader.Value);
+
+ jsonReader.Read();
+ Assert.AreEqual(JsonToken.PropertyName, jsonReader.TokenType);
+ Assert.AreEqual("Test2", jsonReader.Value);
+
+ jsonReader.Read();
+ Assert.AreEqual(JsonToken.Date, jsonReader.TokenType);
+ Assert.AreEqual(new DateTimeOffset(2000, 10, 15, 5, 5, 5, new TimeSpan(11, 11, 0)), jsonReader.Value);
+
+ jsonReader.Read();
+ Assert.AreEqual(JsonToken.PropertyName, jsonReader.TokenType);
+ Assert.AreEqual("Test3", jsonReader.Value);
+
+ jsonReader.Read();
+ Assert.AreEqual(JsonToken.String, jsonReader.TokenType);
+ Assert.AreEqual("Test3Value", jsonReader.Value);
+
+ jsonReader.Read();
+ Assert.AreEqual(JsonToken.PropertyName, jsonReader.TokenType);
+ Assert.AreEqual("Test4", jsonReader.Value);
+
+ jsonReader.Read();
+ Assert.AreEqual(JsonToken.Null, jsonReader.TokenType);
+ Assert.AreEqual(null, jsonReader.Value);
+
+ Assert.IsTrue(jsonReader.Read());
+ Assert.AreEqual(JsonToken.EndObject, jsonReader.TokenType);
+
+ Assert.IsFalse(jsonReader.Read());
+ }
+
+ using (JsonReader jsonReader = new JsonTokenReader(o.Property("Test2")))
+ {
+ Assert.IsTrue(jsonReader.Read());
+ Assert.AreEqual(JsonToken.PropertyName, jsonReader.TokenType);
+ Assert.AreEqual("Test2", jsonReader.Value);
+
+ Assert.IsTrue(jsonReader.Read());
+ Assert.AreEqual(JsonToken.Date, jsonReader.TokenType);
+ Assert.AreEqual(new DateTimeOffset(2000, 10, 15, 5, 5, 5, new TimeSpan(11, 11, 0)), jsonReader.Value);
+
+ Assert.IsFalse(jsonReader.Read());
+ }
+ }
+
+ [Test]
+ public void ReadingIndented()
+ {
+ string input = @"{
+ CPU: 'Intel',
+ Drives: [
+ 'DVD read/writer',
+ ""500 gigabyte hard drive""
+ ]
+}";
+
+ StringReader sr = new StringReader(input);
+
+ using (JsonReader jsonReader = new JsonTextReader(sr))
+ {
+ Assert.AreEqual(jsonReader.TokenType, JsonToken.None);
+
+ jsonReader.Read();
+ Assert.AreEqual(jsonReader.TokenType, JsonToken.StartObject);
+
+ jsonReader.Read();
+ Assert.AreEqual(jsonReader.TokenType, JsonToken.PropertyName);
+ Assert.AreEqual(jsonReader.Value, "CPU");
+
+ jsonReader.Read();
+ Assert.AreEqual(jsonReader.TokenType, JsonToken.String);
+ Assert.AreEqual(jsonReader.Value, "Intel");
+
+ jsonReader.Read();
+ Assert.AreEqual(jsonReader.TokenType, JsonToken.PropertyName);
+ Assert.AreEqual(jsonReader.Value, "Drives");
+
+ jsonReader.Read();
+ Assert.AreEqual(jsonReader.TokenType, JsonToken.StartArray);
+
+ jsonReader.Read();
+ Assert.AreEqual(jsonReader.TokenType, JsonToken.String);
+ Assert.AreEqual(jsonReader.Value, "DVD read/writer");
+ Assert.AreEqual(jsonReader.QuoteChar, '\'');
+
+ jsonReader.Read();
+ Assert.AreEqual(jsonReader.TokenType, JsonToken.String);
+ Assert.AreEqual(jsonReader.Value, "500 gigabyte hard drive");
+ Assert.AreEqual(jsonReader.QuoteChar, '"');
+
+ jsonReader.Read();
+ Assert.AreEqual(jsonReader.TokenType, JsonToken.EndArray);
+
+ jsonReader.Read();
+ Assert.AreEqual(jsonReader.TokenType, JsonToken.EndObject);
+ }
+ }
+
+ [Test]
+ public void ReadingEscapedStrings()
+ {
+ string input = "{value:'Purple\\r \\n monkey\\'s:\\tdishwasher'}";
+
+ StringReader sr = new StringReader(input);
+
+ using (JsonReader jsonReader = new JsonTextReader(sr))
+ {
+ jsonReader.Read();
+ Assert.AreEqual(jsonReader.TokenType, JsonToken.StartObject);
+
+ jsonReader.Read();
+ Assert.AreEqual(jsonReader.TokenType, JsonToken.PropertyName);
+
+ jsonReader.Read();
+ Assert.AreEqual(jsonReader.TokenType, JsonToken.String);
+ Assert.AreEqual(jsonReader.Value, "Purple\r \n monkey's:\tdishwasher");
+ Assert.AreEqual(jsonReader.QuoteChar, '\'');
+
+ jsonReader.Read();
+ Assert.AreEqual(jsonReader.TokenType, JsonToken.EndObject);
+ }
+ }
+
+ [Test]
+ public void ReadNewlineLastCharacter()
+ {
+ string input = @"{
+ CPU: 'Intel',
+ Drives: [
+ 'DVD read/writer',
+ ""500 gigabyte hard drive""
+ ]
+}" + '\n';
+
+ object o = JavaScriptConvert.DeserializeObject(input);
+ }
+
+ [Test]
+ public void WriteReadWrite()
+ {
+ StringBuilder sb = new StringBuilder();
+ StringWriter sw = new StringWriter(sb);
+
+ using (JsonWriter jsonWriter = new JsonTextWriter(sw))
+ {
+ jsonWriter.WriteStartArray();
+ jsonWriter.WriteValue(true);
+
+ jsonWriter.WriteStartObject();
+ jsonWriter.WritePropertyName("integer");
+ jsonWriter.WriteValue(99);
+ jsonWriter.WritePropertyName("string");
+ jsonWriter.WriteValue("how now brown cow?");
+ jsonWriter.WritePropertyName("array");
+
+ jsonWriter.WriteStartArray();
+ for (int i = 0; i < 5; i++)
+ {
+ jsonWriter.WriteValue(i);
+ }
+
+ jsonWriter.WriteStartObject();
+ jsonWriter.WritePropertyName("decimal");
+ jsonWriter.WriteValue(990.00990099m);
+ jsonWriter.WriteEndObject();
+
+ jsonWriter.WriteValue(5);
+ jsonWriter.WriteEndArray();
+
+ jsonWriter.WriteEndObject();
+
+ jsonWriter.WriteValue("This is a string.");
+ jsonWriter.WriteNull();
+ jsonWriter.WriteNull();
+ jsonWriter.WriteEndArray();
+ }
+
+ string json = sb.ToString();
+
+ JsonSerializer serializer = new JsonSerializer();
+
+ object jsonObject = serializer.Deserialize(new JsonTextReader(new StringReader(json)));
+
+ sb = new StringBuilder();
+ sw = new StringWriter(sb);
+
+ using (JsonWriter jsonWriter = new JsonTextWriter(sw))
+ {
+ serializer.Serialize(sw, jsonObject);
+ }
+
+ Assert.AreEqual(json, sb.ToString());
+ }
+ }
+}
\ No newline at end of file
diff --git a/Src/Newtonsoft.Json.Tests/JsonTokenWriterTest.cs b/Src/Newtonsoft.Json.Tests/JsonTokenWriterTest.cs
new file mode 100644
index 00000000..87248bc2
--- /dev/null
+++ b/Src/Newtonsoft.Json.Tests/JsonTokenWriterTest.cs
@@ -0,0 +1,111 @@
+#region License
+// Copyright (c) 2007 James Newton-King
+//
+// Permission is hereby granted, free of charge, to any person
+// obtaining a copy of this software and associated documentation
+// files (the "Software"), to deal in the Software without
+// restriction, including without limitation the rights to use,
+// copy, modify, merge, publish, distribute, sublicense, and/or sell
+// copies of the Software, and to permit persons to whom the
+// Software is furnished to do so, subject to the following
+// conditions:
+//
+// The above copyright notice and this permission notice shall be
+// included in all copies or substantial portions of the Software.
+//
+// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+// EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES
+// OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+// NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT
+// HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
+// WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
+// FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
+// OTHER DEALINGS IN THE SOFTWARE.
+#endregion
+
+using System;
+using System.Collections.Generic;
+using System.Text;
+using NUnit.Framework;
+using Newtonsoft.Json;
+using System.IO;
+using Newtonsoft.Json.Linq;
+using System.Linq;
+
+namespace Newtonsoft.Json.Tests
+{
+ public class JsonTokenWriterTest : TestFixtureBase
+ {
+ [Test]
+ public void ValueFormatting()
+ {
+ JContainer root;
+ using (JsonTokenWriter jsonWriter = new JsonTokenWriter())
+ {
+ jsonWriter.WriteStartArray();
+ jsonWriter.WriteValue('@');
+ jsonWriter.WriteValue("\r\n\t\f\b?{\\r\\n\"\'");
+ jsonWriter.WriteValue(true);
+ jsonWriter.WriteValue(10);
+ jsonWriter.WriteValue(10.99);
+ jsonWriter.WriteValue(0.99);
+ jsonWriter.WriteValue(0.000000000000000001d);
+ jsonWriter.WriteValue(0.000000000000000001m);
+ jsonWriter.WriteValue(null);
+ jsonWriter.WriteValue("This is a string.");
+ jsonWriter.WriteNull();
+ jsonWriter.WriteUndefined();
+ jsonWriter.WriteEndArray();
+
+ root = jsonWriter.Token;
+ }
+
+ Assert.IsInstanceOfType(typeof(JArray), root);
+ Assert.AreEqual(12, root.Children().Count());
+ Assert.AreEqual("@", (string)root[0]);
+ Assert.AreEqual("\r\n\t\f\b?{\\r\\n\"\'", (string)root[1]);
+ Assert.AreEqual(true, (bool)root[2]);
+ Assert.AreEqual(10, (int)root[3]);
+ Assert.AreEqual(10.99, (double)root[4]);
+ Assert.AreEqual(0.99, (double)root[5]);
+ Assert.AreEqual(0.000000000000000001d, (double)root[6]);
+ Assert.AreEqual(0.000000000000000001m, (decimal)root[7]);
+ Assert.AreEqual(string.Empty, (string)root[8]);
+ Assert.AreEqual("This is a string.", (string)root[9]);
+ Assert.AreEqual(null, ((JValue)root[10]).Value);
+ }
+
+ [Test]
+ public void State()
+ {
+ using (JsonWriter jsonWriter = new JsonTokenWriter())
+ {
+ Assert.AreEqual(WriteState.Start, jsonWriter.WriteState);
+
+ jsonWriter.WriteStartObject();
+ Assert.AreEqual(WriteState.Object, jsonWriter.WriteState);
+
+ jsonWriter.WritePropertyName("CPU");
+ Assert.AreEqual(WriteState.Property, jsonWriter.WriteState);
+
+ jsonWriter.WriteValue("Intel");
+ Assert.AreEqual(WriteState.Object, jsonWriter.WriteState);
+
+ jsonWriter.WritePropertyName("Drives");
+ Assert.AreEqual(WriteState.Property, jsonWriter.WriteState);
+
+ jsonWriter.WriteStartArray();
+ Assert.AreEqual(WriteState.Array, jsonWriter.WriteState);
+
+ jsonWriter.WriteValue("DVD read/writer");
+ Assert.AreEqual(WriteState.Array, jsonWriter.WriteState);
+
+ jsonWriter.WriteEnd();
+ Assert.AreEqual(WriteState.Object, jsonWriter.WriteState);
+
+ jsonWriter.WriteEndObject();
+ Assert.AreEqual(WriteState.Start, jsonWriter.WriteState);
+ }
+ }
+ }
+}
\ No newline at end of file
diff --git a/Src/Newtonsoft.Json.Tests/Newtonsoft.Json.Tests.csproj b/Src/Newtonsoft.Json.Tests/Newtonsoft.Json.Tests.csproj
index 767389b3..6e67c1ee 100644
--- a/Src/Newtonsoft.Json.Tests/Newtonsoft.Json.Tests.csproj
+++ b/Src/Newtonsoft.Json.Tests/Newtonsoft.Json.Tests.csproj
@@ -66,15 +66,15 @@
-
-
-
+
+
+