All files
[pithos-ms-client] / trunk / Libraries / Json40r2 / Source / Src / Newtonsoft.Json.Tests / Converters / DataTableConverterTests.cs
1 #if !SILVERLIGHT
2 using System;
3 using System.Collections.Generic;
4 using System.Linq;
5 using System.Text;
6 using Newtonsoft.Json.Converters;
7 using NUnit.Framework;
8 using Newtonsoft.Json.Tests.TestObjects;
9 using System.Data;
10
11 namespace Newtonsoft.Json.Tests.Converters
12 {
13   public class DataTableConverterTests : TestFixtureBase
14   {
15     [Test]
16     public void Deserialize()
17     {
18       string json = @"[
19   {
20     ""id"": 0,
21     ""item"": ""item 0""
22   },
23   {
24     ""id"": 1,
25     ""item"": ""item 1""
26   }
27 ]";
28
29       DataTable deserializedDataTable = JsonConvert.DeserializeObject<DataTable>(json);
30       Assert.IsNotNull(deserializedDataTable);
31
32       Assert.AreEqual(string.Empty, deserializedDataTable.TableName);
33       Assert.AreEqual(2, deserializedDataTable.Columns.Count);
34       Assert.AreEqual("id", deserializedDataTable.Columns[0].ColumnName);
35       Assert.AreEqual(typeof(long), deserializedDataTable.Columns[0].DataType);
36       Assert.AreEqual("item", deserializedDataTable.Columns[1].ColumnName);
37       Assert.AreEqual(typeof(string), deserializedDataTable.Columns[1].DataType);
38
39       Assert.AreEqual(2, deserializedDataTable.Rows.Count);
40
41       DataRow dr1 = deserializedDataTable.Rows[0];
42       Assert.AreEqual(0, dr1["id"]);
43       Assert.AreEqual("item 0", dr1["item"]);
44
45       DataRow dr2 = deserializedDataTable.Rows[1];
46       Assert.AreEqual(1, dr2["id"]);
47       Assert.AreEqual("item 1", dr2["item"]);
48     }
49
50     [Test]
51     public void Serialize()
52     {
53       // create a new DataTable.
54       DataTable myTable = new DataTable("blah");
55
56       // create DataColumn objects of data types.
57       DataColumn colString = new DataColumn("StringCol");
58       colString.DataType = typeof(string);
59       myTable.Columns.Add(colString);
60
61       DataColumn colInt32 = new DataColumn("Int32Col");
62       colInt32.DataType = typeof(int);
63       myTable.Columns.Add(colInt32);
64
65       DataColumn colBoolean = new DataColumn("BooleanCol");
66       colBoolean.DataType = typeof(bool);
67       myTable.Columns.Add(colBoolean);
68
69       DataColumn colTimeSpan = new DataColumn("TimeSpanCol");
70       colTimeSpan.DataType = typeof(TimeSpan);
71       myTable.Columns.Add(colTimeSpan);
72
73       DataColumn colDateTime = new DataColumn("DateTimeCol");
74       colDateTime.DataType = typeof(DateTime);
75       colDateTime.DateTimeMode = DataSetDateTime.Utc;
76       myTable.Columns.Add(colDateTime);
77
78       DataColumn colDecimal = new DataColumn("DecimalCol");
79       colDecimal.DataType = typeof(decimal);
80       myTable.Columns.Add(colDecimal);
81
82       // populate one row with values.
83       DataRow myNewRow = myTable.NewRow();
84
85       myNewRow["StringCol"] = "Item Name";
86       myNewRow["Int32Col"] = 2147483647;
87       myNewRow["BooleanCol"] = true;
88       myNewRow["TimeSpanCol"] = new TimeSpan(10, 22, 10, 15, 100);
89       myNewRow["DateTimeCol"] = new DateTime(2000, 12, 29, 0, 0, 0, DateTimeKind.Utc);
90       myNewRow["DecimalCol"] = 64.0021;
91       myTable.Rows.Add(myNewRow);
92
93       string json = JsonConvert.SerializeObject(myTable, Formatting.Indented);
94       Assert.AreEqual(@"[
95   {
96     ""StringCol"": ""Item Name"",
97     ""Int32Col"": 2147483647,
98     ""BooleanCol"": true,
99     ""TimeSpanCol"": ""10.22:10:15.1000000"",
100     ""DateTimeCol"": ""\/Date(978048000000)\/"",
101     ""DecimalCol"": 64.0021
102   }
103 ]", json);
104     }
105
106     public class TestDataTableConverter : JsonConverter
107     {
108       public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer)
109       {
110         DataTable d = (DataTable) value;
111         writer.WriteValue(d.TableName);
112       }
113
114       public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer)
115       {
116         //reader.Read();
117         DataTable d = new DataTable((string)reader.Value);
118
119         return d;
120       }
121
122       public override bool CanConvert(Type objectType)
123       {
124         return (objectType == typeof (DataTable));
125       }
126     }
127
128     [Test]
129     public void PassedInJsonConverterOverridesInternalConverter()
130     {
131       DataTable t1 = new DataTable("Custom");
132
133       string json = JsonConvert.SerializeObject(t1, Formatting.Indented, new TestDataTableConverter());
134       Assert.AreEqual(@"""Custom""", json);
135
136       DataTable t2 = JsonConvert.DeserializeObject<DataTable>(json, new TestDataTableConverter());
137       Assert.AreEqual(t1.TableName, t2.TableName);
138     }
139   }
140 }
141 #endif