PageRenderTime 32ms CodeModel.GetById 15ms RepoModel.GetById 0ms app.codeStats 0ms

/src/MongoDB.Bson.Tests/IO/JsonReaderTests.cs

http://github.com/mongodb/mongo-csharp-driver
C# | 917 lines | 824 code | 78 blank | 15 comment | 3 complexity | b7c834bfc2c28692c34901e4a9cef32c MD5 | raw file
Possible License(s): Apache-2.0
  1. /* Copyright 2010-2014 MongoDB Inc.
  2. *
  3. * Licensed under the Apache License, Version 2.0 (the "License");
  4. * you may not use this file except in compliance with the License.
  5. * You may obtain a copy of the License at
  6. *
  7. * http://www.apache.org/licenses/LICENSE-2.0
  8. *
  9. * Unless required by applicable law or agreed to in writing, software
  10. * distributed under the License is distributed on an "AS IS" BASIS,
  11. * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
  12. * See the License for the specific language governing permissions and
  13. * limitations under the License.
  14. */
  15. using System;
  16. using System.Collections.Generic;
  17. using System.IO;
  18. using System.Linq;
  19. using System.Text;
  20. using MongoDB.Bson.IO;
  21. using MongoDB.Bson.Serialization;
  22. using FluentAssertions;
  23. using NUnit.Framework;
  24. namespace MongoDB.Bson.Tests.IO
  25. {
  26. [TestFixture]
  27. public class JsonReaderTests
  28. {
  29. private IBsonReader _bsonReader;
  30. [Test]
  31. public void JsonReader_should_support_reading_multiple_documents(
  32. [Range(0, 3)]
  33. int numberOfDocuments)
  34. {
  35. var document = new BsonDocument("x", 1);
  36. var json = document.ToJson();
  37. var input = Enumerable.Repeat(json, numberOfDocuments).Aggregate("", (a, j) => a + j);
  38. var expectedResult = Enumerable.Repeat(document, numberOfDocuments);
  39. using (var jsonReader = new JsonReader(input))
  40. {
  41. var result = new List<BsonDocument>();
  42. while (!jsonReader.IsAtEndOfFile())
  43. {
  44. jsonReader.ReadStartDocument();
  45. var name = jsonReader.ReadName();
  46. var value = jsonReader.ReadInt32();
  47. jsonReader.ReadEndDocument();
  48. var resultDocument = new BsonDocument(name, value);
  49. result.Add(resultDocument);
  50. }
  51. result.Should().Equal(expectedResult);
  52. }
  53. }
  54. [Test]
  55. public void TestArrayEmpty()
  56. {
  57. var json = "[]";
  58. using (_bsonReader = new JsonReader(json))
  59. {
  60. Assert.AreEqual(BsonType.Array, _bsonReader.ReadBsonType());
  61. _bsonReader.ReadStartArray();
  62. Assert.AreEqual(BsonType.EndOfDocument, _bsonReader.ReadBsonType());
  63. _bsonReader.ReadEndArray();
  64. Assert.AreEqual(BsonReaderState.Initial, _bsonReader.State);
  65. }
  66. Assert.AreEqual(json, BsonSerializer.Deserialize<BsonArray>(json).ToJson());
  67. }
  68. [Test]
  69. public void TestArrayOneElement()
  70. {
  71. var json = "[1]";
  72. using (_bsonReader = new JsonReader(json))
  73. {
  74. Assert.AreEqual(BsonType.Array, _bsonReader.ReadBsonType());
  75. _bsonReader.ReadStartArray();
  76. Assert.AreEqual(BsonType.Int32, _bsonReader.ReadBsonType());
  77. Assert.AreEqual(1, _bsonReader.ReadInt32());
  78. Assert.AreEqual(BsonType.EndOfDocument, _bsonReader.ReadBsonType());
  79. _bsonReader.ReadEndArray();
  80. Assert.AreEqual(BsonReaderState.Initial, _bsonReader.State);
  81. }
  82. Assert.AreEqual(json, BsonSerializer.Deserialize<BsonArray>(json).ToJson());
  83. }
  84. [Test]
  85. public void TestArrayTwoElements()
  86. {
  87. var json = "[1, 2]";
  88. using (_bsonReader = new JsonReader(json))
  89. {
  90. Assert.AreEqual(BsonType.Array, _bsonReader.ReadBsonType());
  91. _bsonReader.ReadStartArray();
  92. Assert.AreEqual(BsonType.Int32, _bsonReader.ReadBsonType());
  93. Assert.AreEqual(1, _bsonReader.ReadInt32());
  94. Assert.AreEqual(BsonType.Int32, _bsonReader.ReadBsonType());
  95. Assert.AreEqual(2, _bsonReader.ReadInt32());
  96. Assert.AreEqual(BsonType.EndOfDocument, _bsonReader.ReadBsonType());
  97. _bsonReader.ReadEndArray();
  98. Assert.AreEqual(BsonReaderState.Initial, _bsonReader.State);
  99. }
  100. Assert.AreEqual(json, BsonSerializer.Deserialize<BsonArray>(json).ToJson());
  101. }
  102. [Test]
  103. public void TestBookmark()
  104. {
  105. var json = "{ \"x\" : 1, \"y\" : 2 }";
  106. using (_bsonReader = new JsonReader(json))
  107. {
  108. // do everything twice returning to bookmark in between
  109. var bookmark = _bsonReader.GetBookmark();
  110. Assert.AreEqual(BsonType.Document, _bsonReader.ReadBsonType());
  111. _bsonReader.ReturnToBookmark(bookmark);
  112. Assert.AreEqual(BsonType.Document, _bsonReader.ReadBsonType());
  113. bookmark = _bsonReader.GetBookmark();
  114. _bsonReader.ReadStartDocument();
  115. _bsonReader.ReturnToBookmark(bookmark);
  116. _bsonReader.ReadStartDocument();
  117. bookmark = _bsonReader.GetBookmark();
  118. Assert.AreEqual(BsonType.Int32, _bsonReader.ReadBsonType());
  119. _bsonReader.ReturnToBookmark(bookmark);
  120. Assert.AreEqual(BsonType.Int32, _bsonReader.ReadBsonType());
  121. bookmark = _bsonReader.GetBookmark();
  122. Assert.AreEqual("x", _bsonReader.ReadName());
  123. _bsonReader.ReturnToBookmark(bookmark);
  124. Assert.AreEqual("x", _bsonReader.ReadName());
  125. bookmark = _bsonReader.GetBookmark();
  126. Assert.AreEqual(1, _bsonReader.ReadInt32());
  127. _bsonReader.ReturnToBookmark(bookmark);
  128. Assert.AreEqual(1, _bsonReader.ReadInt32());
  129. bookmark = _bsonReader.GetBookmark();
  130. Assert.AreEqual(BsonType.Int32, _bsonReader.ReadBsonType());
  131. _bsonReader.ReturnToBookmark(bookmark);
  132. Assert.AreEqual(BsonType.Int32, _bsonReader.ReadBsonType());
  133. bookmark = _bsonReader.GetBookmark();
  134. Assert.AreEqual("y", _bsonReader.ReadName());
  135. _bsonReader.ReturnToBookmark(bookmark);
  136. Assert.AreEqual("y", _bsonReader.ReadName());
  137. bookmark = _bsonReader.GetBookmark();
  138. Assert.AreEqual(2, _bsonReader.ReadInt32());
  139. _bsonReader.ReturnToBookmark(bookmark);
  140. Assert.AreEqual(2, _bsonReader.ReadInt32());
  141. bookmark = _bsonReader.GetBookmark();
  142. Assert.AreEqual(BsonType.EndOfDocument, _bsonReader.ReadBsonType());
  143. _bsonReader.ReturnToBookmark(bookmark);
  144. Assert.AreEqual(BsonType.EndOfDocument, _bsonReader.ReadBsonType());
  145. bookmark = _bsonReader.GetBookmark();
  146. _bsonReader.ReadEndDocument();
  147. _bsonReader.ReturnToBookmark(bookmark);
  148. _bsonReader.ReadEndDocument();
  149. Assert.AreEqual(BsonReaderState.Initial, _bsonReader.State);
  150. }
  151. Assert.AreEqual(json, BsonSerializer.Deserialize<BsonDocument>(json).ToJson());
  152. }
  153. [Test]
  154. public void TestBooleanFalse()
  155. {
  156. var json = "false";
  157. using (_bsonReader = new JsonReader(json))
  158. {
  159. Assert.AreEqual(BsonType.Boolean, _bsonReader.ReadBsonType());
  160. Assert.AreEqual(false, _bsonReader.ReadBoolean());
  161. Assert.AreEqual(BsonReaderState.Initial, _bsonReader.State);
  162. }
  163. Assert.AreEqual(json, BsonSerializer.Deserialize<bool>(json).ToJson());
  164. }
  165. [Test]
  166. public void TestBooleanTrue()
  167. {
  168. var json = "true";
  169. using (_bsonReader = new JsonReader(json))
  170. {
  171. Assert.AreEqual(BsonType.Boolean, _bsonReader.ReadBsonType());
  172. Assert.AreEqual(true, _bsonReader.ReadBoolean());
  173. Assert.AreEqual(BsonReaderState.Initial, _bsonReader.State);
  174. }
  175. Assert.AreEqual(json, BsonSerializer.Deserialize<bool>(json).ToJson());
  176. }
  177. [Test]
  178. public void TestDateTimeMinBson()
  179. {
  180. var json = "new Date(-9223372036854775808)";
  181. using (_bsonReader = new JsonReader(json))
  182. {
  183. Assert.AreEqual(BsonType.DateTime, _bsonReader.ReadBsonType());
  184. Assert.AreEqual(-9223372036854775808, _bsonReader.ReadDateTime());
  185. Assert.AreEqual(BsonReaderState.Initial, _bsonReader.State);
  186. }
  187. Assert.AreEqual(json, BsonSerializer.Deserialize<BsonDateTime>(json).ToJson());
  188. }
  189. [Test]
  190. public void TestDateTimeMaxBson()
  191. {
  192. var json = "new Date(9223372036854775807)";
  193. using (_bsonReader = new JsonReader(json))
  194. {
  195. Assert.AreEqual(BsonType.DateTime, _bsonReader.ReadBsonType());
  196. Assert.AreEqual(9223372036854775807, _bsonReader.ReadDateTime());
  197. Assert.AreEqual(BsonReaderState.Initial, _bsonReader.State);
  198. }
  199. Assert.AreEqual(json, BsonSerializer.Deserialize<BsonDateTime>(json).ToJson());
  200. }
  201. [Test]
  202. public void TestDateTimeShell()
  203. {
  204. var json = "ISODate(\"1970-01-01T00:00:00Z\")";
  205. using (_bsonReader = new JsonReader(json))
  206. {
  207. Assert.AreEqual(BsonType.DateTime, _bsonReader.ReadBsonType());
  208. Assert.AreEqual(0, _bsonReader.ReadDateTime());
  209. Assert.AreEqual(BsonReaderState.Initial, _bsonReader.State);
  210. }
  211. var jsonSettings = new JsonWriterSettings { OutputMode = JsonOutputMode.Shell };
  212. Assert.AreEqual(json, BsonSerializer.Deserialize<DateTime>(json).ToJson(jsonSettings));
  213. }
  214. [Test]
  215. public void TestDateTimeStrict()
  216. {
  217. var json = "{ \"$date\" : 0 }";
  218. using (_bsonReader = new JsonReader(json))
  219. {
  220. Assert.AreEqual(BsonType.DateTime, _bsonReader.ReadBsonType());
  221. Assert.AreEqual(0, _bsonReader.ReadDateTime());
  222. Assert.AreEqual(BsonReaderState.Initial, _bsonReader.State);
  223. }
  224. var jsonSettings = new JsonWriterSettings { OutputMode = JsonOutputMode.Strict };
  225. Assert.AreEqual(json, BsonSerializer.Deserialize<DateTime>(json).ToJson(jsonSettings));
  226. }
  227. [Test]
  228. public void TestDateTimeStrictIso8601()
  229. {
  230. var json = "{ \"$date\" : \"1970-01-01T00:00:00Z\" }";
  231. using (_bsonReader = new JsonReader(json))
  232. {
  233. Assert.AreEqual(BsonType.DateTime, _bsonReader.ReadBsonType());
  234. Assert.AreEqual(0, _bsonReader.ReadDateTime());
  235. Assert.AreEqual(BsonReaderState.Initial, _bsonReader.State);
  236. }
  237. var expected = "{ \"$date\" : 0 }"; // it's still not ISO8601 on the way out
  238. var jsonSettings = new JsonWriterSettings { OutputMode = JsonOutputMode.Strict };
  239. Assert.AreEqual(expected, BsonSerializer.Deserialize<DateTime>(json).ToJson(jsonSettings));
  240. }
  241. [Test]
  242. public void TestDocumentEmpty()
  243. {
  244. var json = "{ }";
  245. using (_bsonReader = new JsonReader(json))
  246. {
  247. Assert.AreEqual(BsonType.Document, _bsonReader.ReadBsonType());
  248. _bsonReader.ReadStartDocument();
  249. Assert.AreEqual(BsonType.EndOfDocument, _bsonReader.ReadBsonType());
  250. _bsonReader.ReadEndDocument();
  251. Assert.AreEqual(BsonReaderState.Initial, _bsonReader.State);
  252. }
  253. Assert.AreEqual(json, BsonSerializer.Deserialize<BsonDocument>(json).ToJson());
  254. }
  255. [Test]
  256. public void TestDocumentNested()
  257. {
  258. var json = "{ \"a\" : { \"x\" : 1 }, \"y\" : 2 }";
  259. using (_bsonReader = new JsonReader(json))
  260. {
  261. Assert.AreEqual(BsonType.Document, _bsonReader.ReadBsonType());
  262. _bsonReader.ReadStartDocument();
  263. Assert.AreEqual(BsonType.Document, _bsonReader.ReadBsonType());
  264. Assert.AreEqual("a", _bsonReader.ReadName());
  265. _bsonReader.ReadStartDocument();
  266. Assert.AreEqual(BsonType.Int32, _bsonReader.ReadBsonType());
  267. Assert.AreEqual("x", _bsonReader.ReadName());
  268. Assert.AreEqual(1, _bsonReader.ReadInt32());
  269. Assert.AreEqual(BsonType.EndOfDocument, _bsonReader.ReadBsonType());
  270. _bsonReader.ReadEndDocument();
  271. Assert.AreEqual(BsonType.Int32, _bsonReader.ReadBsonType());
  272. Assert.AreEqual("y", _bsonReader.ReadName());
  273. Assert.AreEqual(2, _bsonReader.ReadInt32());
  274. Assert.AreEqual(BsonType.EndOfDocument, _bsonReader.ReadBsonType());
  275. _bsonReader.ReadEndDocument();
  276. Assert.AreEqual(BsonReaderState.Initial, _bsonReader.State);
  277. }
  278. Assert.AreEqual(json, BsonSerializer.Deserialize<BsonDocument>(json).ToJson());
  279. }
  280. [Test]
  281. public void TestDocumentOneElement()
  282. {
  283. var json = "{ \"x\" : 1 }";
  284. using (_bsonReader = new JsonReader(json))
  285. {
  286. Assert.AreEqual(BsonType.Document, _bsonReader.ReadBsonType());
  287. _bsonReader.ReadStartDocument();
  288. Assert.AreEqual(BsonType.Int32, _bsonReader.ReadBsonType());
  289. Assert.AreEqual("x", _bsonReader.ReadName());
  290. Assert.AreEqual(1, _bsonReader.ReadInt32());
  291. Assert.AreEqual(BsonType.EndOfDocument, _bsonReader.ReadBsonType());
  292. _bsonReader.ReadEndDocument();
  293. Assert.AreEqual(BsonReaderState.Initial, _bsonReader.State);
  294. }
  295. Assert.AreEqual(json, BsonSerializer.Deserialize<BsonDocument>(json).ToJson());
  296. }
  297. [Test]
  298. public void TestDocumentTwoElements()
  299. {
  300. var json = "{ \"x\" : 1, \"y\" : 2 }";
  301. using (_bsonReader = new JsonReader(json))
  302. {
  303. Assert.AreEqual(BsonType.Document, _bsonReader.ReadBsonType());
  304. _bsonReader.ReadStartDocument();
  305. Assert.AreEqual(BsonType.Int32, _bsonReader.ReadBsonType());
  306. Assert.AreEqual("x", _bsonReader.ReadName());
  307. Assert.AreEqual(1, _bsonReader.ReadInt32());
  308. Assert.AreEqual(BsonType.Int32, _bsonReader.ReadBsonType());
  309. Assert.AreEqual("y", _bsonReader.ReadName());
  310. Assert.AreEqual(2, _bsonReader.ReadInt32());
  311. Assert.AreEqual(BsonType.EndOfDocument, _bsonReader.ReadBsonType());
  312. _bsonReader.ReadEndDocument();
  313. Assert.AreEqual(BsonReaderState.Initial, _bsonReader.State);
  314. }
  315. Assert.AreEqual(json, BsonSerializer.Deserialize<BsonDocument>(json).ToJson());
  316. }
  317. [Test]
  318. public void TestDouble()
  319. {
  320. var json = "1.5";
  321. using (_bsonReader = new JsonReader(json))
  322. {
  323. Assert.AreEqual(BsonType.Double, _bsonReader.ReadBsonType());
  324. Assert.AreEqual(1.5, _bsonReader.ReadDouble());
  325. Assert.AreEqual(BsonReaderState.Initial, _bsonReader.State);
  326. }
  327. Assert.AreEqual(json, BsonSerializer.Deserialize<double>(json).ToJson());
  328. }
  329. [Test]
  330. public void TestGuid()
  331. {
  332. var guid = new Guid("B5F21E0C2A0D42D6AD03D827008D8AB6");
  333. var json = "CSUUID(\"B5F21E0C2A0D42D6AD03D827008D8AB6\")";
  334. using (_bsonReader = new JsonReader(json))
  335. {
  336. Assert.AreEqual(BsonType.Binary, _bsonReader.ReadBsonType());
  337. var binaryData = _bsonReader.ReadBinaryData();
  338. Assert.IsTrue(binaryData.Bytes.SequenceEqual(guid.ToByteArray()));
  339. Assert.AreEqual(BsonBinarySubType.UuidLegacy, binaryData.SubType);
  340. Assert.AreEqual(GuidRepresentation.CSharpLegacy, binaryData.GuidRepresentation);
  341. Assert.AreEqual(BsonReaderState.Initial, _bsonReader.State);
  342. }
  343. var expected = "CSUUID(\"b5f21e0c-2a0d-42d6-ad03-d827008d8ab6\")";
  344. Assert.AreEqual(expected, BsonSerializer.Deserialize<Guid>(json).ToJson());
  345. }
  346. [Test]
  347. public void TestHexData()
  348. {
  349. var expectedBytes = new byte[] { 0x01, 0x23 };
  350. var json = "HexData(0, \"123\")";
  351. using (_bsonReader = new JsonReader(json))
  352. {
  353. Assert.AreEqual(BsonType.Binary, _bsonReader.ReadBsonType());
  354. var bytes = _bsonReader.ReadBytes();
  355. Assert.IsTrue(expectedBytes.SequenceEqual(bytes));
  356. Assert.AreEqual(BsonReaderState.Initial, _bsonReader.State);
  357. }
  358. var expectedJson = "new BinData(0, \"ASM=\")";
  359. Assert.AreEqual(expectedJson, BsonSerializer.Deserialize<byte[]>(json).ToJson());
  360. }
  361. [Test]
  362. public void TestInt32()
  363. {
  364. var json = "123";
  365. using (_bsonReader = new JsonReader(json))
  366. {
  367. Assert.AreEqual(BsonType.Int32, _bsonReader.ReadBsonType());
  368. Assert.AreEqual(123, _bsonReader.ReadInt32());
  369. Assert.AreEqual(BsonReaderState.Initial, _bsonReader.State);
  370. }
  371. Assert.AreEqual(json, BsonSerializer.Deserialize<int>(json).ToJson());
  372. }
  373. [TestCase("Number(123)")]
  374. [TestCase("NumberInt(123)")]
  375. public void TestInt32Constructor(string json)
  376. {
  377. using (_bsonReader = new JsonReader(json))
  378. {
  379. Assert.AreEqual(BsonType.Int32, _bsonReader.ReadBsonType());
  380. Assert.AreEqual(123, _bsonReader.ReadInt32());
  381. Assert.AreEqual(BsonReaderState.Initial, _bsonReader.State);
  382. }
  383. var canonicalJson = "123";
  384. Assert.AreEqual(canonicalJson, BsonSerializer.Deserialize<int>(new StringReader(json)).ToJson());
  385. }
  386. [Test]
  387. public void TestInt64ConstructorQuoted()
  388. {
  389. var json = "NumberLong(\"123456789012\")";
  390. using (_bsonReader = new JsonReader(json))
  391. {
  392. Assert.AreEqual(BsonType.Int64, _bsonReader.ReadBsonType());
  393. Assert.AreEqual(123456789012, _bsonReader.ReadInt64());
  394. Assert.AreEqual(BsonReaderState.Initial, _bsonReader.State);
  395. }
  396. Assert.AreEqual(json, BsonSerializer.Deserialize<long>(json).ToJson());
  397. }
  398. [Test]
  399. public void TestInt64ConstructorUnqutoed()
  400. {
  401. var json = "NumberLong(123)";
  402. using (_bsonReader = new JsonReader(json))
  403. {
  404. Assert.AreEqual(BsonType.Int64, _bsonReader.ReadBsonType());
  405. Assert.AreEqual(123, _bsonReader.ReadInt64());
  406. Assert.AreEqual(BsonReaderState.Initial, _bsonReader.State);
  407. }
  408. Assert.AreEqual(json, BsonSerializer.Deserialize<long>(json).ToJson());
  409. }
  410. [Test]
  411. public void TestIsAtEndOfFileWithTwoArrays()
  412. {
  413. var json = "[1,2][1,2]";
  414. using (var jsonReader = new JsonReader(json))
  415. {
  416. var count = 0;
  417. while (!jsonReader.IsAtEndOfFile())
  418. {
  419. var array = BsonSerializer.Deserialize<BsonArray>(jsonReader);
  420. var expected = new BsonArray { 1, 2 };
  421. Assert.AreEqual(expected, array);
  422. count += 1;
  423. }
  424. Assert.AreEqual(2, count);
  425. }
  426. }
  427. [Test]
  428. public void TestIsAtEndOfFileWithTwoDocuments()
  429. {
  430. var json = "{x:1}{x:1}";
  431. using (var jsonReader = new JsonReader(json))
  432. {
  433. var count = 0;
  434. while (!jsonReader.IsAtEndOfFile())
  435. {
  436. var document = BsonSerializer.Deserialize<BsonDocument>(jsonReader);
  437. var expected = new BsonDocument("x", 1);
  438. Assert.AreEqual(expected, document);
  439. count += 1;
  440. }
  441. Assert.AreEqual(2, count);
  442. }
  443. }
  444. [Test]
  445. public void TestInt64ExtendedJson()
  446. {
  447. var json = "{ \"$numberLong\" : \"123\" }";
  448. using (_bsonReader = new JsonReader(json))
  449. {
  450. Assert.AreEqual(BsonType.Int64, _bsonReader.ReadBsonType());
  451. Assert.AreEqual(123, _bsonReader.ReadInt64());
  452. Assert.AreEqual(BsonReaderState.Initial, _bsonReader.State);
  453. }
  454. var canonicalJson = "NumberLong(123)";
  455. Assert.AreEqual(canonicalJson, BsonSerializer.Deserialize<long>(new StringReader(json)).ToJson());
  456. }
  457. [Test]
  458. public void TestJavaScript()
  459. {
  460. string json = "{ \"$code\" : \"function f() { return 1; }\" }";
  461. using (_bsonReader = new JsonReader(json))
  462. {
  463. Assert.AreEqual(BsonType.JavaScript, _bsonReader.ReadBsonType());
  464. Assert.AreEqual("function f() { return 1; }", _bsonReader.ReadJavaScript());
  465. Assert.AreEqual(BsonReaderState.Initial, _bsonReader.State);
  466. }
  467. Assert.AreEqual(json, BsonSerializer.Deserialize<BsonJavaScript>(json).ToJson());
  468. }
  469. [Test]
  470. public void TestJavaScriptWithScope()
  471. {
  472. string json = "{ \"$code\" : \"function f() { return n; }\", \"$scope\" : { \"n\" : 1 } }";
  473. using (_bsonReader = new JsonReader(json))
  474. {
  475. Assert.AreEqual(BsonType.JavaScriptWithScope, _bsonReader.ReadBsonType());
  476. Assert.AreEqual("function f() { return n; }", _bsonReader.ReadJavaScriptWithScope());
  477. _bsonReader.ReadStartDocument();
  478. Assert.AreEqual(BsonType.Int32, _bsonReader.ReadBsonType());
  479. Assert.AreEqual("n", _bsonReader.ReadName());
  480. Assert.AreEqual(1, _bsonReader.ReadInt32());
  481. _bsonReader.ReadEndDocument();
  482. Assert.AreEqual(BsonReaderState.Initial, _bsonReader.State);
  483. }
  484. Assert.AreEqual(json, BsonSerializer.Deserialize<BsonJavaScriptWithScope>(json).ToJson());
  485. }
  486. [Test]
  487. public void TestMaxKeyExtendedJson()
  488. {
  489. var json = "{ \"$maxkey\" : 1 }";
  490. using (_bsonReader = new JsonReader(json))
  491. {
  492. Assert.AreEqual(BsonType.MaxKey, _bsonReader.ReadBsonType());
  493. _bsonReader.ReadMaxKey();
  494. Assert.AreEqual(BsonReaderState.Initial, _bsonReader.State);
  495. }
  496. var canonicalJson = "MaxKey";
  497. Assert.AreEqual(canonicalJson, BsonSerializer.Deserialize<BsonMaxKey>(new StringReader(json)).ToJson());
  498. }
  499. [Test]
  500. public void TestMaxKeyExtendedJsonWithCapitalK()
  501. {
  502. var json = "{ \"$maxKey\" : 1 }";
  503. using (_bsonReader = new JsonReader(json))
  504. {
  505. Assert.AreEqual(BsonType.MaxKey, _bsonReader.ReadBsonType());
  506. _bsonReader.ReadMaxKey();
  507. Assert.AreEqual(BsonReaderState.Initial, _bsonReader.State);
  508. }
  509. var canonicalJson = "MaxKey";
  510. Assert.AreEqual(canonicalJson, BsonSerializer.Deserialize<BsonMaxKey>(new StringReader(json)).ToJson());
  511. }
  512. [Test]
  513. public void TestMaxKeyKeyword()
  514. {
  515. var json = "MaxKey";
  516. using (_bsonReader = new JsonReader(json))
  517. {
  518. Assert.AreEqual(BsonType.MaxKey, _bsonReader.ReadBsonType());
  519. _bsonReader.ReadMaxKey();
  520. Assert.AreEqual(BsonReaderState.Initial, _bsonReader.State);
  521. }
  522. Assert.AreEqual(json, BsonSerializer.Deserialize<BsonMaxKey>(new StringReader(json)).ToJson());
  523. }
  524. [Test]
  525. public void TestMinKeyExtendedJson()
  526. {
  527. var json = "{ \"$minkey\" : 1 }";
  528. using (_bsonReader = new JsonReader(json))
  529. {
  530. Assert.AreEqual(BsonType.MinKey, _bsonReader.ReadBsonType());
  531. _bsonReader.ReadMinKey();
  532. Assert.AreEqual(BsonReaderState.Initial, _bsonReader.State);
  533. }
  534. var canonicalJson = "MinKey";
  535. Assert.AreEqual(canonicalJson, BsonSerializer.Deserialize<BsonMinKey>(new StringReader(json)).ToJson());
  536. }
  537. [Test]
  538. public void TestMinKeyExtendedJsonWithCapitalK()
  539. {
  540. var json = "{ \"$minKey\" : 1 }";
  541. using (_bsonReader = new JsonReader(json))
  542. {
  543. Assert.AreEqual(BsonType.MinKey, _bsonReader.ReadBsonType());
  544. _bsonReader.ReadMinKey();
  545. Assert.AreEqual(BsonReaderState.Initial, _bsonReader.State);
  546. }
  547. var canonicalJson = "MinKey";
  548. Assert.AreEqual(canonicalJson, BsonSerializer.Deserialize<BsonMinKey>(new StringReader(json)).ToJson());
  549. }
  550. [Test]
  551. public void TestMinKeyKeyword()
  552. {
  553. var json = "MinKey";
  554. using (_bsonReader = new JsonReader(json))
  555. {
  556. Assert.AreEqual(BsonType.MinKey, _bsonReader.ReadBsonType());
  557. _bsonReader.ReadMinKey();
  558. Assert.AreEqual(BsonReaderState.Initial, _bsonReader.State);
  559. }
  560. Assert.AreEqual(json, BsonSerializer.Deserialize<BsonMinKey>(new StringReader(json)).ToJson());
  561. }
  562. [Test]
  563. public void TestNestedArray()
  564. {
  565. var json = "{ \"a\" : [1, 2] }";
  566. using (_bsonReader = new JsonReader(json))
  567. {
  568. Assert.AreEqual(BsonType.Document, _bsonReader.ReadBsonType());
  569. _bsonReader.ReadStartDocument();
  570. Assert.AreEqual(BsonType.Array, _bsonReader.ReadBsonType());
  571. Assert.AreEqual("a", _bsonReader.ReadName());
  572. _bsonReader.ReadStartArray();
  573. Assert.AreEqual(1, _bsonReader.ReadInt32());
  574. Assert.AreEqual(2, _bsonReader.ReadInt32());
  575. _bsonReader.ReadEndArray();
  576. _bsonReader.ReadEndDocument();
  577. Assert.AreEqual(BsonReaderState.Initial, _bsonReader.State);
  578. }
  579. Assert.AreEqual(json, BsonSerializer.Deserialize<BsonDocument>(json).ToJson());
  580. }
  581. [Test]
  582. public void TestNestedDocument()
  583. {
  584. var json = "{ \"a\" : { \"b\" : 1, \"c\" : 2 } }";
  585. using (_bsonReader = new JsonReader(json))
  586. {
  587. Assert.AreEqual(BsonType.Document, _bsonReader.ReadBsonType());
  588. _bsonReader.ReadStartDocument();
  589. Assert.AreEqual(BsonType.Document, _bsonReader.ReadBsonType());
  590. Assert.AreEqual("a", _bsonReader.ReadName());
  591. _bsonReader.ReadStartDocument();
  592. Assert.AreEqual("b", _bsonReader.ReadName());
  593. Assert.AreEqual(1, _bsonReader.ReadInt32());
  594. Assert.AreEqual("c", _bsonReader.ReadName());
  595. Assert.AreEqual(2, _bsonReader.ReadInt32());
  596. _bsonReader.ReadEndDocument();
  597. _bsonReader.ReadEndDocument();
  598. Assert.AreEqual(BsonReaderState.Initial, _bsonReader.State);
  599. }
  600. Assert.AreEqual(json, BsonSerializer.Deserialize<BsonDocument>(json).ToJson());
  601. }
  602. [Test]
  603. public void TestNull()
  604. {
  605. var json = "null";
  606. using (_bsonReader = new JsonReader(json))
  607. {
  608. Assert.AreEqual(BsonType.Null, _bsonReader.ReadBsonType());
  609. _bsonReader.ReadNull();
  610. Assert.AreEqual(BsonReaderState.Initial, _bsonReader.State);
  611. }
  612. Assert.AreEqual(json, BsonSerializer.Deserialize<BsonNull>(json).ToJson());
  613. }
  614. [Test]
  615. public void TestObjectIdShell()
  616. {
  617. var json = "ObjectId(\"4d0ce088e447ad08b4721a37\")";
  618. using (_bsonReader = new JsonReader(json))
  619. {
  620. Assert.AreEqual(BsonType.ObjectId, _bsonReader.ReadBsonType());
  621. var objectId = _bsonReader.ReadObjectId();
  622. Assert.AreEqual("4d0ce088e447ad08b4721a37", objectId.ToString());
  623. Assert.AreEqual(BsonReaderState.Initial, _bsonReader.State);
  624. }
  625. Assert.AreEqual(json, BsonSerializer.Deserialize<ObjectId>(json).ToJson());
  626. }
  627. [Test]
  628. public void TestObjectIdStrict()
  629. {
  630. var json = "{ \"$oid\" : \"4d0ce088e447ad08b4721a37\" }";
  631. using (_bsonReader = new JsonReader(json))
  632. {
  633. Assert.AreEqual(BsonType.ObjectId, _bsonReader.ReadBsonType());
  634. var objectId = _bsonReader.ReadObjectId();
  635. Assert.AreEqual("4d0ce088e447ad08b4721a37", objectId.ToString());
  636. Assert.AreEqual(BsonReaderState.Initial, _bsonReader.State);
  637. }
  638. var jsonSettings = new JsonWriterSettings { OutputMode = JsonOutputMode.Strict };
  639. Assert.AreEqual(json, BsonSerializer.Deserialize<ObjectId>(json).ToJson(jsonSettings));
  640. }
  641. [Test]
  642. public void TestRegularExpressionShell()
  643. {
  644. var json = "/pattern/imxs";
  645. using (_bsonReader = new JsonReader(json))
  646. {
  647. Assert.AreEqual(BsonType.RegularExpression, _bsonReader.ReadBsonType());
  648. var regex = _bsonReader.ReadRegularExpression();
  649. Assert.AreEqual("pattern", regex.Pattern);
  650. Assert.AreEqual("imxs", regex.Options);
  651. Assert.AreEqual(BsonReaderState.Initial, _bsonReader.State);
  652. }
  653. Assert.AreEqual(json, BsonSerializer.Deserialize<BsonRegularExpression>(json).ToJson());
  654. }
  655. [Test]
  656. public void TestRegularExpressionStrict()
  657. {
  658. var json = "{ \"$regex\" : \"pattern\", \"$options\" : \"imxs\" }";
  659. using (_bsonReader = new JsonReader(json))
  660. {
  661. Assert.AreEqual(BsonType.RegularExpression, _bsonReader.ReadBsonType());
  662. var regex = _bsonReader.ReadRegularExpression();
  663. Assert.AreEqual("pattern", regex.Pattern);
  664. Assert.AreEqual("imxs", regex.Options);
  665. Assert.AreEqual(BsonReaderState.Initial, _bsonReader.State);
  666. }
  667. var settings = new JsonWriterSettings { OutputMode = JsonOutputMode.Strict };
  668. Assert.AreEqual(json, BsonSerializer.Deserialize<BsonRegularExpression>(json).ToJson(settings));
  669. }
  670. [Test]
  671. public void TestString()
  672. {
  673. var json = "\"abc\"";
  674. using (_bsonReader = new JsonReader(json))
  675. {
  676. Assert.AreEqual(BsonType.String, _bsonReader.ReadBsonType());
  677. Assert.AreEqual("abc", _bsonReader.ReadString());
  678. Assert.AreEqual(BsonReaderState.Initial, _bsonReader.State);
  679. }
  680. Assert.AreEqual(json, BsonSerializer.Deserialize<string>(json).ToJson());
  681. }
  682. [Test]
  683. public void TestStringEmpty()
  684. {
  685. var json = "\"\"";
  686. using (_bsonReader = new JsonReader(json))
  687. {
  688. Assert.AreEqual(BsonType.String, _bsonReader.ReadBsonType());
  689. Assert.AreEqual("", _bsonReader.ReadString());
  690. Assert.AreEqual(BsonReaderState.Initial, _bsonReader.State);
  691. }
  692. Assert.AreEqual(json, BsonSerializer.Deserialize<string>(json).ToJson());
  693. }
  694. [Test]
  695. public void TestSymbol()
  696. {
  697. var json = "{ \"$symbol\" : \"symbol\" }";
  698. using (_bsonReader = new JsonReader(json))
  699. {
  700. Assert.AreEqual(BsonType.Symbol, _bsonReader.ReadBsonType());
  701. Assert.AreEqual("symbol", _bsonReader.ReadSymbol());
  702. Assert.AreEqual(BsonReaderState.Initial, _bsonReader.State);
  703. }
  704. Assert.AreEqual(json, BsonSerializer.Deserialize<BsonSymbol>(json).ToJson());
  705. }
  706. [Test]
  707. public void TestTimestampConstructor()
  708. {
  709. var json = "Timestamp(1, 2)";
  710. using (_bsonReader = new JsonReader(json))
  711. {
  712. Assert.AreEqual(BsonType.Timestamp, _bsonReader.ReadBsonType());
  713. Assert.AreEqual(new BsonTimestamp(1, 2).Value, _bsonReader.ReadTimestamp());
  714. Assert.AreEqual(BsonReaderState.Initial, _bsonReader.State);
  715. }
  716. Assert.AreEqual(json, BsonSerializer.Deserialize<BsonTimestamp>(new StringReader(json)).ToJson());
  717. }
  718. [Test]
  719. public void TestTimestampExtendedJsonNewRepresentation()
  720. {
  721. var json = "{ \"$timestamp\" : { \"t\" : 1, \"i\" : 2 } }";
  722. using (_bsonReader = new JsonReader(json))
  723. {
  724. Assert.AreEqual(BsonType.Timestamp, _bsonReader.ReadBsonType());
  725. Assert.AreEqual(new BsonTimestamp(1, 2).Value, _bsonReader.ReadTimestamp());
  726. Assert.AreEqual(BsonReaderState.Initial, _bsonReader.State);
  727. }
  728. var canonicalJson = "Timestamp(1, 2)";
  729. Assert.AreEqual(canonicalJson, BsonSerializer.Deserialize<BsonTimestamp>(new StringReader(json)).ToJson());
  730. }
  731. [Test]
  732. public void TestTimestampExtendedJsonOldRepresentation()
  733. {
  734. var json = "{ \"$timestamp\" : NumberLong(1234) }";
  735. using (_bsonReader = new JsonReader(json))
  736. {
  737. Assert.AreEqual(BsonType.Timestamp, _bsonReader.ReadBsonType());
  738. Assert.AreEqual(1234L, _bsonReader.ReadTimestamp());
  739. Assert.AreEqual(BsonReaderState.Initial, _bsonReader.State);
  740. }
  741. var canonicalJson = "Timestamp(0, 1234)";
  742. Assert.AreEqual(canonicalJson, BsonSerializer.Deserialize<BsonTimestamp>(new StringReader(json)).ToJson());
  743. }
  744. [Test]
  745. public void TestUndefinedExtendedJson()
  746. {
  747. var json = "{ \"$undefined\" : true }";
  748. using (_bsonReader = new JsonReader(json))
  749. {
  750. Assert.AreEqual(BsonType.Undefined, _bsonReader.ReadBsonType());
  751. _bsonReader.ReadUndefined();
  752. Assert.AreEqual(BsonReaderState.Initial, _bsonReader.State);
  753. }
  754. var canonicalJson = "undefined";
  755. Assert.AreEqual(canonicalJson, BsonSerializer.Deserialize<BsonUndefined>(new StringReader(json)).ToJson());
  756. }
  757. [Test]
  758. public void TestUndefinedKeyword()
  759. {
  760. var json = "undefined";
  761. using (_bsonReader = new JsonReader(json))
  762. {
  763. Assert.AreEqual(BsonType.Undefined, _bsonReader.ReadBsonType());
  764. _bsonReader.ReadUndefined();
  765. Assert.AreEqual(BsonReaderState.Initial, _bsonReader.State);
  766. }
  767. Assert.AreEqual(json, BsonSerializer.Deserialize<BsonUndefined>(json).ToJson());
  768. }
  769. [Test]
  770. public void TestUtf16BigEndian()
  771. {
  772. var encoding = new UnicodeEncoding(true, false, true);
  773. var bytes = BsonUtils.ParseHexString("007b00200022007800220020003a002000310020007d");
  774. using (var memoryStream = new MemoryStream(bytes))
  775. using (var streamReader = new StreamReader(memoryStream, encoding))
  776. {
  777. var document = BsonSerializer.Deserialize<BsonDocument>(streamReader);
  778. Assert.AreEqual(1, document["x"].AsInt32);
  779. }
  780. }
  781. [Test]
  782. public void TestUtf16BigEndianAutoDetect()
  783. {
  784. var bytes = BsonUtils.ParseHexString("feff007b00200022007800220020003a002000310020007d");
  785. using (var memoryStream = new MemoryStream(bytes))
  786. using (var streamReader = new StreamReader(memoryStream, true))
  787. {
  788. var document = BsonSerializer.Deserialize<BsonDocument>(streamReader);
  789. Assert.AreEqual(1, document["x"].AsInt32);
  790. }
  791. }
  792. [Test]
  793. public void TestUtf16LittleEndian()
  794. {
  795. var encoding = new UnicodeEncoding(false, false, true);
  796. var bytes = BsonUtils.ParseHexString("7b00200022007800220020003a002000310020007d00");
  797. using (var memoryStream = new MemoryStream(bytes))
  798. using (var streamReader = new StreamReader(memoryStream, encoding))
  799. {
  800. var document = BsonSerializer.Deserialize<BsonDocument>(streamReader);
  801. Assert.AreEqual(1, document["x"].AsInt32);
  802. }
  803. }
  804. [Test]
  805. public void TestUtf16LittleEndianAutoDetect()
  806. {
  807. var bytes = BsonUtils.ParseHexString("fffe7b00200022007800220020003a002000310020007d00");
  808. using (var memoryStream = new MemoryStream(bytes))
  809. using (var streamReader = new StreamReader(memoryStream, true))
  810. {
  811. var document = BsonSerializer.Deserialize<BsonDocument>(streamReader);
  812. Assert.AreEqual(1, document["x"].AsInt32);
  813. }
  814. }
  815. [Test]
  816. public void TestUtf8()
  817. {
  818. var encoding = Utf8Encodings.Strict;
  819. var bytes = BsonUtils.ParseHexString("7b20227822203a2031207d");
  820. using (var memoryStream = new MemoryStream(bytes))
  821. using (var streamReader = new StreamReader(memoryStream, encoding))
  822. {
  823. var document = BsonSerializer.Deserialize<BsonDocument>(streamReader);
  824. Assert.AreEqual(1, document["x"].AsInt32);
  825. }
  826. }
  827. [Test]
  828. public void TestUtf8AutoDetect()
  829. {
  830. var bytes = BsonUtils.ParseHexString("7b20227822203a2031207d");
  831. using (var memoryStream = new MemoryStream(bytes))
  832. using (var streamReader = new StreamReader(memoryStream, true))
  833. {
  834. var document = BsonSerializer.Deserialize<BsonDocument>(streamReader);
  835. Assert.AreEqual(1, document["x"].AsInt32);
  836. }
  837. }
  838. }
  839. }