PageRenderTime 61ms CodeModel.GetById 0ms RepoModel.GetById 0ms app.codeStats 1ms

/test/System.Web.Mvc.Test/Test/DataAnnotationsModelMetadataProviderTestBase.cs

https://bitbucket.org/mdavid/aspnetwebstack
C# | 614 lines | 396 code | 138 blank | 80 comment | 5 complexity | 62c65af87fea5bbd557f441ae527beb4 MD5 | raw file
  1. using System.Collections.Generic;
  2. using System.ComponentModel;
  3. using System.ComponentModel.DataAnnotations;
  4. using System.Linq;
  5. using Xunit;
  6. using Assert = Microsoft.TestCommon.AssertEx;
  7. namespace System.Web.Mvc.Test
  8. {
  9. public abstract class DataAnnotationsModelMetadataProviderTestBase
  10. {
  11. protected abstract AssociatedMetadataProvider MakeProvider();
  12. [Fact]
  13. public void GetMetadataForPropertiesSetTypesAndPropertyNames()
  14. {
  15. // Arrange
  16. var provider = MakeProvider();
  17. // Act
  18. IEnumerable<ModelMetadata> result = provider.GetMetadataForProperties("foo", typeof(string));
  19. // Assert
  20. Assert.True(result.Any(m => m.ModelType == typeof(int)
  21. && m.PropertyName == "Length"
  22. && (int)m.Model == 3));
  23. }
  24. [Fact]
  25. public void GetMetadataForPropertySetsTypeAndPropertyName()
  26. {
  27. // Arrange
  28. var provider = MakeProvider();
  29. // Act
  30. ModelMetadata result = provider.GetMetadataForProperty(null, typeof(string), "Length");
  31. // Assert
  32. Assert.Equal(typeof(int), result.ModelType);
  33. Assert.Equal("Length", result.PropertyName);
  34. }
  35. [Fact]
  36. public void GetMetadataForTypeSetsTypeWithNullPropertyName()
  37. {
  38. // Arrange
  39. var provider = MakeProvider();
  40. // Act
  41. ModelMetadata result = provider.GetMetadataForType(null, typeof(string));
  42. // Assert
  43. Assert.Equal(typeof(string), result.ModelType);
  44. Assert.Null(result.PropertyName);
  45. }
  46. // [HiddenInput] tests
  47. class HiddenModel
  48. {
  49. public int NoAttribute { get; set; }
  50. [HiddenInput]
  51. public int DefaultHidden { get; set; }
  52. [HiddenInput(DisplayValue = false)]
  53. public int HiddenWithDisplayValueFalse { get; set; }
  54. [HiddenInput]
  55. [UIHint("CustomUIHint")]
  56. public int HiddenAndUIHint { get; set; }
  57. }
  58. [Fact]
  59. public void HiddenAttributeSetsTemplateHintAndHideSurroundingHtml()
  60. {
  61. // Arrange
  62. var provider = MakeProvider();
  63. // Act & Assert
  64. ModelMetadata noAttributeMetadata = provider.GetMetadataForProperty(null, typeof(HiddenModel), "NoAttribute");
  65. Assert.Null(noAttributeMetadata.TemplateHint);
  66. Assert.False(noAttributeMetadata.HideSurroundingHtml);
  67. ModelMetadata defaultHiddenMetadata = provider.GetMetadataForProperty(null, typeof(HiddenModel), "DefaultHidden");
  68. Assert.Equal("HiddenInput", defaultHiddenMetadata.TemplateHint);
  69. Assert.False(defaultHiddenMetadata.HideSurroundingHtml);
  70. ModelMetadata hiddenWithDisplayValueFalseMetadata = provider.GetMetadataForProperty(null, typeof(HiddenModel), "HiddenWithDisplayValueFalse");
  71. Assert.Equal("HiddenInput", hiddenWithDisplayValueFalseMetadata.TemplateHint);
  72. Assert.True(hiddenWithDisplayValueFalseMetadata.HideSurroundingHtml);
  73. // [UIHint] overrides the template hint from [Hidden]
  74. Assert.Equal("CustomUIHint", provider.GetMetadataForProperty(null, typeof(HiddenModel), "HiddenAndUIHint").TemplateHint);
  75. }
  76. // [UIHint] tests
  77. class UIHintModel
  78. {
  79. public int NoAttribute { get; set; }
  80. [UIHint("MyCustomTemplate")]
  81. public int DefaultUIHint { get; set; }
  82. [UIHint("MyMvcTemplate", "MVC")]
  83. public int MvcUIHint { get; set; }
  84. [UIHint("MyWebFormsTemplate", "WebForms")]
  85. public int NoMvcUIHint { get; set; }
  86. [UIHint("MyDefaultTemplate")]
  87. [UIHint("MyWebFormsTemplate", "WebForms")]
  88. [UIHint("MyMvcTemplate", "MVC")]
  89. public int MultipleUIHint { get; set; }
  90. }
  91. [Fact]
  92. public void UIHintAttributeSetsTemplateHint()
  93. {
  94. // Arrange
  95. var provider = MakeProvider();
  96. // Act & Assert
  97. Assert.Null(provider.GetMetadataForProperty(null, typeof(UIHintModel), "NoAttribute").TemplateHint);
  98. Assert.Equal("MyCustomTemplate", provider.GetMetadataForProperty(null, typeof(UIHintModel), "DefaultUIHint").TemplateHint);
  99. Assert.Equal("MyMvcTemplate", provider.GetMetadataForProperty(null, typeof(UIHintModel), "MvcUIHint").TemplateHint);
  100. Assert.Null(provider.GetMetadataForProperty(null, typeof(UIHintModel), "NoMvcUIHint").TemplateHint);
  101. Assert.Equal("MyMvcTemplate", provider.GetMetadataForProperty(null, typeof(UIHintModel), "MultipleUIHint").TemplateHint);
  102. }
  103. // [DataType] tests
  104. class DataTypeModel
  105. {
  106. public int NoAttribute { get; set; }
  107. [DataType(DataType.EmailAddress)]
  108. public int EmailAddressProperty { get; set; }
  109. [DataType("CustomDataType")]
  110. public int CustomDataTypeProperty { get; set; }
  111. }
  112. [Fact]
  113. public void DataTypeAttributeSetsDataTypeName()
  114. {
  115. // Arrange
  116. var provider = MakeProvider();
  117. // Act & Assert
  118. Assert.Null(provider.GetMetadataForProperty(null, typeof(DataTypeModel), "NoAttribute").DataTypeName);
  119. Assert.Equal("EmailAddress", provider.GetMetadataForProperty(null, typeof(DataTypeModel), "EmailAddressProperty").DataTypeName);
  120. Assert.Equal("CustomDataType", provider.GetMetadataForProperty(null, typeof(DataTypeModel), "CustomDataTypeProperty").DataTypeName);
  121. }
  122. // [ReadOnly] & [Editable] tests
  123. class ReadOnlyModel
  124. {
  125. public int NoAttributes { get; set; }
  126. [ReadOnly(true)]
  127. public int ReadOnlyAttribute { get; set; }
  128. [Editable(false)]
  129. public int EditableAttribute { get; set; }
  130. [ReadOnly(true)]
  131. [Editable(true)]
  132. public int BothAttributes { get; set; }
  133. // Editable trumps ReadOnly
  134. }
  135. [Fact]
  136. public void ReadOnlyTests()
  137. {
  138. // Arrange
  139. var provider = MakeProvider();
  140. // Act & Assert
  141. Assert.False(provider.GetMetadataForProperty(null, typeof(ReadOnlyModel), "NoAttributes").IsReadOnly);
  142. Assert.True(provider.GetMetadataForProperty(null, typeof(ReadOnlyModel), "ReadOnlyAttribute").IsReadOnly);
  143. Assert.True(provider.GetMetadataForProperty(null, typeof(ReadOnlyModel), "EditableAttribute").IsReadOnly);
  144. Assert.False(provider.GetMetadataForProperty(null, typeof(ReadOnlyModel), "BothAttributes").IsReadOnly);
  145. }
  146. // [DisplayFormat] tests
  147. class DisplayFormatModel
  148. {
  149. public int NoAttribute { get; set; }
  150. [DisplayFormat(NullDisplayText = "(null value)")]
  151. public int NullDisplayText { get; set; }
  152. [DisplayFormat(DataFormatString = "Data {0} format")]
  153. public int DisplayFormatString { get; set; }
  154. [DisplayFormat(DataFormatString = "Data {0} format", ApplyFormatInEditMode = true)]
  155. public int DisplayAndEditFormatString { get; set; }
  156. [DisplayFormat(ConvertEmptyStringToNull = true)]
  157. public int ConvertEmptyStringToNullTrue { get; set; }
  158. [DisplayFormat(ConvertEmptyStringToNull = false)]
  159. public int ConvertEmptyStringToNullFalse { get; set; }
  160. [DataType(DataType.Currency)]
  161. public int DataTypeWithoutDisplayFormatOverride { get; set; }
  162. [DataType(DataType.Currency)]
  163. [DisplayFormat(DataFormatString = "format override")]
  164. public int DataTypeWithDisplayFormatOverride { get; set; }
  165. [DisplayFormat(HtmlEncode = true)]
  166. public int HtmlEncodeTrue { get; set; }
  167. [DisplayFormat(HtmlEncode = false)]
  168. public int HtmlEncodeFalse { get; set; }
  169. [DataType(DataType.Currency)]
  170. [DisplayFormat(HtmlEncode = false)]
  171. public int HtmlEncodeFalseWithDataType { get; set; }
  172. // DataType trumps DisplayFormat.HtmlEncode
  173. }
  174. [Fact]
  175. public void DisplayFormatAttributetSetsNullDisplayText()
  176. {
  177. // Arrange
  178. var provider = MakeProvider();
  179. // Act & Assert
  180. Assert.Null(provider.GetMetadataForProperty(null, typeof(DisplayFormatModel), "NoAttribute").NullDisplayText);
  181. Assert.Equal("(null value)", provider.GetMetadataForProperty(null, typeof(DisplayFormatModel), "NullDisplayText").NullDisplayText);
  182. }
  183. [Fact]
  184. public void DisplayFormatAttributeSetsDisplayFormatString()
  185. {
  186. // Arrange
  187. var provider = MakeProvider();
  188. // Act & Assert
  189. Assert.Null(provider.GetMetadataForProperty(null, typeof(DisplayFormatModel), "NoAttribute").DisplayFormatString);
  190. Assert.Equal("Data {0} format", provider.GetMetadataForProperty(null, typeof(DisplayFormatModel), "DisplayFormatString").DisplayFormatString);
  191. Assert.Equal("Data {0} format", provider.GetMetadataForProperty(null, typeof(DisplayFormatModel), "DisplayAndEditFormatString").DisplayFormatString);
  192. }
  193. [Fact]
  194. public void DisplayFormatAttributeSetEditFormatString()
  195. {
  196. // Arrange
  197. var provider = MakeProvider();
  198. // Act & Assert
  199. Assert.Null(provider.GetMetadataForProperty(null, typeof(DisplayFormatModel), "NoAttribute").EditFormatString);
  200. Assert.Null(provider.GetMetadataForProperty(null, typeof(DisplayFormatModel), "DisplayFormatString").EditFormatString);
  201. Assert.Equal("Data {0} format", provider.GetMetadataForProperty(null, typeof(DisplayFormatModel), "DisplayAndEditFormatString").EditFormatString);
  202. }
  203. [Fact]
  204. public void DisplayFormatAttributeSetsConvertEmptyStringToNull()
  205. {
  206. // Arrange
  207. var provider = MakeProvider();
  208. // Act & Assert
  209. Assert.True(provider.GetMetadataForProperty(null, typeof(DisplayFormatModel), "NoAttribute").ConvertEmptyStringToNull);
  210. Assert.True(provider.GetMetadataForProperty(null, typeof(DisplayFormatModel), "ConvertEmptyStringToNullTrue").ConvertEmptyStringToNull);
  211. Assert.False(provider.GetMetadataForProperty(null, typeof(DisplayFormatModel), "ConvertEmptyStringToNullFalse").ConvertEmptyStringToNull);
  212. }
  213. [Fact]
  214. public void DataTypeWithoutDisplayFormatOverrideUsesDataTypesDisplayFormat()
  215. {
  216. // Arrange
  217. var provider = MakeProvider();
  218. // Act
  219. string result = provider.GetMetadataForProperty(null, typeof(DisplayFormatModel), "DataTypeWithoutDisplayFormatOverride").DisplayFormatString;
  220. // Assert
  221. Assert.Equal("{0:C}", result); // Currency's default format string
  222. }
  223. [Fact]
  224. public void DataTypeWithDisplayFormatOverrideUsesDisplayFormatOverride()
  225. {
  226. // Arrange
  227. var provider = MakeProvider();
  228. // Act
  229. string result = provider.GetMetadataForProperty(null, typeof(DisplayFormatModel), "DataTypeWithDisplayFormatOverride").DisplayFormatString;
  230. // Assert
  231. Assert.Equal("format override", result);
  232. }
  233. [Fact]
  234. public void DataTypeInfluencedByDisplayFormatAttributeHtmlEncode()
  235. {
  236. // Arrange
  237. var provider = MakeProvider();
  238. // Act & Assert
  239. Assert.Null(provider.GetMetadataForProperty(null, typeof(DisplayFormatModel), "NoAttribute").DataTypeName);
  240. Assert.Null(provider.GetMetadataForProperty(null, typeof(DisplayFormatModel), "HtmlEncodeTrue").DataTypeName);
  241. Assert.Equal("Html", provider.GetMetadataForProperty(null, typeof(DisplayFormatModel), "HtmlEncodeFalse").DataTypeName);
  242. Assert.Equal("Currency", provider.GetMetadataForProperty(null, typeof(DisplayFormatModel), "HtmlEncodeFalseWithDataType").DataTypeName);
  243. }
  244. // [ScaffoldColumn] tests
  245. class ScaffoldColumnModel
  246. {
  247. public int NoAttribute { get; set; }
  248. [ScaffoldColumn(true)]
  249. public int ScaffoldColumnTrue { get; set; }
  250. [ScaffoldColumn(false)]
  251. public int ScaffoldColumnFalse { get; set; }
  252. }
  253. [Fact]
  254. public void ScaffoldColumnAttributeSetsShowForDisplay()
  255. {
  256. // Arrange
  257. var provider = MakeProvider();
  258. // Act & Assert
  259. Assert.True(provider.GetMetadataForProperty(null, typeof(ScaffoldColumnModel), "NoAttribute").ShowForDisplay);
  260. Assert.True(provider.GetMetadataForProperty(null, typeof(ScaffoldColumnModel), "ScaffoldColumnTrue").ShowForDisplay);
  261. Assert.False(provider.GetMetadataForProperty(null, typeof(ScaffoldColumnModel), "ScaffoldColumnFalse").ShowForDisplay);
  262. }
  263. [Fact]
  264. public void ScaffoldColumnAttributeSetsShowForEdit()
  265. {
  266. // Arrange
  267. var provider = MakeProvider();
  268. // Act & Assert
  269. Assert.True(provider.GetMetadataForProperty(null, typeof(ScaffoldColumnModel), "NoAttribute").ShowForEdit);
  270. Assert.True(provider.GetMetadataForProperty(null, typeof(ScaffoldColumnModel), "ScaffoldColumnTrue").ShowForEdit);
  271. Assert.False(provider.GetMetadataForProperty(null, typeof(ScaffoldColumnModel), "ScaffoldColumnFalse").ShowForEdit);
  272. }
  273. // [DisplayColumn] tests
  274. [DisplayColumn("NoPropertyWithThisName")]
  275. class UnknownDisplayColumnModel
  276. {
  277. }
  278. [Fact]
  279. public void SimpleDisplayNameWithUnknownDisplayColumnThrows()
  280. {
  281. // Arrange
  282. var provider = MakeProvider();
  283. // Act & Assert
  284. Assert.Throws<InvalidOperationException>(
  285. () => provider.GetMetadataForType(() => new UnknownDisplayColumnModel(), typeof(UnknownDisplayColumnModel)).SimpleDisplayText,
  286. typeof(UnknownDisplayColumnModel).FullName + " has a DisplayColumn attribute for NoPropertyWithThisName, but property NoPropertyWithThisName does not exist.");
  287. }
  288. [DisplayColumn("WriteOnlyProperty")]
  289. class WriteOnlyDisplayColumnModel
  290. {
  291. public int WriteOnlyProperty
  292. {
  293. set { }
  294. }
  295. }
  296. [DisplayColumn("PrivateReadPublicWriteProperty")]
  297. class PrivateReadPublicWriteDisplayColumnModel
  298. {
  299. public int PrivateReadPublicWriteProperty { private get; set; }
  300. }
  301. [Fact]
  302. public void SimpleDisplayTextForTypeWithWriteOnlyDisplayColumnThrows()
  303. {
  304. // Arrange
  305. var provider = MakeProvider();
  306. // Act & Assert
  307. Assert.Throws<InvalidOperationException>(
  308. () => provider.GetMetadataForType(() => new WriteOnlyDisplayColumnModel(), typeof(WriteOnlyDisplayColumnModel)).SimpleDisplayText,
  309. typeof(WriteOnlyDisplayColumnModel).FullName + " has a DisplayColumn attribute for WriteOnlyProperty, but property WriteOnlyProperty does not have a public getter.");
  310. Assert.Throws<InvalidOperationException>(
  311. () => provider.GetMetadataForType(() => new PrivateReadPublicWriteDisplayColumnModel(), typeof(PrivateReadPublicWriteDisplayColumnModel)).SimpleDisplayText,
  312. typeof(PrivateReadPublicWriteDisplayColumnModel).FullName + " has a DisplayColumn attribute for PrivateReadPublicWriteProperty, but property PrivateReadPublicWriteProperty does not have a public getter.");
  313. }
  314. [DisplayColumn("DisplayColumnProperty")]
  315. class SimpleDisplayTextAttributeModel
  316. {
  317. public int FirstProperty
  318. {
  319. get { return 42; }
  320. }
  321. [ScaffoldColumn(false)]
  322. public string DisplayColumnProperty { get; set; }
  323. }
  324. class SimpleDisplayTextAttributeModelContainer
  325. {
  326. [DisplayFormat(NullDisplayText = "This is the null display text")]
  327. public SimpleDisplayTextAttributeModel Inner { get; set; }
  328. }
  329. [Fact]
  330. public void SimpleDisplayTextForNonNullClassWithNonNullDisplayColumnValue()
  331. {
  332. // Arrange
  333. string expected = "Custom property display value";
  334. var provider = MakeProvider();
  335. var model = new SimpleDisplayTextAttributeModel { DisplayColumnProperty = expected };
  336. var metadata = provider.GetMetadataForType(() => model, typeof(SimpleDisplayTextAttributeModel));
  337. // Act
  338. string result = metadata.SimpleDisplayText;
  339. // Assert
  340. Assert.Equal(expected, result);
  341. }
  342. [Fact]
  343. public void SimpleDisplayTextForNullClassRevertsToDefaultBehavior()
  344. {
  345. // Arrange
  346. var provider = MakeProvider();
  347. var metadata = provider.GetMetadataForProperty(null, typeof(SimpleDisplayTextAttributeModelContainer), "Inner");
  348. // Act
  349. string result = metadata.SimpleDisplayText;
  350. // Assert
  351. Assert.Equal("This is the null display text", result);
  352. }
  353. [Fact]
  354. public void SimpleDisplayTextForNonNullClassWithNullDisplayColumnValueRevertsToDefaultBehavior()
  355. {
  356. // Arrange
  357. var provider = MakeProvider();
  358. var model = new SimpleDisplayTextAttributeModel();
  359. var metadata = provider.GetMetadataForType(() => model, typeof(SimpleDisplayTextAttributeModel));
  360. // Act
  361. string result = metadata.SimpleDisplayText;
  362. // Assert
  363. Assert.Equal("42", result); // Falls back to the default logic of first property value
  364. }
  365. // [Required] tests
  366. class IsRequiredModel
  367. {
  368. public int NonNullableWithout { get; set; }
  369. public string NullableWithout { get; set; }
  370. [Required]
  371. public string NullableWith { get; set; }
  372. }
  373. [Fact]
  374. public void IsRequiredTests()
  375. {
  376. // Arrange
  377. var provider = MakeProvider();
  378. // Act & Assert
  379. Assert.True(provider.GetMetadataForProperty(null, typeof(IsRequiredModel), "NonNullableWithout").IsRequired);
  380. Assert.False(provider.GetMetadataForProperty(null, typeof(IsRequiredModel), "NullableWithout").IsRequired);
  381. Assert.True(provider.GetMetadataForProperty(null, typeof(IsRequiredModel), "NullableWith").IsRequired);
  382. }
  383. // [Display] & [DisplayName] tests
  384. class DisplayModel
  385. {
  386. public int NoAttribute { get; set; }
  387. // Description
  388. [Display]
  389. public int DescriptionNotSet { get; set; }
  390. [Display(Description = "Description text")]
  391. public int DescriptionSet { get; set; }
  392. // DisplayName
  393. [DisplayName("Value from DisplayName")]
  394. public int DisplayNameAttributeNoDisplayAttribute { get; set; }
  395. [Display]
  396. public int DisplayAttributeNameNotSet { get; set; }
  397. [Display(Name = "Non empty name")]
  398. public int DisplayAttributeNonEmptyName { get; set; }
  399. [Display]
  400. [DisplayName("Value from DisplayName")]
  401. public int BothAttributesNameNotSet { get; set; }
  402. [Display(Name = "Value from Display")]
  403. [DisplayName("Value from DisplayName")]
  404. public int BothAttributes { get; set; }
  405. // Display trumps DisplayName
  406. // Order
  407. [Display]
  408. public int OrderNotSet { get; set; }
  409. [Display(Order = 2112)]
  410. public int OrderSet { get; set; }
  411. // ShortDisplayName
  412. [Display]
  413. public int ShortNameNotSet { get; set; }
  414. [Display(ShortName = "Short name")]
  415. public int ShortNameSet { get; set; }
  416. // Watermark
  417. [Display]
  418. public int PromptNotSet { get; set; }
  419. [Display(Prompt = "Enter stuff here")]
  420. public int PromptSet { get; set; }
  421. }
  422. [Fact]
  423. public void DescriptionTests()
  424. {
  425. // Arrange
  426. var provider = MakeProvider();
  427. // Act & Assert
  428. Assert.Null(provider.GetMetadataForProperty(null, typeof(DisplayModel), "NoAttribute").Description);
  429. Assert.Null(provider.GetMetadataForProperty(null, typeof(DisplayModel), "DescriptionNotSet").Description);
  430. Assert.Equal("Description text", provider.GetMetadataForProperty(null, typeof(DisplayModel), "DescriptionSet").Description);
  431. }
  432. [Fact]
  433. public void DisplayNameTests()
  434. {
  435. // Arrange
  436. var provider = MakeProvider();
  437. // Act & Assert
  438. Assert.Null(provider.GetMetadataForProperty(null, typeof(DisplayModel), "NoAttribute").DisplayName);
  439. Assert.Equal("Value from DisplayName", provider.GetMetadataForProperty(null, typeof(DisplayModel), "DisplayNameAttributeNoDisplayAttribute").DisplayName);
  440. Assert.Null(provider.GetMetadataForProperty(null, typeof(DisplayModel), "DisplayAttributeNameNotSet").DisplayName);
  441. Assert.Equal("Non empty name", provider.GetMetadataForProperty(null, typeof(DisplayModel), "DisplayAttributeNonEmptyName").DisplayName);
  442. Assert.Equal("Value from DisplayName", provider.GetMetadataForProperty(null, typeof(DisplayModel), "BothAttributesNameNotSet").DisplayName);
  443. Assert.Equal("Value from Display", provider.GetMetadataForProperty(null, typeof(DisplayModel), "BothAttributes").DisplayName);
  444. }
  445. [Fact]
  446. public void OrderTests()
  447. {
  448. // Arrange
  449. var provider = MakeProvider();
  450. // Act & Assert
  451. Assert.Equal(10000, provider.GetMetadataForProperty(null, typeof(DisplayModel), "NoAttribute").Order);
  452. Assert.Equal(10000, provider.GetMetadataForProperty(null, typeof(DisplayModel), "OrderNotSet").Order);
  453. Assert.Equal(2112, provider.GetMetadataForProperty(null, typeof(DisplayModel), "OrderSet").Order);
  454. }
  455. [Fact]
  456. public void ShortDisplayNameTests()
  457. {
  458. // Arrange
  459. var provider = MakeProvider();
  460. // Act & Assert
  461. Assert.Null(provider.GetMetadataForProperty(null, typeof(DisplayModel), "NoAttribute").ShortDisplayName);
  462. Assert.Null(provider.GetMetadataForProperty(null, typeof(DisplayModel), "ShortNameNotSet").ShortDisplayName);
  463. Assert.Equal("Short name", provider.GetMetadataForProperty(null, typeof(DisplayModel), "ShortNameSet").ShortDisplayName);
  464. }
  465. [Fact]
  466. public void WatermarkTests()
  467. {
  468. // Arrange
  469. var provider = MakeProvider();
  470. // Act & Assert
  471. Assert.Null(provider.GetMetadataForProperty(null, typeof(DisplayModel), "NoAttribute").Watermark);
  472. Assert.Null(provider.GetMetadataForProperty(null, typeof(DisplayModel), "PromptNotSet").Watermark);
  473. Assert.Equal("Enter stuff here", provider.GetMetadataForProperty(null, typeof(DisplayModel), "PromptSet").Watermark);
  474. }
  475. }
  476. }