PageRenderTime 51ms CodeModel.GetById 16ms RepoModel.GetById 0ms app.codeStats 1ms

/tests/MongoDB.Bson.Tests/ObjectModel/BsonDocumentTests.cs

http://github.com/mongodb/mongo-csharp-driver
C# | 1465 lines | 1323 code | 122 blank | 20 comment | 22 complexity | 062a22a91295b175878595a7a1ec1c28 MD5 | raw file
Possible License(s): Apache-2.0

Large files files are truncated, but you can click here to view the full file

  1. /* Copyright 2010-present 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;
  17. using System.Collections.Generic;
  18. using System.IO;
  19. using System.Linq;
  20. using System.Text;
  21. using FluentAssertions;
  22. using MongoDB.Bson.IO;
  23. using MongoDB.Bson.Serialization;
  24. using MongoDB.Bson.Serialization.IdGenerators;
  25. using MongoDB.Bson.Serialization.Serializers;
  26. using MongoDB.Bson.TestHelpers;
  27. using MongoDB.Bson.TestHelpers.XunitExtensions;
  28. using Xunit;
  29. namespace MongoDB.Bson.Tests
  30. {
  31. public class BsonDocumentTests
  32. {
  33. [Fact]
  34. public void TestAddArrayListWithOneEntry()
  35. {
  36. var arrayList = new ArrayList { 1 };
  37. var array = new BsonArray(arrayList);
  38. var json = array.ToJson();
  39. var expected = "[1]".Replace("'", "\"");
  40. Assert.Equal(expected, json);
  41. }
  42. [Fact]
  43. public void TestAddArrayListWithTwoEntries()
  44. {
  45. var arrayList = new ArrayList { 1, 2 };
  46. var array = new BsonArray(arrayList);
  47. var json = array.ToJson();
  48. var expected = "[1, 2]".Replace("'", "\"");
  49. Assert.Equal(expected, json);
  50. }
  51. [Fact]
  52. public void TestAddHashtableWithOneEntry()
  53. {
  54. var hashtable = new Hashtable { { "A", 1 } };
  55. var document = new BsonDocument(hashtable);
  56. var json = document.ToJson();
  57. var expected = "{ 'A' : 1 }".Replace("'", "\"");
  58. Assert.Equal(expected, json);
  59. }
  60. [Fact]
  61. public void TestAddHashtableWithTwoEntries()
  62. {
  63. var hashtable = new Hashtable { { "A", 1 }, { "B", 2 } };
  64. var document = new BsonDocument(hashtable);
  65. // note: can't test json against expected because the order of the keys in the hash table is not defined
  66. Assert.Equal(2, document.ElementCount);
  67. Assert.Equal(1, document["A"].AsInt32);
  68. Assert.Equal(2, document["B"].AsInt32);
  69. }
  70. [Fact]
  71. public void TestAddHashtableWithNestedHashtable()
  72. {
  73. var hashtable = new Hashtable
  74. {
  75. { "A", 1 },
  76. { "B", new Hashtable { { "C", 2 }, { "D", 3 } } }
  77. };
  78. var document = new BsonDocument(hashtable);
  79. // note: can't test json against expected because the order of the keys in the hash table is not defined
  80. Assert.Equal(2, document.ElementCount);
  81. Assert.Equal(1, document["A"].AsInt32);
  82. Assert.Equal(2, document["B"]["C"].AsInt32);
  83. Assert.Equal(3, document["B"]["D"].AsInt32);
  84. }
  85. [Fact]
  86. public void TestAddNameValueWithCondition()
  87. {
  88. var document = new BsonDocument();
  89. document.Add("x", 1, false);
  90. Assert.Equal(0, document.ElementCount);
  91. document.Add("x", 1, true);
  92. Assert.Equal(1, document.ElementCount);
  93. Assert.Equal(1, document["x"].AsInt32);
  94. }
  95. [Fact]
  96. public void TestAutoIndexing()
  97. {
  98. var document = new BsonDocument
  99. {
  100. { "Addresses", new BsonArray
  101. {
  102. new BsonDocument { { "StreetAdress", "123 Main St" }, { "City", "Hope" } },
  103. new BsonDocument { { "StreetAdress", "456 Main St" }, { "City", "Despair" } },
  104. }
  105. }
  106. };
  107. var streetAddress = document["Addresses"][0][0];
  108. Assert.Same(streetAddress, document["Addresses"][0][0]);
  109. Assert.Throws<NotSupportedException>(() => { var x = document["Addresses"][0][0][0]; });
  110. Assert.Throws<NotSupportedException>(() => { var x = document["Addresses"][0][0]["x"]; });
  111. Assert.Throws<NotSupportedException>(() => { document["Addresses"][0][0][0] = 1; });
  112. Assert.Throws<NotSupportedException>(() => { document["Addresses"][0][0]["x"] = 1; });
  113. }
  114. [Fact]
  115. public void TestClear()
  116. {
  117. var document = new BsonDocument("x", 1);
  118. Assert.Equal(1, document.ElementCount);
  119. document.Clear();
  120. Assert.Equal(0, document.ElementCount);
  121. }
  122. [Fact]
  123. public void TestClone()
  124. {
  125. var document = new BsonDocument("d", new BsonDocument("x", 1));
  126. var clone = (BsonDocument)document.Clone();
  127. Assert.Equal(clone, document);
  128. Assert.Same(clone["d"], document["d"]);
  129. }
  130. [Fact]
  131. public void TestConstructorAllowDuplicateNames()
  132. {
  133. var document = new BsonDocument(true);
  134. Assert.Equal(true, document.AllowDuplicateNames);
  135. document.AllowDuplicateNames = false;
  136. Assert.Equal(false, document.AllowDuplicateNames);
  137. }
  138. [Fact]
  139. public void TestConstructorElement()
  140. {
  141. var element = new BsonElement("x", 1);
  142. var document = new BsonDocument(element);
  143. Assert.Equal(1, document.ElementCount);
  144. Assert.Equal(1, document["x"].AsInt32);
  145. Assert.Equal(true, document.Contains("x"));
  146. Assert.Equal(true, document.ContainsValue(1));
  147. Assert.Same(element.Value, document.GetElement("x").Value);
  148. }
  149. [Fact]
  150. public void TestConstructorElements()
  151. {
  152. var elements = new BsonElement[] {
  153. new BsonElement("x", 1),
  154. new BsonElement("y", 2)
  155. };
  156. var document = new BsonDocument((IEnumerable<BsonElement>)elements);
  157. Assert.Equal(2, document.ElementCount);
  158. Assert.Equal(1, document["x"].AsInt32);
  159. Assert.Equal(2, document["y"].AsInt32);
  160. Assert.Equal(true, document.Contains("x"));
  161. Assert.Equal(true, document.Contains("y"));
  162. Assert.Equal(true, document.ContainsValue(1));
  163. Assert.Equal(true, document.ContainsValue(2));
  164. Assert.Same(elements[0].Value, document.GetElement("x").Value);
  165. Assert.Same(elements[1].Value, document.GetElement("y").Value);
  166. }
  167. [Fact]
  168. public void TestConstructorElementsDocument()
  169. {
  170. var originalDocument = new BsonDocument { { "x", 1 }, { "y", 2 } };
  171. var document = new BsonDocument(originalDocument);
  172. Assert.Equal(2, document.ElementCount);
  173. Assert.Equal(1, document["x"].AsInt32);
  174. Assert.Equal(2, document["y"].AsInt32);
  175. Assert.Equal(true, document.Contains("x"));
  176. Assert.Equal(true, document.Contains("y"));
  177. Assert.Equal(true, document.ContainsValue(1));
  178. Assert.Equal(true, document.ContainsValue(2));
  179. Assert.Same(originalDocument.GetElement("x").Value, document.GetElement("x").Value);
  180. Assert.Same(originalDocument.GetElement("y").Value, document.GetElement("y").Value);
  181. }
  182. [Fact]
  183. public void TestConstructorElementsParams()
  184. {
  185. var element1 = new BsonElement("x", 1);
  186. var element2 = new BsonElement("y", 2);
  187. #pragma warning disable 618
  188. var document = new BsonDocument(element1, element2);
  189. #pragma warning restore
  190. Assert.Equal(2, document.ElementCount);
  191. Assert.Equal(1, document["x"].AsInt32);
  192. Assert.Equal(2, document["y"].AsInt32);
  193. Assert.Equal(true, document.Contains("x"));
  194. Assert.Equal(true, document.Contains("y"));
  195. Assert.Equal(true, document.ContainsValue(1));
  196. Assert.Equal(true, document.ContainsValue(2));
  197. Assert.Same(element1.Value, document.GetElement("x").Value);
  198. Assert.Same(element2.Value, document.GetElement("y").Value);
  199. }
  200. [Fact]
  201. public void TestConstructorDictionaryGeneric()
  202. {
  203. var dictionary = new Dictionary<string, object> { { "x", 1 } };
  204. var document = new BsonDocument(dictionary);
  205. Assert.Equal(1, document.ElementCount);
  206. Assert.Equal(1, document["x"].AsInt32);
  207. Assert.Equal(true, document.Contains("x"));
  208. Assert.Equal(true, document.ContainsValue(1));
  209. }
  210. [Fact]
  211. public void TestConstructorDictionaryGenericWithKeys()
  212. {
  213. var dictionary = new Dictionary<string, object> { { "x", 1 }, { "y", 2 } };
  214. var keys = new string[] { "x" };
  215. #pragma warning disable 618
  216. var document = new BsonDocument(dictionary, keys);
  217. #pragma warning restore
  218. Assert.Equal(1, document.ElementCount);
  219. Assert.Equal(1, document["x"].AsInt32);
  220. Assert.Equal(true, document.Contains("x"));
  221. Assert.Equal(true, document.ContainsValue(1));
  222. }
  223. [Fact]
  224. public void TestConstructorIDictionary()
  225. {
  226. var hashtable = (IDictionary)new Hashtable { { "x", 1 } };
  227. var document = new BsonDocument(hashtable);
  228. Assert.Equal(1, document.ElementCount);
  229. Assert.Equal(1, document["x"].AsInt32);
  230. Assert.Equal(true, document.Contains("x"));
  231. Assert.Equal(true, document.ContainsValue(1));
  232. }
  233. [Fact]
  234. public void TestConstructorIDictionaryGeneric()
  235. {
  236. var dictionary = (IDictionary<string, object>)new Dictionary<string, object> { { "x", 1 } };
  237. var document = new BsonDocument(dictionary);
  238. Assert.Equal(1, document.ElementCount);
  239. Assert.Equal(1, document["x"].AsInt32);
  240. Assert.Equal(true, document.Contains("x"));
  241. Assert.Equal(true, document.ContainsValue(1));
  242. }
  243. [Fact]
  244. public void TestConstructorIDictionaryGenericWithKeys()
  245. {
  246. var dictionary = (IDictionary<string, object>)new Dictionary<string, object> { { "x", 1 }, { "y", 2 } };
  247. var keys = new string[] { "x" };
  248. #pragma warning disable 618
  249. var document = new BsonDocument(dictionary, keys);
  250. #pragma warning restore
  251. Assert.Equal(1, document.ElementCount);
  252. Assert.Equal(1, document["x"].AsInt32);
  253. Assert.Equal(true, document.Contains("x"));
  254. Assert.Equal(true, document.ContainsValue(1));
  255. }
  256. [Fact]
  257. public void TestConstructorIDictionaryWithKeys()
  258. {
  259. var hashtable = (IDictionary)new Hashtable { { "x", 1 }, { "y", 2 } };
  260. var keys = new string[] { "x" };
  261. #pragma warning disable 618
  262. var document = new BsonDocument(hashtable, keys);
  263. #pragma warning restore
  264. Assert.Equal(1, document.ElementCount);
  265. Assert.Equal(1, document["x"].AsInt32);
  266. Assert.Equal(true, document.Contains("x"));
  267. Assert.Equal(true, document.ContainsValue(1));
  268. }
  269. [Fact]
  270. public void TestConstructorNameValue()
  271. {
  272. var document = new BsonDocument("x", 1);
  273. Assert.Equal(1, document.ElementCount);
  274. Assert.Equal(1, document["x"].AsInt32);
  275. Assert.Equal(true, document.Contains("x"));
  276. Assert.Equal(true, document.ContainsValue(1));
  277. }
  278. [Fact]
  279. public void TestConstructorNoArgs()
  280. {
  281. var document = new BsonDocument();
  282. Assert.Equal(false, document.AllowDuplicateNames);
  283. Assert.IsType<BsonDocument>(document.AsBsonDocument);
  284. Assert.Equal(BsonType.Document, document.BsonType);
  285. Assert.Equal(false, document.Contains("name"));
  286. Assert.Equal(false, document.ContainsValue(0));
  287. Assert.Equal(0, document.ElementCount);
  288. Assert.Equal(0, document.Elements.Count());
  289. Assert.Equal(false, document.IsBsonArray);
  290. Assert.Equal(true, document.IsBsonDocument);
  291. Assert.Equal(0, document.Names.Count());
  292. #pragma warning disable 618
  293. Assert.Equal(null, document.RawValue);
  294. Assert.Equal(0, document.RawValues.Count());
  295. #pragma warning restore
  296. Assert.Equal(true, document.ToBoolean());
  297. Assert.Same(document, document.ToBsonDocument());
  298. Assert.Equal("{ }", document.ToJson());
  299. Assert.Equal(0, document.Values.Count());
  300. }
  301. [Fact]
  302. public void TestContains()
  303. {
  304. var document = new BsonDocument();
  305. Assert.False(document.Contains("x"));
  306. document["x"] = 1;
  307. Assert.True(document.Contains("x"));
  308. }
  309. [Fact]
  310. public void TestContainsValue()
  311. {
  312. var document = new BsonDocument();
  313. Assert.False(document.ContainsValue(1));
  314. document["x"] = 1;
  315. Assert.True(document.ContainsValue(1));
  316. }
  317. [Fact]
  318. public void TestCreateFromDictionary()
  319. {
  320. var dictionary = new Dictionary<string, object> { { "x", 1 }, { "n", null }, { "a", new object[] { 1, null } } }; // null will be mapped to BsonNull.Value
  321. var document = new BsonDocument(dictionary);
  322. Assert.Equal(3, document.ElementCount);
  323. Assert.Equal(1, document["x"].AsInt32);
  324. Assert.Same(BsonNull.Value, document["n"]);
  325. Assert.True(document["a"].IsBsonArray);
  326. Assert.Equal(2, document["a"].AsBsonArray.Count);
  327. Assert.Equal(1, document["a"][0].AsInt32);
  328. Assert.Same(BsonNull.Value, document["a"][1]);
  329. Assert.Equal(true, document.Contains("x"));
  330. Assert.Equal(true, document.Contains("n"));
  331. Assert.Equal(true, document.Contains("a"));
  332. Assert.Equal(true, document.ContainsValue(1));
  333. Assert.Equal(true, document.ContainsValue(BsonNull.Value));
  334. }
  335. [Fact]
  336. public void TestCreateNull()
  337. {
  338. object obj = null;
  339. Assert.Throws<ArgumentNullException>(() => { BsonDocument.Create(obj); });
  340. }
  341. [Fact]
  342. public void TestDeepClone()
  343. {
  344. var document = new BsonDocument("d", new BsonDocument("x", 1));
  345. var clone = (BsonDocument)document.DeepClone();
  346. Assert.Equal(clone, document);
  347. Assert.NotSame(clone["d"], document["d"]);
  348. }
  349. [Fact]
  350. public void TestElementAccess()
  351. {
  352. var book = new BsonDocument
  353. {
  354. { "author", "Ernest Hemingway" },
  355. { "title", "For Whom the Bell Tolls" },
  356. { "pages", 123 },
  357. { "price", 9.95 },
  358. { "ok", BsonNull.Value }
  359. };
  360. Assert.Equal("Ernest Hemingway", book["author"].AsString);
  361. Assert.Equal(123, book["pages"].AsInt32);
  362. Assert.Equal(0.0, 9.95 - book["price"].AsDouble);
  363. Assert.Equal(false, book["ok"].ToBoolean());
  364. book["err"] = "";
  365. Assert.Equal(false, book["err"].ToBoolean());
  366. book["err"] = "Error message.";
  367. Assert.Equal(true, book["err"].ToBoolean());
  368. book["price"] = (double)book["price"] * 1.1;
  369. double price = book["price"].AsDouble;
  370. }
  371. [Fact]
  372. public void TestElementNameZeroLength()
  373. {
  374. var document = new BsonDocument("", "zero length");
  375. Assert.Equal(0, document.GetElement(0).Name.Length);
  376. }
  377. [Fact]
  378. public void TestGetDocumentId()
  379. {
  380. var document = new BsonDocument("_id", 1);
  381. object id;
  382. Type nominalType;
  383. IIdGenerator idGenerator;
  384. Assert.True(((IBsonIdProvider)BsonDocumentSerializer.Instance).GetDocumentId(document, out id, out nominalType, out idGenerator));
  385. Assert.IsType<BsonInt32>(id);
  386. Assert.Equal(new BsonInt32(1), id);
  387. Assert.Equal(typeof(BsonValue), nominalType);
  388. Assert.Null(idGenerator);
  389. }
  390. [Theory]
  391. [ParameterAttributeData]
  392. [ResetGuidModeAfterTest]
  393. public void TestGetDocumentIdWhenIdIsGuid(
  394. [ClassValues(typeof(GuidModeValues))] GuidMode mode)
  395. {
  396. mode.Set();
  397. #pragma warning disable 618
  398. if (BsonDefaults.GuidRepresentationMode == GuidRepresentationMode.V2 && BsonDefaults.GuidRepresentation != GuidRepresentation.Unspecified)
  399. {
  400. var document = new BsonDocument("_id", Guid.Empty);
  401. object id;
  402. Type nominalType;
  403. IIdGenerator idGenerator;
  404. Assert.True(((IBsonIdProvider)BsonDocumentSerializer.Instance).GetDocumentId(document, out id, out nominalType, out idGenerator));
  405. Assert.IsType<BsonBinaryData>(id);
  406. Assert.Equal(new BsonBinaryData(Guid.Empty), id);
  407. Assert.Equal(typeof(BsonValue), nominalType);
  408. Assert.IsType<BsonBinaryDataGuidGenerator>(idGenerator);
  409. }
  410. else
  411. {
  412. var exception = Record.Exception(() => new BsonDocument("_id", Guid.Empty));
  413. exception.Should().BeOfType<InvalidOperationException>();
  414. }
  415. #pragma warning restore 618
  416. }
  417. [Fact]
  418. public void TestGetDocumentIdWhenIdIsMissing()
  419. {
  420. var document = new BsonDocument();
  421. object id;
  422. Type nominalType;
  423. IIdGenerator idGenerator;
  424. Assert.True(((IBsonIdProvider)BsonDocumentSerializer.Instance).GetDocumentId(document, out id, out nominalType, out idGenerator));
  425. Assert.Null(id);
  426. Assert.Equal(typeof(BsonValue), nominalType);
  427. Assert.IsType<BsonObjectIdGenerator>(idGenerator);
  428. }
  429. [Fact]
  430. public void TestGetHashCode()
  431. {
  432. var document = new BsonDocument("x", 1);
  433. var hashCode = document.GetHashCode();
  434. Assert.Equal(hashCode, document.GetHashCode()); // returns same value when called again
  435. }
  436. [Fact]
  437. public void TestGetValueByIndex()
  438. {
  439. var document = new BsonDocument("x", 1);
  440. Assert.Equal(1, document.GetValue(0).AsInt32);
  441. }
  442. [Fact]
  443. public void TestGetValueByName()
  444. {
  445. var document = new BsonDocument("x", 1);
  446. Assert.Equal(1, document.GetValue("x").AsInt32);
  447. }
  448. [Fact]
  449. public void TestGetValueByNameWithDefaultValue()
  450. {
  451. var document = new BsonDocument("x", 1);
  452. Assert.Equal(1, document.GetValue("x", 2).AsInt32);
  453. Assert.Equal(2, document.GetValue("y", 2).AsInt32);
  454. }
  455. [Fact]
  456. public void TestIndexer()
  457. {
  458. var document = new BsonDocument();
  459. Assert.Equal(0, document.ElementCount);
  460. document["x"] = 1;
  461. Assert.Equal(1, document.ElementCount);
  462. Assert.Equal(1, document["x"].AsInt32);
  463. Assert.Equal(1, document[0].AsInt32);
  464. document["y"] = 2;
  465. Assert.Equal(2, document.ElementCount);
  466. Assert.Equal(2, document["y"].AsInt32);
  467. Assert.Equal(2, document[1].AsInt32);
  468. document["y"] = 3;
  469. Assert.Equal(2, document.ElementCount);
  470. Assert.Equal(3, document["y"].AsInt32);
  471. Assert.Equal(3, document[1].AsInt32);
  472. document[1] = 4;
  473. Assert.Equal(2, document.ElementCount);
  474. Assert.Equal(4, document["y"].AsInt32);
  475. Assert.Equal(4, document[1].AsInt32);
  476. }
  477. [Fact]
  478. public void TestIndexerWithDefaultValue()
  479. {
  480. #pragma warning disable 618
  481. var document = new BsonDocument();
  482. Assert.Equal(0, document["x", 0].AsInt32);
  483. document["x"] = 1;
  484. Assert.Equal(1, document["x", 1].AsInt32);
  485. #pragma warning restore
  486. }
  487. [Theory]
  488. [InlineData("_id", 0)]
  489. [InlineData("x", 1)]
  490. [InlineData("y", 2)]
  491. [InlineData("z", -1)]
  492. public void TestIndexOfName(string name, int expectedResult)
  493. {
  494. var subject = new BsonDocument
  495. {
  496. { "_id", 1 },
  497. { "x", 2 },
  498. { "y", 3 }
  499. };
  500. var result = subject.IndexOfName(name);
  501. Assert.Equal(expectedResult, result);
  502. }
  503. [Fact]
  504. public void TestInsertAt()
  505. {
  506. var document = new BsonDocument();
  507. document.InsertAt(0, new BsonElement("x", 1));
  508. Assert.Equal("x", document.GetElement(0).Name);
  509. Assert.Equal(1, document[0].AsInt32);
  510. document.InsertAt(0, new BsonElement("y", 2));
  511. Assert.Equal("y", document.GetElement(0).Name);
  512. Assert.Equal(2, document[0].AsInt32);
  513. Assert.Equal("x", document.GetElement(1).Name);
  514. Assert.Equal(1, document[1].AsInt32);
  515. }
  516. [Fact]
  517. public void TestMerge()
  518. {
  519. var document = new BsonDocument();
  520. document.Merge(new BsonDocument("x", 1));
  521. Assert.Equal(1, document["x"].AsInt32);
  522. document.Merge(new BsonDocument("x", 2)); // don't overwriteExistingElements
  523. Assert.Equal(1, document["x"].AsInt32); // has old value
  524. document.Merge(new BsonDocument("x", 2), true); // overwriteExistingElements
  525. Assert.Equal(2, document["x"].AsInt32); // has new value
  526. }
  527. [Fact]
  528. public void TestMergeNull()
  529. {
  530. var document = new BsonDocument();
  531. Assert.Throws<ArgumentNullException>(() => { document.Merge(null); });
  532. }
  533. [Fact]
  534. public void TestNullableBoolean()
  535. {
  536. var document = new BsonDocument { { "v", true }, { "n", BsonNull.Value }, { "s", "" } };
  537. Assert.Equal(true, (bool?)document["v"]);
  538. Assert.Equal(null, (bool?)document["n"]);
  539. #pragma warning disable 618
  540. Assert.Equal(null, (bool?)document["x", null]);
  541. Assert.Equal(null, (bool?)document["x", (bool?)null]);
  542. Assert.Equal(null, (bool?)document["x", BsonNull.Value]);
  543. #pragma warning restore
  544. Assert.Equal(true, document["v"].AsNullableBoolean);
  545. Assert.Equal(null, document["n"].AsNullableBoolean);
  546. #pragma warning disable 618
  547. Assert.Equal(null, document["x", (bool?)null].AsNullableBoolean);
  548. Assert.Equal(null, document["x", BsonNull.Value].AsNullableBoolean);
  549. #pragma warning restore
  550. #pragma warning disable 219
  551. Assert.Throws<InvalidCastException>(() => { var v = (bool?)document["s"]; });
  552. Assert.Throws<InvalidCastException>(() => { var v = document["s"].AsNullableBoolean; });
  553. #pragma warning restore
  554. }
  555. [Fact]
  556. public void TestNullableDateTime()
  557. {
  558. var utcNow = DateTime.UtcNow;
  559. var utcNowTruncated = utcNow.AddTicks(-(utcNow.Ticks % 10000));
  560. var document = new BsonDocument { { "v", utcNow }, { "n", BsonNull.Value }, { "s", "" } };
  561. Assert.Equal(utcNowTruncated, (DateTime?)document["v"]);
  562. Assert.Equal(null, (DateTime?)document["n"]);
  563. #pragma warning disable 618
  564. Assert.Equal(null, (DateTime?)document["x", null]);
  565. Assert.Equal(null, (DateTime?)document["x", (DateTime?)null]);
  566. Assert.Equal(null, (DateTime?)document["x", BsonNull.Value]);
  567. #pragma warning restore
  568. Assert.Equal(utcNowTruncated, document["v"].ToNullableUniversalTime());
  569. Assert.Equal(null, document["n"].ToNullableUniversalTime());
  570. #pragma warning disable 618
  571. Assert.Equal(null, document["x", (DateTime?)null].ToNullableUniversalTime());
  572. Assert.Equal(null, document["x", BsonNull.Value].ToNullableUniversalTime());
  573. #pragma warning restore
  574. #pragma warning disable 618, 219
  575. Assert.Throws<InvalidCastException>(() => { var v = (DateTime?)document["s"]; });
  576. Assert.Throws<InvalidCastException>(() => { var v = document["s"].AsNullableDateTime; });
  577. Assert.Throws<NotSupportedException>(() => { var v = document["s"].ToNullableUniversalTime(); });
  578. #pragma warning restore
  579. }
  580. [Fact]
  581. public void TestNullableDouble()
  582. {
  583. var document = new BsonDocument { { "v", 1.5 }, { "n", BsonNull.Value }, { "s", "" } };
  584. Assert.Equal(1.5, (double?)document["v"]);
  585. Assert.Equal(null, (double?)document["n"]);
  586. #pragma warning disable 618
  587. Assert.Equal(null, (double?)document["x", null]);
  588. Assert.Equal(null, (double?)document["x", (double?)null]);
  589. Assert.Equal(null, (double?)document["x", BsonNull.Value]);
  590. #pragma warning restore
  591. Assert.Equal(1.5, document["v"].AsNullableDouble);
  592. Assert.Equal(null, document["n"].AsNullableDouble);
  593. #pragma warning disable 618
  594. Assert.Equal(null, document["x", (double?)null].AsNullableDouble);
  595. Assert.Equal(null, document["x", BsonNull.Value].AsNullableDouble);
  596. #pragma warning restore
  597. #pragma warning disable 219
  598. Assert.Throws<InvalidCastException>(() => { var v = (double?)document["s"]; });
  599. Assert.Throws<InvalidCastException>(() => { var v = document["s"].AsNullableDouble; });
  600. #pragma warning restore
  601. }
  602. [Theory]
  603. [ParameterAttributeData]
  604. [ResetGuidModeAfterTest]
  605. public void TestNullableGuid(
  606. [ClassValues(typeof(GuidModeValues))] GuidMode mode)
  607. {
  608. mode.Set();
  609. #pragma warning disable 618, 1062
  610. var guid = Guid.NewGuid();
  611. if (BsonDefaults.GuidRepresentationMode == GuidRepresentationMode.V2 && BsonDefaults.GuidRepresentation != GuidRepresentation.Unspecified)
  612. {
  613. var document = new BsonDocument { { "v", guid }, { "n", BsonNull.Value }, { "s", "" } };
  614. Assert.Equal(guid, (Guid?)document["v"]);
  615. Assert.Equal(null, (Guid?)document["n"]);
  616. Assert.Equal(null, (Guid?)document["x", null]);
  617. Assert.Equal(null, (Guid?)document["x", (Guid?)null]);
  618. Assert.Equal(null, (Guid?)document["x", BsonNull.Value]);
  619. Assert.Equal(guid, document["v"].AsNullableGuid);
  620. Assert.Equal(null, document["n"].AsNullableGuid);
  621. Assert.Equal(null, document["x", (Guid?)null].AsNullableGuid);
  622. Assert.Equal(null, document["x", BsonNull.Value].AsNullableGuid);
  623. Assert.Throws<InvalidCastException>(() => { var v = (Guid?)document["s"]; });
  624. Assert.Throws<InvalidCastException>(() => { var v = document["s"].AsNullableGuid; });
  625. }
  626. else
  627. {
  628. var exception = Record.Exception(() => new BsonDocument { { "v", guid }, { "n", BsonNull.Value }, { "s", "" } });
  629. exception.Should().BeOfType<InvalidOperationException>();
  630. }
  631. #pragma warning restore 618, 1062
  632. }
  633. [Fact]
  634. public void TestNullableInt32()
  635. {
  636. var document = new BsonDocument { { "v", 1 }, { "n", BsonNull.Value }, { "s", "" } };
  637. Assert.Equal(1, (int?)document["v"]);
  638. Assert.Equal(null, (int?)document["n"]);
  639. #pragma warning disable 618
  640. Assert.Equal(null, (int?)document["x", null]);
  641. Assert.Equal(null, (int?)document["x", (int?)null]);
  642. Assert.Equal(null, (int?)document["x", BsonNull.Value]);
  643. #pragma warning restore
  644. Assert.Equal(1, document["v"].AsNullableInt32);
  645. Assert.Equal(null, document["n"].AsNullableInt32);
  646. #pragma warning disable 618
  647. Assert.Equal(null, document["x", (int?)null].AsNullableInt32);
  648. Assert.Equal(null, document["x", BsonNull.Value].AsNullableInt32);
  649. #pragma warning restore
  650. #pragma warning disable 219
  651. Assert.Throws<InvalidCastException>(() => { var v = (int?)document["s"]; });
  652. Assert.Throws<InvalidCastException>(() => { var v = document["s"].AsNullableInt32; });
  653. #pragma warning restore
  654. }
  655. [Fact]
  656. public void TestNullableInt64()
  657. {
  658. var document = new BsonDocument { { "v", 1L }, { "n", BsonNull.Value }, { "s", "" } };
  659. Assert.Equal(1L, (long?)document["v"]);
  660. Assert.Equal(null, (long?)document["n"]);
  661. #pragma warning disable 618
  662. Assert.Equal(null, (long?)document["x", null]);
  663. Assert.Equal(null, (long?)document["x", (long?)null]);
  664. Assert.Equal(null, (long?)document["x", BsonNull.Value]);
  665. #pragma warning restore
  666. Assert.Equal(1L, document["v"].AsNullableInt64);
  667. Assert.Equal(null, document["n"].AsNullableInt64);
  668. #pragma warning disable 618
  669. Assert.Equal(null, document["x", (long?)null].AsNullableInt64);
  670. Assert.Equal(null, document["x", BsonNull.Value].AsNullableInt64);
  671. #pragma warning restore
  672. #pragma warning disable 219
  673. Assert.Throws<InvalidCastException>(() => { var v = (long?)document["s"]; });
  674. Assert.Throws<InvalidCastException>(() => { var v = document["s"].AsNullableInt64; });
  675. #pragma warning restore
  676. }
  677. [Fact]
  678. public void TestNullableObjectId()
  679. {
  680. var objectId = ObjectId.GenerateNewId();
  681. var document = new BsonDocument { { "v", objectId }, { "n", BsonNull.Value }, { "s", "" } };
  682. Assert.Equal(objectId, (ObjectId?)document["v"]);
  683. Assert.Equal(null, (ObjectId?)document["n"]);
  684. #pragma warning disable 618
  685. Assert.Equal(null, (ObjectId?)document["x", null]);
  686. Assert.Equal(null, (ObjectId?)document["x", (ObjectId?)null]);
  687. Assert.Equal(null, (ObjectId?)document["x", BsonNull.Value]);
  688. #pragma warning restore
  689. Assert.Equal(objectId, document["v"].AsNullableObjectId);
  690. Assert.Equal(null, document["n"].AsNullableObjectId);
  691. #pragma warning disable 618
  692. Assert.Equal(null, document["x", (ObjectId?)null].AsNullableObjectId);
  693. Assert.Equal(null, document["x", BsonNull.Value].AsNullableObjectId);
  694. #pragma warning restore
  695. #pragma warning disable 219
  696. Assert.Throws<InvalidCastException>(() => { var v = (ObjectId?)document["s"]; });
  697. Assert.Throws<InvalidCastException>(() => { var v = document["s"].AsNullableObjectId; });
  698. #pragma warning restore
  699. }
  700. [Fact]
  701. public void TestOperatorEqual()
  702. {
  703. var document1 = new BsonDocument("x", 1);
  704. var document2 = new BsonDocument("x", 1);
  705. Assert.NotSame(document1, document2);
  706. Assert.True(document1 == document2);
  707. }
  708. [Fact]
  709. public void TestOperatorEqualBothNull()
  710. {
  711. BsonDocument document1 = null;
  712. BsonDocument document2 = null;
  713. Assert.True(document1 == document2);
  714. }
  715. [Fact]
  716. public void TestOperatorEqualLhsNull()
  717. {
  718. var document = new BsonDocument();
  719. Assert.False(null == document);
  720. }
  721. [Fact]
  722. public void TestOperatorEqualRhsNull()
  723. {
  724. var document = new BsonDocument();
  725. Assert.False(document == null);
  726. }
  727. [Fact]
  728. public void TestOperatorNotEqual()
  729. {
  730. var document1 = new BsonDocument("x", 1);
  731. var document2 = new BsonDocument("x", 1);
  732. Assert.NotSame(document1, document2);
  733. Assert.False(document1 != document2);
  734. }
  735. [Fact]
  736. public void TestOperatorNotEqualBothNull()
  737. {
  738. BsonDocument document1 = null;
  739. BsonDocument document2 = null;
  740. Assert.False(document1 != document2);
  741. }
  742. [Fact]
  743. public void TestOperatorNotEqualLhsNull()
  744. {
  745. var document = new BsonDocument();
  746. Assert.True(null != document);
  747. }
  748. [Fact]
  749. public void TestOperatorNotEqualRhsNull()
  750. {
  751. var document = new BsonDocument();
  752. Assert.True(document != null);
  753. }
  754. [Fact]
  755. public void TestParse()
  756. {
  757. var json = "{ a : 1, b : 'abc' }";
  758. var document = BsonDocument.Parse(json);
  759. Assert.Equal(2, document.ElementCount);
  760. Assert.Equal(1, document["a"].AsInt32);
  761. Assert.Equal("abc", document["b"].AsString);
  762. }
  763. [Fact]
  764. public void TestParseWithExtraCharacters()
  765. {
  766. var json = "{ a : 1, b : 'abc' } x";
  767. Action action = () => BsonDocument.Parse(json);
  768. action.ShouldThrow<FormatException>();
  769. }
  770. [Fact]
  771. public void TestParseWithExtraWhitespace()
  772. {
  773. var json = "{ a : 1, b : 'abc' } ";
  774. var document = BsonDocument.Parse(json);
  775. Assert.Equal(2, document.ElementCount);
  776. Assert.Equal(1, document["a"].AsInt32);
  777. Assert.Equal("abc", document["b"].AsString);
  778. }
  779. [Fact]
  780. public void TestRemove()
  781. {
  782. var document = new BsonDocument("x", 1);
  783. Assert.Equal(1, document.ElementCount);
  784. document.Remove("x");
  785. Assert.Equal(0, document.ElementCount);
  786. }
  787. [Fact]
  788. public void TestRemoveAt()
  789. {
  790. var document = new BsonDocument { { "x", 1 }, { "y", 2 } };
  791. Assert.Equal(2, document.ElementCount);
  792. document.RemoveAt(0);
  793. Assert.Equal(1, document.ElementCount);
  794. Assert.Equal(2, document["y"].AsInt32);
  795. }
  796. [Fact]
  797. public void TestRemoveElement()
  798. {
  799. var document = new BsonDocument { { "x", 1 }, { "y", 2 } };
  800. Assert.Equal(2, document.ElementCount);
  801. document.RemoveElement(document.GetElement(0));
  802. Assert.Equal(1, document.ElementCount);
  803. Assert.Equal(2, document["y"].AsInt32);
  804. }
  805. [Fact]
  806. public void TestSetByIndex()
  807. {
  808. var document = new BsonDocument("x", 1);
  809. Assert.Equal(1, document.ElementCount);
  810. Assert.Equal(1, document["x"].AsInt32);
  811. document.Set(0, 2);
  812. Assert.Equal(1, document.ElementCount);
  813. Assert.Equal(2, document["x"].AsInt32);
  814. }
  815. [Fact]
  816. public void TestSetByName()
  817. {
  818. var document = new BsonDocument();
  819. Assert.Equal(0, document.ElementCount);
  820. document.Set("x", 1);
  821. Assert.Equal(1, document.ElementCount);
  822. Assert.Equal(1, document["x"].AsInt32);
  823. document.Set("x", 2);
  824. Assert.Equal(1, document.ElementCount);
  825. Assert.Equal(2, document["x"].AsInt32);
  826. }
  827. [Fact]
  828. public void TestSetDocumentId()
  829. {
  830. var document = new BsonDocument("_id", 1);
  831. ((IBsonIdProvider)BsonDocumentSerializer.Instance).SetDocumentId(document, BsonValue.Create(2));
  832. Assert.Equal(2, document["_id"].AsInt32);
  833. }
  834. [Fact]
  835. public void TestSetDocumentIdNewElement()
  836. {
  837. var document = new BsonDocument("x", 1);
  838. ((IBsonIdProvider)BsonDocumentSerializer.Instance).SetDocumentId(document, BsonValue.Create(2));
  839. Assert.Equal(2, document.ElementCount);
  840. Assert.Equal("_id", document.GetElement(0).Name);
  841. Assert.Equal(2, document["_id"].AsInt32);
  842. }
  843. [Fact]
  844. public void TestSetElementByIndex()
  845. {
  846. var document = new BsonDocument("x", 1);
  847. var element = new BsonElement("y", 2);
  848. document.SetElement(0, element);
  849. Assert.Equal(1, document.ElementCount);
  850. Assert.Equal("y", document.GetElement(0).Name);
  851. Assert.Equal(2, document["y"].AsInt32);
  852. }
  853. [Fact]
  854. public void TestSetElementNewElement()
  855. {
  856. var document = new BsonDocument("x", 1);
  857. var element = new BsonElement("y", 2);
  858. document.SetElement(element);
  859. Assert.Equal(2, document.ElementCount);
  860. Assert.Equal("x", document.GetElement(0).Name);
  861. Assert.Equal(1, document["x"].AsInt32);
  862. Assert.Equal("y", document.GetElement(1).Name);
  863. Assert.Equal(2, document["y"].AsInt32);
  864. }
  865. [Fact]
  866. public void TestSetElementReplaceElement()
  867. {
  868. var document = new BsonDocument("x", 1);
  869. var element = new BsonElement("x", 2);
  870. document.SetElement(element);
  871. Assert.Equal(1, document.ElementCount);
  872. Assert.Equal("x", document.GetElement(0).Name);
  873. Assert.Equal(2, document["x"].AsInt32);
  874. }
  875. [Fact]
  876. public void TestSpecBsonAwesomeWithBsonDocument()
  877. {
  878. // this test is from http://bsonspec.org/#/specification
  879. BsonDocument document = new BsonDocument("BSON", new BsonArray { "awesome", 5.05, 1986 });
  880. byte[] bson = document.ToBson();
  881. AssertAreEqual(@"1\x00\x00\x00\x04BSON\x00&\x00\x00\x00\x020\x00\x08\x00\x00\x00awesome\x00\x011\x00333333\x14@\x102\x00\xc2\x07\x00\x00\x00\x00", bson);
  882. }
  883. [Fact]
  884. public void TestSpecBsonAwesomeWithBsonWriter()
  885. {
  886. // this test is from http://bsonspec.org/#/specification
  887. var stream = new MemoryStream();
  888. using (var bsonWriter = new BsonBinaryWriter(stream))
  889. {
  890. bsonWriter.WriteStartDocument();
  891. bsonWriter.WriteStartArray("BSON");
  892. bsonWriter.WriteString("awesome");
  893. bsonWriter.WriteDouble(5.05);
  894. bsonWriter.WriteInt32(1986);
  895. bsonWriter.WriteEndArray();
  896. bsonWriter.WriteEndDocument();
  897. }
  898. byte[] bytes = stream.ToArray();
  899. AssertAreEqual(@"1\x00\x00\x00\x04BSON\x00&\x00\x00\x00\x020\x00\x08\x00\x00\x00awesome\x00\x011\x00333333\x14@\x102\x00\xc2\x07\x00\x00\x00\x00", bytes);
  900. }
  901. [Fact]
  902. public void TestSpecHelloWorldWithBsonDocument()
  903. {
  904. // this test is from http://bsonspec.org/#/specification
  905. BsonDocument document = new BsonDocument("hello", "world");
  906. byte[] bson = document.ToBson();
  907. AssertAreEqual(@"\x16\x00\x00\x00\x02hello\x00\x06\x00\x00\x00world\x00\x00", bson);
  908. }
  909. [Fact]
  910. public void TestSpecHelloWorldWithBsonWriter()
  911. {
  912. // this test is from http://bsonspec.org/#/specification
  913. var stream = new MemoryStream();
  914. using (var bsonWriter = new BsonBinaryWriter(stream))
  915. {
  916. bsonWriter.WriteStartDocument();
  917. bsonWriter.WriteString("hello", "world");
  918. bsonWriter.WriteEndDocument();
  919. }
  920. byte[] bytes = stream.ToArray();
  921. AssertAreEqual(@"\x16\x00\x00\x00\x02hello\x00\x06\x00\x00\x00world\x00\x00", bytes);
  922. }
  923. [Fact]
  924. public void TestToBsonDocument()
  925. {
  926. var document = new BsonDocument();
  927. Assert.Same(document, document.ToBsonDocument());
  928. Assert.Same(document, ((IConvertibleToBsonDocument)document).ToBsonDocument());
  929. }
  930. [Fact]
  931. public void TestToDictionaryEmpty()
  932. {
  933. var document = new BsonDocument();
  934. var dictionary = document.ToDictionary();
  935. Assert.Equal(0, dictionary.Count);
  936. }
  937. [Fact]
  938. public void TestToDictionaryNestedArray()
  939. {
  940. var document = new BsonDocument
  941. {
  942. { "x", 1 },
  943. { "array", new BsonArray { 1, "abc" } }
  944. };
  945. var dictionary = document.ToDictionary();
  946. Assert.Equal(2, dictionary.Count);
  947. Assert.IsType<int>(dictionary["x"]);
  948. Assert.Equal(1, dictionary["x"]);
  949. Assert.IsType<object[]>(dictionary["array"]);
  950. var nested = (object[])dictionary["array"];
  951. Assert.IsType<int>(nested[0]);
  952. Assert.IsType<string>(nested[1]);
  953. Assert.Equal(1, nested[0]);
  954. Assert.Equal("abc", nested[1]);
  955. }
  956. [Fact]
  957. public void TestToDictionaryNestedDocument()
  958. {
  959. var document = new BsonDocument
  960. {
  961. { "x", 1 },
  962. { "nested", new BsonDocument { { "a", 1 }, { "b", 2 } } }
  963. };
  964. var dictionary = document.ToDictionary();
  965. Assert.Equal(2, dictionary.Count);
  966. Assert.IsType<int>(dictionary["x"]);
  967. Assert.Equal(1, dictionary["x"]);
  968. Assert.IsType<Dictionary<string, object>>(dictionary["nested"]);
  969. var nested = (Dictionary<string, object>)dictionary["nested"];
  970. Assert.IsType<int>(nested["a"]);
  971. Assert.IsType<int>(nested["b"]);
  972. Assert.Equal(1, nested["a"]);
  973. Assert.Equal(2, nested["b"]);
  974. }
  975. [Fact]
  976. public void TestToDictionaryOneBinary()
  977. {
  978. var document = new BsonDocument("x", new BsonBinaryData(new byte[] { 1, 2, 3 }, BsonBinarySubType.Binary));
  979. var dictionary = document.ToDictionary();
  980. Assert.Equal(1, dictionary.Count);
  981. Assert.IsType<byte[]>(dictionary["x"]);
  982. Assert.True(new byte[] { 1, 2, 3 }.SequenceEqual((byte[])dictionary["x"]));
  983. }
  984. [Fact]
  985. public void TestToDictionaryOneBoolean()
  986. {
  987. var document = new BsonDocument("x", true);
  988. var dictionary = document.ToDictionary();
  989. Assert.Equal(1, dictionary.Count);
  990. Assert.IsType<bool>(dictionary["x"]);
  991. Assert.Equal(true, dictionary["x"]);
  992. }
  993. [Fact]
  994. public void TestToDictionaryOneDateTime()
  995. {
  996. var utcNow = DateTime.UtcNow;
  997. var utcNowTruncated = utcNow.AddTicks(-(utcNow.Ticks % 10000));
  998. var document = new BsonDocument("x", utcNow);
  999. var dictionary = document.ToDictionary();
  1000. Assert.Equal(1, dictionary.Count);
  1001. Assert.IsType<DateTime>(dictionary["x"]);
  1002. Assert.Equal(DateTimeKind.Utc, ((DateTime)dictionary["x"]).Kind);
  1003. Assert.Equal(utcNowTruncated, dictionary["x"]);
  1004. }
  1005. [Fact]
  1006. public void TestToDictionaryOneDouble()
  1007. {
  1008. var document = new BsonDocument("x", 1.0);
  1009. var dictionary = document.ToDictionary();
  1010. Assert.Equal(1, dictionary.Count);
  1011. Assert.IsType<double>(dictionary["x"]);
  1012. Assert.Equal(1.0, dictionary["x"]);
  1013. }
  1014. [Theory]
  1015. [ParameterAttributeData]
  1016. [ResetGuidModeAfterTest]
  1017. public void TestToDictionaryOneGuidLegacy(
  1018. [ClassValues(typeof(GuidModeValues))] GuidMode mode)
  1019. {
  1020. mode.Set();
  1021. #pragma warning disable 618
  1022. var guid = Guid.NewGuid();
  1023. var document = new BsonDocument("x", new BsonBinaryData(guid, GuidRepresentation.CSharpLegacy));
  1024. if (BsonDefaults.GuidRepresentationMode == GuidRepresentationMode.V2)
  1025. {
  1026. var dictionary = document.ToDictionary();
  1027. Assert.Equal(1, dictionary.Count);
  1028. Assert.IsType<Guid>(dictionary["x"]);
  1029. Assert.Equal(guid, dictionary["x"]);
  1030. }
  1031. #pragma warning restore 618
  1032. }
  1033. [Fact]
  1034. public void TestToDictionaryOneGuidStandard()
  1035. {
  1036. var guid = Guid.NewGuid();
  1037. var document = new BsonDocument("x", new BsonBinaryData(guid, GuidRepresentation.Standard));
  1038. var dictionary = document.ToDictionary();
  1039. Assert.Equal(1, dictionary.Count);
  1040. Assert.IsType<Guid>(dictionary["x"]);
  1041. Assert.Equal(guid, dictionary["x"]);
  1042. }
  1043. [Fact]
  1044. public void TestToDictionaryOneInt32()
  1045. {
  1046. var document = new BsonDocument("x", 1);
  1047. var dictionary = document.ToDictionary();
  1048. Assert.Equal(1, dictionary.Count);
  1049. Assert.IsType<int>(dictionary["x"]);
  1050. Assert.Equal(1, dictionary["x"]);
  1051. }
  1052. [Fact]
  1053. public void TestToDictionaryOneInt64()
  1054. {
  1055. var document = new BsonDocument("x", 1L);
  1056. var dictionary = document.ToDictionary();
  1057. Assert.Equal(1, dictionary.Count);
  1058. Assert.IsType<long>(dictionary["x"]);
  1059. Assert.Equal(1L, dictionary["x"]);
  1060. }
  1061. [Fact]
  1062. public void TestToDictionaryOneObjectId()
  1063. {
  1064. var objectId = ObjectId.GenerateNewId();
  1065. var hashtable = new BsonDocument("x", objectId);
  1066. var dictionary = hashtable.ToDictionary();
  1067. Assert.Equal(1, dictionary.Count);
  1068. Assert.IsType<ObjectId>(dictionary["x"]);
  1069. Assert.Equal(objectId, dictionary["x"]);
  1070. }
  1071. [Fact]
  1072. public void TestToDictionaryOneString()
  1073. {
  1074. var document = new BsonDocument("x", "abc");
  1075. var dictionary = document.ToDictionary();
  1076. Assert.Equal(1, dictionary.Count);
  1077. Assert.IsType<string>(dictionary["x"]);
  1078. Assert.Equal("abc", dictionary["x"]);
  1079. }
  1080. [Fact]
  1081. public void TestToDictionaryOtherTypes()
  1082. {
  1083. var document = new BsonDocument
  1084. {
  1085. { "JavaScript", new BsonJavaScript("x = 1") },
  1086. { "JavaScriptWithScope", new BsonJavaScriptWithScope("x = y", new BsonDocument("y", 1)) },
  1087. { "MaxKey", BsonMaxKey.Value },
  1088. { "MinKey", BsonMinKey.Value },
  1089. { "Null", BsonNull.Value },
  1090. { "RegularExpression", new BsonRegularExpression("abc") },
  1091. { "Symbol", BsonSymbolTable.Lookup("name") },
  1092. { "Timestamp", new BsonTimestamp(123L) },
  1093. { "Undefined", BsonUndefined.Value },
  1094. };
  1095. var dictionary = document.ToDictionary();
  1096. Assert.Equal(9, dictionary.Count);
  1097. Assert.IsType<BsonJavaScript>(dictionary["JavaScript"]);
  1098. Assert.IsType<BsonJavaScriptWithScope>(dictionary["JavaScriptWithScope"]);
  1099. Assert.Same(BsonMaxKey.Value, dictionary["MaxKey"]);
  1100. Assert.Same(BsonMinKey.Value, dictionary["MinKey"]);
  1101. Assert.Null(dictionary["Null"]);
  1102. Assert.IsType<BsonRegularExpression>(dictionary["RegularExpression"]);
  1103. Assert.IsType<BsonSymbol>(dictionary["Symbol"]);
  1104. Assert.IsType<BsonTimestamp>(dictionary["Timestamp"]);
  1105. Assert.Same(BsonUndefined.Value, dictionary["Undefined"]);
  1106. }
  1107. [Fact]
  1108. public void TestToHashtableEmpty()
  1109. {
  1110. var document = new BsonDocument();
  1111. var hashtable = document.ToHashtable();
  1112. Assert.Equal(0, hashtable.Count);
  1113. }
  1114. [Fact]
  1115. public void TestToHashtableNestedArray()
  1116. {
  1117. var document = new BsonDocument
  1118. {
  1119. { "x", 1 },
  1120. { "array", new BsonArray { 1, "abc" } }
  1121. };
  1122. var hashtable = document.ToHashtable();
  1123. Assert.Equal(2, hashtable.Count);
  1124. Assert.IsType<int>(hashtable["x"]);
  1125. Assert.Equal(1, hashtable["x"]);
  1126. Assert.IsType<object[]>(hashtable["array"]);
  1127. var nested = (object[])hashtable["array"];
  1128. Assert.IsType<int>(nested[0]);
  1129. Assert.IsType<string>(nested[1]);
  1130. Assert.Equal(1, nested[0]);
  1131. Assert.Equal("abc", nested[1]);
  1132. }
  1133. [Fact]
  1134. public void TestToHashtableNestedDocument()
  1135. {
  1136. var document = new BsonDocument
  1137. {
  1138. { "x", 1 },
  1139. { "nested", new BsonDocument { { "a", 1 }, { "b", 2 } } }
  1140. };
  1141. var hashtable = document.ToHashtable();
  1142. Assert.Equal(2, hashtable.Count);
  1143. Assert.IsType<int>(hashtable["x"]);
  1144. Assert.Equal(1, hashtable["x"]);
  1145. Assert.IsType<Hashtable>(hashtable["nested"]);
  1146. var nested = (Hashtable)hashtable["nested"];
  1147. Assert.IsType<int>(nested["a"]);
  1148. Assert.IsType<int>(nested["b"]);
  1149. Assert.Equal(1, nested["a"]);
  1150. Assert.Equal(2, nested["b"]);
  1151. }
  1152. [Fact]
  1153. public void TestToHashtableOneBinary()
  1154. {
  1155. var document = new BsonDocument("x", new BsonBinaryData(new byte[] { 1, 2, 3 }, BsonBinarySubType.Binary));
  1156. var hashtable = document.ToHashtable();
  1157. Assert.Equal(1, hashtable.Count);
  1158. Assert.IsType<byte[]>(hashtable["x"]);
  1159. Assert.True(new byte[] { 1, 2, 3 }.SequenceEqual((byte[])hashtable["x"]));
  1160. }
  1161. [Fact]
  1162. public void TestToHashtableOneBoolean()
  1163. {
  1164. var document = new BsonDocument("x", true);
  1165. var dictionary = document.ToHashtable();
  1166. Assert.Equal(1, dictionary.Count);
  1167. Assert.IsType<bool>(dictionary["x"]);
  1168. Assert.Eq

Large files files are truncated, but you can click here to view the full file