~ubuntu-branches/ubuntu/trusty/monodevelop/trusty-proposed

« back to all changes in this revision

Viewing changes to external/Newtonsoft.Json/Src/Newtonsoft.Json.Tests/Bson/BsonWriterTests.cs

  • Committer: Package Import Robot
  • Author(s): Jo Shields
  • Date: 2013-05-12 09:46:03 UTC
  • mto: This revision was merged to the branch mainline in revision 29.
  • Revision ID: package-import@ubuntu.com-20130512094603-mad323bzcxvmcam0
Tags: upstream-4.0.5+dfsg
Import upstream version 4.0.5+dfsg

Show diffs side-by-side

added added

removed removed

Lines of Context:
 
1
#region License
 
2
// Copyright (c) 2007 James Newton-King
 
3
//
 
4
// Permission is hereby granted, free of charge, to any person
 
5
// obtaining a copy of this software and associated documentation
 
6
// files (the "Software"), to deal in the Software without
 
7
// restriction, including without limitation the rights to use,
 
8
// copy, modify, merge, publish, distribute, sublicense, and/or sell
 
9
// copies of the Software, and to permit persons to whom the
 
10
// Software is furnished to do so, subject to the following
 
11
// conditions:
 
12
//
 
13
// The above copyright notice and this permission notice shall be
 
14
// included in all copies or substantial portions of the Software.
 
15
//
 
16
// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
 
17
// EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES
 
18
// OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
 
19
// NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT
 
20
// HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
 
21
// WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
 
22
// FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
 
23
// OTHER DEALINGS IN THE SOFTWARE.
 
24
#endregion
 
25
 
 
26
using System;
 
27
using System.Collections.Generic;
 
28
using System.Text;
 
29
#if !NETFX_CORE
 
30
using NUnit.Framework;
 
31
#else
 
32
using Microsoft.VisualStudio.TestPlatform.UnitTestFramework;
 
33
using TestFixture = Microsoft.VisualStudio.TestPlatform.UnitTestFramework.TestClassAttribute;
 
34
using Test = Microsoft.VisualStudio.TestPlatform.UnitTestFramework.TestMethodAttribute;
 
35
#endif
 
36
using Newtonsoft.Json.Bson;
 
37
using System.IO;
 
38
using Newtonsoft.Json.Utilities;
 
39
using Newtonsoft.Json.Tests.TestObjects;
 
40
using System.Globalization;
 
41
#if NET20
 
42
using Newtonsoft.Json.Utilities.LinqBridge;
 
43
#else
 
44
using System.Linq;
 
45
#endif
 
46
 
 
47
namespace Newtonsoft.Json.Tests.Bson
 
48
{
 
49
  [TestFixture]
 
50
  public class BsonWriterTests : TestFixtureBase
 
51
  {
 
52
    [Test]
 
53
    public void CloseOutput()
 
54
    {
 
55
      MemoryStream ms = new MemoryStream();
 
56
      BsonWriter writer = new BsonWriter(ms);
 
57
 
 
58
      Assert.IsTrue(ms.CanRead);
 
59
      writer.Close();
 
60
      Assert.IsFalse(ms.CanRead);
 
61
 
 
62
      ms = new MemoryStream();
 
63
      writer = new BsonWriter(ms) { CloseOutput = false };
 
64
 
 
65
      Assert.IsTrue(ms.CanRead);
 
66
      writer.Close();
 
67
      Assert.IsTrue(ms.CanRead);
 
68
    }
 
69
 
 
70
    [Test]
 
71
    public void WriteSingleObject()
 
72
    {
 
73
      MemoryStream ms = new MemoryStream();
 
74
      BsonWriter writer = new BsonWriter(ms);
 
75
 
 
76
      writer.WriteStartObject();
 
77
      writer.WritePropertyName("Blah");
 
78
      writer.WriteValue(1);
 
79
      writer.WriteEndObject();
 
80
 
 
81
      string bson = MiscellaneousUtils.BytesToHex(ms.ToArray());
 
82
      Assert.AreEqual("0F-00-00-00-10-42-6C-61-68-00-01-00-00-00-00", bson);
 
83
    }
 
84
 
 
85
#if !PocketPC && !NET20
 
86
    [Test]
 
87
    public void WriteValues()
 
88
    {
 
89
      MemoryStream ms = new MemoryStream();
 
90
      BsonWriter writer = new BsonWriter(ms);
 
91
 
 
92
      writer.WriteStartArray();
 
93
      writer.WriteValue(long.MaxValue);
 
94
      writer.WriteValue((ulong)long.MaxValue);
 
95
      writer.WriteValue(int.MaxValue);
 
96
      writer.WriteValue((uint)int.MaxValue);
 
97
      writer.WriteValue(byte.MaxValue);
 
98
      writer.WriteValue(sbyte.MaxValue);
 
99
      writer.WriteValue('a');
 
100
      writer.WriteValue(decimal.MaxValue);
 
101
      writer.WriteValue(double.MaxValue);
 
102
      writer.WriteValue(float.MaxValue);
 
103
      writer.WriteValue(true);
 
104
      writer.WriteValue(new byte[] { 0, 1, 2, 3, 4 });
 
105
      writer.WriteValue(new DateTimeOffset(2000, 12, 29, 12, 30, 0, TimeSpan.Zero));
 
106
      writer.WriteValue(new DateTime(2000, 12, 29, 12, 30, 0, DateTimeKind.Utc));
 
107
      writer.WriteEnd();
 
108
 
 
109
      string bson = MiscellaneousUtils.BytesToHex(ms.ToArray());
 
110
      Assert.AreEqual("8C-00-00-00-12-30-00-FF-FF-FF-FF-FF-FF-FF-7F-12-31-00-FF-FF-FF-FF-FF-FF-FF-7F-10-32-00-FF-FF-FF-7F-10-33-00-FF-FF-FF-7F-10-34-00-FF-00-00-00-10-35-00-7F-00-00-00-02-36-00-02-00-00-00-61-00-01-37-00-00-00-00-00-00-00-F0-45-01-38-00-FF-FF-FF-FF-FF-FF-EF-7F-01-39-00-00-00-00-E0-FF-FF-EF-47-08-31-30-00-01-05-31-31-00-05-00-00-00-00-00-01-02-03-04-09-31-32-00-40-C5-E2-BA-E3-00-00-00-09-31-33-00-40-C5-E2-BA-E3-00-00-00-00", bson);
 
111
    }
 
112
#endif
 
113
 
 
114
    [Test]
 
115
    public void WriteArrayBsonFromSite()
 
116
    {
 
117
      MemoryStream ms = new MemoryStream();
 
118
      BsonWriter writer = new BsonWriter(ms);
 
119
      writer.WriteStartArray();
 
120
      writer.WriteValue("a");
 
121
      writer.WriteValue("b");
 
122
      writer.WriteValue("c");
 
123
      writer.WriteEndArray();
 
124
      
 
125
      writer.Flush();
 
126
 
 
127
      ms.Seek(0, SeekOrigin.Begin);
 
128
 
 
129
      string expected = "20-00-00-00-02-30-00-02-00-00-00-61-00-02-31-00-02-00-00-00-62-00-02-32-00-02-00-00-00-63-00-00";
 
130
      string bson = MiscellaneousUtils.BytesToHex(ms.ToArray());
 
131
 
 
132
      Assert.AreEqual(expected, bson);
 
133
    }
 
134
 
 
135
    [Test]
 
136
    public void WriteBytes()
 
137
    {
 
138
      byte[] data = Encoding.UTF8.GetBytes("Hello world!");
 
139
 
 
140
      MemoryStream ms = new MemoryStream();
 
141
      BsonWriter writer = new BsonWriter(ms);
 
142
      writer.WriteStartArray();
 
143
      writer.WriteValue("a");
 
144
      writer.WriteValue("b");
 
145
      writer.WriteValue(data);
 
146
      writer.WriteEndArray();
 
147
 
 
148
      writer.Flush();
 
149
 
 
150
      ms.Seek(0, SeekOrigin.Begin);
 
151
 
 
152
      string expected = "2B-00-00-00-02-30-00-02-00-00-00-61-00-02-31-00-02-00-00-00-62-00-05-32-00-0C-00-00-00-00-48-65-6C-6C-6F-20-77-6F-72-6C-64-21-00";
 
153
      string bson = MiscellaneousUtils.BytesToHex(ms.ToArray());
 
154
 
 
155
      Assert.AreEqual(expected, bson);
 
156
 
 
157
      BsonReader reader = new BsonReader(new MemoryStream(ms.ToArray()));
 
158
      reader.ReadRootValueAsArray = true;
 
159
      reader.Read();
 
160
      reader.Read();
 
161
      reader.Read();
 
162
      reader.Read();
 
163
      Assert.AreEqual(JsonToken.Bytes, reader.TokenType);
 
164
      CollectionAssert.AreEquivalent(data, (byte[])reader.Value);
 
165
    }
 
166
 
 
167
    [Test]
 
168
    public void WriteNestedArray()
 
169
    {
 
170
      MemoryStream ms = new MemoryStream();
 
171
      BsonWriter writer = new BsonWriter(ms);
 
172
      writer.WriteStartObject();
 
173
 
 
174
      writer.WritePropertyName("_id");
 
175
      writer.WriteValue(MiscellaneousUtils.HexToBytes("4A-78-93-79-17-22-00-00-00-00-61-CF"));
 
176
 
 
177
      writer.WritePropertyName("a");
 
178
      writer.WriteStartArray();
 
179
      for (int i = 1; i <= 8; i++)
 
180
      {
 
181
        double value = (i != 5)
 
182
                         ? Convert.ToDouble(i)
 
183
                         : 5.78960446186581E+77d;
 
184
 
 
185
        writer.WriteValue(value);
 
186
      }
 
187
      writer.WriteEndArray();
 
188
 
 
189
      writer.WritePropertyName("b");
 
190
      writer.WriteValue("test");
 
191
 
 
192
      writer.WriteEndObject();
 
193
 
 
194
      writer.Flush();
 
195
 
 
196
      ms.Seek(0, SeekOrigin.Begin);
 
197
 
 
198
      string expected = "87-00-00-00-05-5F-69-64-00-0C-00-00-00-00-4A-78-93-79-17-22-00-00-00-00-61-CF-04-61-00-5D-00-00-00-01-30-00-00-00-00-00-00-00-F0-3F-01-31-00-00-00-00-00-00-00-00-40-01-32-00-00-00-00-00-00-00-08-40-01-33-00-00-00-00-00-00-00-10-40-01-34-00-00-00-00-00-00-00-14-50-01-35-00-00-00-00-00-00-00-18-40-01-36-00-00-00-00-00-00-00-1C-40-01-37-00-00-00-00-00-00-00-20-40-00-02-62-00-05-00-00-00-74-65-73-74-00-00";
 
199
      string bson = MiscellaneousUtils.BytesToHex(ms.ToArray());
 
200
 
 
201
      Assert.AreEqual(expected, bson);
 
202
    }
 
203
 
 
204
    [Test]
 
205
    public void WriteSerializedStore()
 
206
    {
 
207
      MemoryStream ms = new MemoryStream();
 
208
      BsonWriter writer = new BsonWriter(ms);
 
209
 
 
210
      Store s1 = new Store();
 
211
      s1.Color = StoreColor.White;
 
212
      s1.Cost = 999.59m;
 
213
      s1.Employees = int.MaxValue - 1;
 
214
      s1.Open = true;
 
215
      s1.product.Add(new Product
 
216
                       {
 
217
                         ExpiryDate = new DateTime(2000, 9, 28, 3, 59, 58, DateTimeKind.Local),
 
218
                         Name = "BSON!",
 
219
                         Price = -0.1m,
 
220
                         Sizes = new [] { "First", "Second" }
 
221
                       });
 
222
      s1.Establised = new DateTime(2000, 1, 1, 0, 0, 0, DateTimeKind.Local);
 
223
 
 
224
      JsonSerializer serializer = new JsonSerializer();
 
225
      serializer.Serialize(writer, s1);
 
226
 
 
227
      ms.Seek(0, SeekOrigin.Begin);
 
228
      BsonReader reader = new BsonReader(ms);
 
229
      Store s2 = (Store)serializer.Deserialize(reader, typeof (Store));
 
230
 
 
231
      Assert.AreNotEqual(s1, s2);
 
232
      Assert.AreEqual(s1.Color, s2.Color);
 
233
      Assert.AreEqual(s1.Cost, s2.Cost);
 
234
      Assert.AreEqual(s1.Employees, s2.Employees);
 
235
      Assert.AreEqual(s1.Escape, s2.Escape);
 
236
      Assert.AreEqual(s1.Establised, s2.Establised);
 
237
      Assert.AreEqual(s1.Mottos.Count, s2.Mottos.Count);
 
238
      Assert.AreEqual(s1.Mottos.First(), s2.Mottos.First());
 
239
      Assert.AreEqual(s1.Mottos.Last(), s2.Mottos.Last());
 
240
      Assert.AreEqual(s1.Open, s2.Open);
 
241
      Assert.AreEqual(s1.product.Count, s2.product.Count);
 
242
      Assert.AreEqual(s1.RoomsPerFloor.Length, s2.RoomsPerFloor.Length);
 
243
      Assert.AreEqual(s1.Symbol, s2.Symbol);
 
244
      Assert.AreEqual(s1.Width, s2.Width);
 
245
 
 
246
      MemoryStream ms1 = new MemoryStream();
 
247
      BsonWriter writer1 = new BsonWriter(ms1);
 
248
 
 
249
      serializer.Serialize(writer1, s1);
 
250
 
 
251
      CollectionAssert.AreEquivalent(ms.ToArray(), ms1.ToArray());
 
252
 
 
253
      string s = JsonConvert.SerializeObject(s1);
 
254
      byte[] textData = Encoding.UTF8.GetBytes(s);
 
255
 
 
256
      int l1 = textData.Length;
 
257
      int l2 = ms.ToArray().Length;
 
258
 
 
259
      Console.WriteLine(l1);
 
260
      Console.WriteLine(l2);
 
261
    }
 
262
 
 
263
    [Test]
 
264
    public void WriteLargeStrings()
 
265
    {
 
266
      MemoryStream ms = new MemoryStream();
 
267
      BsonWriter writer = new BsonWriter(ms);
 
268
 
 
269
      StringBuilder largeStringBuilder = new StringBuilder();
 
270
      for (int i = 0; i < 100; i++)
 
271
      {
 
272
        if (i > 0)
 
273
          largeStringBuilder.Append("-");
 
274
 
 
275
        largeStringBuilder.Append(i.ToString(CultureInfo.InvariantCulture));
 
276
      }
 
277
      string largeString = largeStringBuilder.ToString();
 
278
 
 
279
      writer.WriteStartObject();
 
280
      writer.WritePropertyName(largeString);
 
281
      writer.WriteValue(largeString);
 
282
      writer.WriteEndObject();
 
283
 
 
284
      string bson = MiscellaneousUtils.BytesToHex(ms.ToArray());
 
285
      Assert.AreEqual("4E-02-00-00-02-30-2D-31-2D-32-2D-33-2D-34-2D-35-2D-36-2D-37-2D-38-2D-39-2D-31-30-2D-31-31-2D-31-32-2D-31-33-2D-31-34-2D-31-35-2D-31-36-2D-31-37-2D-31-38-2D-31-39-2D-32-30-2D-32-31-2D-32-32-2D-32-33-2D-32-34-2D-32-35-2D-32-36-2D-32-37-2D-32-38-2D-32-39-2D-33-30-2D-33-31-2D-33-32-2D-33-33-2D-33-34-2D-33-35-2D-33-36-2D-33-37-2D-33-38-2D-33-39-2D-34-30-2D-34-31-2D-34-32-2D-34-33-2D-34-34-2D-34-35-2D-34-36-2D-34-37-2D-34-38-2D-34-39-2D-35-30-2D-35-31-2D-35-32-2D-35-33-2D-35-34-2D-35-35-2D-35-36-2D-35-37-2D-35-38-2D-35-39-2D-36-30-2D-36-31-2D-36-32-2D-36-33-2D-36-34-2D-36-35-2D-36-36-2D-36-37-2D-36-38-2D-36-39-2D-37-30-2D-37-31-2D-37-32-2D-37-33-2D-37-34-2D-37-35-2D-37-36-2D-37-37-2D-37-38-2D-37-39-2D-38-30-2D-38-31-2D-38-32-2D-38-33-2D-38-34-2D-38-35-2D-38-36-2D-38-37-2D-38-38-2D-38-39-2D-39-30-2D-39-31-2D-39-32-2D-39-33-2D-39-34-2D-39-35-2D-39-36-2D-39-37-2D-39-38-2D-39-39-00-22-01-00-00-30-2D-31-2D-32-2D-33-2D-34-2D-35-2D-36-2D-37-2D-38-2D-39-2D-31-30-2D-31-31-2D-31-32-2D-31-33-2D-31-34-2D-31-35-2D-31-36-2D-31-37-2D-31-38-2D-31-39-2D-32-30-2D-32-31-2D-32-32-2D-32-33-2D-32-34-2D-32-35-2D-32-36-2D-32-37-2D-32-38-2D-32-39-2D-33-30-2D-33-31-2D-33-32-2D-33-33-2D-33-34-2D-33-35-2D-33-36-2D-33-37-2D-33-38-2D-33-39-2D-34-30-2D-34-31-2D-34-32-2D-34-33-2D-34-34-2D-34-35-2D-34-36-2D-34-37-2D-34-38-2D-34-39-2D-35-30-2D-35-31-2D-35-32-2D-35-33-2D-35-34-2D-35-35-2D-35-36-2D-35-37-2D-35-38-2D-35-39-2D-36-30-2D-36-31-2D-36-32-2D-36-33-2D-36-34-2D-36-35-2D-36-36-2D-36-37-2D-36-38-2D-36-39-2D-37-30-2D-37-31-2D-37-32-2D-37-33-2D-37-34-2D-37-35-2D-37-36-2D-37-37-2D-37-38-2D-37-39-2D-38-30-2D-38-31-2D-38-32-2D-38-33-2D-38-34-2D-38-35-2D-38-36-2D-38-37-2D-38-38-2D-38-39-2D-39-30-2D-39-31-2D-39-32-2D-39-33-2D-39-34-2D-39-35-2D-39-36-2D-39-37-2D-39-38-2D-39-39-00-00", bson);
 
286
    }
 
287
 
 
288
    [Test]
 
289
    public void SerializeGoogleGeoCode()
 
290
    {
 
291
      string json = @"{
 
292
  ""name"": ""1600 Amphitheatre Parkway, Mountain View, CA, USA"",
 
293
  ""Status"": {
 
294
    ""code"": 200,
 
295
    ""request"": ""geocode""
 
296
  },
 
297
  ""Placemark"": [
 
298
    {
 
299
      ""address"": ""1600 Amphitheatre Pkwy, Mountain View, CA 94043, USA"",
 
300
      ""AddressDetails"": {
 
301
        ""Country"": {
 
302
          ""CountryNameCode"": ""US"",
 
303
          ""AdministrativeArea"": {
 
304
            ""AdministrativeAreaName"": ""CA"",
 
305
            ""SubAdministrativeArea"": {
 
306
              ""SubAdministrativeAreaName"": ""Santa Clara"",
 
307
              ""Locality"": {
 
308
                ""LocalityName"": ""Mountain View"",
 
309
                ""Thoroughfare"": {
 
310
                  ""ThoroughfareName"": ""1600 Amphitheatre Pkwy""
 
311
                },
 
312
                ""PostalCode"": {
 
313
                  ""PostalCodeNumber"": ""94043""
 
314
                }
 
315
              }
 
316
            }
 
317
          }
 
318
        },
 
319
        ""Accuracy"": 8
 
320
      },
 
321
      ""Point"": {
 
322
        ""coordinates"": [-122.083739, 37.423021, 0]
 
323
      }
 
324
    }
 
325
  ]
 
326
}";
 
327
 
 
328
      GoogleMapGeocoderStructure jsonGoogleMapGeocoder = JsonConvert.DeserializeObject<GoogleMapGeocoderStructure>(json);
 
329
 
 
330
      MemoryStream ms = new MemoryStream();
 
331
      BsonWriter writer = new BsonWriter(ms);
 
332
 
 
333
      JsonSerializer serializer = new JsonSerializer();
 
334
      serializer.Serialize(writer, jsonGoogleMapGeocoder);
 
335
 
 
336
      ms.Seek(0, SeekOrigin.Begin);
 
337
      BsonReader reader = new BsonReader(ms);
 
338
      GoogleMapGeocoderStructure bsonGoogleMapGeocoder = (GoogleMapGeocoderStructure)serializer.Deserialize(reader, typeof (GoogleMapGeocoderStructure));
 
339
 
 
340
      Assert.IsNotNull(bsonGoogleMapGeocoder);
 
341
      Assert.AreEqual("1600 Amphitheatre Parkway, Mountain View, CA, USA", bsonGoogleMapGeocoder.Name);
 
342
      Assert.AreEqual("200", bsonGoogleMapGeocoder.Status.Code);
 
343
      Assert.AreEqual("geocode", bsonGoogleMapGeocoder.Status.Request);
 
344
 
 
345
      IList<Placemark> placemarks = bsonGoogleMapGeocoder.Placemark;
 
346
      Assert.IsNotNull(placemarks);
 
347
      Assert.AreEqual(1, placemarks.Count);
 
348
 
 
349
      Placemark placemark = placemarks[0];
 
350
      Assert.AreEqual("1600 Amphitheatre Pkwy, Mountain View, CA 94043, USA", placemark.Address);
 
351
      Assert.AreEqual(8, placemark.AddressDetails.Accuracy);
 
352
      Assert.AreEqual("US", placemark.AddressDetails.Country.CountryNameCode);
 
353
      Assert.AreEqual("CA", placemark.AddressDetails.Country.AdministrativeArea.AdministrativeAreaName);
 
354
      Assert.AreEqual("Santa Clara", placemark.AddressDetails.Country.AdministrativeArea.SubAdministrativeArea.SubAdministrativeAreaName);
 
355
      Assert.AreEqual("Mountain View", placemark.AddressDetails.Country.AdministrativeArea.SubAdministrativeArea.Locality.LocalityName);
 
356
      Assert.AreEqual("1600 Amphitheatre Pkwy", placemark.AddressDetails.Country.AdministrativeArea.SubAdministrativeArea.Locality.Thoroughfare.ThoroughfareName);
 
357
      Assert.AreEqual("94043", placemark.AddressDetails.Country.AdministrativeArea.SubAdministrativeArea.Locality.PostalCode.PostalCodeNumber);
 
358
      Assert.AreEqual(-122.083739m, placemark.Point.Coordinates[0]);
 
359
      Assert.AreEqual(37.423021m, placemark.Point.Coordinates[1]);
 
360
      Assert.AreEqual(0m, placemark.Point.Coordinates[2]);
 
361
    }
 
362
 
 
363
    [Test]
 
364
    public void WriteEmptyStrings()
 
365
    {
 
366
      MemoryStream ms = new MemoryStream();
 
367
      BsonWriter writer = new BsonWriter(ms);
 
368
 
 
369
      writer.WriteStartObject();
 
370
      writer.WritePropertyName("");
 
371
      writer.WriteValue("");
 
372
      writer.WriteEndObject();
 
373
 
 
374
      string bson = MiscellaneousUtils.BytesToHex(ms.ToArray());
 
375
      Assert.AreEqual("0C-00-00-00-02-00-01-00-00-00-00-00", bson);
 
376
    }
 
377
 
 
378
    [Test]
 
379
    public void WriteComment()
 
380
    {
 
381
      ExceptionAssert.Throws<JsonWriterException>("Cannot write JSON comment as BSON. Path ''.",
 
382
      () =>
 
383
      {
 
384
        MemoryStream ms = new MemoryStream();
 
385
        BsonWriter writer = new BsonWriter(ms);
 
386
 
 
387
        writer.WriteStartArray();
 
388
        writer.WriteComment("fail");
 
389
      });
 
390
    }
 
391
 
 
392
    [Test]
 
393
    public void WriteConstructor()
 
394
    {
 
395
      ExceptionAssert.Throws<JsonWriterException>("Cannot write JSON constructor as BSON. Path ''.",
 
396
      () =>
 
397
      {
 
398
        MemoryStream ms = new MemoryStream();
 
399
        BsonWriter writer = new BsonWriter(ms);
 
400
 
 
401
        writer.WriteStartArray();
 
402
        writer.WriteStartConstructor("fail");
 
403
      });
 
404
    }
 
405
 
 
406
    [Test]
 
407
    public void WriteRaw()
 
408
    {
 
409
      ExceptionAssert.Throws<JsonWriterException>("Cannot write raw JSON as BSON. Path ''.",
 
410
      () =>
 
411
      {
 
412
        MemoryStream ms = new MemoryStream();
 
413
        BsonWriter writer = new BsonWriter(ms);
 
414
 
 
415
        writer.WriteStartArray();
 
416
        writer.WriteRaw("fail");
 
417
      });
 
418
    }
 
419
 
 
420
    [Test]
 
421
    public void WriteRawValue()
 
422
    {
 
423
      ExceptionAssert.Throws<JsonWriterException>("Cannot write raw JSON as BSON. Path ''.",
 
424
      () =>
 
425
      {
 
426
        MemoryStream ms = new MemoryStream();
 
427
        BsonWriter writer = new BsonWriter(ms);
 
428
 
 
429
        writer.WriteStartArray();
 
430
        writer.WriteRawValue("fail");
 
431
      });
 
432
    }
 
433
 
 
434
    [Test]
 
435
    public void Example()
 
436
    {
 
437
      Product p = new Product();
 
438
      p.ExpiryDate = DateTime.Parse("2009-04-05T14:45:00Z");
 
439
      p.Name = "Carlos' Spicy Wieners";
 
440
      p.Price = 9.95m;
 
441
      p.Sizes = new[] { "Small", "Medium", "Large" };
 
442
 
 
443
      MemoryStream ms = new MemoryStream();
 
444
      JsonSerializer serializer = new JsonSerializer();
 
445
 
 
446
      // serialize product to BSON
 
447
      BsonWriter writer = new BsonWriter(ms);
 
448
      serializer.Serialize(writer, p);
 
449
 
 
450
      Console.WriteLine(BitConverter.ToString(ms.ToArray()));
 
451
      // 7C-00-00-00-02-4E-61-6D-65-00-16-00-00-00-43-61-72-6C-
 
452
      // 6F-73-27-20-53-70-69-63-79-20-57-69-65-6E-65-72-73-00-
 
453
      // 09-45-78-70-69-72-79-44-61-74-65-00-E0-51-BD-76-20-01-
 
454
      // 00-00-01-50-72-69-63-65-00-66-66-66-66-66-E6-23-40-04-
 
455
      // 53-69-7A-65-73-00-2D-00-00-00-02-30-00-06-00-00-00-53-
 
456
      // 6D-61-6C-6C-00-02-31-00-07-00-00-00-4D-65-64-69-75-6D-
 
457
      // 00-02-32-00-06-00-00-00-4C-61-72-67-65-00-00-00
 
458
 
 
459
 
 
460
      ms.Seek(0, SeekOrigin.Begin);
 
461
 
 
462
      // deserialize product from BSON
 
463
      BsonReader reader = new BsonReader(ms);
 
464
      Product deserializedProduct = serializer.Deserialize<Product>(reader);
 
465
 
 
466
      Console.WriteLine(deserializedProduct.Name);
 
467
      // Carlos' Spicy Wieners
 
468
 
 
469
 
 
470
      Assert.AreEqual("Carlos' Spicy Wieners", deserializedProduct.Name);
 
471
      Assert.AreEqual(9.95m, deserializedProduct.Price);
 
472
      Assert.AreEqual(3, deserializedProduct.Sizes.Length);
 
473
    }
 
474
 
 
475
    [Test]
 
476
    public void WriteOid()
 
477
    {
 
478
      MemoryStream ms = new MemoryStream();
 
479
      BsonWriter writer = new BsonWriter(ms);
 
480
 
 
481
      byte[] oid = new byte[] {1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12};
 
482
 
 
483
      writer.WriteStartObject();
 
484
      writer.WritePropertyName("_oid");
 
485
      writer.WriteObjectId(oid);
 
486
      writer.WriteEndObject();
 
487
 
 
488
      string bson = MiscellaneousUtils.BytesToHex(ms.ToArray());
 
489
      Assert.AreEqual("17-00-00-00-07-5F-6F-69-64-00-01-02-03-04-05-06-07-08-09-0A-0B-0C-00", bson);
 
490
 
 
491
      ms.Seek(0, SeekOrigin.Begin);
 
492
      BsonReader reader = new BsonReader(ms);
 
493
 
 
494
      Assert.IsTrue(reader.Read());
 
495
      Assert.AreEqual(JsonToken.StartObject, reader.TokenType);
 
496
 
 
497
      Assert.IsTrue(reader.Read());
 
498
      Assert.AreEqual(JsonToken.PropertyName, reader.TokenType);
 
499
 
 
500
      Assert.IsTrue(reader.Read());
 
501
      Assert.AreEqual(JsonToken.Bytes, reader.TokenType);
 
502
      CollectionAssert.AreEquivalent(oid, (byte[])reader.Value);
 
503
 
 
504
      Assert.IsTrue(reader.Read());
 
505
      Assert.AreEqual(JsonToken.EndObject, reader.TokenType);
 
506
    }
 
507
 
 
508
    [Test]
 
509
    public void WriteOidPlusContent()
 
510
    {
 
511
      MemoryStream ms = new MemoryStream();
 
512
      BsonWriter writer = new BsonWriter(ms);
 
513
 
 
514
      writer.WriteStartObject();
 
515
      writer.WritePropertyName("_id");
 
516
      writer.WriteObjectId(MiscellaneousUtils.HexToBytes("4ABBED9D1D8B0F0218000001"));
 
517
      writer.WritePropertyName("test");
 
518
      writer.WriteValue("1234£56");
 
519
      writer.WriteEndObject();
 
520
 
 
521
      byte[] expected = MiscellaneousUtils.HexToBytes("29000000075F6964004ABBED9D1D8B0F02180000010274657374000900000031323334C2A335360000");
 
522
 
 
523
      CollectionAssert.AreEquivalent(expected, ms.ToArray());
 
524
    }
 
525
 
 
526
    [Test]
 
527
    public void WriteRegexPlusContent()
 
528
    {
 
529
      MemoryStream ms = new MemoryStream();
 
530
      BsonWriter writer = new BsonWriter(ms);
 
531
 
 
532
      writer.WriteStartObject();
 
533
      writer.WritePropertyName("regex");
 
534
      writer.WriteRegex("abc", "i");
 
535
      writer.WritePropertyName("test");
 
536
      writer.WriteRegex(string.Empty, null);
 
537
      writer.WriteEndObject();
 
538
 
 
539
      byte[] expected = MiscellaneousUtils.HexToBytes("1A-00-00-00-0B-72-65-67-65-78-00-61-62-63-00-69-00-0B-74-65-73-74-00-00-00-00");
 
540
 
 
541
      CollectionAssert.AreEquivalent(expected, ms.ToArray());
 
542
    }
 
543
 
 
544
    [Test]
 
545
    public void SerializeEmptyAndNullStrings()
 
546
    {
 
547
      Product p = new Product();
 
548
      p.ExpiryDate = DateTime.Parse("2009-04-05T14:45:00Z");
 
549
      p.Name = null;
 
550
      p.Price = 9.95m;
 
551
      p.Sizes = new[] { "Small", "", null };
 
552
 
 
553
      MemoryStream ms = new MemoryStream();
 
554
      JsonSerializer serializer = new JsonSerializer();
 
555
 
 
556
      BsonWriter writer = new BsonWriter(ms);
 
557
      serializer.Serialize(writer, p);
 
558
 
 
559
      ms.Seek(0, SeekOrigin.Begin);
 
560
 
 
561
      BsonReader reader = new BsonReader(ms);
 
562
      Product deserializedProduct = serializer.Deserialize<Product>(reader);
 
563
 
 
564
      Console.WriteLine(deserializedProduct.Name);
 
565
 
 
566
      Assert.AreEqual(null, deserializedProduct.Name);
 
567
      Assert.AreEqual(9.95m, deserializedProduct.Price);
 
568
      Assert.AreEqual(3, deserializedProduct.Sizes.Length);
 
569
      Assert.AreEqual("Small", deserializedProduct.Sizes[0]);
 
570
      Assert.AreEqual("", deserializedProduct.Sizes[1]);
 
571
      Assert.AreEqual(null, deserializedProduct.Sizes[2]);
 
572
    }
 
573
 
 
574
    [Test]
 
575
    public void WriteReadEmptyAndNullStrings()
 
576
    {
 
577
      MemoryStream ms = new MemoryStream();
 
578
      BsonWriter writer = new BsonWriter(ms);
 
579
 
 
580
      writer.WriteStartArray();
 
581
      writer.WriteValue("Content!");
 
582
      writer.WriteValue("");
 
583
      writer.WriteValue((string)null);
 
584
      writer.WriteEndArray();
 
585
 
 
586
      ms.Seek(0, SeekOrigin.Begin);
 
587
 
 
588
      BsonReader reader = new BsonReader(ms);
 
589
      reader.ReadRootValueAsArray = true;
 
590
 
 
591
      Assert.IsTrue(reader.Read());
 
592
      Assert.AreEqual(JsonToken.StartArray, reader.TokenType);
 
593
 
 
594
      Assert.IsTrue(reader.Read());
 
595
      Assert.AreEqual(JsonToken.String, reader.TokenType);
 
596
      Assert.AreEqual("Content!", reader.Value);
 
597
 
 
598
      Assert.IsTrue(reader.Read());
 
599
      Assert.AreEqual(JsonToken.String, reader.TokenType);
 
600
      Assert.AreEqual("", reader.Value);
 
601
 
 
602
      Assert.IsTrue(reader.Read());
 
603
      Assert.AreEqual(JsonToken.Null, reader.TokenType);
 
604
      Assert.AreEqual(null, reader.Value);
 
605
 
 
606
      Assert.IsTrue(reader.Read());
 
607
      Assert.AreEqual(JsonToken.EndArray, reader.TokenType);
 
608
 
 
609
      Assert.IsFalse(reader.Read());
 
610
    }
 
611
 
 
612
    [Test]
 
613
    public void WriteDateTimes()
 
614
    {
 
615
      MemoryStream ms = new MemoryStream();
 
616
      BsonWriter writer = new BsonWriter(ms);
 
617
      writer.DateTimeKindHandling = DateTimeKind.Unspecified;
 
618
 
 
619
      writer.WriteStartArray();
 
620
      writer.WriteValue(new DateTime(2000, 10, 12, 20, 55, 0, DateTimeKind.Utc));
 
621
      writer.WriteValue(new DateTime(2000, 10, 12, 20, 55, 0, DateTimeKind.Local));
 
622
      writer.WriteValue(new DateTime(2000, 10, 12, 20, 55, 0, DateTimeKind.Unspecified));
 
623
      writer.WriteEndArray();
 
624
 
 
625
      ms.Seek(0, SeekOrigin.Begin);
 
626
 
 
627
      BsonReader reader = new BsonReader(ms);
 
628
      reader.ReadRootValueAsArray = true;
 
629
      reader.DateTimeKindHandling = DateTimeKind.Utc;
 
630
 
 
631
      Assert.IsTrue(reader.Read());
 
632
      Assert.AreEqual(JsonToken.StartArray, reader.TokenType);
 
633
 
 
634
      Assert.IsTrue(reader.Read());
 
635
      Assert.AreEqual(JsonToken.Date, reader.TokenType);
 
636
      Assert.AreEqual(new DateTime(2000, 10, 12, 20, 55, 0, DateTimeKind.Utc), reader.Value);
 
637
 
 
638
      Assert.IsTrue(reader.Read());
 
639
      Assert.AreEqual(JsonToken.Date, reader.TokenType);
 
640
      Assert.AreEqual(new DateTime(2000, 10, 12, 20, 55, 0, DateTimeKind.Utc), reader.Value);
 
641
 
 
642
      Assert.IsTrue(reader.Read());
 
643
      Assert.AreEqual(JsonToken.Date, reader.TokenType);
 
644
      Assert.AreEqual(new DateTime(2000, 10, 12, 20, 55, 0, DateTimeKind.Utc), reader.Value);
 
645
 
 
646
      Assert.IsTrue(reader.Read());
 
647
      Assert.AreEqual(JsonToken.EndArray, reader.TokenType);
 
648
 
 
649
      Assert.IsFalse(reader.Read());
 
650
    }
 
651
 
 
652
    [Test]
 
653
    public void WriteValueOutsideOfObjectOrArray()
 
654
    {
 
655
      ExceptionAssert.Throws<JsonWriterException>("Error writing String value. BSON must start with an Object or Array. Path ''.",
 
656
      () =>
 
657
      {
 
658
        MemoryStream stream = new MemoryStream();
 
659
 
 
660
        using (BsonWriter writer = new BsonWriter(stream))
 
661
        {
 
662
          writer.WriteValue("test");
 
663
          writer.Flush();
 
664
        }
 
665
      });
 
666
    }
 
667
 
 
668
    [Test]
 
669
    public void DateTimeZoneHandling()
 
670
    {
 
671
      MemoryStream ms = new MemoryStream();
 
672
      JsonWriter writer = new BsonWriter(ms)
 
673
      {
 
674
        DateTimeZoneHandling = Json.DateTimeZoneHandling.Utc
 
675
      };
 
676
 
 
677
      writer.WriteStartArray();
 
678
      writer.WriteValue(new DateTime(2000, 1, 1, 1, 1, 1, DateTimeKind.Unspecified));
 
679
      writer.WriteEndArray();
 
680
 
 
681
      Assert.AreEqual("10-00-00-00-09-30-00-C8-88-07-6B-DC-00-00-00-00", (BitConverter.ToString(ms.ToArray())));
 
682
    }
 
683
  }
 
684
}
 
 
b'\\ No newline at end of file'