Merge pull request #2034 from alexrp/ctx-cleanup
[mono.git] / mcs / class / System.ComponentModel.DataAnnotations / Test / System.ComponentModel.DataAnnotations / DisplayAttributeTest.cs
1 using System;
2 using NUnit.Framework;
3 using System.Collections.Generic;
4 using System.ComponentModel.DataAnnotations;
5 using System.Globalization;
6 using System.Linq;
7 using System.Reflection;
8
9 namespace MonoTests.System.ComponentModel.DataAnnotations
10 {
11         public class AttributeTargetValidation
12         {
13                 [Display(ResourceType = typeof(GoodResources), Name = "NameKey")]
14                 public string WorksOnProperty { get; set; }
15
16                 [Display(ResourceType = typeof(GoodResources), Name = "NameKey")]
17                 public string WorksOnMethod ()
18                 {
19                         return "";
20                 }
21
22                 [Display(ResourceType = typeof(GoodResources), Name = "NameKey")]
23                 public string worksOnField;
24
25                 public string WorksOnParameter ([Display(ResourceType = typeof(GoodResources), Name = "NameKey")] string parameter1)
26                 {
27                         return "";
28                 }
29         }
30         
31         public class GoodResources
32         {
33                 public static string Name {
34                         get { return "NameValue"; }
35                 }
36                 public static string ShortName {
37                         get { return "ShortNameValue"; }
38                 }
39                 public static string Prompt {
40                         get { return "PromptValue"; }
41                 }
42                 public static string Description {
43                         get { return "DescriptionValue"; }
44                 }
45                 public static string GroupName {
46                         get { return "GroupNameValue"; }
47                 }
48                 
49         }
50         public class BadResources
51         {
52                 private static string PrivateString {
53                         get { return "Not a public string"; }
54                 }
55                 public string InstanceString {
56                         get { return "Not a static string"; }
57                 }
58                 public string WriteOnlyString {
59                         set { }
60                 }
61         }
62         internal class InvisibleResources
63         {
64                 public static string InvisibleResource {
65                         get { return "Not a visible string "; }
66                 }
67         }
68         
69         [TestFixture]
70         public class DisplayAttributeTests
71         {
72                 const string property_not_set_message = "The {0} property has not been set.  Use the Get{0} method to get the value.";
73                 const string localization_failed_message = "Cannot retrieve property '{0}' because localization failed.  Type '{1}' is not public or does not contain a public static string property with the name '{2}'.";
74         
75                 [Test]
76                 public void StringProperties_ReturnLiteralValues_Success()
77                 {
78                         var display = new DisplayAttribute()
79                         {
80                                 Name = "Name",
81                                 ShortName = "ShortName",
82                                 Prompt = "Prompt",
83                                 Description = "Description",
84                                 GroupName = "GroupName"
85                         };
86                         
87                         Assert.AreEqual("Name", display.GetName());
88                         Assert.AreEqual("ShortName", display.GetShortName());
89                         Assert.AreEqual("Prompt", display.GetPrompt());
90                         Assert.AreEqual("Description", display.GetDescription());
91                         Assert.AreEqual("GroupName", display.GetGroupName());
92                 }
93                 [Test]
94                 public void StringProperties_ReturnLocalizedValues_Success()
95                 {
96                         var display = new DisplayAttribute()
97                         {
98                                 ResourceType = typeof(GoodResources),
99                                 Name = "Name",
100                                 ShortName = "ShortName",
101                                 Prompt = "Prompt",
102                                 Description = "Description",
103                                 GroupName = "GroupName"
104                         };
105                         
106                         Assert.AreEqual(GoodResources.Name, display.GetName());
107                         Assert.AreEqual(GoodResources.ShortName, display.GetShortName());
108                         Assert.AreEqual(GoodResources.Prompt, display.GetPrompt());
109                         Assert.AreEqual(GoodResources.Description, display.GetDescription());
110                         Assert.AreEqual(GoodResources.GroupName, display.GetGroupName());
111                 }
112                 
113                 [Test]
114                 public void ShortName_ReturnsName_WhenNotSet()
115                 {
116                         var display = new DisplayAttribute()
117                         {
118                                 Name = "Name"
119                         };
120                         
121                         Assert.AreEqual("Name", display.GetShortName());
122                 }
123                 
124                 [Test]
125                 public void OrderAndAutoGenerateProperties_Success()
126                 {
127                         var display = new DisplayAttribute()
128                         {
129                                 Order = 1,
130                                 AutoGenerateField = true,
131                                 AutoGenerateFilter = false
132                         };
133                         
134                         Assert.AreEqual(1, display.Order);
135                         Assert.AreEqual(1, display.GetOrder());
136                         
137                         Assert.AreEqual(true, display.AutoGenerateField);
138                         Assert.AreEqual(true, display.GetAutoGenerateField());
139                         
140                         Assert.AreEqual(false, display.AutoGenerateFilter);
141                         Assert.AreEqual(false, display.GetAutoGenerateFilter());
142                 }
143                 
144                 [Test]
145                 public void StringProperties_GetUnSetProperties_ReturnsNull ()
146                 {
147                         var display = new DisplayAttribute ();
148                         Assert.IsNull (display.Name);
149                         Assert.IsNull (display.ShortName);
150                         Assert.IsNull (display.Prompt);
151                         Assert.IsNull (display.Description);
152                         Assert.IsNull (display.GroupName);
153                         
154                         Assert.IsNull (display.GetName ());
155                         Assert.IsNull (display.GetShortName ());
156                         Assert.IsNull (display.GetPrompt ());
157                         Assert.IsNull (display.GetDescription ());
158                         Assert.IsNull (display.GetGroupName ());
159                 }
160                 
161                 [Test]
162                 public void OrderAndAutoGeneratedProperties_GetUnSetProperties_ThrowsInvalidOperationException ()
163                 {
164                         var display = new DisplayAttribute();
165                         
166                         ExceptionAssert.Throws<InvalidOperationException>(() => display.Order.ToString(), string.Format(property_not_set_message, "Order"));
167                         ExceptionAssert.Throws<InvalidOperationException>(() => display.AutoGenerateField.ToString(), string.Format(property_not_set_message, "AutoGenerateField"));
168                         ExceptionAssert.Throws<InvalidOperationException>(() => display.AutoGenerateFilter.ToString(), string.Format(property_not_set_message, "AutoGenerateFilter"));
169                 }
170                 
171                 [Test]
172                 public void AllProperties_InvisibleResource_ThrowsInvalidOperationException ()
173                 {
174                         var resourceType = typeof(InvisibleResources);
175                         var resourceKey = "InvisibleResource";
176                         var display = new DisplayAttribute()
177                         {
178                                 ResourceType = resourceType,
179                                 Name = resourceKey,
180                                 ShortName = resourceKey,
181                                 Prompt = resourceKey,
182                                 Description = resourceKey,
183                                 GroupName = resourceKey
184                         };
185                         
186                         ExceptionAssert.Throws<InvalidOperationException>(() => display.GetName(), string.Format(localization_failed_message, "Name", resourceType, resourceKey));
187                         ExceptionAssert.Throws<InvalidOperationException>(() => display.GetShortName(), string.Format(localization_failed_message, "ShortName", resourceType, resourceKey));
188                         ExceptionAssert.Throws<InvalidOperationException>(() => display.GetPrompt(), string.Format(localization_failed_message, "Prompt", resourceType, resourceKey));
189                         ExceptionAssert.Throws<InvalidOperationException>(() => display.GetDescription(), string.Format(localization_failed_message, "Description", resourceType, resourceKey));
190                         ExceptionAssert.Throws<InvalidOperationException>(() => display.GetGroupName(), string.Format(localization_failed_message, "GroupName", resourceType, resourceKey));            
191                 }
192                 
193                 [Test]
194                 public void AllProperties_PrivateResource_ThrowsInvalidOperationException ()
195                 {
196                         var resourceType = typeof(BadResources);
197                         var resourceKey = "InstanceString";
198                         var display = new DisplayAttribute()
199                         {
200                                 ResourceType = resourceType,
201                                 Name = resourceKey,
202                                 ShortName = resourceKey,
203                                 Prompt = resourceKey,
204                                 Description = resourceKey,
205                                 GroupName = resourceKey
206                         };
207                         
208                         ExceptionAssert.Throws<InvalidOperationException>(() => display.GetName(), string.Format(localization_failed_message, "Name", resourceType, resourceKey));
209                         ExceptionAssert.Throws<InvalidOperationException>(() => display.GetShortName(), string.Format(localization_failed_message, "ShortName", resourceType, resourceKey));
210                         ExceptionAssert.Throws<InvalidOperationException>(() => display.GetPrompt(), string.Format(localization_failed_message, "Prompt", resourceType, resourceKey));
211                         ExceptionAssert.Throws<InvalidOperationException>(() => display.GetDescription(), string.Format(localization_failed_message, "Description", resourceType, resourceKey));
212                         ExceptionAssert.Throws<InvalidOperationException>(() => display.GetGroupName(), string.Format(localization_failed_message, "GroupName", resourceType, resourceKey));            
213                 }
214                 
215                 [Test]
216                 public void AllProperties_InstanceResource_ThrowsInvalidOperationException ()
217                 {
218                         var resourceType = typeof(BadResources);
219                         var resourceKey = "InstanceString";
220                         var display = new DisplayAttribute()
221                         {
222                                 ResourceType = resourceType,
223                                 Name = resourceKey,
224                                 ShortName = resourceKey,
225                                 Prompt = resourceKey,
226                                 Description = resourceKey,
227                                 GroupName = resourceKey
228                         };
229                         
230                         ExceptionAssert.Throws<InvalidOperationException>(() => display.GetName(), string.Format(localization_failed_message, "Name", resourceType, resourceKey));
231                         ExceptionAssert.Throws<InvalidOperationException>(() => display.GetShortName(), string.Format(localization_failed_message, "ShortName", resourceType, resourceKey));
232                         ExceptionAssert.Throws<InvalidOperationException>(() => display.GetPrompt(), string.Format(localization_failed_message, "Prompt", resourceType, resourceKey));
233                         ExceptionAssert.Throws<InvalidOperationException>(() => display.GetDescription(), string.Format(localization_failed_message, "Description", resourceType, resourceKey));
234                         ExceptionAssert.Throws<InvalidOperationException>(() => display.GetGroupName(), string.Format(localization_failed_message, "GroupName", resourceType, resourceKey));            
235                 }
236                 
237                 [Test]
238                 public void AllProperties_WriteOnlyResource_ThrowsInvalidOperationException ()
239                 {
240                         var resourceType = typeof(BadResources);
241                         var resourceKey = "WriteOnlyString";
242                         var display = new DisplayAttribute()
243                         {
244                                 ResourceType = resourceType,
245                                 Name = resourceKey,
246                                 ShortName = resourceKey,
247                                 Prompt = resourceKey,
248                                 Description = resourceKey,
249                                 GroupName = resourceKey
250                         };
251                         
252                         ExceptionAssert.Throws<InvalidOperationException>(() => display.GetName(), string.Format(localization_failed_message, "Name", resourceType, resourceKey));
253                         ExceptionAssert.Throws<InvalidOperationException>(() => display.GetShortName(), string.Format(localization_failed_message, "ShortName", resourceType, resourceKey));
254                         ExceptionAssert.Throws<InvalidOperationException>(() => display.GetPrompt(), string.Format(localization_failed_message, "Prompt", resourceType, resourceKey));
255                         ExceptionAssert.Throws<InvalidOperationException>(() => display.GetDescription(), string.Format(localization_failed_message, "Description", resourceType, resourceKey));
256                         ExceptionAssert.Throws<InvalidOperationException>(() => display.GetGroupName(), string.Format(localization_failed_message, "GroupName", resourceType, resourceKey));            
257                 }
258         }
259         public static class ExceptionAssert
260         {
261                 public static void Throws<TException> (Action action, string expectedMessage) where TException : Exception
262                 {
263                         try
264                         {
265                                 action ();
266                         }
267                         catch (TException ex)
268                         {
269                                 Assert.AreEqual (expectedMessage, ex.Message);
270                                 return;
271                         }
272                         
273                         Assert.Fail();
274                 }
275         }
276 }