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

/tests/MongoDB.Bson.Tests/IO/BsonStreamAdapterTests.cs

http://github.com/mongodb/mongo-csharp-driver
C# | 1751 lines | 1370 code | 362 blank | 19 comment | 0 complexity | 3b649c9c2e5dc0ec4ac4581db4cff43a 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.IO;
  17. using System.Linq;
  18. using System.Reflection;
  19. using System.Threading;
  20. using System.Threading.Tasks;
  21. using FluentAssertions;
  22. using MongoDB.Bson.IO;
  23. using MongoDB.Bson.TestHelpers.XunitExtensions;
  24. using Moq;
  25. using Xunit;
  26. namespace MongoDB.Bson.Tests
  27. {
  28. public class BsonStreamAdapterTests
  29. {
  30. // test methods
  31. [Fact]
  32. public void BaseStream_should_return_expected_resut()
  33. {
  34. var mockStream = new Mock<Stream>();
  35. var subject = new BsonStreamAdapter(mockStream.Object);
  36. var result = subject.BaseStream;
  37. result.Should().Be(mockStream.Object);
  38. }
  39. [Fact]
  40. public void BaseStream_should_throw_when_subject_is_disposed()
  41. {
  42. var mockStream = new Mock<Stream>();
  43. var subject = new BsonStreamAdapter(mockStream.Object);
  44. subject.Dispose();
  45. Action action = () => { var _ = subject.BaseStream; };
  46. action.ShouldThrow<ObjectDisposedException>().And.ObjectName.Should().Be("BsonStreamAdapter");
  47. }
  48. #if NET452
  49. [Fact]
  50. public void BeginRead_should_call_wrapped_stream()
  51. {
  52. var mockStream = new Mock<Stream>();
  53. var subject = new BsonStreamAdapter(mockStream.Object);
  54. var buffer = new byte[0];
  55. var offset = 1;
  56. var count = 2;
  57. var mockCallback = new Mock<AsyncCallback>();
  58. var state = new object();
  59. var mockAsyncResult = new Mock<IAsyncResult>();
  60. mockStream.Setup(s => s.BeginRead(buffer, offset, count, mockCallback.Object, state)).Returns(mockAsyncResult.Object);
  61. var result = subject.BeginRead(buffer, offset, count, mockCallback.Object, state);
  62. result.Should().BeSameAs(mockAsyncResult.Object);
  63. mockStream.Verify(s => s.BeginRead(buffer, offset, count, mockCallback.Object, state), Times.Once);
  64. }
  65. #endif
  66. #if NET452
  67. [Fact]
  68. public void BeginRead_should_throw_when_subject_is_diposed()
  69. {
  70. var mockStream = new Mock<Stream>();
  71. var subject = new BsonStreamAdapter(mockStream.Object);
  72. var buffer = new byte[0];
  73. var offset = 1;
  74. var count = 2;
  75. var mockCallback = new Mock<AsyncCallback>();
  76. var state = new object();
  77. subject.Dispose();
  78. Action action = () => subject.BeginRead(buffer, offset, count, mockCallback.Object, state);
  79. action.ShouldThrow<ObjectDisposedException>().And.ObjectName.Should().Be("BsonStreamAdapter");
  80. }
  81. #endif
  82. #if NET452
  83. [Fact]
  84. public void BeginWrite_should_call_wrapped_stream()
  85. {
  86. var mockStream = new Mock<Stream>();
  87. var subject = new BsonStreamAdapter(mockStream.Object);
  88. var buffer = new byte[0];
  89. var offset = 1;
  90. var count = 2;
  91. var mockCallback = new Mock<AsyncCallback>();
  92. var state = new object();
  93. var mockAsyncResult = new Mock<IAsyncResult>();
  94. mockStream.Setup(s => s.BeginWrite(buffer, offset, count, mockCallback.Object, state)).Returns(mockAsyncResult.Object);
  95. var result = subject.BeginWrite(buffer, offset, count, mockCallback.Object, state);
  96. result.Should().BeSameAs(mockAsyncResult.Object);
  97. mockStream.Verify(s => s.BeginWrite(buffer, offset, count, mockCallback.Object, state), Times.Once);
  98. }
  99. #endif
  100. #if NET452
  101. [Fact]
  102. public void BeginWrite_should_throw_when_subject_is_disposed()
  103. {
  104. var mockStream = new Mock<Stream>();
  105. var subject = new BsonStreamAdapter(mockStream.Object);
  106. var buffer = new byte[0];
  107. var offset = 1;
  108. var count = 2;
  109. var mockCallback = new Mock<AsyncCallback>();
  110. var state = new object();
  111. subject.Dispose();
  112. Action action = () => subject.BeginWrite(buffer, offset, count, mockCallback.Object, state);
  113. action.ShouldThrow<ObjectDisposedException>().And.ObjectName.Should().Be("BsonStreamAdapter");
  114. }
  115. #endif
  116. [Theory]
  117. [ParameterAttributeData]
  118. public void CanRead_should_call_wrapped_stream(
  119. [Values(false, true)]
  120. bool canRead)
  121. {
  122. var mockStream = new Mock<Stream>();
  123. var subject = new BsonStreamAdapter(mockStream.Object);
  124. mockStream.SetupGet(s => s.CanRead).Returns(canRead);
  125. var result = subject.CanRead;
  126. result.Should().Be(canRead);
  127. mockStream.VerifyGet(s => s.CanRead, Times.Once);
  128. }
  129. [Fact]
  130. public void CanRead_should_throw_when_subject_is_disposed()
  131. {
  132. var mockStream = new Mock<Stream>();
  133. var subject = new BsonStreamAdapter(mockStream.Object);
  134. subject.Dispose();
  135. Action action = () => { var _ = subject.CanRead; };
  136. action.ShouldThrow<ObjectDisposedException>().And.ObjectName.Should().Be("BsonStreamAdapter");
  137. }
  138. [Theory]
  139. [ParameterAttributeData]
  140. public void CanSeek_should_call_wrapped_stream(
  141. [Values(false, true)]
  142. bool canSeek)
  143. {
  144. var mockStream = new Mock<Stream>();
  145. var subject = new BsonStreamAdapter(mockStream.Object);
  146. mockStream.SetupGet(s => s.CanSeek).Returns(canSeek);
  147. var result = subject.CanSeek;
  148. result.Should().Be(canSeek);
  149. mockStream.VerifyGet(s => s.CanSeek, Times.Once);
  150. }
  151. [Fact]
  152. public void CanSeek_should_throw_when_subject_is_disposed()
  153. {
  154. var mockStream = new Mock<Stream>();
  155. var subject = new BsonStreamAdapter(mockStream.Object);
  156. subject.Dispose();
  157. Action action = () => { var _ = subject.CanSeek; };
  158. action.ShouldThrow<ObjectDisposedException>().And.ObjectName.Should().Be("BsonStreamAdapter");
  159. }
  160. [Theory]
  161. [ParameterAttributeData]
  162. public void CanTimeout_should_call_wrapped_stream(
  163. [Values(false, true)]
  164. bool canTimeout)
  165. {
  166. var mockStream = new Mock<Stream>();
  167. var subject = new BsonStreamAdapter(mockStream.Object);
  168. mockStream.SetupGet(s => s.CanTimeout).Returns(canTimeout);
  169. var result = subject.CanTimeout;
  170. result.Should().Be(canTimeout);
  171. mockStream.VerifyGet(s => s.CanTimeout, Times.Once);
  172. }
  173. [Fact]
  174. public void CanTimeout_should_throw_when_subject_is_disposed()
  175. {
  176. var mockStream = new Mock<Stream>();
  177. var subject = new BsonStreamAdapter(mockStream.Object);
  178. subject.Dispose();
  179. Action action = () => { var _ = subject.CanTimeout; };
  180. action.ShouldThrow<ObjectDisposedException>().And.ObjectName.Should().Be("BsonStreamAdapter");
  181. }
  182. [Theory]
  183. [ParameterAttributeData]
  184. public void CanWrite_should_call_wrapped_stream(
  185. [Values(false, true)]
  186. bool canWrite)
  187. {
  188. var mockStream = new Mock<Stream>();
  189. var subject = new BsonStreamAdapter(mockStream.Object);
  190. mockStream.SetupGet(s => s.CanWrite).Returns(canWrite);
  191. var result = subject.CanWrite;
  192. result.Should().Be(canWrite);
  193. mockStream.VerifyGet(s => s.CanWrite, Times.Once);
  194. }
  195. [Fact]
  196. public void CanWrite_should_throw_when_subject_is_disposed()
  197. {
  198. var mockStream = new Mock<Stream>();
  199. var subject = new BsonStreamAdapter(mockStream.Object);
  200. subject.Dispose();
  201. Action action = () => { var _ = subject.CanWrite; };
  202. action.ShouldThrow<ObjectDisposedException>().And.ObjectName.Should().Be("BsonStreamAdapter");
  203. }
  204. #if NET452
  205. [Fact]
  206. public void Close_can_be_called_multiple_times()
  207. {
  208. var mockStream = new Mock<Stream>();
  209. var subject = new BsonStreamAdapter(mockStream.Object);
  210. subject.Close();
  211. subject.Close();
  212. var subjectReflector = new Reflector(subject);
  213. subjectReflector._disposed.Should().BeTrue();
  214. }
  215. #endif
  216. #if NET452
  217. [Fact]
  218. public void Close_should_dispose_subject()
  219. {
  220. var mockStream = new Mock<Stream>();
  221. var subject = new BsonStreamAdapter(mockStream.Object);
  222. subject.Close();
  223. var subjectReflector = new Reflector(subject);
  224. subjectReflector._disposed.Should().BeTrue();
  225. }
  226. #endif
  227. [Fact]
  228. public void constructor_should_use_false_as_the_default_value_for_ownsStream()
  229. {
  230. var mockStream = new Mock<Stream>();
  231. var subject = new BsonStreamAdapter(mockStream.Object);
  232. var subjectReflector = new Reflector(subject);
  233. subjectReflector._ownsStream.Should().BeFalse();
  234. }
  235. [Theory]
  236. [ParameterAttributeData]
  237. public void constructor_should_initialize_instance(
  238. [Values(false, true)]
  239. bool ownsStream)
  240. {
  241. var mockStream = new Mock<Stream>();
  242. var subject = new BsonStreamAdapter(mockStream.Object, ownsStream: ownsStream);
  243. var subjectReflector = new Reflector(subject);
  244. subjectReflector._disposed.Should().BeFalse();
  245. subjectReflector._ownsStream.Should().Be(ownsStream);
  246. subjectReflector._stream.Should().Be(mockStream.Object);
  247. subjectReflector._temp.Should().NotBeNull();
  248. subjectReflector._tempUtf8.Should().NotBeNull();
  249. }
  250. [Fact]
  251. public void constructor_should_throw_when_stream_is_null()
  252. {
  253. Action action = () => new BsonStreamAdapter(null);
  254. action.ShouldThrow<ArgumentNullException>().And.ParamName.Should().Be("stream");
  255. }
  256. [Fact]
  257. public void CopyToAsync_should_call_wrapped_stream()
  258. {
  259. var mockStream = new Mock<Stream>();
  260. var subject = new BsonStreamAdapter(mockStream.Object);
  261. var mockDestination = new Mock<Stream>();
  262. var bufferSize = 1;
  263. var cancellationToken = new CancellationTokenSource().Token;
  264. var task = new TaskCompletionSource<object>().Task;
  265. mockStream.Setup(s => s.CopyToAsync(mockDestination.Object, bufferSize, cancellationToken)).Returns(task);
  266. var result = subject.CopyToAsync(mockDestination.Object, bufferSize, cancellationToken);
  267. result.Should().Be(task);
  268. mockStream.Verify(s => s.CopyToAsync(mockDestination.Object, bufferSize, cancellationToken), Times.Once);
  269. }
  270. [Fact]
  271. public void CopyToAsync_should_throw_when_subject_is_disposed()
  272. {
  273. var mockStream = new Mock<Stream>();
  274. var subject = new BsonStreamAdapter(mockStream.Object);
  275. var mockDestination = new Mock<Stream>();
  276. var bufferSize = 1;
  277. var cancellationToken = new CancellationTokenSource().Token;
  278. subject.Dispose();
  279. Action action = () => subject.CopyToAsync(mockDestination.Object, bufferSize, cancellationToken);
  280. action.ShouldThrow<ObjectDisposedException>().And.ObjectName.Should().Be("BsonStreamAdapter");
  281. }
  282. [Fact]
  283. public void Dispose_can_be_called_multiple_times()
  284. {
  285. var mockStream = new Mock<Stream>();
  286. var subject = new BsonStreamAdapter(mockStream.Object);
  287. subject.Dispose();
  288. subject.Dispose();
  289. var subjectReflector = new Reflector(subject);
  290. subjectReflector._disposed.Should().BeTrue();
  291. }
  292. #if NET452
  293. [Fact]
  294. public void Dispose_should_dispose_stream_once_when_Disposed_is_called_more_than_once()
  295. {
  296. var mockStream = new Mock<Stream>();
  297. var subject = new BsonStreamAdapter(mockStream.Object, ownsStream: true);
  298. subject.Dispose();
  299. subject.Dispose();
  300. mockStream.Verify(s => s.Close(), Times.Once); // Dispose is not virtual but calls virtual Close
  301. }
  302. #endif
  303. #if NET452
  304. [Theory]
  305. [ParameterAttributeData]
  306. public void Dispose_should_dispose_stream_only_when_it_owns_it(
  307. [Values(false, true)]
  308. bool ownsStream)
  309. {
  310. var mockStream = new Mock<Stream>();
  311. var subject = new BsonStreamAdapter(mockStream.Object, ownsStream: ownsStream);
  312. subject.Dispose();
  313. mockStream.Verify(s => s.Close(), Times.Exactly(ownsStream ? 1 : 0)); // Dispose is not virtual but calls virtual Close
  314. }
  315. #endif
  316. [Fact]
  317. public void Dispose_should_dispose_subject()
  318. {
  319. var mockStream = new Mock<Stream>();
  320. var subject = new BsonStreamAdapter(mockStream.Object);
  321. subject.Dispose();
  322. var subjectReflector = new Reflector(subject);
  323. subjectReflector._disposed.Should().BeTrue();
  324. }
  325. #if NET452
  326. [Fact]
  327. public void EndRead_should_call_wrapped_stream()
  328. {
  329. var mockStream = new Mock<Stream>();
  330. var subject = new BsonStreamAdapter(mockStream.Object);
  331. var mockAsyncResult = new Mock<IAsyncResult>();
  332. var numberOfBytesRead = 1;
  333. mockStream.Setup(s => s.EndRead(mockAsyncResult.Object)).Returns(numberOfBytesRead);
  334. var result = subject.EndRead(mockAsyncResult.Object);
  335. result.Should().Be(numberOfBytesRead);
  336. mockStream.Verify(s => s.EndRead(mockAsyncResult.Object), Times.Once);
  337. }
  338. #endif
  339. #if NET452
  340. [Fact]
  341. public void EndRead_should_throw_when_subject_is_disposed()
  342. {
  343. var mockStream = new Mock<Stream>();
  344. var subject = new BsonStreamAdapter(mockStream.Object);
  345. var mockAsyncResult = new Mock<IAsyncResult>();
  346. subject.Dispose();
  347. Action action = () => subject.EndRead(mockAsyncResult.Object);
  348. action.ShouldThrow<ObjectDisposedException>().And.ObjectName.Should().Be("BsonStreamAdapter");
  349. }
  350. #endif
  351. #if NET452
  352. [Fact]
  353. public void EndWrite_should_call_wrapped_stream()
  354. {
  355. var mockStream = new Mock<Stream>();
  356. var subject = new BsonStreamAdapter(mockStream.Object);
  357. var mockAsyncResult = new Mock<IAsyncResult>();
  358. subject.EndWrite(mockAsyncResult.Object);
  359. mockStream.Verify(s => s.EndWrite(mockAsyncResult.Object), Times.Once);
  360. }
  361. #endif
  362. #if NET452
  363. [Fact]
  364. public void EndWrite_should_throw_when_subject_is_disposed()
  365. {
  366. var mockStream = new Mock<Stream>();
  367. var subject = new BsonStreamAdapter(mockStream.Object);
  368. var mockAsyncResult = new Mock<IAsyncResult>();
  369. subject.Dispose();
  370. Action action = () => subject.EndWrite(mockAsyncResult.Object);
  371. action.ShouldThrow<ObjectDisposedException>().And.ObjectName.Should().Be("BsonStreamAdapter");
  372. }
  373. #endif
  374. [Fact]
  375. public void Flush_should_call_wrapped_stream()
  376. {
  377. var mockStream = new Mock<Stream>();
  378. var subject = new BsonStreamAdapter(mockStream.Object);
  379. subject.Flush();
  380. mockStream.Verify(s => s.Flush(), Times.Once);
  381. }
  382. [Fact]
  383. public void Flush_should_throw_when_subject_is_disposed()
  384. {
  385. var mockStream = new Mock<Stream>();
  386. var subject = new BsonStreamAdapter(mockStream.Object);
  387. subject.Dispose();
  388. Action action = () => subject.Flush();
  389. action.ShouldThrow<ObjectDisposedException>().And.ObjectName.Should().Be("BsonStreamAdapter");
  390. }
  391. [Fact]
  392. public void FlushAsync_should_call_wrapped_stream()
  393. {
  394. var mockStream = new Mock<Stream>();
  395. var subject = new BsonStreamAdapter(mockStream.Object);
  396. var task = new TaskCompletionSource<object>().Task;
  397. var cancellationToken = new CancellationTokenSource().Token;
  398. mockStream.Setup(s => s.FlushAsync(cancellationToken)).Returns(task);
  399. var result = subject.FlushAsync(cancellationToken);
  400. result.Should().Be(task);
  401. mockStream.Verify(s => s.FlushAsync(cancellationToken), Times.Once);
  402. }
  403. [Fact]
  404. public void FlushAsync_should_throw_when_subject_is_disposed()
  405. {
  406. var mockStream = new Mock<Stream>();
  407. var subject = new BsonStreamAdapter(mockStream.Object);
  408. var cancellationToken = new CancellationTokenSource().Token;
  409. subject.Dispose();
  410. Action action = () => subject.FlushAsync(cancellationToken);
  411. action.ShouldThrow<ObjectDisposedException>().And.ObjectName.Should().Be("BsonStreamAdapter");
  412. }
  413. [Theory]
  414. [ParameterAttributeData]
  415. public void Length_get_should_call_wrapped_stream(
  416. [Values(0L, 1L, 2L)]
  417. long length)
  418. {
  419. var mockStream = new Mock<Stream>();
  420. var subject = new BsonStreamAdapter(mockStream.Object);
  421. mockStream.SetupGet(s => s.Length).Returns(length);
  422. var result = subject.Length;
  423. result.Should().Be(length);
  424. mockStream.VerifyGet(s => s.Length, Times.Once);
  425. }
  426. [Fact]
  427. public void Length_get_should_throw_when_subject_is_disposed()
  428. {
  429. var mockStream = new Mock<Stream>();
  430. var subject = new BsonStreamAdapter(mockStream.Object);
  431. subject.Dispose();
  432. Action action = () => { var _ = subject.Length; };
  433. action.ShouldThrow<ObjectDisposedException>().And.ObjectName.Should().Be("BsonStreamAdapter");
  434. }
  435. [Theory]
  436. [ParameterAttributeData]
  437. public void Position_get_should_call_wrapped_stream(
  438. [Values(0, 1, 2)]
  439. long position)
  440. {
  441. var mockStream = new Mock<Stream>();
  442. var subject = new BsonStreamAdapter(mockStream.Object);
  443. mockStream.SetupGet(s => s.Position).Returns(position);
  444. var result = subject.Position;
  445. result.Should().Be(position);
  446. mockStream.VerifyGet(s => s.Position, Times.Once);
  447. }
  448. [Fact]
  449. public void Position_get_should_throw_when_subject_is_disposed()
  450. {
  451. var mockStream = new Mock<Stream>();
  452. var subject = new BsonStreamAdapter(mockStream.Object);
  453. subject.Dispose();
  454. Action action = () => { var _ = subject.Position; };
  455. action.ShouldThrow<ObjectDisposedException>().And.ObjectName.Should().Be("BsonStreamAdapter");
  456. }
  457. [Theory]
  458. [ParameterAttributeData]
  459. public void Position_set_should_call_wrapped_stream(
  460. [Values(0, 1, 2)]
  461. long position)
  462. {
  463. var mockStream = new Mock<Stream>();
  464. var subject = new BsonStreamAdapter(mockStream.Object);
  465. subject.Position = position;
  466. mockStream.VerifySet(s => s.Position = position, Times.Once);
  467. }
  468. [Fact]
  469. public void Position_set_should_throw_when_subject_is_disposed()
  470. {
  471. var mockStream = new Mock<Stream>();
  472. var subject = new BsonStreamAdapter(mockStream.Object);
  473. subject.Dispose();
  474. Action action = () => { subject.Position = 0; };
  475. action.ShouldThrow<ObjectDisposedException>().And.ObjectName.Should().Be("BsonStreamAdapter");
  476. }
  477. [Fact]
  478. public void Read_should_call_wrapped_stream()
  479. {
  480. var mockStream = new Mock<Stream>();
  481. var subject = new BsonStreamAdapter(mockStream.Object);
  482. var buffer = new byte[3];
  483. var offset = 1;
  484. var count = 2;
  485. var numberOfBytesRead = 1;
  486. mockStream.Setup(s => s.Read(buffer, offset, count)).Returns(numberOfBytesRead);
  487. var result = subject.Read(buffer, offset, count);
  488. result.Should().Be(numberOfBytesRead);
  489. mockStream.Verify(s => s.Read(buffer, offset, count), Times.Once);
  490. }
  491. [Fact]
  492. public void Read_should_throw_when_subject_is_disposed()
  493. {
  494. var mockStream = new Mock<Stream>();
  495. var subject = new BsonStreamAdapter(mockStream.Object);
  496. var buffer = new byte[3];
  497. var offset = 1;
  498. var count = 2;
  499. subject.Dispose();
  500. Action action = () => subject.Read(buffer, offset, count);
  501. action.ShouldThrow<ObjectDisposedException>().And.ObjectName.Should().Be("BsonStreamAdapter");
  502. }
  503. [Fact]
  504. public void ReadAsync_should_call_wrapped_stream()
  505. {
  506. var mockStream = new Mock<Stream>();
  507. var subject = new BsonStreamAdapter(mockStream.Object);
  508. var task = new TaskCompletionSource<int>().Task;
  509. var buffer = new byte[3];
  510. var offset = 1;
  511. var count = 2;
  512. var cancellationToken = new CancellationTokenSource().Token;
  513. mockStream.Setup(s => s.ReadAsync(buffer, offset, count, cancellationToken)).Returns(task);
  514. var result = subject.ReadAsync(buffer, offset, count, cancellationToken);
  515. result.Should().Be(task);
  516. mockStream.Verify(s => s.ReadAsync(buffer, offset, count, cancellationToken), Times.Once);
  517. }
  518. [Fact]
  519. public void ReadAsync_should_throw_when_subject_is_disposed()
  520. {
  521. var mockStream = new Mock<Stream>();
  522. var subject = new BsonStreamAdapter(mockStream.Object);
  523. var buffer = new byte[3];
  524. var offset = 1;
  525. var count = 2;
  526. var cancellationToken = new CancellationTokenSource().Token;
  527. subject.Dispose();
  528. Action action = () => subject.ReadAsync(buffer, offset, count, cancellationToken);
  529. action.ShouldThrow<ObjectDisposedException>().And.ObjectName.Should().Be("BsonStreamAdapter");
  530. }
  531. [Fact]
  532. public void ReadByte_should_call_wrapped_stream()
  533. {
  534. var mockStream = new Mock<Stream>();
  535. var subject = new BsonStreamAdapter(mockStream.Object);
  536. mockStream.Setup(s => s.ReadByte()).Returns(1);
  537. var result = subject.ReadByte();
  538. result.Should().Be(1);
  539. mockStream.Verify(s => s.ReadByte(), Times.Once);
  540. }
  541. [Fact]
  542. public void ReadByte_should_throw_when_subject_is_disposed()
  543. {
  544. var mockStream = new Mock<Stream>();
  545. var subject = new BsonStreamAdapter(mockStream.Object);
  546. subject.Dispose();
  547. Action action = () => subject.ReadByte();
  548. action.ShouldThrow<ObjectDisposedException>().And.ObjectName.Should().Be("BsonStreamAdapter");
  549. }
  550. [Theory]
  551. [InlineData(new byte[] { 0 }, "")]
  552. [InlineData(new byte[] { 97, 0 }, "a")]
  553. [InlineData(new byte[] { 97, 98, 0 }, "ab")]
  554. [InlineData(new byte[] { 97, 98, 99, 0 }, "abc")]
  555. public void ReadCString_should_return_expected_result(byte[] bytes, string expectedResult)
  556. {
  557. var stream = new MemoryStream(bytes);
  558. var subject = new BsonStreamAdapter(stream);
  559. var result = subject.ReadCString(Utf8Encodings.Strict);
  560. result.Should().Be(expectedResult);
  561. subject.Position.Should().Be(bytes.Length);
  562. }
  563. [Fact]
  564. public void ReadCString_should_throw_when_encoding_is_null()
  565. {
  566. var mockStream = new Mock<Stream>();
  567. var subject = new BsonStreamAdapter(mockStream.Object);
  568. Action action = () => subject.ReadCString(null);
  569. action.ShouldThrow<ArgumentNullException>().And.ParamName.Should().Be("encoding");
  570. }
  571. [Fact]
  572. public void ReadCString_should_throw_when_subject_is_disposed()
  573. {
  574. var mockStream = new Mock<Stream>();
  575. var subject = new BsonStreamAdapter(mockStream.Object);
  576. subject.Dispose();
  577. Action action = () => subject.ReadCString(Utf8Encodings.Strict);
  578. action.ShouldThrow<ObjectDisposedException>().And.ObjectName.Should().Be("BsonStreamAdapter");
  579. }
  580. [Theory]
  581. [InlineData(new byte[] { 0 }, "")]
  582. [InlineData(new byte[] { 97, 0 }, "a")]
  583. [InlineData(new byte[] { 97, 98, 0 }, "ab")]
  584. [InlineData(new byte[] { 97, 98, 99, 0 }, "abc")]
  585. public void ReadCStringBytes_should_return_expected_result(byte[] bytes, string expectedResult)
  586. {
  587. var stream = new MemoryStream(bytes);
  588. var subject = new BsonStreamAdapter(stream);
  589. var result = subject.ReadCStringBytes();
  590. result.Array.Skip(result.Offset).Take(result.Count).Should().Equal(bytes.Take(bytes.Length - 1));
  591. subject.Position.Should().Be(bytes.Length);
  592. }
  593. [Fact]
  594. public void ReadCStringBytes_should_throw_when_subject_is_disposed()
  595. {
  596. var mockStream = new Mock<Stream>();
  597. var subject = new BsonStreamAdapter(mockStream.Object);
  598. subject.Dispose();
  599. Action action = () => subject.ReadCStringBytes();
  600. action.ShouldThrow<ObjectDisposedException>().And.ObjectName.Should().Be("BsonStreamAdapter");
  601. }
  602. [Fact]
  603. public void ReadCStringBytes_should_throw_when_terminating_null_byte_is_missing()
  604. {
  605. var bytes = new byte[] { 0, 97, 98 };
  606. var stream = new MemoryStream(bytes);
  607. var subject = new BsonStreamAdapter(stream);
  608. subject.SetLength(3);
  609. subject.Position = 1;
  610. Action action = () => subject.ReadCStringBytes();
  611. action.ShouldThrow<EndOfStreamException>();
  612. }
  613. [Theory]
  614. [ParameterAttributeData]
  615. public void ReadDecimal128_should_return_expected_result(
  616. [Values("-1.0", "0.0", "1.0", "NaN", "-Infinity", "Infinity")]
  617. string valueString
  618. )
  619. {
  620. var value = Decimal128.Parse(valueString);
  621. var bytes = new byte[16];
  622. Buffer.BlockCopy(BitConverter.GetBytes(value.GetIEEELowBits()), 0, bytes, 0, 8);
  623. Buffer.BlockCopy(BitConverter.GetBytes(value.GetIEEEHighBits()), 0, bytes, 8, 8);
  624. var stream = new MemoryStream(bytes);
  625. var subject = new BsonStreamAdapter(stream);
  626. var result = subject.ReadDecimal128();
  627. result.Should().Be(value);
  628. subject.Position.Should().Be(16);
  629. }
  630. [Fact]
  631. public void ReadDecimal128_should_throw_when_subject_is_disposed()
  632. {
  633. var mockStream = new Mock<Stream>();
  634. var subject = new BsonStreamAdapter(mockStream.Object);
  635. subject.Dispose();
  636. Action action = () => subject.ReadDecimal128();
  637. action.ShouldThrow<ObjectDisposedException>().And.ObjectName.Should().Be("BsonStreamAdapter");
  638. }
  639. [Theory]
  640. [ParameterAttributeData]
  641. public void ReadDouble_should_return_expected_result(
  642. [Values(-1.0, 0.0, 1.0, double.Epsilon, double.MaxValue, double.MinValue, double.NaN, double.NegativeInfinity, double.PositiveInfinity)]
  643. double value
  644. )
  645. {
  646. var bytes = BitConverter.GetBytes(value);
  647. var stream = new MemoryStream(bytes);
  648. var subject = new BsonStreamAdapter(stream);
  649. var result = subject.ReadDouble();
  650. result.Should().Be(value);
  651. subject.Position.Should().Be(8);
  652. }
  653. [Fact]
  654. public void ReadDouble_should_throw_when_subject_is_disposed()
  655. {
  656. var mockStream = new Mock<Stream>();
  657. var subject = new BsonStreamAdapter(mockStream.Object);
  658. subject.Dispose();
  659. Action action = () => subject.ReadDouble();
  660. action.ShouldThrow<ObjectDisposedException>().And.ObjectName.Should().Be("BsonStreamAdapter");
  661. }
  662. [Fact]
  663. public void ReadInt32_should_be_little_endian()
  664. {
  665. var bytes = new byte[] { 1, 2, 3, 4 };
  666. var stream = new MemoryStream(bytes);
  667. var subject = new BsonStreamAdapter(stream);
  668. var result = subject.ReadInt32();
  669. result.Should().Be(0x04030201);
  670. }
  671. [Theory]
  672. [ParameterAttributeData]
  673. public void ReadInt32_should_return_expected_result(
  674. [Values(-1, 0, 1, int.MaxValue, int.MinValue)]
  675. int value)
  676. {
  677. var bytes = BitConverter.GetBytes(value);
  678. var stream = new MemoryStream(bytes);
  679. var subject = new BsonStreamAdapter(stream);
  680. var result = subject.ReadInt32();
  681. result.Should().Be(value);
  682. subject.Position.Should().Be(4);
  683. }
  684. [Fact]
  685. public void ReadInt32_should_throw_when_subject_is_disposed()
  686. {
  687. var mockStream = new Mock<Stream>();
  688. var subject = new BsonStreamAdapter(mockStream.Object);
  689. subject.Dispose();
  690. Action action = () => subject.ReadInt32();
  691. action.ShouldThrow<ObjectDisposedException>().And.ObjectName.Should().Be("BsonStreamAdapter");
  692. }
  693. [Fact]
  694. public void ReadInt64_should_be_little_endian()
  695. {
  696. var bytes = new byte[] { 1, 2, 3, 4, 5, 6, 7, 8 };
  697. var stream = new MemoryStream(bytes);
  698. var subject = new BsonStreamAdapter(stream);
  699. var result = subject.ReadInt64();
  700. result.Should().Be(0x0807060504030201);
  701. }
  702. [Theory]
  703. [ParameterAttributeData]
  704. public void ReadInt64_should_return_expected_result(
  705. [Values(-1, 0, 1, long.MaxValue, long.MinValue)]
  706. long value)
  707. {
  708. var bytes = BitConverter.GetBytes(value);
  709. var stream = new MemoryStream(bytes);
  710. var subject = new BsonStreamAdapter(stream);
  711. var result = subject.ReadInt64();
  712. result.Should().Be(value);
  713. subject.Position.Should().Be(8);
  714. }
  715. [Fact]
  716. public void ReadInt64_should_throw_when_subject_is_disposed()
  717. {
  718. var mockStream = new Mock<Stream>();
  719. var subject = new BsonStreamAdapter(mockStream.Object);
  720. subject.Dispose();
  721. Action action = () => subject.ReadInt64();
  722. action.ShouldThrow<ObjectDisposedException>().And.ObjectName.Should().Be("BsonStreamAdapter");
  723. }
  724. [Fact]
  725. public void ReadObjectId_should_be_big_endian()
  726. {
  727. var bytes = new byte[] { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12 };
  728. var stream = new MemoryStream(bytes);
  729. var subject = new BsonStreamAdapter(stream);
  730. var result = subject.ReadObjectId();
  731. result._a().Should().Be(0x01020304);
  732. result._b().Should().Be(0x05060708);
  733. result._c().Should().Be(0x090a0b0c);
  734. }
  735. [Fact]
  736. public void ReadObjectId_should_return_expected_result()
  737. {
  738. var objectId = ObjectId.GenerateNewId();
  739. var bytes = objectId.ToByteArray();
  740. var stream = new MemoryStream(bytes);
  741. var subject = new BsonStreamAdapter(stream);
  742. var result = subject.ReadObjectId();
  743. result.Should().Be(objectId);
  744. subject.Position.Should().Be(12);
  745. }
  746. [Fact]
  747. public void ReadObjectId_should_throw_when_subject_is_disposed()
  748. {
  749. var mockStream = new Mock<Stream>();
  750. var subject = new BsonStreamAdapter(mockStream.Object);
  751. subject.Dispose();
  752. Action action = () => subject.ReadObjectId();
  753. action.ShouldThrow<ObjectDisposedException>().And.ObjectName.Should().Be("BsonStreamAdapter");
  754. }
  755. [Fact]
  756. public void ReadSlice_should_return_expected_result()
  757. {
  758. var bytes = new byte[] { 7, 0, 0, 0, 1, 2, 3 };
  759. var stream = new MemoryStream(bytes);
  760. var subject = new BsonStreamAdapter(stream);
  761. var result = subject.ReadSlice();
  762. result.IsReadOnly.Should().BeTrue();
  763. var segment = result.AccessBackingBytes(0);
  764. segment.Array.Skip(segment.Offset).Take(segment.Count).Should().Equal(bytes);
  765. subject.Position.Should().Be(7);
  766. }
  767. [Fact]
  768. public void ReadSlice_should_throw_when_subject_is_disposed()
  769. {
  770. var mockStream = new Mock<Stream>();
  771. var subject = new BsonStreamAdapter(mockStream.Object);
  772. subject.Dispose();
  773. Action action = () => subject.ReadSlice();
  774. action.ShouldThrow<ObjectDisposedException>().And.ObjectName.Should().Be("BsonStreamAdapter");
  775. }
  776. [Theory]
  777. [InlineData(new byte[] { 1, 0, 0, 0, 0 }, "")]
  778. [InlineData(new byte[] { 2, 0, 0, 0, 97, 0 }, "a")]
  779. [InlineData(new byte[] { 3, 0, 0, 0, 97, 98, 0 }, "ab")]
  780. [InlineData(new byte[] { 4, 0, 0, 0, 97, 98, 99, 0 }, "abc")]
  781. public void ReadString_should_return_expected_result(byte[] bytes, string expectedResult)
  782. {
  783. var stream = new MemoryStream(bytes);
  784. var subject = new BsonStreamAdapter(stream);
  785. var result = subject.ReadString(Utf8Encodings.Strict);
  786. result.Should().Be(expectedResult);
  787. subject.Position.Should().Be(bytes.Length);
  788. }
  789. [Fact]
  790. public void ReadString_should_throw_when_encoding_is_null()
  791. {
  792. var mockStream = new Mock<Stream>();
  793. var subject = new BsonStreamAdapter(mockStream.Object);
  794. Action action = () => subject.ReadString(null);
  795. action.ShouldThrow<ArgumentNullException>().And.ParamName.Should().Be("encoding");
  796. }
  797. [Fact]
  798. public void ReadString_should_throw_when_subject_is_disposed()
  799. {
  800. var mockStream = new Mock<Stream>();
  801. var subject = new BsonStreamAdapter(mockStream.Object);
  802. subject.Dispose();
  803. Action action = () => subject.ReadString(Utf8Encodings.Strict);
  804. action.ShouldThrow<ObjectDisposedException>().And.ObjectName.Should().Be("BsonStreamAdapter");
  805. }
  806. [Fact]
  807. public void ReadString_should_throw_when_terminating_null_byte_is_missing()
  808. {
  809. var bytes = new byte[] { 2, 0, 0, 0, 97, 1 };
  810. var stream = new MemoryStream(bytes);
  811. var subject = new BsonStreamAdapter(stream);
  812. Action action = () => subject.ReadString(Utf8Encodings.Strict);
  813. action.ShouldThrow<FormatException>();
  814. }
  815. [Theory]
  816. [ParameterAttributeData]
  817. public void ReadTimeout_get_should_call_wrapped_stream(
  818. [Values(0, 1, 2)]
  819. int readTimeout)
  820. {
  821. var mockStream = new Mock<Stream>();
  822. var subject = new BsonStreamAdapter(mockStream.Object);
  823. mockStream.SetupGet(s => s.ReadTimeout).Returns(readTimeout);
  824. var result = subject.ReadTimeout;
  825. result.Should().Be(readTimeout);
  826. mockStream.VerifyGet(s => s.ReadTimeout, Times.Once);
  827. }
  828. [Fact]
  829. public void ReadTimeout_get_should_throw_when_subject_is_disposed()
  830. {
  831. var mockStream = new Mock<Stream>();
  832. var subject = new BsonStreamAdapter(mockStream.Object);
  833. subject.Dispose();
  834. Action action = () => { var _ = subject.ReadTimeout; };
  835. action.ShouldThrow<ObjectDisposedException>().And.ObjectName.Should().Be("BsonStreamAdapter");
  836. }
  837. [Theory]
  838. [ParameterAttributeData]
  839. public void ReadTimeout_set_should_call_wrapped_stream(
  840. [Values(0, 1, 2)]
  841. int readTimeout)
  842. {
  843. var mockStream = new Mock<Stream>();
  844. var subject = new BsonStreamAdapter(mockStream.Object);
  845. subject.ReadTimeout = readTimeout;
  846. mockStream.VerifySet(s => s.ReadTimeout = readTimeout);
  847. }
  848. [Fact]
  849. public void ReadTimeout_set_should_throw_when_subject_is_disposed()
  850. {
  851. var mockStream = new Mock<Stream>();
  852. var subject = new BsonStreamAdapter(mockStream.Object);
  853. subject.Dispose();
  854. Action action = () => { subject.ReadTimeout = 0; };
  855. action.ShouldThrow<ObjectDisposedException>().And.ObjectName.Should().Be("BsonStreamAdapter");
  856. }
  857. [Fact]
  858. public void Seek_should_call_wrapped_stream()
  859. {
  860. var mockStream = new Mock<Stream>();
  861. var subject = new BsonStreamAdapter(mockStream.Object);
  862. var offset = 1L;
  863. var origin = SeekOrigin.Current;
  864. var newPosition = 2L;
  865. mockStream.Setup(s => s.Seek(offset, origin)).Returns(newPosition);
  866. var result = subject.Seek(offset, origin);
  867. result.Should().Be(newPosition);
  868. mockStream.Verify(s => s.Seek(offset, origin), Times.Once);
  869. }
  870. [Fact]
  871. public void Seek_should_throw_when_subject_is_disposed()
  872. {
  873. var mockStream = new Mock<Stream>();
  874. var subject = new BsonStreamAdapter(mockStream.Object);
  875. var offset = 1L;
  876. var origin = SeekOrigin.Current;
  877. subject.Dispose();
  878. Action action = () => subject.Seek(offset, origin);
  879. action.ShouldThrow<ObjectDisposedException>().And.ObjectName.Should().Be("BsonStreamAdapter");
  880. }
  881. [Fact]
  882. public void SetLength_should_call_wrapped_stream()
  883. {
  884. var mockStream = new Mock<Stream>();
  885. var subject = new BsonStreamAdapter(mockStream.Object);
  886. var length = 1L;
  887. subject.SetLength(length);
  888. mockStream.Verify(s => s.SetLength(length), Times.Once);
  889. }
  890. [Fact]
  891. public void SetLength_should_throw_when_subject_is_diposed()
  892. {
  893. var mockStream = new Mock<Stream>();
  894. var subject = new BsonStreamAdapter(mockStream.Object);
  895. var length = 1L;
  896. subject.Dispose();
  897. Action action = () => subject.SetLength(length);
  898. action.ShouldThrow<ObjectDisposedException>().And.ObjectName.Should().Be("BsonStreamAdapter");
  899. }
  900. [Theory]
  901. [InlineData(new byte[] { 0 })]
  902. [InlineData(new byte[] { 97, 0 })]
  903. [InlineData(new byte[] { 97, 98, 0 })]
  904. [InlineData(new byte[] { 97, 98, 99, 0 })]
  905. public void SkipCString_should_skip_cstring(byte[] bytes)
  906. {
  907. var stream = new MemoryStream(bytes);
  908. var subject = new BsonStreamAdapter(stream);
  909. subject.SkipCString();
  910. subject.Position.Should().Be(bytes.Length);
  911. }
  912. [Fact]
  913. public void SkipCString_should_throw_when_subject_is_disposed()
  914. {
  915. var mockStream = new Mock<Stream>();
  916. var subject = new BsonStreamAdapter(mockStream.Object);
  917. subject.Dispose();
  918. Action action = () => subject.SkipCString();
  919. action.ShouldThrow<ObjectDisposedException>().And.ObjectName.Should().Be("BsonStreamAdapter");
  920. }
  921. [Fact]
  922. public void SkipCString_should_throw_when_terminating_null_byte_is_missing()
  923. {
  924. var bytes = new byte[] { 97 };
  925. var stream = new MemoryStream(bytes);
  926. var subject = new BsonStreamAdapter(stream);
  927. Action action = () => subject.SkipCString();
  928. action.ShouldThrow<EndOfStreamException>();
  929. }
  930. [Fact]
  931. public void Write_should_call_wrapped_stream()
  932. {
  933. var mockStream = new Mock<Stream>();
  934. var subject = new BsonStreamAdapter(mockStream.Object);
  935. var buffer = new byte[0];
  936. var offset = 1;
  937. var count = 2;
  938. subject.Write(buffer, offset, count);
  939. mockStream.Verify(s => s.Write(buffer, offset, count), Times.Once);
  940. }
  941. [Fact]
  942. public void Write_should_throw_when_subject_is_disposed()
  943. {
  944. var mockStream = new Mock<Stream>();
  945. var subject = new BsonStreamAdapter(mockStream.Object);
  946. var buffer = new byte[0];
  947. var offset = 1;
  948. var count = 2;
  949. subject.Dispose();
  950. Action action = () => subject.Write(buffer, offset, count);
  951. action.ShouldThrow<ObjectDisposedException>().And.ObjectName.Should().Be("BsonStreamAdapter");
  952. }
  953. [Fact]
  954. public void WriteAsync_should_call_wrapped_stream()
  955. {
  956. var mockStream = new Mock<Stream>();
  957. var subject = new BsonStreamAdapter(mockStream.Object);
  958. var task = new TaskCompletionSource<object>().Task;
  959. var buffer = new byte[0];
  960. var offset = 1;
  961. var count = 2;
  962. var cancellationToken = new CancellationTokenSource().Token;
  963. mockStream.Setup(s => s.WriteAsync(buffer, offset, count, cancellationToken)).Returns(task);
  964. var result = subject.WriteAsync(buffer, offset, count, cancellationToken);
  965. result.Should().Be(task);
  966. mockStream.Verify(s => s.WriteAsync(buffer, offset, count, cancellationToken), Times.Once);
  967. }
  968. [Fact]
  969. public void WriteAsync_should_throw_when_subject_is_disposed()
  970. {
  971. var mockStream = new Mock<Stream>();
  972. var subject = new BsonStreamAdapter(mockStream.Object);
  973. var task = new TaskCompletionSource<object>().Task;
  974. var buffer = new byte[0];
  975. var offset = 1;
  976. var count = 2;
  977. var cancellationToken = new CancellationTokenSource().Token;
  978. subject.Dispose();
  979. Action action = () => subject.WriteAsync(buffer, offset, count, cancellationToken);
  980. action.ShouldThrow<ObjectDisposedException>().And.ObjectName.Should().Be("BsonStreamAdapter");
  981. }
  982. [Fact]
  983. public void WriteByte_should_call_wrapped_stream()
  984. {
  985. var mockStream = new Mock<Stream>();
  986. var subject = new BsonStreamAdapter(mockStream.Object);
  987. var value = (byte)97;
  988. subject.WriteByte(value);
  989. mockStream.Verify(s => s.WriteByte(value), Times.Once);
  990. }
  991. [Fact]
  992. public void WriteByte_should_throw_when_subject_is_disposed()
  993. {
  994. var mockStream = new Mock<Stream>();
  995. var subject = new BsonStreamAdapter(mockStream.Object);
  996. var value = (byte)97;
  997. subject.Dispose();
  998. Action action = () => subject.WriteByte(value);
  999. action.ShouldThrow<ObjectDisposedException>().And.ObjectName.Should().Be("BsonStreamAdapter");
  1000. }
  1001. [Fact]
  1002. public void WriteCString_should_throw_when_subject_is_disposed()
  1003. {
  1004. var mockStream = new Mock<Stream>();
  1005. var subject = new BsonStreamAdapter(mockStream.Object);
  1006. var value = "abc";
  1007. subject.Dispose();
  1008. Action action = () => subject.WriteCString(value);
  1009. action.ShouldThrow<ObjectDisposedException>().And.ObjectName.Should().Be("BsonStreamAdapter");
  1010. }
  1011. [Fact]
  1012. public void WriteCString_should_throw_when_value_contains_nulls()
  1013. {
  1014. var stream = new MemoryStream();
  1015. var subject = new BsonStreamAdapter(stream);
  1016. var value = "a\0b";
  1017. Action action = () => subject.WriteCString(value);
  1018. action.ShouldThrow<ArgumentException>().And.ParamName.Should().Be("value");
  1019. }
  1020. [Theory]
  1021. [ParameterAttributeData]
  1022. public void WriteCString_should_throw_when_value_with_maxByteCount_near_tempUtf8_contains_nulls(
  1023. [Values(-1, 0, 1)] int delta)
  1024. {
  1025. var stream = new MemoryStream();
  1026. var subject = new BsonStreamAdapter(stream);
  1027. var subjectReflector = new Reflector(subject);
  1028. var valueLength = (subjectReflector._tempUtf8.Length / 3) + delta;
  1029. var length1 = valueLength / 2;
  1030. var length2 = valueLength - length1 - 1;
  1031. var value = new string('x', length1) + '\0' + new string('x', length2);
  1032. Action action = () => subject.WriteCString(value);
  1033. action.ShouldThrow<ArgumentException>().And.ParamName.Should().Be("value");
  1034. }
  1035. [Fact]
  1036. public void WriteCString_should_throw_when_value_is_null()
  1037. {
  1038. var mockStream = new Mock<Stream>();
  1039. var subject = new BsonStreamAdapter(mockStream.Object);
  1040. Action action = () => subject.WriteCString(null);
  1041. action.ShouldThrow<ArgumentNullException>().And.ParamName.Should().Be("value");
  1042. }
  1043. [Theory]
  1044. [InlineData("", new byte[] { 0 })]
  1045. [InlineData("a", new byte[] { 97, 0 })]
  1046. [InlineData("ab", new byte[] { 97, 98, 0 })]
  1047. [InlineData("abc", new byte[] { 97, 98, 99, 0 })]
  1048. public void WriteCString_should_write_expected_bytes(string value, byte[] expectedBytes)
  1049. {
  1050. var stream = new MemoryStream();
  1051. var subject = new BsonStreamAdapter(stream);
  1052. subject.WriteCString(value);
  1053. stream.ToArray().Should().Equal(expectedBytes);
  1054. }
  1055. [Theory]
  1056. [ParameterAttributeData]
  1057. public void WriteCString_should_write_expected_bytes_when_maxByteCount_is_near_tempUtf8_length(
  1058. [Values(-1, 0, 1)]
  1059. int delta)
  1060. {
  1061. var stream = new MemoryStream();
  1062. var subject = new BsonStreamAdapter(stream);
  1063. var subjectReflector = new Reflector(subject);
  1064. var valueLength = (subjectReflector._tempUtf8.Length / 3) + delta;
  1065. var value = new string('a', valueLength);
  1066. var expectedBytes = Enumerable.Repeat<byte>(97, valueLength).Concat(new byte[] { 0 }).ToArray();
  1067. subject.WriteCString(value);
  1068. stream.ToArray().Should().Equal(expectedBytes);
  1069. }
  1070. [Fact]
  1071. public void WriteCStringBytes_should_throw_when_subject_is_disposed()
  1072. {
  1073. var mockStream = new Mock<Stream>();
  1074. var subject = new BsonStreamAdapter(mockStream.Object);
  1075. var value = new byte[0];
  1076. subject.Dispose();
  1077. Action action = () => subject.WriteCStringBytes(value);
  1078. action.ShouldThrow<ObjectDisposedException>().And.ObjectName.Should().Be("BsonStreamAdapter");
  1079. }
  1080. [Fact]
  1081. public void WriteCStringBytes_should_throw_when_value_is_null()
  1082. {
  1083. var mockStream = new Mock<Stream>();
  1084. var subject = new BsonStreamAdapter(mockStream.Object);
  1085. Action action = () => subject.WriteCStringBytes(null);
  1086. action.ShouldThrow<ArgumentNullException>().And.ParamName.Should().Be("value");
  1087. }
  1088. [Theory]
  1089. [InlineData(new byte[] { })]
  1090. [InlineData(new byte[] { 97 })]
  1091. [InlineData(new byte[] { 97, 98 })]
  1092. [InlineData(new byte[] { 97, 98, 99 })]
  1093. public void WriteCStringBytes_should_write_expected_bytes(byte[] value)
  1094. {
  1095. var stream = new MemoryStream();
  1096. var subject = new BsonStreamAdapter(stream);
  1097. subject.WriteCStringBytes(value);
  1098. stream.ToArray().Should().Equal(value.Concat(new byte[] { 0 }));
  1099. }
  1100. [Theory]
  1101. [ParameterAttributeData]
  1102. public void WriteDecimal128_should_write_expected_bytes(
  1103. [Values("-1.0", "0.0", "1.0", "NaN", "-Infinity", "Infinity")]
  1104. string valueString)
  1105. {
  1106. var value = Decimal128.Parse(valueString);
  1107. var stream = new MemoryStream();
  1108. var subject = new BsonStreamAdapter(stream);
  1109. var expectedBytes = new byte[16];
  1110. Buffer.BlockCopy(BitConverter.GetBytes(value.GetIEEELowBits()), 0, expectedBytes, 0, 8);
  1111. Buffer.BlockCopy(BitConverter.GetBytes(value.GetIEEEHighBits()), 0, expectedBytes, 8, 8);
  1112. subject.WriteDecimal128(value);
  1113. stream.ToArray().Should().Equal(expectedBytes);
  1114. }
  1115. [Fact]
  1116. public void WriteDecimal128_should_throw_when_subject_is_disposed()
  1117. {
  1118. var mockStream = new Mock<Stream>();
  1119. var subject = new BsonStreamAdapter(mockStream.Object);
  1120. subject.Dispose();
  1121. Action action = () => subject.WriteDecimal128(Decimal128.Zero);
  1122. action.ShouldThrow<ObjectD

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