PageRenderTime 48ms CodeModel.GetById 13ms RepoModel.GetById 0ms app.codeStats 0ms

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

http://github.com/mongodb/mongo-csharp-driver
C# | 1124 lines | 995 code | 114 blank | 15 comment | 41 complexity | 57467709f9c2139990d43cbfe47bfab7 MD5 | raw file
Possible License(s): Apache-2.0
  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.Linq;
  17. using System.Text.RegularExpressions;
  18. using FluentAssertions;
  19. using MongoDB.Bson.TestHelpers;
  20. using MongoDB.Bson.TestHelpers.XunitExtensions;
  21. using Xunit;
  22. namespace MongoDB.Bson.Tests
  23. {
  24. public class BsonValueTests
  25. {
  26. [Theory]
  27. [ParameterAttributeData]
  28. public void implicit_conversion_from_bool_should_return_precreated_instance(
  29. [Values(false, true)]
  30. bool value)
  31. {
  32. var result1 = (BsonValue)value;
  33. var result2 = (BsonValue)value;
  34. result2.Should().BeSameAs(result1);
  35. }
  36. [Theory]
  37. [ParameterAttributeData]
  38. public void implicit_conversion_from_double_should_return_new_instance(
  39. [Values(-101.0, 101.0)]
  40. double value)
  41. {
  42. var result1 = (BsonValue)value;
  43. var result2 = (BsonValue)value;
  44. result2.Should().NotBeSameAs(result1);
  45. }
  46. [Theory]
  47. [ParameterAttributeData]
  48. public void implicit_conversion_from_double_should_return_precreated_instance(
  49. [Range(-100.0, 100.0, 1.0)]
  50. double value)
  51. {
  52. var result1 = (BsonValue)value;
  53. var result2 = (BsonValue)value;
  54. result2.Should().BeSameAs(result1);
  55. }
  56. [Theory]
  57. [ParameterAttributeData]
  58. public void implicit_conversion_from_int_should_return_new_instance(
  59. [Values(-101, 101)]
  60. int value)
  61. {
  62. var result1 = (BsonValue)value;
  63. var result2 = (BsonValue)value;
  64. result2.Should().NotBeSameAs(result1);
  65. }
  66. [Theory]
  67. [ParameterAttributeData]
  68. public void implicit_conversion_from_int_should_return_precreated_instance(
  69. [Range(-100, 100)]
  70. int value)
  71. {
  72. var result1 = (BsonValue)value;
  73. var result2 = (BsonValue)value;
  74. result2.Should().BeSameAs(result1);
  75. }
  76. [Theory]
  77. [ParameterAttributeData]
  78. public void implicit_conversion_from_long_should_return_new_instance(
  79. [Values(-101L, 101L)]
  80. long value)
  81. {
  82. var result1 = (BsonValue)value;
  83. var result2 = (BsonValue)value;
  84. result2.Should().NotBeSameAs(result1);
  85. }
  86. [Theory]
  87. [ParameterAttributeData]
  88. public void implicit_conversion_from_long_should_return_precreated_instance(
  89. [Range(-100L, 100L, 1L)]
  90. long value)
  91. {
  92. var result1 = (BsonValue)value;
  93. var result2 = (BsonValue)value;
  94. result2.Should().BeSameAs(result1);
  95. }
  96. [Theory]
  97. [ParameterAttributeData]
  98. public void implicit_conversion_from_string_should_return_new_instance(
  99. [Values("x")]
  100. string value)
  101. {
  102. var result1 = (BsonValue)value;
  103. var result2 = (BsonValue)value;
  104. result2.Should().NotBeSameAs(result1);
  105. }
  106. [Theory]
  107. [ParameterAttributeData]
  108. public void implicit_conversion_from_string_should_return_precreated_instance(
  109. [Values("")]
  110. string value)
  111. {
  112. var result1 = (BsonValue)value;
  113. var result2 = (BsonValue)value;
  114. result2.Should().BeSameAs(result1);
  115. }
  116. [Fact]
  117. public void TestAsBoolean()
  118. {
  119. BsonValue v = true;
  120. BsonValue s = "";
  121. var b = v.AsBoolean;
  122. Assert.Equal(true, b);
  123. Assert.Throws<InvalidCastException>(() => { var x = s.AsBoolean; });
  124. }
  125. [Fact]
  126. public void TestAsBsonArray()
  127. {
  128. BsonValue v = new BsonArray { 1, 2 };
  129. BsonValue s = "";
  130. var a = v.AsBsonArray;
  131. Assert.Equal(2, a.Count);
  132. Assert.Equal(1, a[0].AsInt32);
  133. Assert.Equal(2, a[1].AsInt32);
  134. Assert.Throws<InvalidCastException>(() => { var x = s.AsBsonArray; });
  135. }
  136. [Fact]
  137. public void TestAsBinaryData()
  138. {
  139. BsonValue v = new byte[] { 1, 2 };
  140. BsonValue s = "";
  141. var b = v.AsBsonBinaryData;
  142. Assert.Equal(2, b.AsByteArray.Length);
  143. Assert.Equal(1, b.AsByteArray[0]);
  144. Assert.Equal(2, b.AsByteArray[1]);
  145. Assert.Equal(BsonBinarySubType.Binary, b.SubType);
  146. Assert.Throws<InvalidCastException>(() => { var x = s.AsBsonBinaryData; });
  147. }
  148. [Fact]
  149. public void TestAsBsonDocument()
  150. {
  151. BsonValue v = new BsonDocument("x", 1);
  152. BsonValue s = "";
  153. var d = v.AsBsonDocument;
  154. Assert.Equal(1, d.ElementCount);
  155. Assert.Equal("x", d.GetElement(0).Name);
  156. Assert.Equal(1, d[0].AsInt32);
  157. Assert.Throws<InvalidCastException>(() => { var x = s.AsBsonDocument; });
  158. }
  159. [Fact]
  160. public void TestAsBsonJavaScript()
  161. {
  162. BsonValue v = new BsonJavaScript("code");
  163. BsonValue s = "";
  164. var js = v.AsBsonJavaScript;
  165. Assert.Equal("code", js.Code);
  166. Assert.Throws<InvalidCastException>(() => { var x = s.AsBsonJavaScript; });
  167. }
  168. [Fact]
  169. public void TestAsBsonJavaScriptWithScode()
  170. {
  171. var scope = new BsonDocument("x", 1);
  172. BsonValue s = "";
  173. BsonValue v = new BsonJavaScriptWithScope("code", scope);
  174. var js = v.AsBsonJavaScriptWithScope;
  175. Assert.Equal("code", js.Code);
  176. Assert.Equal(1, js.Scope.ElementCount);
  177. Assert.Equal("x", js.Scope.GetElement(0).Name);
  178. Assert.Equal(1, js.Scope["x"].AsInt32);
  179. Assert.Same(v.AsBsonJavaScript, v.AsBsonJavaScriptWithScope);
  180. Assert.Throws<InvalidCastException>(() => { var x = s.AsBsonJavaScriptWithScope; });
  181. }
  182. [Fact]
  183. public void TestAsBsonMaxKey()
  184. {
  185. BsonValue v = BsonMaxKey.Value;
  186. BsonValue s = "";
  187. var m = v.AsBsonMaxKey;
  188. Assert.Same(BsonMaxKey.Value, m);
  189. Assert.Throws<InvalidCastException>(() => { var x = s.AsBsonMaxKey; });
  190. }
  191. [Fact]
  192. public void TestAsBsonMinKey()
  193. {
  194. BsonValue v = BsonMinKey.Value;
  195. BsonValue s = "";
  196. var m = v.AsBsonMinKey;
  197. Assert.Same(BsonMinKey.Value, m);
  198. Assert.Throws<InvalidCastException>(() => { var x = s.AsBsonMinKey; });
  199. }
  200. [Fact]
  201. public void TestAsBsonNull()
  202. {
  203. BsonValue v = BsonNull.Value;
  204. BsonValue s = "";
  205. var n = v.AsBsonNull;
  206. Assert.Same(BsonNull.Value, n);
  207. Assert.Throws<InvalidCastException>(() => { var x = s.AsBsonNull; });
  208. }
  209. [Fact]
  210. public void TestAsBsonRegularExpression()
  211. {
  212. BsonValue v = new BsonRegularExpression("pattern", "imxs");
  213. BsonValue s = "";
  214. var r = v.AsBsonRegularExpression;
  215. Assert.Equal("pattern", r.Pattern);
  216. Assert.Equal("imsx", r.Options);
  217. Assert.Throws<InvalidCastException>(() => { var x = s.AsBsonRegularExpression; });
  218. }
  219. [Fact]
  220. public void TestAsBsonSymbol()
  221. {
  222. BsonValue v = BsonSymbolTable.Lookup("name");
  223. BsonValue s = "";
  224. var sym = v.AsBsonSymbol;
  225. Assert.Equal("name", sym.Name);
  226. Assert.Throws<InvalidCastException>(() => { var x = s.AsBsonSymbol; });
  227. }
  228. [Fact]
  229. public void TestAsBsonTimestamp()
  230. {
  231. BsonValue v = new BsonTimestamp(1234);
  232. BsonValue s = "";
  233. var ts = v.AsBsonTimestamp;
  234. Assert.Equal(1234, ts.Value);
  235. Assert.Throws<InvalidCastException>(() => { var x = s.AsBsonTimestamp; });
  236. }
  237. [Fact]
  238. public void TestAsByteArray()
  239. {
  240. BsonValue v = new byte[] { 1, 2 };
  241. BsonValue s = "";
  242. var a = v.AsByteArray;
  243. Assert.Equal(2, a.Length);
  244. Assert.Equal(1, a[0]);
  245. Assert.Equal(2, a[1]);
  246. Assert.Throws<InvalidCastException>(() => { var x = s.AsByteArray; });
  247. }
  248. [Fact]
  249. public void TestAsDateTime()
  250. {
  251. var utcNow = DateTime.UtcNow;
  252. var utcNowTruncated = utcNow.AddTicks(-(utcNow.Ticks % 10000));
  253. BsonValue v = utcNow;
  254. BsonValue s = "";
  255. var dt = v.ToUniversalTime();
  256. Assert.Equal(utcNowTruncated, dt);
  257. #pragma warning disable 618
  258. Assert.Throws<InvalidCastException>(() => { var x = s.AsDateTime; });
  259. #pragma warning restore
  260. Assert.Throws<NotSupportedException>(() => s.ToUniversalTime());
  261. }
  262. [Fact]
  263. public void TestAsDecimal()
  264. {
  265. BsonValue v = (BsonDecimal128)1.5M;
  266. BsonValue s = "";
  267. var d = v.AsDecimal;
  268. Assert.Equal(1.5M, d);
  269. Assert.Throws<InvalidCastException>(() => { var x = s.AsDecimal; });
  270. }
  271. [Fact]
  272. public void TestAsDecimal128()
  273. {
  274. BsonValue v = (BsonDecimal128)1.5M;
  275. BsonValue s = "";
  276. var d = v.AsDecimal128;
  277. Assert.Equal((Decimal128)1.5M, d);
  278. Assert.Throws<InvalidCastException>(() => { var x = s.AsDecimal; });
  279. }
  280. [Fact]
  281. public void TestAsDouble()
  282. {
  283. BsonValue v = 1.5;
  284. BsonValue s = "";
  285. var d = v.AsDouble;
  286. Assert.Equal(1.5, d);
  287. Assert.Throws<InvalidCastException>(() => { var x = s.AsDouble; });
  288. }
  289. [Theory]
  290. [ParameterAttributeData]
  291. [ResetGuidModeAfterTest]
  292. public void TestAsGuid(
  293. [ClassValues(typeof(GuidModeValues))] GuidMode mode)
  294. {
  295. mode.Set();
  296. #pragma warning disable 618
  297. var guid = Guid.NewGuid();
  298. if (BsonDefaults.GuidRepresentationMode == GuidRepresentationMode.V2 && BsonDefaults.GuidRepresentation != GuidRepresentation.Unspecified)
  299. {
  300. BsonValue v = guid;
  301. BsonValue s = "";
  302. var g = v.AsGuid;
  303. Assert.Equal(guid, g);
  304. Assert.Throws<InvalidCastException>(() => { var x = s.AsGuid; });
  305. }
  306. else
  307. {
  308. var exception = Record.Exception(() => { BsonValue v = guid; });
  309. exception.Should().BeOfType<InvalidOperationException>();
  310. }
  311. #pragma warning restore 618
  312. }
  313. [Fact]
  314. public void TestAsInt32()
  315. {
  316. BsonValue v = 1;
  317. BsonValue s = "";
  318. var i = v.AsInt32;
  319. Assert.Equal(1, i);
  320. Assert.Throws<InvalidCastException>(() => { var x = s.AsInt32; });
  321. }
  322. [Fact]
  323. public void TestAsInt64()
  324. {
  325. BsonValue v = 1L;
  326. BsonValue s = "";
  327. var i = v.AsInt64;
  328. Assert.Equal(1L, i);
  329. Assert.Throws<InvalidCastException>(() => { var x = s.AsInt64; });
  330. }
  331. [Fact]
  332. public void TestAsNullableBoolean()
  333. {
  334. BsonValue v = true;
  335. BsonValue n = BsonNull.Value;
  336. BsonValue s = "";
  337. Assert.Equal(true, v.AsNullableBoolean);
  338. Assert.Equal(null, n.AsNullableBoolean);
  339. Assert.Throws<InvalidCastException>(() => { var x = s.AsNullableBoolean; });
  340. }
  341. [Fact]
  342. public void TestAsNullableDateTime()
  343. {
  344. var utcNow = DateTime.UtcNow;
  345. var utcNowTruncated = utcNow.AddTicks(-(utcNow.Ticks % 10000));
  346. BsonValue v = utcNow;
  347. BsonValue n = BsonNull.Value;
  348. BsonValue s = "";
  349. Assert.Equal(utcNowTruncated, v.ToNullableUniversalTime());
  350. Assert.Equal(null, n.ToNullableUniversalTime());
  351. #pragma warning disable 618
  352. Assert.Throws<InvalidCastException>(() => { var x = s.AsNullableDateTime; });
  353. #pragma warning restore
  354. Assert.Throws<NotSupportedException>(() => s.ToNullableUniversalTime());
  355. }
  356. [Fact]
  357. public void TestAsNullableDecimal()
  358. {
  359. BsonValue v = (BsonDecimal128)1.5M;
  360. BsonValue n = BsonNull.Value;
  361. BsonValue s = "";
  362. Assert.Equal(1.5M, v.AsNullableDecimal);
  363. Assert.Equal(null, n.AsNullableDecimal);
  364. Assert.Throws<InvalidCastException>(() => { var x = s.AsNullableDecimal; });
  365. }
  366. [Fact]
  367. public void TestAsNullableDecimal128()
  368. {
  369. BsonValue v = (BsonDecimal128)1.5M;
  370. BsonValue n = BsonNull.Value;
  371. BsonValue s = "";
  372. Assert.Equal((Decimal128)1.5M, v.AsNullableDecimal128);
  373. Assert.Equal(null, n.AsNullableDecimal128);
  374. Assert.Throws<InvalidCastException>(() => { var x = s.AsNullableDecimal128; });
  375. }
  376. [Fact]
  377. public void TestAsNullableDouble()
  378. {
  379. BsonValue v = 1.5;
  380. BsonValue n = BsonNull.Value;
  381. BsonValue s = "";
  382. Assert.Equal(1.5, v.AsNullableDouble);
  383. Assert.Equal(null, n.AsNullableDouble);
  384. Assert.Throws<InvalidCastException>(() => { var x = s.AsNullableDouble; });
  385. }
  386. [Theory]
  387. [ParameterAttributeData]
  388. [ResetGuidModeAfterTest]
  389. public void TestAsNullableGuid(
  390. [ClassValues(typeof(GuidModeValues))] GuidMode mode)
  391. {
  392. mode.Set();
  393. #pragma warning disable 618
  394. Guid guid = Guid.NewGuid();
  395. if (BsonDefaults.GuidRepresentationMode == GuidRepresentationMode.V2 && BsonDefaults.GuidRepresentation != GuidRepresentation.Unspecified)
  396. {
  397. BsonValue v = guid;
  398. BsonValue n = BsonNull.Value;
  399. BsonValue s = "";
  400. Assert.Equal(guid, v.AsNullableGuid);
  401. Assert.Equal(null, n.AsNullableGuid);
  402. Assert.Throws<InvalidCastException>(() => { var x = s.AsNullableGuid; });
  403. }
  404. else
  405. {
  406. var exception = Record.Exception(() => { BsonValue v = guid; });
  407. exception.Should().BeOfType<InvalidOperationException>();
  408. }
  409. #pragma warning restore 618
  410. }
  411. [Fact]
  412. public void TestAsNullableInt32()
  413. {
  414. BsonValue v = 1;
  415. BsonValue n = BsonNull.Value;
  416. BsonValue s = "";
  417. Assert.Equal(1, v.AsNullableInt32);
  418. Assert.Equal(null, n.AsNullableInt32);
  419. Assert.Throws<InvalidCastException>(() => { var x = s.AsNullableInt32; });
  420. }
  421. [Fact]
  422. public void TestAsNullableInt64()
  423. {
  424. BsonValue v = 1L;
  425. BsonValue n = BsonNull.Value;
  426. BsonValue s = "";
  427. Assert.Equal(1L, v.AsNullableInt64);
  428. Assert.Equal(null, n.AsNullableInt64);
  429. Assert.Throws<InvalidCastException>(() => { var x = s.AsNullableInt64; });
  430. }
  431. [Fact]
  432. public void TestAsNullableObjectId()
  433. {
  434. var objectId = ObjectId.GenerateNewId();
  435. BsonValue v = objectId;
  436. BsonValue n = BsonNull.Value;
  437. BsonValue s = "";
  438. Assert.Equal(objectId, v.AsNullableObjectId);
  439. Assert.Equal(null, n.AsNullableObjectId);
  440. Assert.Throws<InvalidCastException>(() => { var x = s.AsNullableObjectId; });
  441. }
  442. [Fact]
  443. public void TestAsObjectId()
  444. {
  445. var objectId = ObjectId.GenerateNewId();
  446. BsonValue v = objectId;
  447. BsonValue s = "";
  448. var o = v.AsObjectId;
  449. Assert.Equal(objectId, o);
  450. Assert.Throws<InvalidCastException>(() => { var x = s.AsObjectId; });
  451. }
  452. [Fact]
  453. public void TestAsRegexOptionNone()
  454. {
  455. BsonValue v = new BsonRegularExpression("xyz");
  456. BsonValue s = "";
  457. var r = v.AsRegex;
  458. Assert.Equal(RegexOptions.None, r.Options);
  459. Assert.Throws<InvalidCastException>(() => { var x = s.AsRegex; });
  460. }
  461. [Fact]
  462. public void TestAsRegexOptionAll()
  463. {
  464. BsonValue v = new BsonRegularExpression("xyz", "imxs");
  465. BsonValue s = "";
  466. var r = v.AsRegex;
  467. Assert.Equal(RegexOptions.IgnoreCase | RegexOptions.Multiline | RegexOptions.IgnorePatternWhitespace | RegexOptions.Singleline, r.Options);
  468. Assert.Throws<InvalidCastException>(() => { var x = s.AsRegex; });
  469. }
  470. [Fact]
  471. public void TestAsRegexOptionI()
  472. {
  473. BsonValue v = new BsonRegularExpression("xyz", "i");
  474. BsonValue s = "";
  475. var r = v.AsRegex;
  476. Assert.Equal(RegexOptions.IgnoreCase, r.Options);
  477. Assert.Throws<InvalidCastException>(() => { var x = s.AsRegex; });
  478. }
  479. [Fact]
  480. public void TestAsRegexOptionM()
  481. {
  482. BsonValue v = new BsonRegularExpression("xyz", "m");
  483. BsonValue s = "";
  484. var r = v.AsRegex;
  485. Assert.Equal(RegexOptions.Multiline, r.Options);
  486. Assert.Throws<InvalidCastException>(() => { var x = s.AsRegex; });
  487. }
  488. [Fact]
  489. public void TestAsRegexOptionX()
  490. {
  491. BsonValue v = new BsonRegularExpression("xyz", "x");
  492. BsonValue s = "";
  493. var r = v.AsRegex;
  494. Assert.Equal(RegexOptions.IgnorePatternWhitespace, r.Options);
  495. Assert.Throws<InvalidCastException>(() => { var x = s.AsRegex; });
  496. }
  497. [Fact]
  498. public void TestAsRegexOptionS()
  499. {
  500. BsonValue v = new BsonRegularExpression("xyz", "s");
  501. BsonValue s = "";
  502. var r = v.AsRegex;
  503. Assert.Equal(RegexOptions.Singleline, r.Options);
  504. Assert.Throws<InvalidCastException>(() => { var x = s.AsRegex; });
  505. }
  506. [Fact]
  507. public void TestAsString()
  508. {
  509. BsonValue v = "Hello";
  510. BsonValue i = 1;
  511. var s = v.AsString;
  512. Assert.Equal("Hello", s);
  513. Assert.Throws<InvalidCastException>(() => { var x = i.AsString; });
  514. }
  515. [Fact]
  516. public void TestBsonRegularExpressionConstructors()
  517. {
  518. var regex = new BsonRegularExpression("pattern");
  519. Assert.IsType<BsonRegularExpression>(regex);
  520. Assert.Equal("pattern", regex.Pattern);
  521. Assert.Equal("", regex.Options);
  522. regex = new BsonRegularExpression("/pattern/i");
  523. Assert.IsType<BsonRegularExpression>(regex);
  524. Assert.Equal("pattern", regex.Pattern);
  525. Assert.Equal("i", regex.Options);
  526. regex = new BsonRegularExpression(@"/pattern\/withslash/i");
  527. Assert.IsType<BsonRegularExpression>(regex);
  528. Assert.Equal("pattern/withslash", regex.Pattern);
  529. Assert.Equal("i", regex.Options);
  530. regex = new BsonRegularExpression("pattern", "i");
  531. Assert.IsType<BsonRegularExpression>(regex);
  532. Assert.Equal("pattern", regex.Pattern);
  533. Assert.Equal("i", regex.Options);
  534. regex = new BsonRegularExpression(new Regex("pattern"));
  535. Assert.IsType<BsonRegularExpression>(regex);
  536. Assert.Equal("pattern", regex.Pattern);
  537. Assert.Equal("", regex.Options);
  538. regex = new BsonRegularExpression(new Regex("pattern", RegexOptions.IgnoreCase | RegexOptions.Multiline | RegexOptions.IgnorePatternWhitespace | RegexOptions.Singleline));
  539. Assert.IsType<BsonRegularExpression>(regex);
  540. Assert.Equal("pattern", regex.Pattern);
  541. Assert.Equal("imsx", regex.Options);
  542. regex = new BsonRegularExpression(new Regex("pattern", RegexOptions.IgnoreCase));
  543. Assert.IsType<BsonRegularExpression>(regex);
  544. Assert.Equal("pattern", regex.Pattern);
  545. Assert.Equal("i", regex.Options);
  546. regex = new BsonRegularExpression(new Regex("pattern", RegexOptions.Multiline));
  547. Assert.IsType<BsonRegularExpression>(regex);
  548. Assert.Equal("pattern", regex.Pattern);
  549. Assert.Equal("m", regex.Options);
  550. regex = new BsonRegularExpression(new Regex("pattern", RegexOptions.IgnorePatternWhitespace));
  551. Assert.IsType<BsonRegularExpression>(regex);
  552. Assert.Equal("pattern", regex.Pattern);
  553. Assert.Equal("x", regex.Options);
  554. regex = new BsonRegularExpression(new Regex("pattern", RegexOptions.Singleline));
  555. Assert.IsType<BsonRegularExpression>(regex);
  556. Assert.Equal("pattern", regex.Pattern);
  557. Assert.Equal("s", regex.Options);
  558. }
  559. [Fact]
  560. public void TestBsonValueEqualsFalse()
  561. {
  562. BsonValue a = false;
  563. Assert.True(a == false);
  564. Assert.False(a != false);
  565. Assert.False(a == true);
  566. Assert.True(a != true);
  567. }
  568. [Fact]
  569. public void TestBsonValueEqualsTrue()
  570. {
  571. BsonValue a = true;
  572. Assert.True(a == true);
  573. Assert.False(a != true);
  574. Assert.False(a == false);
  575. Assert.True(a != false);
  576. }
  577. [Fact]
  578. public void TestBsonValueEqualsDouble()
  579. {
  580. BsonValue a = 1;
  581. Assert.True(a == 1.0);
  582. Assert.False(a != 1.0);
  583. Assert.False(a == 2.0);
  584. Assert.True(a != 2.0);
  585. }
  586. [Fact]
  587. public void TestBsonValueEqualsInt32()
  588. {
  589. BsonValue a = 1;
  590. Assert.True(a == 1);
  591. Assert.False(a != 1);
  592. Assert.False(a == 2);
  593. Assert.True(a != 2);
  594. }
  595. [Fact]
  596. public void TestBsonValueEqualsInt64()
  597. {
  598. BsonValue a = 1;
  599. Assert.True(a == 1);
  600. Assert.False(a != 1);
  601. Assert.False(a == 2);
  602. Assert.True(a != 2);
  603. }
  604. [Fact]
  605. public void TestCreateNull()
  606. {
  607. object obj = null;
  608. Assert.Same(BsonNull.Value, BsonValue.Create(obj));
  609. }
  610. [Fact]
  611. public void TestExplicitConversionToDecimal()
  612. {
  613. BsonValue v = 1.5M;
  614. var r = (decimal)v;
  615. Assert.Equal(1.5M, r);
  616. }
  617. [Fact]
  618. public void TestExplicitConversionToDecimal128()
  619. {
  620. BsonValue v = 1.5M;
  621. var r = (Decimal128)v;
  622. Assert.Equal((Decimal128)1.5M, r);
  623. }
  624. [Theory]
  625. [InlineData(1.0)]
  626. [InlineData(null)]
  627. public void TestExplicitConversionToNullableDecimal(double? nullableDoubleValue)
  628. {
  629. var nullableDecimalValue = nullableDoubleValue == null ? (decimal?)null : (decimal)nullableDoubleValue;
  630. BsonValue v = nullableDecimalValue;
  631. var r = (decimal?)v;
  632. Assert.Equal(nullableDecimalValue, r);
  633. }
  634. [Theory]
  635. [InlineData(1.0)]
  636. [InlineData(null)]
  637. public void TestExplicitConversionToNullableDecimal128(double? nullableDoubleValue)
  638. {
  639. var nullableDecimal128Value = nullableDoubleValue == null ? (Decimal128?)null : (Decimal128)(decimal)nullableDoubleValue;
  640. BsonValue v = nullableDecimal128Value;
  641. var r = (Decimal128?)v;
  642. Assert.Equal(nullableDecimal128Value, r);
  643. }
  644. [Fact]
  645. public void TestImplicitConversionFromBoolean()
  646. {
  647. BsonValue v = true;
  648. Assert.IsType<BsonBoolean>(v);
  649. var b = (BsonBoolean)v;
  650. Assert.Equal(true, b.Value);
  651. }
  652. [Fact]
  653. public void TestImplicitConversionFromByteArray()
  654. {
  655. BsonValue v = new byte[] { 1, 2 };
  656. BsonValue n = (byte[])null;
  657. Assert.IsType<BsonBinaryData>(v);
  658. Assert.Null(n);
  659. var b = (BsonBinaryData)v;
  660. Assert.Equal(BsonBinarySubType.Binary, b.SubType);
  661. Assert.Equal(1, b.AsByteArray[0]);
  662. Assert.Equal(2, b.AsByteArray[1]);
  663. }
  664. [Fact]
  665. public void TestImplicitConversionFromDateTime()
  666. {
  667. var utcNow = DateTime.UtcNow;
  668. var utcNowTruncated = utcNow.AddTicks(-(utcNow.Ticks % 10000));
  669. BsonValue v = utcNow;
  670. Assert.IsType<BsonDateTime>(v);
  671. var dt = (BsonDateTime)v;
  672. Assert.Equal(utcNowTruncated, dt.ToUniversalTime());
  673. }
  674. [Fact]
  675. public void TestImplicitConversionFromDecimal()
  676. {
  677. BsonValue v = 1.5M;
  678. Assert.IsType<BsonDecimal128>(v);
  679. var d = (BsonDecimal128)v;
  680. Assert.Equal((Decimal128)1.5M, d.Value);
  681. }
  682. [Fact]
  683. public void TestImplicitConversionFromDecimal128()
  684. {
  685. BsonValue v = (Decimal128)1.5M;
  686. Assert.IsType<BsonDecimal128>(v);
  687. var d = (BsonDecimal128)v;
  688. Assert.Equal((Decimal128)1.5M, d.Value);
  689. }
  690. [Fact]
  691. public void TestImplicitConversionFromDouble()
  692. {
  693. BsonValue v = 1.5;
  694. Assert.IsType<BsonDouble>(v);
  695. var d = (BsonDouble)v;
  696. Assert.Equal(1.5, d.Value);
  697. }
  698. [Theory]
  699. [ParameterAttributeData]
  700. [ResetGuidModeAfterTest]
  701. public void TestImplicitConversionFromGuid(
  702. [ClassValues(typeof(GuidModeValues))] GuidMode mode)
  703. {
  704. mode.Set();
  705. #pragma warning disable 618
  706. var guid = Guid.NewGuid();
  707. if (BsonDefaults.GuidRepresentationMode == GuidRepresentationMode.V2 && BsonDefaults.GuidRepresentation != GuidRepresentation.Unspecified)
  708. {
  709. BsonValue v = guid;
  710. Assert.IsType<BsonBinaryData>(v);
  711. var b = (BsonBinaryData)v;
  712. var expectedBytes = GuidConverter.ToBytes(guid, BsonDefaults.GuidRepresentation);
  713. var expectedSubType = GuidConverter.GetSubType(BsonDefaults.GuidRepresentation);
  714. Assert.True(expectedBytes.SequenceEqual(b.AsByteArray));
  715. Assert.Equal(expectedSubType, b.SubType);
  716. }
  717. else
  718. {
  719. var exception = Record.Exception(() => { BsonValue v = guid; });
  720. exception.Should().BeOfType<InvalidOperationException>();
  721. }
  722. #pragma warning restore 618
  723. }
  724. [Fact]
  725. public void TestImplicitConversionFromInt16Enum()
  726. {
  727. BsonValue v = Int16Enum.A;
  728. Assert.IsType<BsonInt32>(v);
  729. var n = (BsonInt32)v;
  730. Assert.Equal((int)Int16Enum.A, n.Value);
  731. }
  732. [Fact]
  733. public void TestImplicitConversionFromInt32()
  734. {
  735. BsonValue v = 1;
  736. Assert.IsType<BsonInt32>(v);
  737. var i = (BsonInt32)v;
  738. Assert.Equal(1, i.Value);
  739. }
  740. [Fact]
  741. public void TestImplicitConversionFromInt32Enum()
  742. {
  743. BsonValue v = Int32Enum.A;
  744. Assert.IsType<BsonInt32>(v);
  745. var n = (BsonInt32)v;
  746. Assert.Equal((int)Int32Enum.A, n.Value);
  747. }
  748. [Fact]
  749. public void TestImplicitConversionFromInt64()
  750. {
  751. BsonValue v = 1L;
  752. Assert.IsType<BsonInt64>(v);
  753. var i = (BsonInt64)v;
  754. Assert.Equal(1L, i.Value);
  755. }
  756. [Fact]
  757. public void TestImplicitConversionFromInt64Enum()
  758. {
  759. BsonValue v = Int64Enum.A;
  760. Assert.IsType<BsonInt64>(v);
  761. var n = (BsonInt64)v;
  762. Assert.Equal((int)Int64Enum.A, n.Value);
  763. }
  764. [Fact]
  765. public void TestImplicitConversionFromNullableBoolean()
  766. {
  767. BsonValue v = (bool?)true;
  768. BsonValue n = (bool?)null;
  769. Assert.IsType<BsonBoolean>(v);
  770. Assert.IsType<BsonNull>(n);
  771. var b = (BsonBoolean)v;
  772. Assert.Equal(true, b.Value);
  773. }
  774. [Fact]
  775. public void TestImplicitConversionFromNullableDateTime()
  776. {
  777. var utcNow = DateTime.UtcNow;
  778. var utcNowTruncated = utcNow.AddTicks(-(utcNow.Ticks % 10000));
  779. BsonValue v = (DateTime?)utcNow;
  780. BsonValue n = (DateTime?)null;
  781. Assert.IsType<BsonDateTime>(v);
  782. Assert.IsType<BsonNull>(n);
  783. var dt = (BsonDateTime)v;
  784. Assert.Equal(utcNowTruncated, dt.ToUniversalTime());
  785. }
  786. [Fact]
  787. public void TestImplicitConversionFromNullableDecimal()
  788. {
  789. BsonValue v = (decimal?)1.5M;
  790. BsonValue n = (decimal?)null;
  791. Assert.IsType<BsonDecimal128>(v);
  792. Assert.IsType<BsonNull>(n);
  793. var d = (BsonDecimal128)v;
  794. Assert.Equal((Decimal128)1.5M, d.Value);
  795. }
  796. [Fact]
  797. public void TestImplicitConversionFromNullableDecimal128()
  798. {
  799. BsonValue v = (Decimal128?)1.5M;
  800. BsonValue n = (Decimal128?)null;
  801. Assert.IsType<BsonDecimal128>(v);
  802. Assert.IsType<BsonNull>(n);
  803. var d = (BsonDecimal128)v;
  804. Assert.Equal((Decimal128)1.5M, d.Value);
  805. }
  806. [Fact]
  807. public void TestImplicitConversionFromNullableDouble()
  808. {
  809. BsonValue v = (double?)1.5;
  810. BsonValue n = (double?)null;
  811. Assert.IsType<BsonDouble>(v);
  812. Assert.IsType<BsonNull>(n);
  813. var d = (BsonDouble)v;
  814. Assert.Equal(1.5, d.Value);
  815. }
  816. [Theory]
  817. [ParameterAttributeData]
  818. [ResetGuidModeAfterTest]
  819. public void TestImplicitConversionFromNullableGuid(
  820. [ClassValues(typeof(GuidModeValues))] GuidMode mode)
  821. {
  822. mode.Set();
  823. #pragma warning disable 618
  824. var guid = Guid.NewGuid();
  825. if (BsonDefaults.GuidRepresentationMode == GuidRepresentationMode.V2 && BsonDefaults.GuidRepresentation != GuidRepresentation.Unspecified)
  826. {
  827. BsonValue v = (Guid?)guid;
  828. BsonValue n = (Guid?)null;
  829. byte[] expectedBytes;
  830. BsonBinarySubType expectedSubType;
  831. var guidRepresentation = BsonDefaults.GuidRepresentationMode == GuidRepresentationMode.V2 ? BsonDefaults.GuidRepresentation : GuidRepresentation.Unspecified;
  832. if (guidRepresentation == GuidRepresentation.Unspecified)
  833. {
  834. expectedBytes = GuidConverter.ToBytes(guid, GuidRepresentation.Standard);
  835. expectedSubType = BsonBinarySubType.UuidStandard;
  836. }
  837. else
  838. {
  839. expectedBytes = GuidConverter.ToBytes(guid, guidRepresentation);
  840. expectedSubType = GuidConverter.GetSubType(guidRepresentation);
  841. }
  842. Assert.IsType<BsonBinaryData>(v);
  843. Assert.IsType<BsonNull>(n);
  844. var b = (BsonBinaryData)v;
  845. Assert.True(expectedBytes.SequenceEqual(b.AsByteArray));
  846. Assert.Equal(expectedSubType, b.SubType);
  847. }
  848. else
  849. {
  850. var exception = Record.Exception(() => { BsonValue v = (Guid?)guid; });
  851. exception.Should().BeOfType<InvalidOperationException>();
  852. }
  853. #pragma warning restore 618
  854. }
  855. [Fact]
  856. public void TestImplicitConversionFromNullableInt32()
  857. {
  858. BsonValue v = (int?)1;
  859. BsonValue n = (int?)null;
  860. Assert.IsType<BsonInt32>(v);
  861. Assert.IsType<BsonNull>(n);
  862. var i = (BsonInt32)v;
  863. Assert.Equal(1, i.Value);
  864. }
  865. [Fact]
  866. public void TestImplicitConversionFromNullableInt64()
  867. {
  868. BsonValue v = (long?)1L;
  869. BsonValue n = (long?)null;
  870. Assert.IsType<BsonInt64>(v);
  871. Assert.IsType<BsonNull>(n);
  872. var i = (BsonInt64)v;
  873. Assert.Equal(1, i.Value);
  874. }
  875. [Fact]
  876. public void TestImplicitConversionFromNullableObjectId()
  877. {
  878. var objectId = ObjectId.GenerateNewId();
  879. BsonValue v = objectId;
  880. BsonValue n = (ObjectId?)null;
  881. Assert.IsType<BsonObjectId>(v);
  882. Assert.IsType<BsonNull>(n);
  883. var o = (BsonObjectId)v;
  884. Assert.Equal(objectId, o.Value);
  885. }
  886. [Fact]
  887. public void TestImplicitConversionFromObjectId()
  888. {
  889. var objectId = ObjectId.GenerateNewId();
  890. BsonValue v = objectId;
  891. Assert.IsType<BsonObjectId>(v);
  892. var o = (BsonObjectId)v;
  893. Assert.Equal(objectId, o.Value);
  894. }
  895. [Fact]
  896. public void TestImplicitConversionFromRegexOptionNone()
  897. {
  898. BsonValue v = new Regex("xyz");
  899. BsonValue n = (Regex)null;
  900. Assert.IsType<BsonRegularExpression>(v);
  901. Assert.Null(n);
  902. var r = (BsonRegularExpression)v;
  903. Assert.Equal("xyz", r.Pattern);
  904. Assert.Equal("", r.Options);
  905. }
  906. [Fact]
  907. public void TestImplicitConversionFromRegexOptionAll()
  908. {
  909. BsonValue v = new Regex("xyz", RegexOptions.IgnoreCase | RegexOptions.Multiline | RegexOptions.IgnorePatternWhitespace | RegexOptions.Singleline);
  910. BsonValue n = (Regex)null;
  911. Assert.IsType<BsonRegularExpression>(v);
  912. Assert.Null(n);
  913. var r = (BsonRegularExpression)v;
  914. Assert.Equal("xyz", r.Pattern);
  915. Assert.Equal("imsx", r.Options);
  916. }
  917. [Fact]
  918. public void TestImplicitConversionFromRegexOptionI()
  919. {
  920. BsonValue v = new Regex("xyz", RegexOptions.IgnoreCase);
  921. BsonValue n = (Regex)null;
  922. Assert.IsType<BsonRegularExpression>(v);
  923. Assert.Null(n);
  924. var r = (BsonRegularExpression)v;
  925. Assert.Equal("xyz", r.Pattern);
  926. Assert.Equal("i", r.Options);
  927. }
  928. [Fact]
  929. public void TestImplicitConversionFromRegexOptionM()
  930. {
  931. BsonValue v = new Regex("xyz", RegexOptions.Multiline);
  932. BsonValue n = (Regex)null;
  933. Assert.IsType<BsonRegularExpression>(v);
  934. Assert.Null(n);
  935. var r = (BsonRegularExpression)v;
  936. Assert.Equal("xyz", r.Pattern);
  937. Assert.Equal("m", r.Options);
  938. }
  939. [Fact]
  940. public void TestImplicitConversionFromRegexOptionX()
  941. {
  942. BsonValue v = new Regex("xyz", RegexOptions.IgnorePatternWhitespace);
  943. BsonValue n = (Regex)null;
  944. Assert.IsType<BsonRegularExpression>(v);
  945. Assert.Null(n);
  946. var r = (BsonRegularExpression)v;
  947. Assert.Equal("xyz", r.Pattern);
  948. Assert.Equal("x", r.Options);
  949. }
  950. [Fact]
  951. public void TestImplicitConversionFromRegexOptionS()
  952. {
  953. BsonValue v = new Regex("xyz", RegexOptions.Singleline);
  954. BsonValue n = (Regex)null;
  955. Assert.IsType<BsonRegularExpression>(v);
  956. Assert.Null(n);
  957. var r = (BsonRegularExpression)v;
  958. Assert.Equal("xyz", r.Pattern);
  959. Assert.Equal("s", r.Options);
  960. }
  961. [Fact]
  962. public void TestImplicitConversionFromString()
  963. {
  964. BsonValue v = "xyz";
  965. BsonValue n = (string)null;
  966. Assert.IsType<BsonString>(v);
  967. Assert.Null(n);
  968. var s = (BsonString)v;
  969. Assert.Equal("xyz", s.Value);
  970. }
  971. [Fact]
  972. public void TestIsDecimal128()
  973. {
  974. BsonValue v = new BsonDecimal128(1.0M);
  975. BsonValue s = new BsonString("");
  976. Assert.True(v.IsDecimal128);
  977. Assert.False(s.IsDecimal128);
  978. }
  979. [Fact]
  980. public void TestIsNumeric()
  981. {
  982. BsonValue d128 = new BsonDecimal128(1.0M);
  983. BsonValue d = new BsonDouble(1.0);
  984. BsonValue i32 = new BsonInt32(1);
  985. BsonValue i64 = new BsonInt64(1L);
  986. BsonValue s = new BsonString("");
  987. Assert.True(d128.IsNumeric);
  988. Assert.True(d.IsNumeric);
  989. Assert.True(i32.IsNumeric);
  990. Assert.True(i64.IsNumeric);
  991. Assert.False(s.IsDecimal128);
  992. }
  993. // nested types
  994. public enum Int16Enum : short
  995. {
  996. A = 1,
  997. B
  998. }
  999. public enum Int32Enum
  1000. {
  1001. A = 1,
  1002. B
  1003. }
  1004. public enum Int64Enum : long
  1005. {
  1006. A = 1,
  1007. B
  1008. }
  1009. }
  1010. }