/src/FubuCore.Testing/StringifierTester.cs

https://github.com/schotime/fubumvc · C# · 305 lines · 222 code · 75 blank · 8 comment · 3 complexity · 31d81541a9a8aa58175937434ee31e9d MD5 · raw file

  1. using System;
  2. using FubuCore.Reflection;
  3. using System.Reflection;
  4. using FubuMVC.StructureMap;
  5. using NUnit.Framework;
  6. using StructureMap;
  7. namespace FubuCore.Testing
  8. {
  9. [TestFixture]
  10. public class StringifierTester
  11. {
  12. [SetUp]
  13. public void SetUp()
  14. {
  15. stringifier = new Stringifier();
  16. container = new Container();
  17. locator = new StructureMapServiceLocator(container);
  18. }
  19. private Stringifier stringifier;
  20. private StructureMapServiceLocator locator;
  21. private Container container;
  22. public interface Something
  23. {
  24. string Description { get; }
  25. }
  26. public class RedSomething : Something
  27. {
  28. public string Description { get { return "Red"; } }
  29. }
  30. public class BlueSomething : Something
  31. {
  32. public string Description { get { return "Blue"; } }
  33. }
  34. public class FakeSite
  35. {
  36. public Address Shipping { get; set; }
  37. public Address Billing { get; set; }
  38. }
  39. [Test]
  40. public void get_date_value_out_of_the_box()
  41. {
  42. DateTime date = DateTime.Today;
  43. stringifier.GetString(date).ShouldEqual(date.ToString());
  44. }
  45. [Test]
  46. public void get_int_values_out_of_the_box()
  47. {
  48. stringifier.GetString(123).ShouldEqual(123);
  49. }
  50. [Test]
  51. public void get_string_values_out_of_the_box()
  52. {
  53. stringifier.GetString(null).ShouldBeEmpty();
  54. stringifier.GetString("a").ShouldEqual("a");
  55. }
  56. private void configure(Action<DisplayConversionRegistry> configure)
  57. {
  58. var registry = new DisplayConversionRegistry();
  59. configure(registry);
  60. registry.Configure(stringifier);
  61. }
  62. [Test]
  63. public void register_a_string_conversion_for_a_class()
  64. {
  65. configure(x => x.IfIsType<Address>().ConvertBy(a => "{0}, {1}".ToFormat(a.Address1, a.City)));
  66. var address = new Address
  67. {
  68. Address1 = "2050 Ozark",
  69. City = "Joplin"
  70. };
  71. stringifier.GetString(address).ShouldEqual("2050 Ozark, Joplin");
  72. }
  73. [Test]
  74. public void register_a_property_override_for_a_string_conversion()
  75. {
  76. configure(x =>
  77. {
  78. //specific override formatting for Address objects named Shipping
  79. x.IfPropertyMatches<Address>(prop => prop.Name == "Shipping").ConvertBy(a => "{1}-{0}".ToFormat(a.Address1, a.City));
  80. //default formatting for Address objects
  81. x.IfIsType<Address>().ConvertBy(a => "{0}, {1}".ToFormat(a.Address1, a.City));
  82. });
  83. var address = new Address
  84. {
  85. Address1 = "2050 Ozark",
  86. City = "Joplin"
  87. };
  88. var site = new FakeSite {Billing = address, Shipping = address};
  89. const string expectedDefaultFormatting = "2050 Ozark, Joplin";
  90. const string expectedOverrideFormatting = "Joplin-2050 Ozark";
  91. var billingRequest = new GetStringRequest(ReflectionHelper.GetAccessor<FakeSite>(s => s.Billing), address, locator);
  92. var shippingRequest = new GetStringRequest(ReflectionHelper.GetAccessor<FakeSite>(s => s.Shipping), address, locator);
  93. stringifier.GetString(billingRequest).ShouldEqual(expectedDefaultFormatting);
  94. stringifier.GetString(shippingRequest).ShouldEqual(expectedOverrideFormatting);
  95. }
  96. [Test]
  97. public void register_a_property_override_for_a_string_conversion_passing_property_info()
  98. {
  99. PropertyInfo passedProperty = null;
  100. configure(x =>
  101. {
  102. //specific override formatting for Address objects named Shipping
  103. x.IfPropertyMatches<Address>(prop => prop.Name == "Shipping")
  104. .ConvertBy((req, value) =>
  105. {
  106. passedProperty = req.Property;
  107. return "{1}-{0}".ToFormat(value.Address1, value.City);
  108. });
  109. //default formatting for Address objects
  110. x.IfIsType<Address>().ConvertBy(a => "{0}, {1}".ToFormat(a.Address1, a.City));
  111. });
  112. var address = new Address();
  113. var site = new FakeSite { Billing = address, Shipping = address };
  114. var shippingRequest = new GetStringRequest(ReflectionHelper.GetAccessor<FakeSite>(s => s.Shipping), address, locator);
  115. stringifier.GetString(shippingRequest);
  116. passedProperty.Name.ShouldEqual("Shipping");
  117. }
  118. [Test]
  119. public void register_a_property_override_for_a_string_conversion_passing_raw_value()
  120. {
  121. object passedRawValue = null;
  122. configure(x =>
  123. {
  124. //specific override formatting for Address objects named Shipping
  125. x.IfPropertyMatches<Address>(prop => prop.Name == "Shipping").ConvertBy((req, value) =>
  126. {
  127. passedRawValue = req.RawValue;
  128. return "{1}-{0}".ToFormat(value.Address1, value.City);
  129. });
  130. //default formatting for Address objects
  131. x.IfIsType<Address>().ConvertBy(a => "{0}, {1}".ToFormat(a.Address1, a.City));
  132. });
  133. var address = new Address();
  134. var site = new FakeSite { Billing = address, Shipping = address };
  135. var shippingRequest = new GetStringRequest(ReflectionHelper.GetAccessor<FakeSite>(s => s.Shipping), address, locator);
  136. stringifier.GetString(shippingRequest);
  137. passedRawValue.ShouldBeTheSameAs(address);
  138. }
  139. [Test]
  140. public void register_a_string_conversion_for_a_series_of_types()
  141. {
  142. configure(x => x.IfCanBeCastToType<Something>().ConvertBy(s => s.Description));
  143. stringifier.GetString(new RedSomething()).ShouldEqual("Red");
  144. stringifier.GetString(new BlueSomething()).ShouldEqual("Blue");
  145. }
  146. [Test]
  147. public void register_a_string_conversion_function_by_a_struct_type()
  148. {
  149. configure(x => x.IfIsType<DateTime>().ConvertBy(d => d.ToShortDateString()));
  150. DateTime date = DateTime.Today;
  151. stringifier.GetString(date).ShouldEqual(date.ToShortDateString());
  152. }
  153. [Test]
  154. public void string_conversion_functions_work_for_nullable_types()
  155. {
  156. configure(x => x.IfIsType<DateTime>().ConvertBy(d => d.ToShortDateString()));
  157. DateTime date = DateTime.Today;
  158. stringifier.GetString(date).ShouldEqual(date.ToShortDateString());
  159. }
  160. [Test]
  161. public void string_conversion_functions_work_for_nullable_types_that_are_null()
  162. {
  163. configure(x => x.IfIsType<DateTime>().ConvertBy(d => d.ToShortDateString()));
  164. stringifier.GetString(DateTime.Parse("17-JAN-2007")).ShouldEqual(DateTime.Parse("17-JAN-2007").ToShortDateString());
  165. }
  166. [Test]
  167. public void should_return_empty_when_no_converter_is_defined_for_type()
  168. {
  169. stringifier.GetString(null).ShouldEqual("");
  170. }
  171. [Test]
  172. public void should_return_empty_when_value_is_null()
  173. {
  174. configure(x => x.IfIsType<DateTime>().ConvertBy(d => d.ToShortDateString()));
  175. stringifier.GetString(null).ShouldEqual("");
  176. }
  177. [Test]
  178. public void stringifier_can_use_a_service_to_get_at_a_display()
  179. {
  180. container.Configure(x => x.For<IWidgetDisplayer>().Use<WidgetDisplayer>());
  181. configure(x =>
  182. {
  183. x.IfCanBeCastToType<Widget>().ConvertBy((r, w) => r.Get<IWidgetDisplayer>().ToDisplay(w));
  184. });
  185. var widget = new Widget
  186. {
  187. Color = "Red"
  188. };
  189. var request = new GetStringRequest(null, widget, locator);
  190. stringifier.GetString(request).ShouldEqual("A Red widget");
  191. }
  192. }
  193. public class Widget
  194. {
  195. public string Color { get; set; }
  196. }
  197. public interface IWidgetDisplayer
  198. {
  199. string ToDisplay(Widget widget);
  200. }
  201. public class WidgetDisplayer : IWidgetDisplayer
  202. {
  203. public string ToDisplay(Widget widget)
  204. {
  205. return "A {0} widget".ToFormat(widget.Color);
  206. }
  207. }
  208. public class Address
  209. {
  210. public Address()
  211. {
  212. StateOrProvince = string.Empty;
  213. Country = string.Empty;
  214. AddressType = string.Empty;
  215. }
  216. public int Order { get; set; }
  217. public bool IsActive { get; set; }
  218. public string AddressType { get; set; }
  219. public string Address1 { get; set; }
  220. public string Address2 { get; set; }
  221. public string City { get; set; }
  222. public string StateOrProvince { get; set; }
  223. public string Country { get; set; }
  224. public string PostalCode { get; set; }
  225. //[Required]
  226. //public TimeZoneInfo TimeZone { get; set; }
  227. public DateTime DateEntered { get; set; }
  228. public Guid Guid { get; set; }
  229. }
  230. }