Normalize line endings.
[mono.git] / mcs / class / System / Test / System.Configuration / ApplicationSettingsBaseTest.cs
1 //
2 // System.Configuration.ApplicationsSettingsBaseTest.cs - Unit tests
3 // for System.Configuration.ApplicationSettingsBase.
4 //
5 // Author:
6 //      Chris Toshok  <toshok@ximian.com>
7 //
8 // Copyright (C) 2005, 2006 Novell, Inc (http://www.novell.com)
9 //
10 // Permission is hereby granted, free of charge, to any person obtaining
11 // a copy of this software and associated documentation files (the
12 // "Software"), to deal in the Software without restriction, including
13 // without limitation the rights to use, copy, modify, merge, publish,
14 // distribute, sublicense, and/or sell copies of the Software, and to
15 // permit persons to whom the Software is furnished to do so, subject to
16 // the following conditions:
17 // 
18 // The above copyright notice and this permission notice shall be
19 // included in all copies or substantial portions of the Software.
20 // 
21 // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
22 // EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
23 // MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
24 // NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
25 // LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
26 // OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
27 // WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
28 //
29
30 //#define SPEW
31
32 #if NET_2_0
33
34 using System;
35 using System.Text;
36 using System.Configuration;
37 using System.ComponentModel;
38 using System.Collections;
39 using System.Collections.Specialized;
40 using NUnit.Framework;
41 using CategoryAttribute = NUnit.Framework.CategoryAttribute;
42
43 namespace MonoTests.System.Configuration {
44         class ProviderPoker : LocalFileSettingsProvider {
45                 public override void Initialize (string name,
46                                                  NameValueCollection values)
47                 {
48 #if SPEW
49                         Console.WriteLine ("Initialize '{0}'", name);
50                         Console.WriteLine (Environment.StackTrace);
51 #endif
52                         if (name == null)
53                                 name = "ProviderPoker";
54
55                         base.Initialize (name, values);
56                 }
57
58                 public override SettingsPropertyValueCollection GetPropertyValues (SettingsContext context,
59                                                                                    SettingsPropertyCollection properties)
60                 {
61 #if SPEW
62                         Console.WriteLine (Environment.StackTrace);
63 #endif
64                         return base.GetPropertyValues (context, properties);
65                 }
66
67                 public override void SetPropertyValues (SettingsContext context,
68                                                         SettingsPropertyValueCollection values)
69                 {
70 #if SPEW
71                         Console.WriteLine (Environment.StackTrace);
72 #endif
73                         base.SetPropertyValues (context, values);
74                 }
75
76                 public override string ApplicationName {
77                         get {
78 #if SPEW
79                                 Console.WriteLine (Environment.StackTrace);
80 #endif
81                                 return base.ApplicationName;
82                         }
83                         set {
84 #if SPEW
85                                 Console.WriteLine ("ApplicationName = {0}", value);
86                                 Console.WriteLine (Environment.StackTrace);
87 #endif
88                                 base.ApplicationName = value;
89                         }
90                 }
91         }
92
93         /* a basic settings class.  just two settings, one application
94          * scoped, one user scoped */
95         class TestSettings1 : ApplicationSettingsBase
96         {
97                 public TestSettings1() : base ("TestSettings1")
98                 {
99                 }
100
101                 [ApplicationScopedSetting]
102                 [DefaultSettingValue ("root")]
103                 public string Username {
104                         get { return (string)this["Username"]; }
105                         set { this["Username"] = value; }
106                 }
107
108                 [UserScopedSetting]
109                 [DefaultSettingValue ("8 Cambridge Center")]
110                 public string Address {
111                         get { return (string)this["Address"]; }
112                         set { this["Address"] = value; }
113                 }
114         }
115
116         /* an error according to msdn2 docs.  both ApplicationScoped
117          * and UserScoped attributes on the same property */
118         class TestSettings2 : ApplicationSettingsBase
119         {
120                 public TestSettings2() : base ("TestSettings2")
121                 {
122                 }
123
124                 [ApplicationScopedSetting]
125                 [UserScopedSetting]
126                 [SettingsProvider (typeof (ProviderPoker))]
127                 public string Username {
128                         get { return (string)this["Username"]; }
129                         set { this["Username"] = value; }
130                 }
131         }
132
133         /* a custom provider for our setting */
134         class TestSettings3 : ApplicationSettingsBase
135         {
136                 public TestSettings3() : base ("TestSettings3")
137                 {
138                 }
139
140                 [ApplicationScopedSetting]
141                 [SettingsProvider (typeof (ProviderPoker))]
142                 public string Username {
143                         get { return (string)this["Username"]; }
144                         set { this["Username"] = value; }
145                 }
146         }
147
148         class TestSettings4 : ApplicationSettingsBase {
149
150                 public TestSettings4 ()
151                         : base ("TestSettings4")
152                 {
153                 }
154
155                 [ApplicationScopedSetting]
156                 [DefaultSettingValue ("<?xml version=\"1.0\" encoding=\"utf-16\"?>\r\n<ArrayOfString xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\" xmlns:xsd=\"http://www.w3.org/2001/XMLSchema\">\r\n  <string>go</string>\r\n  <string>mono</string>\r\n  </ArrayOfString>")]
157                 public StringCollection Values {
158                         get { return (StringCollection) this ["Values"]; }
159                 }
160         }
161
162         [TestFixture]
163         public class ApplicationSettingsBaseTest
164         {
165                 [Test]
166                 public void TestSettings1_Properties ()
167                 {
168                         TestSettings1 settings = new TestSettings1 ();
169
170                         IEnumerator props = settings.Properties.GetEnumerator();
171                         Assert.IsNotNull (props, "A1");
172                         
173                         Assert.IsTrue (props.MoveNext(), "A2");
174                         Assert.AreEqual ("Address", ((SettingsProperty)props.Current).Name, "A3");
175
176                         Assert.IsTrue (props.MoveNext(), "A4");
177                         Assert.AreEqual ("Username", ((SettingsProperty)props.Current).Name, "A5");
178
179                         Assert.AreEqual ("root", settings.Username, "A6");
180                         Assert.AreEqual ("8 Cambridge Center", settings.Address, "A7");
181                 }
182
183                 [Test]
184                 public void TestSettings1_Provider ()
185                 {
186                         TestSettings1 settings = new TestSettings1 ();
187
188                         /* since we didn't specify a provider for any
189                          * of them, they should all use the
190                          * LocalFileSettingsProvider */
191                         foreach (SettingsProperty prop in settings.Properties) {
192                                 Assert.AreEqual (typeof (LocalFileSettingsProvider), prop.Provider.GetType(), "A1");
193                                 Console.WriteLine ("'{0}': '{1}'", prop.Provider.Name, prop.Provider.ApplicationName);
194                         }
195                 }
196
197                 [Test]
198                 public void TestSettings1_SetProperty ()
199                 {
200                         TestSettings1 settings = new TestSettings1 ();
201                         bool setting_changing = false;
202                         bool setting_changed = false;
203
204                         settings.SettingChanging += delegate (object sender, SettingChangingEventArgs e) {
205                                 setting_changing = true;
206                                 Assert.AreEqual ("Username", e.SettingName, "A1");
207                                 Assert.AreEqual ("toshok", e.NewValue, "A2");
208                                 Assert.AreEqual ("TestSettings1", e.SettingKey, "A3");
209                                 Assert.AreEqual (settings.GetType().FullName, e.SettingClass, "A4");
210                         };
211
212                         settings.PropertyChanged += delegate (object sender, PropertyChangedEventArgs e) {
213                                 Assert.IsTrue (setting_changing, "A5");
214                                 setting_changed = true;
215                                 Assert.AreEqual ("Username", e.PropertyName, "A6");
216                         };
217
218                         settings.Username = "toshok";
219
220                         Assert.IsTrue (setting_changing && setting_changed, "A7");
221                         Assert.AreEqual ("toshok", settings.Username, "A8");
222                 }
223
224                 [Test]
225                 public void TestSettings1_SetPropertyCancel ()
226                 {
227                         TestSettings1 settings = new TestSettings1 ();
228                         bool setting_changing = false;
229                         bool setting_changed = false;
230
231                         settings.SettingChanging += delegate (object sender, SettingChangingEventArgs e) {
232                                 setting_changing = true;
233                                 Assert.AreEqual ("Username", e.SettingName, "A1");
234                                 Assert.AreEqual ("toshok", e.NewValue, "A2");
235                                 Assert.AreEqual ("TestSettings1", e.SettingKey, "A3");
236                                 Assert.AreEqual (settings.GetType().FullName, e.SettingClass, "A4");
237                                 e.Cancel = true;
238                         };
239
240                         settings.PropertyChanged += delegate (object sender, PropertyChangedEventArgs e) {
241                                 setting_changed = true;
242                                 Assert.Fail ("shouldn't reach here.", "A5");
243                         };
244
245                         settings.Username = "toshok";
246
247                         Assert.IsTrue (setting_changing, "A6");
248                         Assert.IsFalse (setting_changed, "A7");
249
250                         Assert.AreEqual ("root", settings.Username, "A8");
251                 }
252
253                 [Test]
254                 public void TestSettings1_SettingsLoaded ()
255                 {
256                         TestSettings1 settings = new TestSettings1 ();
257                         bool settings_loaded = false;
258                         SettingsProvider loaded_provider = null;
259
260                         settings.SettingsLoaded += delegate (object sender, SettingsLoadedEventArgs e) {
261                                 settings_loaded = true;
262                                 loaded_provider = e.Provider;
263                         };
264
265                         Assert.AreEqual ("root", settings.Username, "A1");
266                         Assert.IsTrue (settings_loaded, "A2");
267                         Assert.AreEqual (loaded_provider, settings.Properties ["Username"].Provider, "A3");
268                 }
269
270                 [Test]
271                 [Category ("NotWorking")]
272                 public void TestSettings1_SetPropertyReset ()
273                 {
274                         TestSettings1 settings = new TestSettings1 ();
275
276                         settings.Username = "toshok";
277
278                         Assert.AreEqual ("toshok", settings.Username, "A1");
279
280                         settings.Reset ();
281
282                         Assert.AreEqual ("root", settings.Username, "A2");
283                 }
284
285                 [Test]
286                 public void TestSettings2_Properties ()
287                 {
288                         // This test will fail when there are newer versions
289                         // of the test assemblies - so conditionalize it in
290                         // such cases.
291 #if TARGET_JVM
292                         string expected = "MonoTests.System.Configuration.ProviderPoker, System.Test, Version=0.0.0.0";
293 #else
294                         string expected = "MonoTests.System.Configuration.ProviderPoker, System_test_net_2_0, Version=0.0.0.0";
295 #endif
296                         Assert.AreEqual (expected, new SettingsProviderAttribute (typeof (ProviderPoker)).ProviderTypeName.Substring (0, expected.Length), "#1");
297                         TestSettings2 settings = new TestSettings2 ();
298
299                         /* should throw ConfigurationException */
300                         IEnumerator props = settings.Properties.GetEnumerator();
301                 }
302
303                 [Test]
304                 [Ignore ("On MS.NET it returns null ...")]
305                 public void TestSettings3_Properties ()
306                 {
307                         TestSettings3 settings = new TestSettings3 ();
308
309                         Assert.AreEqual ("root", settings.Username, "A1");
310                 }
311
312                 public static void Main (string[] args)
313                 {
314                         ApplicationSettingsBaseTest test = new ApplicationSettingsBaseTest();
315                         test.TestSettings1_Properties();
316                 }
317
318                 [Test]
319                 public void Synchronized ()
320                 {
321                         Bug78430 s = new Bug78430 ();
322                         s.Initialize (null, new SettingsPropertyCollection (),
323                                 new SettingsProviderCollection ());
324                         SettingsBase sb = SettingsBase.Synchronized (s);
325                         Assert.IsTrue (sb.IsSynchronized, "#1");
326                         Assert.IsTrue (sb is Bug78430, "#2");
327                         // these checks are so cosmetic, actually not
328                         // worthy of testing.
329                         Assert.IsTrue (Object.ReferenceEquals (s, sb), "#3");
330                         Assert.IsFalse (sb.Properties.IsSynchronized, "#4");
331                 }
332
333                 class Bug78430 : SettingsBase
334                 {
335                 }
336
337                 [Test] // bug #78654
338                 public void DefaultSettingValueAs ()
339                 {
340                         Assert.AreEqual (1, new Bug78654 ().IntSetting);
341                 }
342
343                 class Bug78654 : ApplicationSettingsBase
344                 {
345                         [UserScopedSettingAttribute ()]
346                         [DefaultSettingValueAttribute ("1")]
347                         public int IntSetting {
348                                 get { return ((int)(this ["IntSetting"])); }
349                         }
350                 }
351
352                 [Test]
353                 public void TestSettings4_StringCollection_DefaultSettingValue ()
354                 {
355                         TestSettings4 settings = new TestSettings4 ();
356                         Assert.AreEqual (2, settings.Values.Count, "Count");
357                         Assert.AreEqual ("go", settings.Values[0], "0");
358                         Assert.AreEqual ("mono", settings.Values[1], "1");
359                 }
360
361                 [Test]
362                 [Category ("NotWorking")]
363                 public void Providers ()
364                 {
365                         Assert.AreEqual (0, new TestSettings1 ().Providers.Count);
366                 }
367
368                 class Bug532180 : ApplicationSettingsBase {
369                         [UserScopedSetting]
370                         [DefaultSettingValue("10")]
371                         public int IntSetting {
372                                 get { return (int)this["IntSetting"]; }
373                                 set { this["IntSetting"] = value; }                               
374                         }
375                 }
376
377                 [Test] // bug #532180
378                 public void DefaultSettingValueAsWithReload() {
379                         Bug532180 settings = new Bug532180();
380                         Assert.AreEqual(10, settings.IntSetting, "A1");
381                         settings.IntSetting = 1;
382                         Assert.AreEqual(1, settings.IntSetting, "A2");
383                         settings.Reload();
384                         Assert.AreEqual(10, settings.IntSetting, "A3");
385                 }                        
386         }
387 }
388
389 #endif