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

/tests/MongoDB.Driver.Tests/UpdateDefinitionBuilderTests.cs

http://github.com/mongodb/mongo-csharp-driver
C# | 745 lines | 567 code | 164 blank | 14 comment | 9 complexity | ff4b50c62bb926081027ec79e42f8a6b 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.Collections.Generic;
  17. using System.Linq;
  18. using FluentAssertions;
  19. using MongoDB.Bson;
  20. using MongoDB.Bson.Serialization;
  21. using MongoDB.Bson.Serialization.Attributes;
  22. using MongoDB.Bson.TestHelpers.XunitExtensions;
  23. using Xunit;
  24. namespace MongoDB.Driver.Tests
  25. {
  26. public class UpdateDefinitionBuilderTests
  27. {
  28. [Fact]
  29. public void AddToSet()
  30. {
  31. var subject = CreateSubject<BsonDocument>();
  32. Assert(subject.AddToSet("a", 1), "{$addToSet: {a: 1}}");
  33. Assert(subject.AddToSet("a", new[] { 1, 2 }), "{$addToSet: {a: [1, 2]}}");
  34. }
  35. [Fact]
  36. public void AddToSet_Typed()
  37. {
  38. var subject = CreateSubject<Person>();
  39. Assert(subject.AddToSet(x => x.FavoriteColors, "green"), "{$addToSet: {colors: 'green'}}");
  40. Assert(subject.AddToSet("FavoriteColors", "green"), "{$addToSet: {colors: 'green'}}");
  41. }
  42. [Fact]
  43. public void AddToSetEach()
  44. {
  45. var subject = CreateSubject<BsonDocument>();
  46. Assert(subject.AddToSetEach("a", new[] { 1, 2 }), "{$addToSet: {a: {$each: [1, 2]}}}");
  47. Assert(subject.AddToSetEach("a", new[] { new[] { 1, 2 }, new[] { 3, 4 } }), "{$addToSet: {a: {$each: [[1, 2], [3, 4]]}}}");
  48. }
  49. [Fact]
  50. public void AddToSetEach_Typed()
  51. {
  52. var subject = CreateSubject<Person>();
  53. Assert(subject.AddToSetEach(x => x.FavoriteColors, new[] { "green", "violet" }), "{$addToSet: {colors: {$each: ['green', 'violet']}}}");
  54. Assert(subject.AddToSetEach("FavoriteColors", new[] { "green", "violet" }), "{$addToSet: {colors: {$each: ['green', 'violet']}}}");
  55. }
  56. [Fact]
  57. public void BitwiseAnd()
  58. {
  59. var subject = CreateSubject<BsonDocument>();
  60. Assert(subject.BitwiseAnd("a", 1), "{$bit: {a: {and: 1}}}");
  61. }
  62. [Fact]
  63. public void BitwiseAnd_Typed()
  64. {
  65. var subject = CreateSubject<Person>();
  66. Assert(subject.BitwiseAnd(x => x.Age, 1), "{$bit: {age: {and: 1}}}");
  67. Assert(subject.BitwiseAnd("Age", 1), "{$bit: {age: {and: 1}}}");
  68. }
  69. [Fact]
  70. public void BitwiseOr()
  71. {
  72. var subject = CreateSubject<BsonDocument>();
  73. Assert(subject.BitwiseOr("a", 1), "{$bit: {a: {or: 1}}}");
  74. }
  75. [Fact]
  76. public void BitwiseOr_Typed()
  77. {
  78. var subject = CreateSubject<Person>();
  79. Assert(subject.BitwiseOr(x => x.Age, 1), "{$bit: {age: {or: 1}}}");
  80. Assert(subject.BitwiseOr("Age", 1), "{$bit: {age: {or: 1}}}");
  81. }
  82. [Fact]
  83. public void BitwiseXor()
  84. {
  85. var subject = CreateSubject<BsonDocument>();
  86. Assert(subject.BitwiseXor("a", 1), "{$bit: {a: {xor: 1}}}");
  87. }
  88. [Fact]
  89. public void BitwiseXor_Typed()
  90. {
  91. var subject = CreateSubject<Person>();
  92. Assert(subject.BitwiseXor(x => x.Age, 1), "{$bit: {age: {xor: 1}}}");
  93. Assert(subject.BitwiseXor("Age", 1), "{$bit: {age: {xor: 1}}}");
  94. }
  95. [Fact]
  96. public void Combine()
  97. {
  98. var subject = CreateSubject<BsonDocument>();
  99. var update = subject.Combine(
  100. "{$set: {a: 1, b: 2}}",
  101. "{$inc: {c: 1}}");
  102. Assert(update, "{$set: {a: 1, b: 2}, $inc: {c: 1}}");
  103. }
  104. [Fact]
  105. public void Combine_with_overlapping_operators()
  106. {
  107. var subject = CreateSubject<BsonDocument>();
  108. var update = subject.Combine(
  109. "{$set: {a: 1, b: 2}}",
  110. "{$set: {c: 3}}");
  111. Assert(update, "{$set: {a: 1, b: 2, c: 3}}");
  112. }
  113. [Fact]
  114. public void Combine_with_overlapping_operators_and_duplicate_elements()
  115. {
  116. var subject = CreateSubject<BsonDocument>();
  117. var update = subject.Combine(
  118. "{$set: {a: 1, b: 2}}",
  119. "{$set: {a: 4}}");
  120. Assert(update, "{$set: {a: 4, b: 2}}");
  121. }
  122. [Fact]
  123. public void Combine_with_overlapping_operators_and_duplicate_elements_using_extension_methods()
  124. {
  125. var subject = CreateSubject<BsonDocument>();
  126. var update = subject.Set("a", 1).Set("b", 2).Set("a", 4);
  127. Assert(update, "{$set: {a: 4, b: 2}}");
  128. }
  129. [Fact]
  130. public void Combine_with_no_updates()
  131. {
  132. var subject = CreateSubject<BsonDocument>();
  133. var update = subject.Combine();
  134. Assert(update, "{ }");
  135. }
  136. [Fact]
  137. public void CurrentDate()
  138. {
  139. var subject = CreateSubject<BsonDocument>();
  140. Assert(subject.CurrentDate("a"), "{$currentDate: {a: true}}");
  141. }
  142. [Fact]
  143. public void CurrentDate_with_date_type()
  144. {
  145. var subject = CreateSubject<BsonDocument>();
  146. Assert(subject.CurrentDate("a", UpdateDefinitionCurrentDateType.Date), "{$currentDate: {a: {$type: 'date'}}}");
  147. }
  148. [Fact]
  149. public void CurrentDate_with_timestamp_type()
  150. {
  151. var subject = CreateSubject<BsonDocument>();
  152. Assert(subject.CurrentDate("a", UpdateDefinitionCurrentDateType.Timestamp), "{$currentDate: {a: {$type: 'timestamp'}}}");
  153. }
  154. [Fact]
  155. public void CurrentDate_Typed()
  156. {
  157. var subject = CreateSubject<Person>();
  158. Assert(subject.CurrentDate(x => x.LastUpdated), "{$currentDate: {last_updated: true}}");
  159. Assert(subject.CurrentDate("LastUpdated"), "{$currentDate: {last_updated: true}}");
  160. }
  161. [Fact]
  162. public void CurrentDate_Typed_with_date_type()
  163. {
  164. var subject = CreateSubject<Person>();
  165. Assert(subject.CurrentDate(x => x.LastUpdated, UpdateDefinitionCurrentDateType.Date), "{$currentDate: {last_updated: {$type: 'date'}}}");
  166. Assert(subject.CurrentDate("LastUpdated", UpdateDefinitionCurrentDateType.Date), "{$currentDate: {last_updated: {$type: 'date'}}}");
  167. }
  168. [Fact]
  169. public void CurrentDate_Typed_with_timestamp_type()
  170. {
  171. var subject = CreateSubject<Person>();
  172. Assert(subject.CurrentDate(x => x.LastUpdated, UpdateDefinitionCurrentDateType.Timestamp), "{$currentDate: {last_updated: {$type: 'timestamp'}}}");
  173. Assert(subject.CurrentDate("LastUpdated", UpdateDefinitionCurrentDateType.Timestamp), "{$currentDate: {last_updated: {$type: 'timestamp'}}}");
  174. }
  175. [Fact]
  176. public void Inc()
  177. {
  178. var subject = CreateSubject<BsonDocument>();
  179. Assert(subject.Inc("a", 1), "{$inc: {a: 1}}");
  180. }
  181. [Fact]
  182. public void Inc_Typed()
  183. {
  184. var subject = CreateSubject<Person>();
  185. Assert(subject.Inc(x => x.Age, 1), "{$inc: {age: 1}}");
  186. Assert(subject.Inc("Age", 1), "{$inc: {age: 1}}");
  187. }
  188. [Fact]
  189. public void Incorrect_index_should_throw_expected_exception_with_set()
  190. {
  191. var subject = CreateSubject<Person>();
  192. string expectedErrorMessage = "Array indexes must be greater than or equal to -1.";
  193. #pragma warning disable 251
  194. AssertThrow<Person, IndexOutOfRangeException>(subject.Set(x => x.FavoriteColors[-2], "yellow"), expectedErrorMessage);
  195. #pragma warning restore
  196. AssertThrow<Person, IndexOutOfRangeException>(subject.Set(x => x.Pets[-2].Name, "Fluffencutters"), expectedErrorMessage);
  197. AssertThrow<Person, IndexOutOfRangeException>(subject.Set(x => x.Pets.ElementAt(-2).Name, "Fluffencutters"), expectedErrorMessage);
  198. }
  199. [Fact]
  200. public void Indexed_Positional_Typed()
  201. {
  202. var subject = CreateSubject<Person>();
  203. #pragma warning disable
  204. Assert(subject.Set(x => x.FavoriteColors[-1], "yellow"), "{$set: {'colors.$': 'yellow'}}");
  205. #pragma warning restore
  206. Assert(subject.Set(x => x.Pets[-1].Name, "Fluffencutters"), "{$set: {'pets.$.name': 'Fluffencutters'}}");
  207. Assert(subject.Set(x => x.Pets.ElementAt(-1).Name, "Fluffencutters"), "{$set: {'pets.$.name': 'Fluffencutters'}}");
  208. }
  209. [Fact]
  210. public void Indexed_Typed()
  211. {
  212. var subject = CreateSubject<Person>();
  213. Assert(subject.Set(x => x.FavoriteColors[2], "yellow"), "{$set: {'colors.2': 'yellow'}}");
  214. Assert(subject.Set(x => x.Pets[2].Name, "Fluffencutters"), "{$set: {'pets.2.name': 'Fluffencutters'}}");
  215. Assert(subject.Set(x => x.Pets.ElementAt(2).Name, "Fluffencutters"), "{$set: {'pets.2.name': 'Fluffencutters'}}");
  216. var index = 2;
  217. Assert(subject.Set(x => x.FavoriteColors[index], "yellow"), "{$set: {'colors.2': 'yellow'}}");
  218. Assert(subject.Set(x => x.Pets[index].Name, "Fluffencutters"), "{$set: {'pets.2.name': 'Fluffencutters'}}");
  219. Assert(subject.Set(x => x.Pets.ElementAt(index).Name, "Fluffencutters"), "{$set: {'pets.2.name': 'Fluffencutters'}}");
  220. }
  221. [Fact]
  222. public void Max()
  223. {
  224. var subject = CreateSubject<BsonDocument>();
  225. Assert(subject.Max("a", 1), "{$max: {a: 1}}");
  226. }
  227. [Fact]
  228. public void Max_Typed()
  229. {
  230. var subject = CreateSubject<Person>();
  231. Assert(subject.Max(x => x.Age, 1), "{$max: {age: 1}}");
  232. Assert(subject.Max("Age", 1), "{$max: {age: 1}}");
  233. }
  234. [Fact]
  235. public void Min()
  236. {
  237. var subject = CreateSubject<BsonDocument>();
  238. Assert(subject.Min("a", 1), "{$min: {a: 1}}");
  239. }
  240. [Fact]
  241. public void Min_Typed()
  242. {
  243. var subject = CreateSubject<Person>();
  244. Assert(subject.Min(x => x.Age, 1), "{$min: {age: 1}}");
  245. Assert(subject.Min("Age", 1), "{$min: {age: 1}}");
  246. }
  247. [Fact]
  248. public void Mul()
  249. {
  250. var subject = CreateSubject<BsonDocument>();
  251. Assert(subject.Mul("a", 2), "{$mul: {a: 2}}");
  252. }
  253. [Fact]
  254. public void Mul_Typed()
  255. {
  256. var subject = CreateSubject<Person>();
  257. Assert(subject.Mul(x => x.Age, 2), "{$mul: {age: 2}}");
  258. Assert(subject.Mul("Age", 2), "{$mul: {age: 2}}");
  259. }
  260. [Fact]
  261. public void Pipeline()
  262. {
  263. var subject = CreateSubject<BsonDocument>();
  264. var pipeline = new EmptyPipelineDefinition<BsonDocument>()
  265. .AppendStage<BsonDocument, BsonDocument, BsonDocument>("{ $addFields : { x : 2 } }");
  266. Assert(subject.Pipeline(pipeline), new[] { "{ \"$addFields\" : { \"x\" : 2 } }" });
  267. }
  268. [Fact]
  269. public void PopFirst()
  270. {
  271. var subject = CreateSubject<BsonDocument>();
  272. Assert(subject.PopFirst("a"), "{$pop: {a: -1}}");
  273. }
  274. [Fact]
  275. public void PopFirst_Typed()
  276. {
  277. var subject = CreateSubject<Person>();
  278. Assert(subject.PopFirst(x => x.FavoriteColors), "{$pop: {colors: -1}}");
  279. Assert(subject.PopFirst("FavoriteColors"), "{$pop: {colors: -1}}");
  280. }
  281. [Fact]
  282. public void PopLast()
  283. {
  284. var subject = CreateSubject<BsonDocument>();
  285. Assert(subject.PopLast("a"), "{$pop: {a: 1}}");
  286. }
  287. [Fact]
  288. public void PopLast_Typed()
  289. {
  290. var subject = CreateSubject<Person>();
  291. Assert(subject.PopLast(x => x.FavoriteColors), "{$pop: {colors: 1}}");
  292. Assert(subject.PopLast("FavoriteColors"), "{$pop: {colors: 1}}");
  293. }
  294. [Fact]
  295. public void Pull()
  296. {
  297. var subject = CreateSubject<BsonDocument>();
  298. Assert(subject.Pull("a", 1), "{$pull: {a: 1}}");
  299. Assert(subject.Pull("a", new[] { 1, 2 }), "{$pull: {a: [1, 2]}}");
  300. }
  301. [Fact]
  302. public void Pull_Typed()
  303. {
  304. var subject = CreateSubject<Person>();
  305. Assert(subject.Pull(x => x.FavoriteColors, "green"), "{$pull: {colors: 'green'}}");
  306. Assert(subject.Pull("FavoriteColors", "green"), "{$pull: {colors: 'green'}}");
  307. }
  308. [Fact]
  309. public void PullAll()
  310. {
  311. var subject = CreateSubject<BsonDocument>();
  312. Assert(subject.PullAll("a", new[] { 1, 2 }), "{$pullAll: {a: [1, 2]}}");
  313. Assert(subject.PullAll("a", new[] { new[] { 1, 2 }, new[] { 3, 4 } }), "{$pullAll: {a: [[1, 2], [3, 4]]}}");
  314. }
  315. [Fact]
  316. public void PullAll_Typed()
  317. {
  318. var subject = CreateSubject<Person>();
  319. Assert(subject.PullAll(x => x.FavoriteColors, new[] { "green", "violet" }), "{$pullAll: {colors: ['green', 'violet']}}");
  320. Assert(subject.PullAll("FavoriteColors", new[] { "green", "violet" }), "{$pullAll: {colors: ['green', 'violet']}}");
  321. }
  322. [Fact]
  323. public void PullFilter()
  324. {
  325. var subject = CreateSubject<BsonDocument>();
  326. Assert(subject.PullFilter<BsonDocument>("a", "{b: {$gt: 1}}"), "{$pull: {a: {b: {$gt: 1}}}}");
  327. }
  328. [Fact]
  329. public void PullFilter_Typed()
  330. {
  331. var subject = CreateSubject<Person>();
  332. Assert(subject.PullFilter(x => x.Pets, x => x.Name == "Fluffy"), "{$pull: {pets: {name: 'Fluffy'}}}");
  333. Assert(subject.PullFilter<Pet>("Pets", "{ Name: 'Fluffy'}"), "{$pull: {pets: {Name: 'Fluffy'}}}");
  334. }
  335. [Fact]
  336. public void Push()
  337. {
  338. var subject = CreateSubject<BsonDocument>();
  339. Assert(subject.Push("a", 1), "{$push: {a: 1}}");
  340. Assert(subject.Push("a", new[] { 1, 2 }), "{$push: {a: [1, 2]}}");
  341. }
  342. [Fact]
  343. public void Push_Typed()
  344. {
  345. var subject = CreateSubject<Person>();
  346. Assert(subject.Push(x => x.FavoriteColors, "green"), "{$push: {colors: 'green'}}");
  347. Assert(subject.Push("FavoriteColors", "green"), "{$push: {colors: 'green'}}");
  348. }
  349. [Theory]
  350. [ParameterAttributeData]
  351. public void PushEach(
  352. [Values(null, 10)] int? slice,
  353. [Values(null, 20)] int? position,
  354. [Values(null, "{b: 1}")] string sort)
  355. {
  356. var subject = CreateSubject<BsonDocument>();
  357. var expectedPushValue = BsonDocument.Parse("{$each: [1, 2]}");
  358. if (slice.HasValue)
  359. {
  360. expectedPushValue.Add("$slice", slice.Value);
  361. }
  362. if (position.HasValue)
  363. {
  364. expectedPushValue.Add("$position", position.Value);
  365. }
  366. if (sort != null)
  367. {
  368. expectedPushValue.Add("$sort", BsonDocument.Parse(sort));
  369. }
  370. var expectedPush = new BsonDocument("$push", new BsonDocument("a", expectedPushValue));
  371. Assert(subject.PushEach("a", new[] { 1, 2 }, slice, position, sort), expectedPush);
  372. }
  373. [Theory]
  374. [ParameterAttributeData]
  375. public void PushEach_Typed(
  376. [Values(null, 10)] int? slice,
  377. [Values(null, 20)] int? position,
  378. [Values(null, "{b: 1}")] string sort)
  379. {
  380. var subject = CreateSubject<Person>();
  381. var expectedPushValue = BsonDocument.Parse("{$each: ['green', 'violet']}");
  382. if (slice.HasValue)
  383. {
  384. expectedPushValue.Add("$slice", slice.Value);
  385. }
  386. if (position.HasValue)
  387. {
  388. expectedPushValue.Add("$position", position.Value);
  389. }
  390. if (sort != null)
  391. {
  392. expectedPushValue.Add("$sort", BsonDocument.Parse(sort));
  393. }
  394. var expectedPush = new BsonDocument("$push", new BsonDocument("colors", expectedPushValue));
  395. Assert(subject.PushEach(x => x.FavoriteColors, new[] { "green", "violet" }, slice, position, sort), expectedPush);
  396. }
  397. [Fact]
  398. public void Rename()
  399. {
  400. var subject = CreateSubject<BsonDocument>();
  401. Assert(subject.Rename("a", "b"), "{$rename: {a: 'b'}}");
  402. }
  403. [Fact]
  404. public void Rename_Typed()
  405. {
  406. var subject = CreateSubject<Person>();
  407. Assert(subject.Rename(x => x.Age, "birthDate"), "{$rename: {age: 'birthDate'}}");
  408. Assert(subject.Rename("Age", "birthDate"), "{$rename: {age: 'birthDate'}}");
  409. }
  410. [Fact]
  411. public void Set()
  412. {
  413. var subject = CreateSubject<BsonDocument>();
  414. Assert(subject.Set("a", 1), "{$set: {a: 1}}");
  415. }
  416. [Fact]
  417. public void Set_field_type_D_Set_type_D_value_type_D()
  418. {
  419. var subject = CreateSubject<C>();
  420. var value = new D { X = "X" };
  421. var update = subject.Set<D>("D", value);
  422. Assert(update, "{ $set : { D : { X : \"X\" } } }");
  423. }
  424. [Fact]
  425. public void Set_field_type_D_Set_type_D_value_type_E()
  426. {
  427. var subject = CreateSubject<C>();
  428. var value = new E { X = "X", Y = "Y" };
  429. var update = subject.Set<D>("D", value);
  430. Assert(update, "{ $set : { D : { _t : \"E\", X : \"X\", Y : \"Y\" } } }");
  431. }
  432. [Fact]
  433. public void Set_field_type_D_Set_type_object_value_type_D()
  434. {
  435. var subject = CreateSubject<C>();
  436. var value = new D { X = "X" };
  437. var update = subject.Set<object>("D", value);
  438. Assert(update, "{ $set : { D : { X : \"X\" } } }");
  439. }
  440. [Fact]
  441. public void Set_field_type_D_Set_type_object_value_type_E()
  442. {
  443. var subject = CreateSubject<C>();
  444. var value = new E { X = "X", Y = "Y" };
  445. var update = subject.Set<object>("D", value);
  446. Assert(update, "{ $set : { D : { _t : \"E\", X : \"X\", Y : \"Y\" } } }");
  447. }
  448. [Fact]
  449. public void Set_field_type_D_Set_type_object_value_type_F()
  450. {
  451. var subject = CreateSubject<C>();
  452. var value = new F { Z = "Z" };
  453. var update = subject.Set<object>("D", value);
  454. Assert(update, "{ $set : { D : { _t : \"F\", Z : \"Z\" } } }");
  455. }
  456. [Fact]
  457. public void Set_Typed()
  458. {
  459. var subject = CreateSubject<Person>();
  460. Assert(subject.Set(x => x.Age, 1), "{$set: {age: 1}}");
  461. Assert(subject.Set("Age", 1), "{$set: {age: 1}}");
  462. }
  463. [Fact]
  464. public void Set_Typed_with_cast()
  465. {
  466. var subject = CreateSubject<Message>();
  467. Assert(subject.Set(x => ((SmsMessage)x).PhoneNumber, "1234567890"), "{$set: {pn: '1234567890'}}");
  468. var subject2 = CreateSubject<Person>();
  469. Assert(subject2.Set(x => ((SmsMessage)x.Message).PhoneNumber, "1234567890"), "{$set: {'m.pn': '1234567890'}}");
  470. }
  471. [Fact]
  472. public void Set_Typed_with_type_as()
  473. {
  474. var subject = CreateSubject<Message>();
  475. Assert(subject.Set(x => (x as SmsMessage).PhoneNumber, "1234567890"), "{$set: {pn: '1234567890'}}");
  476. var subject2 = CreateSubject<Person>();
  477. Assert(subject2.Set(x => (x.Message as SmsMessage).PhoneNumber, "1234567890"), "{$set: {'m.pn': '1234567890'}}");
  478. }
  479. [Fact]
  480. public void SetOnInsert()
  481. {
  482. var subject = CreateSubject<BsonDocument>();
  483. Assert(subject.SetOnInsert("a", 1), "{$setOnInsert: {a: 1}}");
  484. }
  485. [Fact]
  486. public void SetOnInsert_Typed()
  487. {
  488. var subject = CreateSubject<Person>();
  489. Assert(subject.SetOnInsert(x => x.Age, 1), "{$setOnInsert: {age: 1}}");
  490. Assert(subject.SetOnInsert("Age", 1), "{$setOnInsert: {age: 1}}");
  491. }
  492. [Fact]
  493. public void Unset()
  494. {
  495. var subject = CreateSubject<BsonDocument>();
  496. Assert(subject.Unset("a"), "{$unset: {a: 1}}");
  497. }
  498. [Fact]
  499. public void Unset_Typed()
  500. {
  501. var subject = CreateSubject<Person>();
  502. Assert(subject.Unset(x => x.Age), "{$unset: {age: 1}}");
  503. Assert(subject.Unset("Age"), "{$unset: {age: 1}}");
  504. }
  505. private void Assert<TDocument>(UpdateDefinition<TDocument> update, BsonDocument expected)
  506. {
  507. var renderedUpdate = Render(update).AsBsonDocument;
  508. renderedUpdate.Should().Be(expected);
  509. }
  510. private void Assert<TDocument>(UpdateDefinition<TDocument> update, string[] expectedArrayItems)
  511. {
  512. var renderedUpdate = Render(update).AsBsonArray;
  513. var bsonArray = new BsonArray(expectedArrayItems.Select(BsonDocument.Parse));
  514. renderedUpdate.Should().Be(bsonArray);
  515. }
  516. private void Assert<TDocument>(UpdateDefinition<TDocument> update, string expected)
  517. {
  518. Assert(update, BsonDocument.Parse(expected));
  519. }
  520. private void AssertThrow<TDocument, TException>(UpdateDefinition<TDocument> update, string errorMessage) where TException : Exception
  521. {
  522. var exception = Record.Exception(() => { Render(update); });
  523. exception.Should().BeOfType<TException>();
  524. exception.Message.Should().Be(errorMessage);
  525. }
  526. private UpdateDefinitionBuilder<TDocument> CreateSubject<TDocument>()
  527. {
  528. return new UpdateDefinitionBuilder<TDocument>();
  529. }
  530. private BsonValue Render<TDocument>(UpdateDefinition<TDocument> update)
  531. {
  532. var documentSerializer = BsonSerializer.SerializerRegistry.GetSerializer<TDocument>();
  533. return update.Render(documentSerializer, BsonSerializer.SerializerRegistry);
  534. }
  535. private class Person
  536. {
  537. [BsonElement("fn")]
  538. public string FirstName { get; set; }
  539. [BsonElement("colors")]
  540. public string[] FavoriteColors { get; set; }
  541. [BsonElement("age")]
  542. public int Age { get; set; }
  543. [BsonElement("last_updated")]
  544. public DateTime LastUpdated { get; set; }
  545. [BsonElement("pets")]
  546. public List<Pet> Pets { get; set; }
  547. [BsonElement("m")]
  548. public Message Message { get; set; }
  549. }
  550. private class Pet
  551. {
  552. [BsonElement("name")]
  553. public string Name { get; set; }
  554. }
  555. private abstract class Message
  556. {
  557. }
  558. private class SmsMessage : Message
  559. {
  560. [BsonElement("pn")]
  561. public string PhoneNumber { get; set; }
  562. }
  563. public class C
  564. {
  565. public int Id { get; set; }
  566. public D D { get; set; }
  567. }
  568. public class D
  569. {
  570. public string X { get; set; }
  571. }
  572. public class E : D
  573. {
  574. public string Y { get; set; }
  575. }
  576. public class F
  577. {
  578. public string Z { get; set; }
  579. }
  580. }
  581. }