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

/Raven.Tests/Bugs/DocumentToJsonAndBackTest.cs

http://github.com/ravendb/ravendb
C# | 119 lines | 97 code | 17 blank | 5 comment | 2 complexity | b3a5c75c78337c50b09cad391b4a5f90 MD5 | raw file
Possible License(s): GPL-3.0, LGPL-2.1, MPL-2.0-no-copyleft-exception, Apache-2.0, BSD-3-Clause
  1. //-----------------------------------------------------------------------
  2. // <copyright file="DocumentToJsonAndBackTest.cs" company="Hibernating Rhinos LTD">
  3. // Copyright (c) Hibernating Rhinos LTD. All rights reserved.
  4. // </copyright>
  5. //-----------------------------------------------------------------------
  6. using System.Collections;
  7. using System.Collections.Generic;
  8. using System.Linq;
  9. using Raven.Abstractions.Linq;
  10. using Raven.Json.Linq;
  11. using Raven.Client.Document;
  12. using Raven.Client.Indexes;
  13. using Raven.Database.Linq;
  14. using Raven.Tests.Common;
  15. using Xunit;
  16. namespace Raven.Tests.Bugs
  17. {
  18. public class DocumentToJsonAndBackTest : NoDisposalNeeded
  19. {
  20. private readonly Page page;
  21. public DocumentToJsonAndBackTest()
  22. {
  23. page = new Page();
  24. page.CoAuthors.Add(new User {UserId = 1});
  25. page.CoAuthors.Add(new User {UserId = 2});
  26. }
  27. [Fact]
  28. public void ListOnDynamicJsonObjectFromJsonWillFailToBeAJsonList()
  29. {
  30. var conventions = new DocumentConvention();
  31. var jObject = RavenJObject.FromObject(page, conventions.CreateSerializer());
  32. dynamic dynamicObject = new DynamicJsonObject(jObject);
  33. Assert.NotNull(dynamicObject.CoAuthors as IEnumerable);
  34. Assert.NotNull(dynamicObject.CoAuthors.Length);
  35. Assert.Equal(2, dynamicObject.CoAuthors.Length);
  36. }
  37. [Fact]
  38. public void ListOnDynamicJsonObjectFromJsonIsAnArray()
  39. {
  40. var conventions = new DocumentConvention();
  41. var jObject = RavenJObject.FromObject(page, conventions.CreateSerializer());
  42. dynamic dynamicObject = new DynamicJsonObject(jObject);
  43. Assert.NotNull(dynamicObject.CoAuthors as IEnumerable);
  44. Assert.NotNull(dynamicObject.CoAuthors.Length);
  45. Assert.Equal(2, dynamicObject.CoAuthors.Length);
  46. }
  47. [Fact]
  48. public void LinqQueryWithStaticCallOnEnumerableIsTranslatedToExtensionMethod()
  49. {
  50. var indexDefinition = new IndexDefinitionBuilder<Page>
  51. {
  52. Map = pages => from p in pages
  53. from coAuthor in p.CoAuthors.DefaultIfEmpty()
  54. select new
  55. {
  56. p.Id,
  57. CoAuthorUserID = coAuthor != null ? coAuthor.UserId : -1
  58. }
  59. }.ToIndexDefinition(new DocumentConvention());
  60. Assert.Contains("p.CoAuthors.DefaultIfEmpty()", indexDefinition.Map);
  61. }
  62. [Fact]
  63. public void LinqQueryWithStaticCallOnEnumerableIsCanBeCompiledAndRun()
  64. {
  65. var indexDefinition = new IndexDefinitionBuilder<Page>
  66. {
  67. Map = pages => from p in pages
  68. from coAuthor in p.CoAuthors.DefaultIfEmpty()
  69. select new
  70. {
  71. p.Id,
  72. CoAuthorUserID = coAuthor != null ? coAuthor.UserId : -1
  73. }
  74. }.ToIndexDefinition(new DocumentConvention());
  75. var mapInstance = new DynamicViewCompiler("testView",
  76. indexDefinition, ".").
  77. GenerateInstance();
  78. var conventions = new DocumentConvention();
  79. var o = RavenJObject.FromObject(page,conventions.CreateSerializer());
  80. o["@metadata"] = new RavenJObject {{"Raven-Entity-Name", "Pages"}, {"@id", "0"}};
  81. dynamic dynamicObject = new DynamicJsonObject(o);
  82. var result = mapInstance.MapDefinitions[0](new[] { dynamicObject }).ToList<object>();
  83. Assert.Equal("{ Id = 0, CoAuthorUserID = 1, __document_id = 0 }", result[0].ToString());
  84. Assert.Equal("{ Id = 0, CoAuthorUserID = 2, __document_id = 0 }", result[1].ToString());
  85. }
  86. private class Page
  87. {
  88. public readonly IList<User> CoAuthors;
  89. #pragma warning disable 0649
  90. public int Id;
  91. #pragma warning restore 0649
  92. public Page()
  93. {
  94. CoAuthors = new List<User>();
  95. }
  96. }
  97. private class User
  98. {
  99. public int UserId;
  100. }
  101. }
  102. }