2 // System.ComponentModel.Container test cases
5 // Gonzalo Paniagua Javier (gonzalo@ximian.com)
6 // Ivan N. Zlatev (contact i-nZ.net)
8 // Copyright (c) 2006 Novell, Inc. (http://www.novell.com)
9 // Copyright (c) 2006 Ivan N. Zlatev
12 using NUnit.Framework;
14 using System.ComponentModel;
15 using System.ComponentModel.Design;
17 namespace MonoTests.System.ComponentModel
22 class TestContainer : Container {
23 ServiceContainer _services = new ServiceContainer ();
24 bool allowDuplicateNames;
26 public TestContainer()
28 _services.AddService (typeof (TestService), new TestService ());
31 public bool AllowDuplicateNames {
32 get { return allowDuplicateNames; }
33 set { allowDuplicateNames = value; }
36 protected override object GetService (Type serviceType)
38 return _services.GetService (serviceType);
42 public void Remove_WithoutUnsiting (IComponent component)
44 base.RemoveWithoutUnsiting (component);
47 public void InvokeValidateName (IComponent component, string name)
49 ValidateName (component, name);
52 protected override void ValidateName (IComponent component, string name)
54 if (AllowDuplicateNames)
56 base.ValidateName (component, name);
60 public bool Contains (IComponent component)
64 foreach (IComponent c in Components) {
65 if (component.Equals (c)) {
73 public new void Dispose (bool disposing)
75 base.Dispose (disposing);
79 class TestComponent : Component {
80 public override ISite Site {
87 Assert.IsNotNull (value.GetService (typeof (ISite)), "ISite");
88 Assert.IsNotNull (value.GetService (typeof (TestService)), "TestService");
93 public bool IsDisposed {
94 get { return disposed; }
97 public bool ThrowOnDispose {
98 get { return throwOnDispose; }
99 set { throwOnDispose = value; }
102 protected override void Dispose (bool disposing)
105 throw new InvalidOperationException ();
107 base.Dispose (disposing);
111 private bool disposed;
112 private bool throwOnDispose;
116 public class ContainerTest
118 private TestContainer _container;
123 _container = new TestContainer ();
126 [Test] // Add (IComponent)
129 TestContainer containerA = new TestContainer ();
130 TestContainer containerB = new TestContainer ();
135 TestComponent compA = new TestComponent ();
136 Assert.IsNull (compA.Site);
137 TestComponent compB = new TestComponent ();
138 Assert.IsNull (compB.Site);
139 Assert.AreEqual (0, containerA.Components.Count);
140 Assert.AreEqual (0, containerB.Components.Count);
142 containerA.Add (compA);
144 Assert.IsNotNull (siteA);
145 Assert.AreSame (compA, siteA.Component);
146 Assert.AreSame (containerA, siteA.Container);
147 Assert.IsFalse (siteA.DesignMode);
148 Assert.IsNull (siteA.Name);
149 containerA.Add (compB);
151 Assert.IsNotNull (siteB);
152 Assert.AreSame (compB, siteB.Component);
153 Assert.AreSame (containerA, siteB.Container);
154 Assert.IsFalse (siteB.DesignMode);
155 Assert.IsNull (siteB.Name);
157 Assert.IsFalse (object.ReferenceEquals (siteA, siteB));
158 Assert.AreEqual (2, containerA.Components.Count);
159 Assert.AreEqual (0, containerB.Components.Count);
160 Assert.AreSame (compA, containerA.Components [0]);
161 Assert.AreSame (compB, containerA.Components [1]);
163 // check effect of adding component that is already member of
165 containerB.Add (compA);
166 Assert.IsFalse (object.ReferenceEquals (siteA, compA.Site));
168 Assert.IsNotNull (siteA);
169 Assert.AreSame (compA, siteA.Component);
170 Assert.AreSame (containerB, siteA.Container);
171 Assert.IsFalse (siteA.DesignMode);
172 Assert.IsNull (siteA.Name);
174 Assert.AreEqual (1, containerA.Components.Count);
175 Assert.AreEqual (1, containerB.Components.Count);
176 Assert.AreSame (compB, containerA.Components [0]);
177 Assert.AreSame (compA, containerB.Components [0]);
179 // check effect of add component twice to same container
180 containerB.Add (compA);
181 Assert.AreSame (siteA, compA.Site);
183 Assert.AreEqual (1, containerA.Components.Count);
184 Assert.AreEqual (1, containerB.Components.Count);
185 Assert.AreSame (compB, containerA.Components [0]);
186 Assert.AreSame (compA, containerB.Components [0]);
190 public void Add1_Component_Null ()
192 _container.Add ((IComponent) null);
193 Assert.AreEqual (0, _container.Components.Count);
196 [Test] // Add (IComponent, String)
199 TestContainer containerA = new TestContainer ();
200 TestContainer containerB = new TestContainer ();
205 TestComponent compA = new TestComponent ();
206 Assert.IsNull (compA.Site);
207 TestComponent compB = new TestComponent ();
208 Assert.IsNull (compB.Site);
209 Assert.AreEqual (0, containerA.Components.Count);
210 Assert.AreEqual (0, containerB.Components.Count);
212 containerA.Add (compA, "A");
214 Assert.IsNotNull (siteA);
215 Assert.AreSame (compA, siteA.Component);
216 Assert.AreSame (containerA, siteA.Container);
217 Assert.IsFalse (siteA.DesignMode);
218 Assert.AreEqual ("A", siteA.Name);
219 containerA.Add (compB, "B");
221 Assert.IsNotNull (siteB);
222 Assert.AreSame (compB, siteB.Component);
223 Assert.AreSame (containerA, siteB.Container);
224 Assert.IsFalse (siteB.DesignMode);
225 Assert.AreEqual ("B", siteB.Name);
227 Assert.IsFalse (object.ReferenceEquals (siteA, siteB));
228 Assert.AreEqual (2, containerA.Components.Count);
229 Assert.AreEqual (0, containerB.Components.Count);
230 Assert.AreSame (compA, containerA.Components [0]);
231 Assert.AreSame (compB, containerA.Components [1]);
233 // check effect of adding component that is already member of
235 containerB.Add (compA, "A2");
236 Assert.IsFalse (object.ReferenceEquals (siteA, compA.Site));
238 Assert.IsNotNull (siteA);
239 Assert.AreSame (compA, siteA.Component);
240 Assert.AreSame (containerB, siteA.Container);
241 Assert.IsFalse (siteA.DesignMode);
242 Assert.AreEqual ("A2", siteA.Name);
244 Assert.AreEqual (1, containerA.Components.Count);
245 Assert.AreEqual (1, containerB.Components.Count);
246 Assert.AreSame (compB, containerA.Components [0]);
247 Assert.AreSame (compA, containerB.Components [0]);
249 // check effect of add component twice to same container
250 containerB.Add (compA, "A2");
251 Assert.AreSame (siteA, compA.Site);
252 Assert.AreEqual ("A2", siteA.Name);
254 Assert.AreEqual (1, containerA.Components.Count);
255 Assert.AreEqual (1, containerB.Components.Count);
256 Assert.AreSame (compB, containerA.Components [0]);
257 Assert.AreSame (compA, containerB.Components [0]);
259 // add again with different name
260 containerB.Add (compA, "A3");
261 Assert.AreSame (siteA, compA.Site);
262 Assert.AreEqual ("A2", siteA.Name);
264 Assert.AreEqual (1, containerA.Components.Count);
265 Assert.AreEqual (1, containerB.Components.Count);
266 Assert.AreSame (compB, containerA.Components [0]);
267 Assert.AreSame (compA, containerB.Components [0]);
269 // check effect of add component twice to same container
270 containerB.Add (compA, "A2");
271 Assert.AreSame (siteA, compA.Site);
272 Assert.AreEqual ("A2", siteA.Name);
276 public void Add2_Component_Null ()
278 _container.Add ((IComponent) null, "A");
279 Assert.AreEqual (0, _container.Components.Count);
280 _container.Add (new TestComponent (), "A");
281 Assert.AreEqual (1, _container.Components.Count);
282 _container.Add ((IComponent) null, "A");
283 Assert.AreEqual (1, _container.Components.Count);
287 public void Add2_Name_Duplicate ()
289 TestContainer container = new TestContainer ();
290 TestComponent c1 = new TestComponent ();
291 container.Add (c1, "dup");
293 // new component, same case
294 TestComponent c2 = new TestComponent ();
296 container.Add (c2, "dup");
298 } catch (ArgumentException ex) {
299 // Duplicate component name 'dup'. Component names must be
300 // unique and case-insensitive
301 Assert.AreEqual (typeof (ArgumentException), ex.GetType (), "#A2");
302 Assert.IsNull (ex.InnerException, "#A3");
303 Assert.IsNotNull (ex.Message, "#A4");
304 Assert.IsTrue (ex.Message.IndexOf ("'dup'") != -1, "#A5");
305 Assert.IsNull (ex.ParamName, "#A6");
306 Assert.AreEqual (1, container.Components.Count, "#A7");
309 // new component, different case
310 TestComponent c3 = new TestComponent ();
312 container.Add (c3, "duP");
314 } catch (ArgumentException ex) {
315 // Duplicate component name 'duP'. Component names must be
316 // unique and case-insensitive
317 Assert.AreEqual (typeof (ArgumentException), ex.GetType (), "#B2");
318 Assert.IsNull (ex.InnerException, "#B3");
319 Assert.IsNotNull (ex.Message, "#B4");
320 Assert.IsTrue (ex.Message.IndexOf ("'duP'") != -1, "#B5");
321 Assert.IsNull (ex.ParamName, "#B6");
322 Assert.AreEqual (1, container.Components.Count, "#B7");
325 // existing component, same case
326 TestComponent c4 = new TestComponent ();
327 container.Add (c4, "C4");
328 Assert.AreEqual (2, container.Components.Count, "#C1");
329 container.Add (c4, "dup");
330 Assert.AreEqual (2, container.Components.Count, "#C2");
331 Assert.AreEqual ("C4", c4.Site.Name, "#C3");
333 // component of other container, same case
334 TestContainer container2 = new TestContainer ();
335 TestComponent c5 = new TestComponent ();
336 container2.Add (c5, "C5");
338 container.Add (c5, "dup");
340 } catch (ArgumentException ex) {
341 // Duplicate component name 'dup'. Component names must be
342 // unique and case-insensitive
343 Assert.AreEqual (typeof (ArgumentException), ex.GetType (), "#D2");
344 Assert.IsNull (ex.InnerException, "#D3");
345 Assert.IsNotNull (ex.Message, "#D4");
346 Assert.IsTrue (ex.Message.IndexOf ("'dup'") != -1, "#D5");
347 Assert.IsNull (ex.ParamName, "#D6");
348 Assert.AreEqual (2, container.Components.Count, "#D7");
350 Assert.AreEqual (1, container2.Components.Count, "#D8");
351 Assert.AreSame (c5, container2.Components [0], "#D9");
354 container.AllowDuplicateNames = true;
355 TestComponent c6 = new TestComponent ();
356 container.Add (c6, "dup");
357 Assert.AreEqual (3, container.Components.Count, "#E1");
358 Assert.IsNotNull (c1.Site, "#E2");
359 Assert.AreEqual ("dup", c1.Site.Name, "#E3");
360 Assert.IsNotNull (c6.Site, "#E4");
361 Assert.AreEqual ("dup", c6.Site.Name, "#E5");
362 Assert.IsFalse (object.ReferenceEquals (c1.Site, c6.Site), "#E6");
367 public void AddRemove ()
369 TestComponent component = new TestComponent ();
371 _container.Add (component);
372 Assert.IsNotNull (component.Site, "#1");
373 Assert.IsTrue (_container.Contains (component), "#2");
375 _container.Remove (component);
376 Assert.IsNull (component.Site, "#3");
377 Assert.IsFalse (_container.Contains (component), "#4");
380 _container.Add (component);
381 _container.Remove_WithoutUnsiting (component);
382 Assert.IsNotNull (component.Site, "#5");
383 Assert.IsFalse (_container.Contains (component), "#6");
388 public void Dispose1 ()
393 compA = new TestComponent ();
394 _container.Add (compA);
395 compB = new TestComponent ();
396 _container.Add (compB);
398 _container.Dispose ();
400 Assert.AreEqual (0, _container.Components.Count, "#A1");
401 Assert.IsTrue (compA.IsDisposed, "#A2");
402 Assert.IsNull (compA.Site, "#A3");
403 Assert.IsTrue (compB.IsDisposed, "#A4");
404 Assert.IsNull (compB.Site, "#A5");
406 _container = new TestContainer ();
407 compA = new TestComponent ();
408 compA.ThrowOnDispose = true;
409 _container.Add (compA);
410 compB = new TestComponent ();
411 _container.Add (compB);
413 // assert that component is not removed from components until after
414 // Dispose of component has succeeded
416 _container.Dispose ();
418 } catch (InvalidOperationException) {
419 Assert.AreEqual (0, _container.Components.Count, "#B2");
420 Assert.IsFalse (compA.IsDisposed, "#B4");
421 Assert.IsNull (compA.Site, "#B5");
422 Assert.IsTrue (compB.IsDisposed, "#B6");
423 Assert.IsNull (compB.Site, "#B7");
425 compA.ThrowOnDispose = false;
428 _container = new TestContainer ();
429 compA = new TestComponent ();
430 _container.Add (compA);
431 compB = new TestComponent ();
432 compB.ThrowOnDispose = true;
433 _container.Add (compB);
436 _container.Dispose ();
438 } catch (InvalidOperationException) {
439 Assert.AreEqual (1, _container.Components.Count, "#C2");
440 Assert.AreSame (compA, _container.Components [0], "#C3");
441 Assert.IsFalse (compA.IsDisposed, "#C4");
442 Assert.IsNotNull (compA.Site, "#C5");
443 Assert.IsFalse (compB.IsDisposed, "#C6");
444 Assert.IsNull (compB.Site, "#C7");
446 compB.ThrowOnDispose = false;
450 [Test] // Dispose (Boolean)
451 public void Dispose2 ()
456 compA = new TestComponent ();
457 _container.Add (compA);
458 compB = new TestComponent ();
459 _container.Add (compB);
461 _container.Dispose (false);
463 Assert.AreEqual (2, _container.Components.Count, "#A1");
464 Assert.IsFalse (compA.IsDisposed, "#A2");
465 Assert.IsNotNull (compA.Site, "#A3");
466 Assert.IsFalse (compB.IsDisposed, "#A4");
467 Assert.IsNotNull (compB.Site, "#A5");
469 _container.Dispose (true);
471 Assert.AreEqual (0, _container.Components.Count, "#B1");
472 Assert.IsTrue (compA.IsDisposed, "#B2");
473 Assert.IsNull (compA.Site, "#B3");
474 Assert.IsTrue (compB.IsDisposed, "#B4");
475 Assert.IsNull (compB.Site, "#B5");
477 compA = new TestComponent ();
478 _container.Add (compA);
479 compB = new TestComponent ();
480 _container.Add (compB);
482 Assert.AreEqual (2, _container.Components.Count, "#C1");
483 Assert.IsFalse (compA.IsDisposed, "#C2");
484 Assert.IsNotNull (compA.Site, "#C3");
485 Assert.IsFalse (compB.IsDisposed, "#C4");
486 Assert.IsNotNull (compB.Site, "#C5");
488 _container.Dispose (true);
490 Assert.AreEqual (0, _container.Components.Count, "#D1");
491 Assert.IsTrue (compA.IsDisposed, "#D2");
492 Assert.IsNull (compA.Site, "#D3");
493 Assert.IsTrue (compB.IsDisposed, "#D4");
494 Assert.IsNull (compB.Site, "#D5");
498 public void GetService ()
502 GetServiceContainer container = new GetServiceContainer ();
503 container.Add (new MyComponent ());
504 service = container.GetService (typeof (MyComponent));
505 Assert.IsNull (service, "#1");
506 service = container.GetService (typeof (Component));
507 Assert.IsNull (service, "#2");
508 service = container.GetService (typeof (IContainer));
509 Assert.AreSame (container, service, "#3");
510 service = container.GetService ((Type) null);
511 Assert.IsNull (service, "#4");
516 public void ValidateName_Component_Null ()
519 _container.InvokeValidateName ((IComponent) null, "A");
521 } catch (ArgumentNullException ex) {
522 Assert.AreEqual (typeof (ArgumentNullException), ex.GetType (), "#2");
523 Assert.IsNull (ex.InnerException, "#3");
524 Assert.IsNotNull (ex.Message, "#4");
525 Assert.AreEqual ("component", ex.ParamName, "#5");
530 public void ValidateName_Name_Null ()
532 TestComponent compA = new TestComponent ();
533 _container.Add (compA, (string) null);
534 TestComponent compB = new TestComponent ();
535 _container.InvokeValidateName (compB, (string) null);
539 public void ValidateName_Name_Duplicate ()
541 TestComponent compA = new TestComponent ();
542 _container.Add (compA, "dup");
544 // same component, same case
545 _container.InvokeValidateName (compA, "dup");
547 // existing component, same case
548 TestComponent compB = new TestComponent ();
549 _container.Add (compB, "B");
551 _container.InvokeValidateName (compB, "dup");
553 } catch (ArgumentException ex) {
554 // Duplicate component name 'duP'. Component names must be
555 // unique and case-insensitive
556 Assert.AreEqual (typeof (ArgumentException), ex.GetType (), "#A2");
557 Assert.IsNull (ex.InnerException, "#A3");
558 Assert.IsNotNull (ex.Message, "#A4");
559 Assert.IsTrue (ex.Message.IndexOf ("'dup'") != -1, "#A5");
560 Assert.IsNull (ex.ParamName, "#A6");
561 Assert.AreEqual (2, _container.Components.Count, "#A7");
563 _container.InvokeValidateName (compB, "whatever");
565 // new component, different case
566 TestComponent compC = new TestComponent ();
568 _container.InvokeValidateName (compC, "dup");
570 } catch (ArgumentException ex) {
571 // Duplicate component name 'duP'. Component names must be
572 // unique and case-insensitive
573 Assert.AreEqual (typeof (ArgumentException), ex.GetType (), "#B2");
574 Assert.IsNull (ex.InnerException, "#B3");
575 Assert.IsNotNull (ex.Message, "#B4");
576 Assert.IsTrue (ex.Message.IndexOf ("'dup'") != -1, "#B5");
577 Assert.IsNull (ex.ParamName, "#B6");
578 Assert.AreEqual (2, _container.Components.Count, "#B7");
580 _container.InvokeValidateName (compC, "whatever");
582 // component of other container, different case
583 TestContainer container2 = new TestContainer ();
584 TestComponent compD = new TestComponent ();
585 container2.Add (compD, "B");
587 _container.InvokeValidateName (compD, "dup");
589 } catch (ArgumentException ex) {
590 // Duplicate component name 'duP'. Component names must be
591 // unique and case-insensitive
592 Assert.AreEqual (typeof (ArgumentException), ex.GetType (), "#C2");
593 Assert.IsNull (ex.InnerException, "#C3");
594 Assert.IsNotNull (ex.Message, "#C4");
595 Assert.IsTrue (ex.Message.IndexOf ("'dup'") != -1, "#C5");
596 Assert.IsNull (ex.ParamName, "#C6");
597 Assert.AreEqual (2, _container.Components.Count, "#C7");
599 _container.InvokeValidateName (compD, "whatever");
600 Assert.AreEqual (1, container2.Components.Count, "#C8");
601 Assert.AreSame (compD, container2.Components [0], "#C9");
605 class MyComponent : Component
609 class MyContainer : IContainer
611 private ComponentCollection components = new ComponentCollection (
614 public ComponentCollection Components {
615 get { return components; }
618 public void Add (IComponent component)
622 public void Add (IComponent component, string name)
626 public void Remove (IComponent component)
630 public void Dispose ()
635 public class GetServiceContainer : Container
637 public new object GetService (Type service)
639 return base.GetService (service);