/Xtensive.Core/Xtensive.Core.Tests/ObjectMapping/MapperHandlingStructureTests.cs

https://code.google.com/p/dataobjectsdotnet/ · C# · 200 lines · 186 code · 9 blank · 5 comment · 0 complexity · aedc82dc111a42834fd987572c855011 MD5 · raw file

  1. // Copyright (C) 2010 Xtensive LLC.
  2. // All rights reserved.
  3. // For conditions of distribution and use, see license.
  4. // Created by: Alexander Nikolaev
  5. // Created: 2010.01.13
  6. using System;
  7. using System.Linq;
  8. using NUnit.Framework;
  9. using Xtensive.Core.ObjectMapping;
  10. using Xtensive.Core.Testing;
  11. using Xtensive.Core.Tests.ObjectMapping.SourceModel;
  12. using Xtensive.Core.Tests.ObjectMapping.TargetModel;
  13. namespace Xtensive.Core.Tests.ObjectMapping
  14. {
  15. [TestFixture]
  16. public sealed class MapperHandlingStructureTests : MapperTestBase
  17. {
  18. [Test]
  19. public void StructureTransformationTest()
  20. {
  21. var mapper = GetStructureContainerMapper();
  22. var source = GetSourceStructureContainer();
  23. var target = (StructureContainerDto) mapper.Transform(source);
  24. Assert.AreEqual(source.Id, target.Id);
  25. Assert.AreEqual(source.AuxString, target.AuxString);
  26. Assert.AreEqual(source.Structure.String, target.Structure.String);
  27. Assert.AreEqual(source.Structure.Int, target.Structure.Int);
  28. Assert.AreEqual(source.Structure.DateTime, target.Structure.DateTime);
  29. Assert.AreEqual(source.CompositeStructure.AuxInt, target.CompositeStructure.AuxInt);
  30. Assert.AreEqual((int) source.CompositeStructure.Structure.AuxDouble,
  31. target.CompositeStructure.Structure.AuxInt);
  32. Assert.AreEqual(source.CompositeStructure.Structure.Structure.AuxInt,
  33. target.CompositeStructure.Structure.Structure.AuxInt);
  34. Assert.AreEqual(source.CompositeStructure.Structure.Structure.StructureContainer.Id,
  35. target.CompositeStructure.Structure.Structure.StructureContainer.Id);
  36. Assert.AreEqual(source.CompositeStructure.Structure.Structure.StructureContainer.Structure.DateTime,
  37. target.CompositeStructure.Structure.Structure.StructureContainer.Structure.DateTime);
  38. Assert.AreEqual(source.CompositeStructure.Structure.Structure.StructureContainer.Structure.Int,
  39. target.CompositeStructure.Structure.Structure.StructureContainer.Structure.Int);
  40. Assert.AreEqual(source.CompositeStructure.Structure.Structure.StructureContainer.Structure.String,
  41. target.CompositeStructure.Structure.Structure.StructureContainer.Structure.String);
  42. }
  43. [Test]
  44. public void StructureComparisonTest()
  45. {
  46. var mapper = GetStructureContainerMapper();
  47. var source = GetSourceStructureContainer();
  48. var original = (StructureContainerDto) mapper.Transform(source);
  49. var modified = Clone(original);
  50. var newStructureString = modified.Structure.String + "M";
  51. modified.Structure = new StructureDto {
  52. DateTime = modified.Structure.DateTime, Int = modified.Structure.Int,
  53. String = newStructureString
  54. };
  55. var newCompositeStructureStructureStructure = new CompositeStructure2Dto {
  56. AuxInt = 11, StructureContainer = modified.CompositeStructure.Structure.Structure.StructureContainer
  57. };
  58. newCompositeStructureStructureStructure.StructureContainer.AuxString += "A";
  59. var newCompositeStructureStructure = new CompositeStructure1Dto {
  60. AuxInt = modified.CompositeStructure.Structure.AuxInt,
  61. Structure = newCompositeStructureStructureStructure
  62. };
  63. var newCompositeStructure = new CompositeStructure0Dto {
  64. AuxInt = modified.CompositeStructure.AuxInt, Structure = newCompositeStructureStructure
  65. };
  66. modified.CompositeStructure = newCompositeStructure;
  67. var operations = ((DefaultOperationLog) mapper.Compare(original, modified).Operations).ToList();
  68. Assert.AreEqual(3, operations.Count);
  69. ValidatePropertyOperation<StructureContainerDto>(original, operations[0], sc => sc.Structure.String,
  70. newStructureString, OperationType.SetProperty);
  71. ValidatePropertyOperation<StructureContainerDto>(original, operations[1],
  72. sc => sc.CompositeStructure.Structure.Structure.AuxInt, newCompositeStructureStructureStructure.AuxInt,
  73. OperationType.SetProperty);
  74. ValidatePropertyOperation<StructureContainerDto>(
  75. original.CompositeStructure.Structure.Structure.StructureContainer, operations[2], sc => sc.AuxString,
  76. modified.CompositeStructure.Structure.Structure.StructureContainer.AuxString,
  77. OperationType.SetProperty);
  78. }
  79. [Test]
  80. public void ModifyReferencePropertyOfStructureTest()
  81. {
  82. var mapper = GetStructureContainerMapper();
  83. var source = GetSourceStructureContainer();
  84. var original = (StructureContainerDto) mapper.Transform(source);
  85. var modified = Clone(original);
  86. var newStructureContainer = new StructureContainerDto {AuxString = "NEW",
  87. CompositeStructure = new CompositeStructure0Dto {AuxInt = 999}};
  88. var newCs2 = new CompositeStructure2Dto {
  89. AuxInt = modified.CompositeStructure.Structure.Structure.AuxInt,
  90. StructureContainer = newStructureContainer
  91. };
  92. var newCs1 = new CompositeStructure1Dto
  93. {
  94. AuxInt = modified.CompositeStructure.Structure.AuxInt,
  95. Structure = newCs2
  96. };
  97. modified.CompositeStructure = new CompositeStructure0Dto {
  98. AuxInt = modified.CompositeStructure.AuxInt,
  99. Structure = newCs1
  100. };
  101. var operations = ((DefaultOperationLog) mapper.Compare(original, modified).Operations).ToList();
  102. Assert.AreEqual(8, operations.Count);
  103. ValidateObjectCreation(newStructureContainer, operations[0]);
  104. ValidatePropertyOperation<StructureContainerDto>(
  105. newStructureContainer,
  106. operations[1], sc => sc.AuxString, newStructureContainer.AuxString, OperationType.SetProperty);
  107. ValidatePropertyOperation<StructureContainerDto>(
  108. newStructureContainer,
  109. operations[2], sc => sc.Structure.Int, default (int), OperationType.SetProperty);
  110. ValidatePropertyOperation<StructureContainerDto>(
  111. newStructureContainer,
  112. operations[3], sc => sc.Structure.String, default (string), OperationType.SetProperty);
  113. ValidatePropertyOperation<StructureContainerDto>(
  114. newStructureContainer,
  115. operations[4], sc => sc.Structure.DateTime, default (DateTime), OperationType.SetProperty);
  116. ValidatePropertyOperation<StructureContainerDto>(
  117. newStructureContainer,
  118. operations[5], sc => sc.CompositeStructure.AuxInt, newStructureContainer.CompositeStructure.AuxInt,
  119. OperationType.SetProperty);
  120. ValidatePropertyOperation<StructureContainerDto>(
  121. original,
  122. operations[6], sc => sc.CompositeStructure.Structure.Structure.StructureContainer,
  123. newStructureContainer, OperationType.SetProperty);
  124. ValidateObjectRemoval(original.CompositeStructure.Structure.Structure.StructureContainer, operations[7]);
  125. }
  126. [Test]
  127. public void LimitDepthOfGraphContainingStructureTest()
  128. {
  129. var mapper = GetStructureContainerMapper(2, GraphTruncationType.Throw);
  130. var source = GetSourceStructureContainer();
  131. AssertEx.ThrowsInvalidOperationException(() => mapper.Transform(source));
  132. mapper = GetStructureContainerMapper(5, GraphTruncationType.Throw);
  133. mapper.Transform(source);
  134. mapper = GetStructureContainerMapper(2, GraphTruncationType.SetDefaultValue);
  135. var target = (StructureContainerDto) mapper.Transform(source);
  136. Assert.AreEqual(source.Structure.DateTime, target.Structure.DateTime);
  137. Assert.AreEqual(default (CompositeStructure2Dto), target.CompositeStructure.Structure.Structure);
  138. mapper = GetStructureContainerMapper(1, GraphTruncationType.SetDefaultValue);
  139. target = (StructureContainerDto) mapper.Transform(source);
  140. Assert.AreEqual(source.Structure.DateTime, target.Structure.DateTime);
  141. Assert.AreEqual(default (CompositeStructure1Dto), target.CompositeStructure.Structure);
  142. mapper = GetStructureContainerMapper(3, GraphTruncationType.SetDefaultValue);
  143. target = (StructureContainerDto) mapper.Transform(source);
  144. Assert.AreEqual(source.CompositeStructure.Structure.Structure.AuxInt,
  145. target.CompositeStructure.Structure.Structure.AuxInt);
  146. Assert.IsNull(target.CompositeStructure.Structure.Structure.StructureContainer);
  147. }
  148. [Test]
  149. public void TransformationOfStructureFieldHavingConverterTest()
  150. {
  151. var mapper = GetStructureContainerMapperWithStructureConverter();
  152. var source = GetSourceStructureContainer();
  153. var target = (StructureContainerDto) mapper.Transform(source);
  154. Assert.AreEqual(source.CompositeStructure.Structure.Structure.AuxInt,
  155. target.CompositeStructure.Structure.Structure.AuxInt);
  156. Assert.IsNull(target.CompositeStructure.Structure.Structure.StructureContainer);
  157. Assert.AreEqual(source.CompositeStructure.Structure.Structure.AuxInt,
  158. target.CompositeStructure.Structure.Structure.AuxInt);
  159. }
  160. [Test]
  161. public void LimitDepthOfGraphContainingStructureWithConverterTest()
  162. {
  163. var mapper = GetStructureContainerMapperWithStructureConverter(2, GraphTruncationType.Throw);
  164. var source = GetSourceStructureContainer();
  165. AssertEx.ThrowsInvalidOperationException(() => mapper.Transform(source));
  166. mapper = GetStructureContainerMapperWithStructureConverter(2, GraphTruncationType.SetDefaultValue);
  167. var target = (StructureContainerDto) mapper.Transform(source);
  168. Assert.AreEqual(default (CompositeStructure2Dto), target.CompositeStructure.Structure.Structure);
  169. }
  170. private static DefaultMapper GetStructureContainerMapperWithStructureConverter(int? graphDepthLimit,
  171. GraphTruncationType truncationType)
  172. {
  173. var settings = new MapperSettings {
  174. GraphDepthLimit = graphDepthLimit, GraphTruncationType = truncationType
  175. };
  176. var mapping = new MappingBuilder()
  177. .MapStructure<Structure, StructureDto>()
  178. .MapType<StructureContainer, StructureContainerDto, Guid>(s => s.Id, s => s.Id)
  179. .MapStructure<CompositeStructure0, CompositeStructure0Dto>()
  180. .MapStructure<CompositeStructure1, CompositeStructure1Dto>()
  181. .MapProperty(c => (int) c.AuxDouble, c => c.AuxInt)
  182. .MapProperty(c => new CompositeStructure2Dto {AuxInt = c.Structure.AuxInt}, c => c.Structure)
  183. .MapStructure<CompositeStructure2, CompositeStructure2Dto>().Build();
  184. return new DefaultMapper(mapping, settings);
  185. }
  186. private static DefaultMapper GetStructureContainerMapperWithStructureConverter()
  187. {
  188. return GetStructureContainerMapperWithStructureConverter(null, GraphTruncationType.Default);
  189. }
  190. }
  191. }