98d87d4ab9840017f1ff66ac8dd607330142258d
[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 #elif NET_4_5
294                         string expected = "MonoTests.System.Configuration.ProviderPoker, System_test_net_4_5, Version=0.0.0.0";
295 #elif NET_4_0
296                         string expected = "MonoTests.System.Configuration.ProviderPoker, System_test_net_4_0, Version=0.0.0.0";
297 #else
298                         string expected = "MonoTests.System.Configuration.ProviderPoker, System_test_net_2_0, Version=0.0.0.0";
299 #endif
300                         Assert.AreEqual (expected, new SettingsProviderAttribute (typeof (ProviderPoker)).ProviderTypeName.Substring (0, expected.Length), "#1");
301                         TestSettings2 settings = new TestSettings2 ();
302
303                         /* should throw ConfigurationException */
304                         IEnumerator props = settings.Properties.GetEnumerator();
305                 }
306
307                 [Test]
308                 [Ignore ("On MS.NET it returns null ...")]
309                 public void TestSettings3_Properties ()
310                 {
311                         TestSettings3 settings = new TestSettings3 ();
312
313                         Assert.AreEqual ("root", settings.Username, "A1");
314                 }
315
316                 public static void Main (string[] args)
317                 {
318                         ApplicationSettingsBaseTest test = new ApplicationSettingsBaseTest();
319                         test.TestSettings1_Properties();
320                 }
321
322                 [Test]
323                 public void Synchronized ()
324                 {
325                         Bug78430 s = new Bug78430 ();
326                         s.Initialize (null, new SettingsPropertyCollection (),
327                                 new SettingsProviderCollection ());
328                         SettingsBase sb = SettingsBase.Synchronized (s);
329                         Assert.IsTrue (sb.IsSynchronized, "#1");
330                         Assert.IsTrue (sb is Bug78430, "#2");
331                         // these checks are so cosmetic, actually not
332                         // worthy of testing.
333                         Assert.IsTrue (Object.ReferenceEquals (s, sb), "#3");
334                         Assert.IsFalse (sb.Properties.IsSynchronized, "#4");
335                 }
336
337                 class Bug78430 : SettingsBase
338                 {
339                 }
340
341                 [Test] // bug #78654
342                 public void DefaultSettingValueAs ()
343                 {
344                         Assert.AreEqual (1, new Bug78654 ().IntSetting);
345                 }
346
347                 class Bug78654 : ApplicationSettingsBase
348                 {
349                         [UserScopedSettingAttribute ()]
350                         [DefaultSettingValueAttribute ("1")]
351                         public int IntSetting {
352                                 get { return ((int)(this ["IntSetting"])); }
353                         }
354                 }
355
356                 [Test]
357                 public void TestSettings4_StringCollection_DefaultSettingValue ()
358                 {
359                         TestSettings4 settings = new TestSettings4 ();
360                         Assert.AreEqual (2, settings.Values.Count, "Count");
361                         Assert.AreEqual ("go", settings.Values[0], "0");
362                         Assert.AreEqual ("mono", settings.Values[1], "1");
363                 }
364
365                 [Test]
366                 [Category ("NotWorking")]
367                 public void Providers ()
368                 {
369                         Assert.AreEqual (0, new TestSettings1 ().Providers.Count);
370                 }
371
372                 class Bug532180 : ApplicationSettingsBase {
373                         [UserScopedSetting]
374                         [DefaultSettingValue("10")]
375                         public int IntSetting {
376                                 get { return (int)this["IntSetting"]; }
377                                 set { this["IntSetting"] = value; }                               
378                         }
379                 }
380
381                 [Test] // bug #532180
382                 public void DefaultSettingValueAsWithReload() 
383                 {
384                         Bug532180 settings = new Bug532180();
385                         Assert.AreEqual (10, settings.IntSetting, "A1");
386                         settings.IntSetting = 1;
387                         Assert.AreEqual (1, settings.IntSetting, "A2");
388                         settings.Reload ();
389                         Assert.AreEqual (10, settings.IntSetting, "A3");
390                 }                        
391                 
392                 class Bug8592ConfHolder : ApplicationSettingsBase {
393                         [UserScopedSetting]
394                         public string TestKey1OnHolder { 
395                                 get { return (string) this ["TestKey1OnHolder"] ?? ""; }
396                                 set { this ["TestKey1OnHolder"] = value; }
397                         }
398                 }
399
400                 [Test]
401                 public void TestBug8592BasicOperations ()
402                 {
403                         var holder = new Bug8592ConfHolder ();
404                         holder.Reset ();
405                         holder.Save ();
406                         Assert.AreEqual ("", holder.TestKey1OnHolder);
407                         holder.TestKey1OnHolder = "candy";
408                         Assert.AreEqual ("candy", holder.TestKey1OnHolder);
409                         holder.Reload ();
410                         Assert.AreEqual ("", holder.TestKey1OnHolder);
411                         holder.TestKey1OnHolder = "candy";
412                         Assert.AreEqual ("candy", holder.TestKey1OnHolder);
413                         holder.Save ();
414                         Assert.AreEqual ("candy", holder.TestKey1OnHolder);
415                         holder.Reload ();
416                         Assert.AreEqual ("candy", holder.TestKey1OnHolder);
417                         holder.Reset ();
418                         Assert.AreEqual ("", holder.TestKey1OnHolder);
419                 }
420
421                 class Bug8533ConfHolder1 : ApplicationSettingsBase {
422                         [UserScopedSetting]
423                         public string TestKey1OnHolder1 {
424                                 get { return (string) this ["TestKey1OnHolder1"] ?? ""; }
425                                 set { this ["TestKey1OnHolder1"] = value; }
426                         }
427
428                         [UserScopedSetting]
429                         public string TestKey1OnHolder2 {
430                                 get { return (string) this ["TestKey1OnHolder2"] ?? ""; }
431                                 set { this ["TestKey1OnHolder2"] = value; }
432                         }
433                         
434                         [UserScopedSetting]
435                         public string TestKey {
436                                 get { return (string) this ["TestKey"] ?? ""; }
437                                 set { this ["TestKey"] = value; }
438                         }
439                 }
440
441                 class Bug8533ConfHolder2 : ApplicationSettingsBase {
442                         [UserScopedSetting]
443                         public string TestKey1OnHolder2 {
444                                 get { return (string) this ["TestKey1OnHolder2"] ?? ""; }
445                                 set { this ["TestKey1OnHolder2"] = value; }
446                         }
447
448                         [UserScopedSetting]
449                         public string TestKey {
450                                 get { return (string) this ["TestKey"] ?? ""; }
451                                 set { this ["TestKey"] = value; }
452                         }
453                 }
454
455                 [Test]
456                 public void TestBug8533ConfHandlerWronglyMixedUp ()
457                 {
458                         var holder1 = new Bug8533ConfHolder1 ();
459                         var holder2 = new Bug8533ConfHolder2 ();
460                         holder1.TestKey1OnHolder1 = "candy";
461                         holder2.TestKey1OnHolder2 = "donut";
462                         holder1.TestKey = "eclair";
463                         holder1.Save ();
464                         holder2.Save ();
465                         holder1.Reload ();
466                         holder2.Reload();
467                         Assert.AreEqual ("", holder1.TestKey1OnHolder2);
468                         Assert.AreEqual ("candy", holder1.TestKey1OnHolder1);
469                         Assert.AreEqual ("donut", holder2.TestKey1OnHolder2);
470                         Assert.AreEqual ("eclair", holder1.TestKey);
471                         Assert.AreEqual ("", holder2.TestKey);
472                 }
473         }
474 }
475
476 #endif